背景

蓝牙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(重发间隔170ms FRI_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低功耗节点相关推荐

  1. 安信可PB系列蓝牙模组 APP Ble Mesh组网教程

    文章目录 一.前言 二.硬件准备 三.软件准备 四.AT指令集 五.APP组网示例 六.数据通信 一.前言 本文以PB-02开发板为例,介绍PB系列蓝牙模组通过安卓"PHY Mesh&quo ...

  2. 转载 解密蓝牙mesh系列 | 第五篇 【好友(Friend)和低功耗节点(LPN)】【友谊(Friendship)参数】【友谊建立】【友谊(Friendship)消息传送】【安全性】【友谊终止】

    YD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了B ...

  3. BLE MESH组网(一)简介和基本概念

    BLE MESH组网(一) BLE MESH简介 BLE MESH来源 BLE MESH用处 BLE MESH的通讯方式 管理洪水 市场内蓝牙设备支持 安全性 BLE MESH协议栈模型 BLE ME ...

  4. BLE MESH组网(四)安全概述

    BLE MESH(四)安全概述 一.安全的重要性 二.蓝牙MESH网络的安全性是强制性的 三.蓝牙MESH网络安全基础 四.关注点和安全密钥分离 五.区域隔离 六.节点移除.密钥刷新和垃圾桶攻击 七. ...

  5. AliOS Things SIG BLE Mesh网络的介绍和搭建

    摘要: 在最新的版本(1.2.1)中,AliOS Things 开始支持SIG BLE mesh.本文对SIG BLE mesh及如何使用AliOS Things搭建BLE mesh网络进行了详细的说 ...

  6. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅③简单入门安信可TB-02开发开发板轻松接入天猫精灵,语音控制冷暖灯so easy!

    本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...

  7. 泰凌微ble mesh蓝牙模组天猫精灵学习之旅④如何在Android开发低功耗蓝牙ble控制 TB-02 模块,代码工程全部开源!(附带Demo)

    本<泰凌微ble mesh蓝牙模组天猫精灵学习之旅>系列博客学习由半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1.小白也痴迷,如 ...

  8. BLE MESH组网(二)友谊功能和设备管理

    BLE MESH组网(二) Friendship功能 一.概述 1.Friendship是什么 2.Friend和LPN 3.Friend参数 4.好友建立 Friendship消息 安全 友谊终止 ...

  9. Bluetooth 蓝牙介绍(四):低功耗蓝牙BLE Mesh网络 Ⅰ—— 基础概念

    文章目录 背景 术语 Managed Flooding Models Scenes 架构 Node Features 中继节点 代理节点 友元节点和低功耗节点 示例 BLE Mesh Networki ...

最新文章

  1. 杨清彦:《像三国》游戏3D动效制作经验分享
  2. hashset java 键值对_Java中的各个容器的性能对比
  3. 使用WTMPlus快速搭建发卡网
  4. leetcode852. 山脉数组的峰顶索引(二分法)
  5. SPOJ COT2 (树上莫队)
  6. 戴尔计算机软件的安装,戴尔笔记本电脑安装软件没反应怎么办
  7. qq象棋辅助 android,QQ象棋自动下棋
  8. 【正点原子STM32连载】第三十七章 触摸屏实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  9. HTML的DOCTYPE是什么意思
  10. 聊一个自己写的MVC框架
  11. 使用MyQR和qrcode来制作二维码
  12. OIO、NIO、AIO小结
  13. picker多选 vant_Vant picker 多级联动操作
  14. python解椭圆方程的例题_椭圆标准方程典型例题及练习题
  15. 计算机导论基础论文3000字,计算机导论课论文3000字
  16. mix2s刷Android7,小米Mix2s刷机教程
  17. 普通盒模型和怪异盒模型
  18. 斯坦福和NLTK英语短语词组抽取工具原理及源码理解
  19. 谱定理、瑞利熵、PCA(主成分分析)、clustering algorihtm
  20. 广州3日2夜游行程~

热门文章

  1. 入坑esp-01s 1.3寸OLED带农历时钟及天气显示(四)
  2. Linux之进程的前后台切换
  3. 巧用搜索引擎---如何在指定网站中搜索
  4. 导游APP开发模板现源码
  5. css overflow
  6. 转载:为什么Linux不需要磁盘碎片整理
  7. java手机验证码登录代码_java web实现手机短信验证码登录实例
  8. 智能家居一智能插座 Homekit
  9. 联合证券|内外利好共振 今年A股可更乐观一点
  10. ::before和::after伪元素的使用及优惠券案例