nordic mesh中的消息缓存实现

代码文件msg_cache.hmsg_cache.c

接口定义

头文件中定义了四个接口,供mesh协议栈调用,四个接口如下所示,接口的实现代码在msg_cache.c文件中。

  1. @filemsg_cache.h
  2. // 消息缓存初始化
  3. void msg_cache_init(void);
  4. // 检查消息是否存在
  5. bool msg_cache_entry_exists(uint16_t src_addr, uint32_t sequence_number);
  6. // 添加消息到缓存
  7. void msg_cache_entry_add(uint16_t src, uint32_t seq);
  8. // 消息缓存清空
  9. void msg_cache_clear(void);

实现代码

消息缓存用静态全局变量的一个数组m_msg_cache[]实现,该数组长度为32,数组每个元素表示消息。m_msg_cache_head表示新消息加入的位置,通过对m_msg_cache_head的控制实现一个环形的消息缓存。

其结构定义如下:

  1. typedef struct
  2. {
  3. bool allocated; /**< Whether the entry is in use. */
  4. uint16_t src; /**< Source address from packet header. */
  5. uint32_t seq; /**< Sequence number from the packet header. */
  6. } msg_cache_entry_t;
  7. /** Message cache buffer */
  8. static msg_cache_entry_t m_msg_cache[MSG_CACHE_ENTRY_COUNT];
  9. /** Message cache head index
  10. * 新消息的加入位置
  11. */
  12. static uint32_t m_msg_cache_head = 0;

由缓存结构可知,消息缓存结构只是保存了消息的源地址及其序列号。收到消息时,先在消息缓存中检查是否已有该消息,若不存在则添加进去,否则忽略消息。

由于蓝牙mesh是基于泛洪管理网络的,所以某个节点会收到多条相同的消息(每个节点会中继转发消息),消息缓存主要用判断是否已收到该消息,用来避免消息拥塞。

msg_cache_init()

消息缓存初始化代码如下,就是将消息缓存数组的各元素设置为可用状态。


  1. void msg_cache_init(void)
  2. {
  3. for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
  4. {
  5. m_msg_cache[i].src = NRF_MESH_ADDR_UNASSIGNED;
  6. m_msg_cache[i].seq = 0;
  7. m_msg_cache[i].allocated = 0;
  8. }
  9. m_msg_cache_head = 0;
  10. }

msg_cache_entry_exists()

判断消息是否已经存在,从m_msg_cache_head的位置开始逆序遍历整个消息缓存数组,逐个对比源地址及序列号


  1. bool msg_cache_entry_exists(uint16_t src_addr, uint32_t sequence_number)
  2. {
  3. /* Search backwards from head */
  4. uint32_t entry_index = m_msg_cache_head;
  5. for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
  6. {
  7. if (entry_index-- == 0) /* compare before subtraction */
  8. {
  9. entry_index = MSG_CACHE_ENTRY_COUNT - 1;
  10. }
  11. if (!m_msg_cache[entry_index].allocated)
  12. {
  13. return false; /* Gone past the last valid entry. */
  14. }
  15. if (m_msg_cache[entry_index].src == src_addr &&
  16. m_msg_cache[entry_index].seq == sequence_number)
  17. {
  18. return true;
  19. }
  20. }
  21. return false;
  22. }

msg_cache_entry_add()

消息添加到缓存

  1. void msg_cache_entry_add(uint16_t src, uint32_t seq)
  2. {
  3. m_msg_cache[m_msg_cache_head].src = src;
  4. m_msg_cache[m_msg_cache_head].seq = seq;
  5. m_msg_cache[m_msg_cache_head].allocated = true;
  6. if ((++m_msg_cache_head) == MSG_CACHE_ENTRY_COUNT)
  7. {
  8. m_msg_cache_head = 0;
  9. }
  10. }

msg_cache_clear()

清空消息缓存

  1. void msg_cache_clear(void)
  2. {
  3. for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
  4. {
  5. m_msg_cache[i].allocated = 0;
  6. }
  7. }

nordic mesh中的消息缓存实现的更多相关文章

  1. 深入探讨在集群环境中使用 EhCache 缓存系统

    EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用 ...

  2. (转)深入探讨在集群环境中使用 EhCache 缓存系统

    简介: EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.本文充分的介绍了 EhCache 缓存系统对集群环境的 ...

  3. WebIM(2)---消息缓存

    WebIM系列文章 在一步一步打造WebIM(1)一文中,已经介绍了如何实现一个简单的WebIM,但是,这个WebIM有一个问题,就是每一次添加消息监听器时,都必须访问一次数据库去查询是否有消息,显然 ...

  4. Objective-C中的消息发送总结

    关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解. 我想这跟知识体系的构建有关,如果你不认识有砖.水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建 ...

  5. linux中的redis缓存服务器

    Linux中的Redis缓存服务器 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1 ...

  6. nordic mesh 任务调度实现

    nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  8. 基于事件驱动机制,在Service Mesh中进行消息传递的探讨

    翻译 | 宋松 原文 | https://www.infoq.com/articles/service-mesh-event-driven-messaging 关键点 当前流行的Service Mes ...

  9. IOS OS X 中集中消息的传递机制

    1 KVO (key-value Observing) 是提供对象属性被改变是的通知机制.KVO的实现实在Foundation中,很多基于 Foundation 的框架都依赖与它.如果只对某一个对象的 ...

随机推荐

  1. lable随堂笔记

    lable标签与属性 lable标签:for属性,让标签与指定的input元素建立标签:将input元素包含在lable标签中. <table border="2" alig ...

  2. update更新修改数据

    update ---整表更新数据 update  表名  set  需要调整字段1= '值1' ,需要调整字段2= '值2'  …… ---更新条件数据 update  表名  set  需要调整字段 ...

  3. 解决ssh连接linux系统特别慢的问题

    新安装的centos系统,发现ssh连接很慢,因为是测试环境,对安全的要求不高,所以完全可以更快的连接,下面一起来解决这个问题. 一.分析主要原因: 1.SSH的反向DNS解析会消耗大量时间 2.GS ...

  4. 闲谈Hybrid

    前言 当经常需要更换样式,产品迭代,那么我们应该考虑hybrid混合开发,上层使用Html&Css&JS做业务开发,底层透明化.上层多多样化,这种场景非常有利于前端介入,非常适合业务快 ...

  5. 5 替换空格 JavaScript

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   原来一个空格字符,替换之后 ...

  6. STM32F407+STemwin学习笔记之STemwin移植补充Touch

    原文地址:http://www.cnblogs.com/NickQ/p/8857213.html 环境:keil5.20  STM32F407ZGT6  LCD(320*240)  STemwin:S ...

  7. socketpair通信

    1.线程间通信(参考安卓源码InputTransport.cpp) #include <pthread.h> #include <sys/types.h> /* See NOT ...

  8. sql server 常用sql语句

    --删除约束 alter table productInfo drop constraint 约束名称 --删除列alter table productInfo drop column 列名 --添加 ...

  9. Django自定制分页功能

    URL: """django_paginner URL Configuration The `urlpatterns` list routes URLs to views ...

  10. Active Job 基础

    开发中涉及到调用三方服务API,运行时间长,结果不需要实时反馈给用户这样的任务,都可以使用异步处理.常见的场景包括:发邮件和短信.图片处理.定时清理等.爬虫. 后端处理软件可以自行选择这里选择了sid ...