nordic mesh中的消息缓存实现

代码文件msg_cache.hmsg_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中的消息缓存实现的更多相关文章

  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. Linux下Git远程仓库的使用详解

    Git远程仓库Github 提示:Github网站作为远程代码仓库时的操作和本地代码仓库一样的,只是仓库位置不同而已! 准备Git源代码仓库 https://github.com/ 准备经理的文件 D ...

  2. node的安装和配置

    一 . 直接安装node 1. http://nodejs.cn/download/ 根据自己的电脑选择适合的安装包 2.安装 , 无脑下一步 , 可以选择安装路径 , 但是一定要记住 . 3.命令行 ...

  3. [翻译]Hystrix wiki–How it Works

    注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了.本文更多是学习过程的产出,请尽量参考原官方文档. 流程图 下图 ...

  4. Maven安装配置环境变量及eclipse的配置

    Maven安装与配置   一.需要准备的东西 1. JDK 2. Eclipse 3. Maven程序包 二.下载与安装 1. 前往https://maven.apache.org/download. ...

  5. Bigdata--hadoop系列安装

    Date:20180827 Monday 目前市场hadoop主流版本是2.7.x系列,下面我们就以hadoop-2.7.3为例进行安装 安装前准备: 1.操作系统:cetos(6和7) 2.java ...

  6. MapReduce之Reduce Join

    一 介绍 Reduce Join其主要思想如下: 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag), 比如:t ...

  7. Java核心技术36讲----------Exception和Error有什么区别

    1.异常知识点学习实例 代码如下: package fromnet; /** * 参考链接:https://blog.csdn.net/qq_18505715/article/details/7319 ...

  8. 6、core dump 故障分析

    Core Dump-定义Core Dump又叫核心转存.当程序在运行过程中发生异常, 这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump. Segme ...

  9. 863. All Nodes Distance K in Binary Tree

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  10. IPV6路由技术

    OSPFV3 一.OSPFv3概述:协议号89 1.概念: OSPFv3是ospf(开放式最短路径优先)版本3的简称,主要提供对IPV6的支持,遵循的标准为RFC2740(OSPF for IPv6) ...