蓝牙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小节)

  • 不分包控制消息格式(分包数据格式会在数据域中进行细分分包索引)
FileSize(bit)Note
SEG10(不分包) 1 (分包)
Opcode70x00:分包消息应答包
0x01~0x7F:其他控制命令
Parameters0~88数据域
  • 其中Opcode消息如下
DataMessageNote
0x01Friend Poll低功耗节点向Friend节点请求是否有消息的命令
0x02Friend UpdateFriend 节点向低功耗节点通知安全消息的更新
0x03Friend Request低功耗节点开始寻找Friend节点
0x04Friend OfferFriend 节点向低功耗节点发的Offer
0x05Friend ClearFriend节点通知低功耗节点之前的Friend节点与其解除朋友关系
0x06Friend Clear ConfirmFriend 节点移除朋友节点的确认
请求过程
  • 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 release
    if(LPN_MODE_GATT_OTA == lpn_mode){
        // use BLE PM flow: BLE_REMOTE_PM_ENABLE
        if(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
	        }
	    }
	    #endif
	    
        if(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 provision
    	        if(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 finish
				gatt_adv_send_flag = GATT_LPN_EN;				
				mesh_friend_ship_set_st_lpn(FRI_ST_REQUEST);//启动 friend request
				if(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的方式来实现更加合理

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值