nordic mesh中的消息缓存实现
nordic mesh中的消息缓存实现
代码文件msg_cache.h
、msg_cache.c
。
接口定义
头文件中定义了四个接口,供mesh协议栈调用,四个接口如下所示,接口的实现代码在msg_cache.c
文件中。
@file:msg_cache.h
// 消息缓存初始化
void msg_cache_init(void);
// 检查消息是否存在
bool msg_cache_entry_exists(uint16_t src_addr, uint32_t sequence_number);
// 添加消息到缓存
void msg_cache_entry_add(uint16_t src, uint32_t seq);
// 消息缓存清空
void msg_cache_clear(void);
实现代码
消息缓存用静态全局变量的一个数组m_msg_cache[]
实现,该数组长度为32,数组每个元素表示消息。m_msg_cache_head
表示新消息加入的位置,通过对m_msg_cache_head
的控制实现一个环形的消息缓存。
其结构定义如下:
typedef struct
{
bool allocated; /**< Whether the entry is in use. */
uint16_t src; /**< Source address from packet header. */
uint32_t seq; /**< Sequence number from the packet header. */
} msg_cache_entry_t;
/** Message cache buffer */
static msg_cache_entry_t m_msg_cache[MSG_CACHE_ENTRY_COUNT];
/** Message cache head index
* 新消息的加入位置
*/
static uint32_t m_msg_cache_head = 0;
由缓存结构可知,消息缓存结构只是保存了消息的源地址及其序列号。收到消息时,先在消息缓存中检查是否已有该消息,若不存在则添加进去,否则忽略消息。
由于蓝牙mesh是基于泛洪管理网络的,所以某个节点会收到多条相同的消息(每个节点会中继转发消息),消息缓存主要用判断是否已收到该消息,用来避免消息拥塞。
msg_cache_init()
消息缓存初始化代码如下,就是将消息缓存数组的各元素设置为可用状态。
void msg_cache_init(void)
{
for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
{
m_msg_cache[i].src = NRF_MESH_ADDR_UNASSIGNED;
m_msg_cache[i].seq = 0;
m_msg_cache[i].allocated = 0;
}
m_msg_cache_head = 0;
}
msg_cache_entry_exists()
判断消息是否已经存在,从m_msg_cache_head
的位置开始逆序遍历整个消息缓存数组,逐个对比源地址及序列号
bool msg_cache_entry_exists(uint16_t src_addr, uint32_t sequence_number)
{
/* Search backwards from head */
uint32_t entry_index = m_msg_cache_head;
for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
{
if (entry_index-- == 0) /* compare before subtraction */
{
entry_index = MSG_CACHE_ENTRY_COUNT - 1;
}
if (!m_msg_cache[entry_index].allocated)
{
return false; /* Gone past the last valid entry. */
}
if (m_msg_cache[entry_index].src == src_addr &&
m_msg_cache[entry_index].seq == sequence_number)
{
return true;
}
}
return false;
}
msg_cache_entry_add()
消息添加到缓存
void msg_cache_entry_add(uint16_t src, uint32_t seq)
{
m_msg_cache[m_msg_cache_head].src = src;
m_msg_cache[m_msg_cache_head].seq = seq;
m_msg_cache[m_msg_cache_head].allocated = true;
if ((++m_msg_cache_head) == MSG_CACHE_ENTRY_COUNT)
{
m_msg_cache_head = 0;
}
}
msg_cache_clear()
清空消息缓存
void msg_cache_clear(void)
{
for (uint32_t i = 0; i < MSG_CACHE_ENTRY_COUNT; ++i)
{
m_msg_cache[i].allocated = 0;
}
}
nordic mesh中的消息缓存实现的更多相关文章
- 深入探讨在集群环境中使用 EhCache 缓存系统
EhCache 缓存系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider. 下图是 EhCache 在应用 ...
- (转)深入探讨在集群环境中使用 EhCache 缓存系统
简介: EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点,是 Hibernate 中默认的 CacheProvider.本文充分的介绍了 EhCache 缓存系统对集群环境的 ...
- WebIM(2)---消息缓存
WebIM系列文章 在一步一步打造WebIM(1)一文中,已经介绍了如何实现一个简单的WebIM,但是,这个WebIM有一个问题,就是每一次添加消息监听器时,都必须访问一次数据库去查询是否有消息,显然 ...
- Objective-C中的消息发送总结
关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解. 我想这跟知识体系的构建有关,如果你不认识有砖.水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建 ...
- linux中的redis缓存服务器
Linux中的Redis缓存服务器 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1 ...
- nordic mesh 任务调度实现
nordic mesh 任务调度实现 nordic mesh的任务调度室基于定时器实现的,有两个链表结构维护任务. 需要注意的是,任务调度的部分接口只能在"bearer event" ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存
第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...
- 基于事件驱动机制,在Service Mesh中进行消息传递的探讨
翻译 | 宋松 原文 | https://www.infoq.com/articles/service-mesh-event-driven-messaging 关键点 当前流行的Service Mes ...
- IOS OS X 中集中消息的传递机制
1 KVO (key-value Observing) 是提供对象属性被改变是的通知机制.KVO的实现实在Foundation中,很多基于 Foundation 的框架都依赖与它.如果只对某一个对象的 ...
随机推荐
- Use PerfHUD ES to Do Frame Capture Android Game
Author: http://www.cnblogs.com/open-coder/p/3898224.html Get Start This is short tutorial about how ...
- 使用第三方库iOS-ECharts做柱状图的心得
最近的项目里面用到了饼图和条形统计图,饼图用的是PNChart来做的,这个库感觉用起来也简单,但是做条形统计图的时候就特别蛋疼(不知道是不是我姿势没对),反正就是各种问题,然后就想到换一种框架,最后选 ...
- js取一个对象中的另一个对象
最开始的截图 原本是想取到其中的foodName 先是用一个for循环循环了下 for (var i=0;i<res.data.length;i++) { this.goodsList.res. ...
- java8的新特性,Collections.sort(排序的List集合)的使用,对list封装Map里面的某个值进行排序
--------------------------对简单list的排序---------------------------------- List<Integer> list = ne ...
- shell基础知识---与监听服务器长连接端口状态
从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...
- 关于mybatis编写sql问题.
最近呢楼主回到长沙进行面试:被问了一个这样的问题,在mybatis中怎么进行模糊查询,望各位大佬在下方进行评论,好让我这菜鸡多学习一些.
- [转]关于sdk更新Android SDK Tools 25.3.1版本后使用sdk manager闪退
昨天这两个manager还工作正常,今天更新了一下,发现不可用了,运行avd manager和sdk manager没反应,搜了好多文章,然后看到了下这篇文章<关于sdk更新Android SD ...
- Xshell配色方案推荐
使用方法: 新建mycolor.xcs文件 复制粘贴如下代码,将文件导入,修改自己喜欢的字体即可 [mycolor] text=00ff80 cyan(bold)=00ffff text(bold)= ...
- 集合之WeakHashMap
WeakHashMap 底层数据结构是哈希表结构 依赖于键的数据结构特点 不同于HashMap,该类的键是以弱键的形式存在 当该键成为垃圾对象,会被垃圾回收期空闲的时候回收,那么改键所对应值也会被回收 ...
- Windows 聚焦(锁屏背景)不更新的解决方法
在 Windows Store 搜索 Dynamic theme 安装后可对桌面背景.锁屏界面等进行设置,非常好用!