一、配网过程事件处理

1.1 配网发送广播状态

​ 由于lpn节点支持 pb_gatt_advpb_adv两种广播

1.1.1 pb_gatt_adv发送
  • pb_gatt_adv采用telink_ble的方式,执行广播的流程如下:

    //广播发送过程,由系统回调执行->>app_advertise_prepare_handler()--->>gatt_adv_prepare_handler()---------->>set_adv_provision()----------->>>set_pb_gatt_adv()
  • gatt_adv 广播使能标志 gatt_adv_send_flag

​ 使能gatt_ad广播发送,广播周期:ADV_INTERVAL_MS = 160ms

1.1.2 pb_adv广播发送
  • pb_adv 采用main_loop循环的方式发送 执行流程如下:

    //mesh_pb_adv 广播初始化
    ->>mesh_init_all()
    --->>>beacon_str_init()//beacon loop发送流程
    ->mesh_beacon_send_proc()
    ---->>>unprov_beacon_send()
  • pb_gatt 广播使能标志 beacon_send.en

    用于使能mesh_beacon发送,广播周期:MAX_BEACON_SEND_INTERVAL = 2s

1.2 配网过程中

1.2.1 pb_gatt_adv配网过程

​ 通过手机连接设备,通过gatt方式进行配网

--->>pb_gatt_Write()
---->>>dispatch_pb_gatt()
------------>>>set_dev_key()   //配网成功,保存秘钥key
1.2.2 pb_adv 配网过程
->>app_event_handler_adv()
--->>>mesh_provision_rcv_process()
------------>>>mesh_provison_process()
------------>>>mesh_node_rc_data_dispatch()  //处理mesh数据
---------------------------->>>set_dev_key()   //配网成功,保存秘钥key  即为配网成功
1.2.3 配网成功标志 lpn_provision_ok

通过获取是否保存网络秘钥(net_key)来判断配网是否完成。

lpn_provision_ok = is_net_key_save();// 1: 配网成功  0 :配网失败

二、好友关系建立过程

2.1 建立好友关系时序

上图,定义LPN节点与FN节点消息请求和响应交互的时序。

lpn节点端说明;

  • ReceiveDelay mesh协议参考值为 100ms
  • ReceiveWindow mesh协议参考值 1000ms

FN节点端说明:


好友节点 收到 req请求之后,延时(friend offer delay )通过计算实际的延迟 发送offer 消息。

如果在 1s内收到lpn节点的poll消息任务好友关系建立成功。否则失败。

特别说明:friend offer delay >= 100ms

2.1.1 LPN节点端

​ 好友关系建立成功的时序逻辑解释如下:

​ 第一阶段:发送好友req请求后100ms,开启扫描持续时间为1s,等待好友节点发送offer消息

​ - lpn节点接收成功:进行第二阶段发送poll

​ - lpn节点接收失败,可以重新发起req ,协议规定两次req间隔至少大于 1100ms。

​ 第二阶段:发送poll请求100ms,开启持续扫描模式时间为1s,等到接收upadte消息。

​ - lpn节点1s内接收update成功 ,则表示建立好友成功

​ - lpn节点1s内接收update失败 ,则选择重新建立好友关系,发送req请求。

特别说明:节点可以通过rssi 和接受好友节点的ReceiveWindow 参数 进行选择好友节点。

2.1.2 FN节点端

好友节点 收到 req请求之后,延时(friend offer delay )通过计算实际的延迟 发送offer 消息。

如果在 1s内收到lpn节点的poll消息任务好友关系建立成功。否则失败。

特别说明:friend offer delay >= 100ms

2.2 好友关系掉线时序

​ 好友关系超时断开判断时序,依据消息超时机制判断。

设置的poll超时时间 >= 两个poll的时间间隔

2.2.1 lpn节点端。

多次重试poll消息 在poll超时时间没有响应 终止关系,重新建立好友关系过程。

2.2.2 FN节点端:

​ 在polltimeout 时间之前没收到 好友节点消息 终止好友关系。

2.2.3 代码分析

由于这部分代码不开源,无法分析完整消息流程。

部分流程分析:

  • 接受好友offer消息回调处理/与未接受好友消息的处理:
//结构体原形:
typedef struct{u16 LPNAdr;u16 FriAdr;mesh_ctl_fri_req_t req;  mesh_ctl_fri_offer_t offer;mesh_ctl_fri_poll_t poll;mesh_ctl_fri_update_t update;u8 link_ok;   //好友关系状态标志
}mesh_lpn_par_t;lpn_rx_offer_handle()
{//主要选择合适的好友节点,给全局好友节点消息结构体,mesh_lpn_par。mesh_lpn_par.FriAdr = p_nw->src;  //选择合适好友节点地址
}lpn_no_offer_handle()
{//lpn节点 再次发送好友请求。
}
  • 在由系统根据 mesh_lpn_par, 发送poll消息,等待好友节点update消息。

  • 建立成功回调,friend_ship_establish_ok_cb_lpn()处理,发送低功耗节点订阅消息列表。

  • 建立完成好友关系之后,通过该接口判断好友关系状态:is_friend_ship_link_ok_lpn();

三、LPN节点是否进入睡眠的状态切换过程

​ 整个睡眠过程处理函数如下在mesh_lpn_proc_suspend()函数处理中睡眠分为:

​ suspend mode 睡眠模式和deepsleep retention mode模式

  • 在好友操作指令过程中的 ReceiveDelay 采用的suspend mode 睡眠模式
  • 在大的周期性循环poll请求 采用的是 deepsleep retention mode睡眠模式

//lpn节点睡眠结构体typedef struct{u32 tick_tx;u32 sleep_ms;      //睡眠时间u16 op;            //lpn睡眠前的设备运行状态u8 sleep_ready;    //是否可以进入睡眠,广播发送完成即可进入睡眠准备状态置1,有adv数据发置0
}mesh_lpn_sleep_t;//LPN节点睡眠前的操作状态,op 总共有如下几种参数#define CMD_CTL_ACK                 (0x00)
#define CMD_CTL_POLL                (0x01)
#define CMD_CTL_UPDATE              (0x02)
#define CMD_CTL_REQUEST             (0x03)
#define CMD_CTL_OFFER               (0x04)
#define CMD_CTL_CLEAR               (0x05)
#define CMD_CTL_CLR_CONF            (0x06)
#define CMD_CTL_SUBS_LIST_ADD       (0x07)
#define CMD_CTL_SUBS_LIST_REMOVE    (0x08)
#define CMD_CTL_SUBS_LIST_CONF      (0x09)
#define CMD_CTL_HEARTBEAT           (0x0a)#define CMD_ST_NORMAL_UNSEG         (0xFFF0)
#define CMD_ST_NORMAL_SEG           (0xFFF1)
#define CMD_ST_SLEEP                (0xFFF2)
#define CMD_ST_POLL_MD              (0xFFF3)  //消息接收

请求好友关系:LPN发送好友REQUEST , 此时lpn_sleep.op = CMD_CTL_REQUEST

​ 函数进入 suspend_handle_wakeup_rx()处理,此时函数进入 suspend mode 睡眠模式

​ 睡眠 sleep_ms 唤醒,执行扫描程序,等待接受offer消息。

接受好友offer消息:接受好友offer消息, 发送poll消息 lpn_sleep.op = CMD_CTL_POLL

​ 函数进入 suspend_handle_wakeup_rx()处理,此时函数进入 suspend mode 睡眠模式

​ 睡眠 sleep_ms 唤醒,执行扫描程序,等待接受update消息。

接受好友update消息:接受完成,则好友关系建立,进入lpn_sleep.op = CMD_ST_SLEEP,则程序进入

​ suspend_handle_next_poll_interval(),进入长睡眠,睡眠模式为deepsleep retention mode,poll周期唤醒执行poll消息处理。

poll消息请求: 执行poll消息请求过程 ,收到好友节点响应消息为MD=0的消息,则重新执行poll消息,执行新的 睡眠周期。

如果好友关系建立失败:设备睡眠操作模式为:lpn_sleep.op = CMD_ST_SLEEP,程序也会进入

​ suspend_handle_next_poll_interval()进入长睡眠 周期性执行好友REQ请求消息。

ble mesh 学习笔记(9)telink的mesh-lpn代码分析相关推荐

  1. PCIe学习笔记之MSI/MSI-x中断及代码分析

    本文基于linux 5.7.0, 平台是arm64 1. MSI/MSI-X概述 PCIe有三种中断,分别为INTx中断,MSI中断,MSI-X中断,其中INTx是可选的,MSI/MSI-X是必须实现 ...

  2. ble mesh学习笔记(10)mesh网络各种key的应用

    一.网络密钥(Network Key) 应使用符合核心规范要求的随机数生成器生成. 网络密钥层次结构的图示如图所示. 1.用NID EncryptionKey PrivacyKey 来对mesh网络数 ...

  3. 学习笔记-第十二章 恶意代码分析实战

    第12章 隐蔽的恶意代码启动 1.启动器启动器是一种设置自身或其他恶意代码片段以达到即使或将来秘密运行的恶意代码.启动器的目的是安装一些东西,以使恶意行为对用户隐蔽.启动器经常包含它要加载的恶意代码. ...

  4. 学习笔记-第十四章 恶意代码分析实战

    第十四章 恶意代码的网络特征 1.网络应对措施. 网络行为的基本属性包括IP地址,TCP端口,以及流量内容等,网络和安全 设备可以利用它们,来提供网络应对措施.根据IP地址和端口,防火墙和路由器可以限 ...

  5. ESP32_WIFI MESH学习笔记4 MESH网WIFI桥接

    ESP32_WIFI MESH学习笔记4 MESH网与WIFI桥接 前言 在PlainlessMEH库的帮助下,我们很容易就建立了一个WIFI_MESH网络,但只是一个单一网络.本文计录使用WIFI ...

  6. ESP32 WIFI MESH学习笔记7-物联网与控制(ESP32部分)

    ESP32 WIFI MESH学习笔记 文章目录 前言 一.服务器部分 二.ESP32部分 1.引入例子 2.修改用户名称及密码 3.初始化IOT登陆信息 4.初始化 5.侦听函数 6.主函数 7.子 ...

  7. ESP32_WIFI Mesh学习笔记1---Ardino IDE 环境配置

    ESP_WIFI MESH学习笔记1-Ardino IDE 环境配置 文章目录 ESP_WIFI MESH学习笔记1---Ardino IDE 环境配置 前言 一.Arduino IDE配置问题 二. ...

  8. python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据

    但是很多时候数据是非线性的,所以这篇文章主要讲述逻辑回归及Sklearn机器学习包中的LogisticRegression算法 #2018-03-28 16:57:56 March Wednesday ...

  9. Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据

    #2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...

  10. Ui学习笔记---EasyUI的EasyLoader组件源码分析

    Ui学习笔记---EasyUI的EasyLoader组件源码分析 技术qq交流群:JavaDream:251572072   1.问题1:为什么只使用了dialog却加载了那么多的js   http: ...

最新文章

  1. 《Mysql数据库及应用》_MySQL数据库及应用
  2. 很多人都在埋怨没有遇到好的团队,但好的团队不可能凭空出现,一流的团队不能仅靠团队成员努力,作为Leader,要有可行的规划,并坚定地执行、时势地调整(转)...
  3. memcached java 多线程_springboot使用memcache缓存
  4. VMware-workstation-6.0 安装系统前必须映射光驱盘符
  5. php wordpress 开源,PHP 遭弃用!WordPress.com 开源并转用 Javascript
  6. JSP关于Frameset的简单用法
  7. Discuz! 在线中文分词、关键词提取服务
  8. 编程高手必学的内存知识01:深入理解虚拟内存
  9. C++ + Irrlicht整一个东东?
  10. XAF应用开发教程(七)外观控制模块
  11. Oracle12c错误01017,ORACLE12.2中用户无法登陆报ORA-01017的解决办法
  12. librtmp linux下 编译,LibRtmp编译并导入Android Studio
  13. bzoj #1854 游戏(二分图匹配)
  14. java对数组进行排序
  15. 物联网(IoT)及其未来应用方向
  16. 实现简单的自定义音乐播放器
  17. 计算机网络基础课内实验报告答案,计算机网络基础课内实验报告-20210418131414.docx-原创力文档...
  18. ENSP彻底卸载干净仅需几步
  19. Particle Swarm Optimization粒子群优化算法(PSO算法)概念及实战
  20. python 语音特征提取_使用python实现语音文件的特征提取方法

热门文章

  1. 五类/超五类/六类/超六类/七类等多类网线的比较
  2. PHP利用有道智云提供的API接口来翻译字符串
  3. FDM3D打印技术原理简析
  4. 《非暴力沟通》-马歇尔·卢森堡
  5. 为资产分类定义折旧范围_2广东省农村集体经济组织固定资产分类及折旧办法(4月15日)...
  6. GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857
  7. 广东电信在线人工服务器,202.96.128.86广东电信DNS故障及解决方法
  8. 富士施乐3065扫描教程_富士施乐打印机3065怎么连接电脑扫描
  9. 均值(average)与期望(mean)
  10. iOS 【陀螺仪 自身旋转角水平面夹角 问题】