蓝牙Mesh开发五 Ble Mesh友谊FriendShip之TLSR8258低功耗节点
背景
蓝牙Mesh应用中存在低功耗的场景,如温湿度、烟感传感器通过电池供电且需要尽量长的续航时间,针对这一类产品,蓝牙Mesh规范中定义了友谊(Friendship)相关协议,本章会继续使用泰凌微8258评估友谊功能
如有异议,欢迎留言指正
简介
低功耗节点(LPN,low power node)通过与邻近的好友节点(FN,friend node)建立友谊(friendship)关系,低功耗(Low-Power)节点以明显较低的接收端占空比在 mesh 网络中运行。通过将无线电接收器启用时间最小化来降低节点功耗,只有在绝对必要时才启动接收器。
- 对于 LPN 节点,只能和一个 FN 建立友谊;
- 对于 FN 节点,可以和多个 LPN 节点建立友谊。
- 当建立 friendship 后,低功耗节点会以一个比较长的周期对好友节点进行轮询(Poll),查看是否有新消息,如果有,则获取该消息。
- 好友(Friend)节点将mesh网络中发送给低功耗节点的消息缓存到消息队列中,仅在 LPN 明确发出请求时才进行转发来帮助 LPN 运行的能力。
友谊时间参数
ReceiveDelay:接收延迟是低功耗节点发送请求和侦听响应之间的时间,让Friend节点有时间准备响应
ReceiveWindow:接收窗口是低功耗节点侦听响应的时间。 当低功耗节点从其Friend节点接收消息时,它可以停止侦听其他消息
PollTimeout:轮询超时用于低功耗节点发送的两个连续请求之间的时间,如果在PollTimeout计时器到来之前,好友节点未能收到LPN的请求,则友谊关系将被终止。
友谊建立
消息格式
在上一篇有讲到,上层传输层包含了朋友特性的的实现(具体友谊消息格式可以查看Mesh规范第3.6.5小节)
- 不分包控制消息格式(分包数据格式会在数据域中进行细分分包索引)
File | Size(bit) | Note |
---|---|---|
SEG | 1 | 0(不分包) 1 (分包) |
Opcode | 7 |
0x00:分包消息应答包 0x01~0x7F:其他控制命令 |
Parameters | 0~88 | 数据域 |
- 其中Opcode消息如下
Data | Message | Note |
---|---|---|
0x01 | Friend Poll | 低功耗节点向Friend节点请求是否有消息的命令 |
0x02 | Friend Update | Friend 节点向低功耗节点通知安全消息的更新 |
0x03 | Friend Request | 低功耗节点开始寻找Friend节点 |
0x04 | Friend Offer | Friend 节点向低功耗节点发的Offer |
0x05 | Friend Clear | Friend节点通知低功耗节点之前的Friend节点与其解除朋友关系 |
0x06 | Friend Clear Confirm | Friend 节点移除朋友节点的确认 |
请求过程
- 1 . LPN发布一个“好友请求”(Friend Request)消息。该消息不会被中继,因此只有处于直接无线电范围内的好友节点才能处理该消息。不具有“好友”特性的节点会将消息丢弃。“好友请求” 消息包括LPN的ReceiveDelay、ReceiveWindow和PollTimeout参数。
- 2 . 附近的好友节点若支持“好友请求”消息中特定的要求,将准备一个“Friend Offer”消息,并将其发送回LPN。该消息包括各种参数,包括支持的ReceiveWindow大小、可用的消息队列大小、可用的订阅列表(Subscription List)大小、以及由好友节点测量的RSSI值。
- 3 . LPN接收到“Friend Offer”消息时,通过应用一种实施专用的算法来选择合适的好友节点。该算法可能会考虑到各种各样的情况。某些设备可能会优先考虑ReceiveWindow大小,以尽可能减少功耗;而有些设备则可能会更加关注RSSI值,以确保能够与好友节点保持高质量的链路。所采用的精确算法由产品开发者决定。
- 4 . 选择好友节点之后,LPN将向好友节点发送一个“Friend Poll”轮询消息。
- 5 . 从LPN收到“好友轮询”(Friend Poll)消息后,好友节点会回复一个“Friend Update”更新消息,完成“好友” 建立流程并提供安全参数,好友节点会为低功耗节点存储一个订阅列表,此时“友谊”得以建立。
友谊消息通信
友谊建立成功后,好友节点会缓存发往LPN节点的消息
低功耗节点LPN会周期唤醒向好友节点发送轮询消息获取其缓存数据
当好友缓存中无消息时,MD字段设置为0终止消息,LPN会停止轮询并重新进入休眠
分包缓存消息
当发往LPN低功耗节点的消息存在分包情况时,好友节点会缓存完整的消息后才会应答给LPN节点
- 如下图,Node A发往的消息Msg中,好友节点会等待缓存完SegMsg(0~2)
分包发送消息
LPN发往其他节点的消息时,分包发送消息时,LPN节点仅保证发往好友节点,发送完成后进入休眠
好友节点将LPN消息转发后,如果并未成功送达目标节点,则会等待下一次LPN唤醒后进行重新发送
安全性
主安全资料(Master Security Material)
- 由网络密钥(NetKey)派生,可被同一网络中的其他节点使用。使用主安全资料加密的消息可被同一网络中的任何节点解码。
好友安全资料(Friend Security Material)
- 由网络密钥(NetKey)、以及由低功耗节点(LPN)和好友节点生成的额外计数器号码派生而来。使用好友安全资料加密的消息只能由处理该消息的好友节点和 LPN 解码。
使用好友安全材料加密的相应友谊消息
- 好友轮询(Friend Poll)
- 好友更新(Friend Update)
- 好友订阅列表(Friend Subscription List)
使用主安全资料加密的相应友谊消息
- 好友清除(Friend Clear)
- 清除确认(Friend Clear Confirm)
其它从 LPN 发送至好友节点的非控制消息将根据应用设置对应 model publish 参数里面的credential_flag,来确定是通过主安全资料或好友安全资料进行加密。credential_flag 默认值是0,也就是使用主安全资料。
友谊终止
如果在 PollTimeout 计时结束之前,好友节点未收到“好友轮询”、“好友订阅列表添加”或“好友订阅列表删除”消息,则友谊终止。
LPN 可以通过将“好友清除”消息发送给好友节点,以启动友谊终止程序,“友谊”就会被好友节点终止。
举例
- 好友节点断电情况下,LPN低功耗节点轮询超时后会重新发起Friend Request与其他节点重新建立友谊
- 新建立友谊的好友节点会持续发送好友清除消息,告知原先的节点进行好友清除
代码实例
TLSR8258使用mesh_lpn例程来测试验证,低功耗节点功能处理主要在mesh_lpn_proc_suspend
中
void mesh_lpn_proc_suspend ()
{if((BLS_LINK_STATE_CONN != blt_state) && is_friend_ship_link_ok_lpn()){//更新状态extern u8 blt_busy;blt_busy = 0; // triger pm in blt_sdk_main_loop}lpn_key_factory_reset_check(); //恢复出厂按键 // include mesh_lpn_wakeup_key_io_get_(); // check releaseif(LPN_MODE_GATT_OTA == lpn_mode){// use BLE PM flow: BLE_REMOTE_PM_ENABLEif(blt_state != BLS_LINK_STATE_CONN){if(clock_time_exceed(lpn_mode_tick, LPN_GATT_OTA_ADV_STATE_MAX_TIME_MS * 1000)){lpn_mode_set(LPN_MODE_NORMAL);}else{if(!is_led_busy()){cfg_led_event (LED_EVENT_FLASH_1HZ_1T);}}}return ;}if(lpn_provision_ok){#if (FRI_ESTABLISH_WIN_MS > 100)if(FRI_ST_OFFER == fri_ship_proc_lpn.status){ //接收窗口,等待FN 应答offer MCU is active and waiting for rx offer.static u32 tick_lpn_key_scan;if(clock_time_exceed(tick_lpn_key_scan, KEY_SCAN_INTERVAL_MS * 1000)){tick_lpn_key_scan = clock_time();is_lpn_key_cmd_tx_trigger(0); // check key and tx command}}#endifif(blt_state == BLS_LINK_STATE_CONN){return ;}#if (!DEBUG_SUSPEND)if(clock_time_exceed(lpn_wakeup_tick, LPN_WORKING_TIMEOUT_MS*1000)){mesh_friend_ship_set_st_lpn(FRI_ST_REQUEST);// prevent abnormal working time.}#endif}else{if(!is_provision_success()){if(!is_provision_working() && !blcOta.ota_start_flag){ // not being provisionif(clock_time_exceed(0, LPN_SCAN_PROVISION_START_TIMEOUT_MS*1000)){//等待配网60sec超时进入休眠light_onoff_all(0); cpu_sleep_wakeup(1, PM_WAKEUP_PAD, 0);while(1); // wait reboot}}}else{if((!lpn_provision_ok) && node_binding_tick && clock_time_exceed(node_binding_tick, LPN_START_REQUEST_AFTER_BIND_MS*1000)){lpn_provision_ok = 1;//配网 key绑定成功 provison and key bind finishgatt_adv_send_flag = GATT_LPN_EN; mesh_friend_ship_set_st_lpn(FRI_ST_REQUEST);//启动 friend requestif(BLS_LINK_STATE_CONN == blt_state){bls_ll_terminateConnection(0x13); // disconnet to establish friendship}}}return ;}return;
}
代码主要处理逻辑
- 低功耗LPN设备初次上电处于未配网状态,等待60sec配网超时进入休眠,超时时间通过配置宏LPN_WORKING_TIMEOUT_MS
- 配网与密钥绑定成功后,低功耗LPN节点会主动发起朋友请求friend quest,等待支持朋友功能的节点回复friend offer,建立friend ship友谊
- 友谊建立成功后,低功耗节点LPN会每2sec唤醒一次向朋友节点同步消息,唤醒周期通过配置宏FRI_POLL_INTERVAL_MS
- 低功耗LPN连续8次(
FRI_POLL_RETRY_MAX
)未收到好友offer(重发间隔170msFRI_REC_DELAY_MS + FRI_REC_WIN_MS
),则友谊friend ship断开,重新发起朋友请求friend quest寻找新的好友节点 - 好友节点支持最大友谊连接数,修改宏MAX_LPN_NUM,最大16个
- 友谊建立回调friend_ship_establish_ok_cb_lpn,友谊断开回调friend_ship_disconnect_cb_lpn
调试
烧录完固件后,通过APP进行配网,APP进过Mesh节点代理服务发送给低功耗节点单播地址,LPN低功耗设备2sec唤醒一次获取好友节点缓存消息
总结
实际测试当好友节点的友谊连接大于3个时,会有概率LPN唤醒后轮询poll消息需要重发,且增加继续增加LPN节点后会出现友谊断开重连的情况
本质上低功耗节点将能量的耗损迁移到了常供电的朋友节点上,所以实际应用中需要考虑到场景配置,如果应用单一,设备都是低功耗节点,而没有支持朋友功能节点,那么Mesh就不适用了,低功耗节点无法实现中继,这时使用BLE的方式来实现更加合理
蓝牙Mesh开发五 Ble Mesh友谊FriendShip之TLSR8258低功耗节点相关推荐
- 安信可PB系列蓝牙模组 APP Ble Mesh组网教程
文章目录 一.前言 二.硬件准备 三.软件准备 四.AT指令集 五.APP组网示例 六.数据通信 一.前言 本文以PB-02开发板为例,介绍PB系列蓝牙模组通过安卓"PHY Mesh&quo ...
- 转载 解密蓝牙mesh系列 | 第五篇 【好友(Friend)和低功耗节点(LPN)】【友谊(Friendship)参数】【友谊建立】【友谊(Friendship)消息传送】【安全性】【友谊终止】
YD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了B ...
- BLE MESH组网(一)简介和基本概念
BLE MESH组网(一) BLE MESH简介 BLE MESH来源 BLE MESH用处 BLE MESH的通讯方式 管理洪水 市场内蓝牙设备支持 安全性 BLE MESH协议栈模型 BLE ME ...
- BLE MESH组网(四)安全概述
BLE MESH(四)安全概述 一.安全的重要性 二.蓝牙MESH网络的安全性是强制性的 三.蓝牙MESH网络安全基础 四.关注点和安全密钥分离 五.区域隔离 六.节点移除.密钥刷新和垃圾桶攻击 七. ...
- AliOS Things SIG BLE Mesh网络的介绍和搭建
摘要: 在最新的版本(1.2.1)中,AliOS Things 开始支持SIG BLE mesh.本文对SIG BLE mesh及如何使用AliOS Things搭建BLE mesh网络进行了详细的说 ...
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅③简单入门安信可TB-02开发开发板轻松接入天猫精灵,语音控制冷暖灯so easy!
本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...
- 泰凌微ble mesh蓝牙模组天猫精灵学习之旅④如何在Android开发低功耗蓝牙ble控制 TB-02 模块,代码工程全部开源!(附带Demo)
本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...
- BLE MESH组网(二)友谊功能和设备管理
BLE MESH组网(二) Friendship功能 一.概述 1.Friendship是什么 2.Friend和LPN 3.Friend参数 4.好友建立 Friendship消息 安全 友谊终止 ...
- Bluetooth 蓝牙介绍(四):低功耗蓝牙BLE Mesh网络 Ⅰ—— 基础概念
文章目录 背景 术语 Managed Flooding Models Scenes 架构 Node Features 中继节点 代理节点 友元节点和低功耗节点 示例 BLE Mesh Networki ...
最新文章
- 杨清彦:《像三国》游戏3D动效制作经验分享
- hashset java 键值对_Java中的各个容器的性能对比
- 使用WTMPlus快速搭建发卡网
- leetcode852. 山脉数组的峰顶索引(二分法)
- SPOJ COT2 (树上莫队)
- 戴尔计算机软件的安装,戴尔笔记本电脑安装软件没反应怎么办
- qq象棋辅助 android,QQ象棋自动下棋
- 【正点原子STM32连载】第三十七章 触摸屏实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
- HTML的DOCTYPE是什么意思
- 聊一个自己写的MVC框架
- 使用MyQR和qrcode来制作二维码
- OIO、NIO、AIO小结
- picker多选 vant_Vant picker 多级联动操作
- python解椭圆方程的例题_椭圆标准方程典型例题及练习题
- 计算机导论基础论文3000字,计算机导论课论文3000字
- mix2s刷Android7,小米Mix2s刷机教程
- 普通盒模型和怪异盒模型
- 斯坦福和NLTK英语短语词组抽取工具原理及源码理解
- 谱定理、瑞利熵、PCA(主成分分析)、clustering algorihtm
- 广州3日2夜游行程~