文章目录1、SDK 概述1.1 SDK的文件架构1.2 入口函数1.3 BLE协议栈收发包处理1.4 Mesh应用 收发处理1.4.1 发包1.4.2 收包1.5 发包流程简介1.6 收包流程简介1.7 SIG Mesh 信道1、SDK 概述SDK 给用户提供基于 SIG_Mesh 协议应用开发的 demo code用户可以在这些 demo code基础上开发自己的应用程序。目前工程适用的芯片是 TLSR82692016.1.16。负责上位机通信的芯片是8267或者8269。1.1 SDK的文件架构SDK的文件架构分为app应用层和BLE SIG_mesh协议层。当导入工程文件后显示的文件架构如下图所示。有3个主要的顶层文件夹projproj_libvendor。1、proj提供MCU相关的外设驱动程序如 flashi2cusbgpiouart等。2、proj_lib提供MCU运行所必须的库文件包括 BLE协议栈、RF驱动、PM驱动等这部分是以库文件形式提供的user 无法看到源文件。比如序号库文件描述1liblt_8269_mesh.a蓝牙协议栈的库文件2libsig_mesh.a普通节点的库文件3libsig_mesh_LPN.aSIG_Mesh中的低功耗节点的库文件4libsig_mesh_prov.aSIG_Mesh中的Provision节点的库文件3、vendor存放 用户应用层代码。vendor目录下8267_master_kma_dongle上位机测试 使用固件配合上位机工具可以作为一个Provisioner的角色用于演示和debug。common主要包含了mesh/mesh_lpn/mesh_provision/mesh_switch中共用的模块例如 led部分出厂初始化测试命令等模块。mesh/mesh_lpn/mesh_provision/mesh_switch这4个文件夹的结构一样都包含了 app.capp.happ_att.capp_config.hmain.c。序号文件描述1app.capp.h主要是初始化和底层回调功能2app_att.c蓝牙att表的描述以及接口函数的说明3app_config.h定义工程中对应的宏和声明4main.c主函数和中断函数的入口具体的函数接口部分详见第3章中关于各个文件的介绍。1.2 入口函数intmain(){FLASH_ADDRESS_CONFIG;cpu_wakeup_init();//mcu硬件初始化用户不关心clock_init();//时钟初始化用户可以在 user_config.h 里面修改配置set_tick_per_us(CLOCK_SYS_CLOCK_HZ/1000000);//时钟初始化gpio_init();//gpio初始化用户可以在 user_config.h 里面修改配置rf_drv_init(CRYSTAL_TYPE);//RF初始化用户不关心user_init();//ble初始化系统初始化用户自定义初始化irq_enable();//使能全局中断while(1){#if(MODULE_WATCHDOG_ENABLE)wd_clear();#endifmain_loop();//1.ble收发处理 2.低功耗处理 3.用户自定义处理}}1.3 BLE协议栈收发包处理在lib中实现用户不用关心。如果有需要用户可以参考 my_Attributes_provision[] / my_Attributes_proxy[] / my_Attributes[] 定义自己定制 BLE service。1.4 Mesh应用 收发处理1.4.1 发包节点之间发包调用 mesh_tx_cmd2normal_primary()该函数具体用法后面介绍。此方式发送的数据遵循SIG_ Mesh协议。access_cmd_onoff() 等命令是对 mesh_tx_cmd2normal_primary() 进行封装而来。开发者可以启用 sim_tx_cmd_node2node() 来进行发送命令的演示该函数默认是屏蔽的效果是上电后每隔3秒自动交替发送ON/OFF命令。详见后续对该函数的说明。直连节点发给 Master调用 bls_att_pushNotifyData()用于发送客户任意自定义格式的数据。注意需要新增UUID然后才能用该方式否则可能会和当前UUID的协议冲突。HCIUSB/UART上报数据my_fifo_push_hci_tx_fifo(u8*p,u16 n,u8*head,u8 head_len)p指向所发数据地址 n数据长度 head标识头 len标识头长度没有则填0调用 my_fifo_push_hci_tx_fifo(u8 *p, u16 n, u8 *head, u8 head_len) 往 hci_tx_fifo 送数据在发送回调函数里会把 hci_tx_fifo 的数据送出去。回调函数在 user_init 里注册UART:blc_register_hci_handler(blc_rx_from_uart,blc_hci_tx_to_uart)USB:blc_register_hci_handler(app_hci_cmd_from_usb,blc_hci_tx_to_usb)1.4.2 收包Mesh 数据的接收通过回调函数通知应用层用户需要在初始化阶段注册对应的回调处理函数。1.节点之间收包adv-bearer 接收当节点收到其他 mesh 节点发来的数据包时协议栈会调用用户注册的 mesh 数据处理回调。用户需要在 user_init() 中调用类似 mesh_cb_func_register(mesh_rx_callback) 注册回调函数。回调函数示例voidmesh_rx_callback(u8*p_payload,u16 len,u32 src_addr,u8 ttl,u8 is_rsp){// p_payload指向接收到的 mesh payload不含网络层头部// lenpayload 长度// src_addr源地址// ttl当前包剩余跳数// is_rsp是否为响应包// 用户在此解析 opcode 与参数执行相应动作}2.直连节点收到 Master 的数据gatt-bearer 接收当手机或上位机通过 GATT 连接向节点写入数据时协议栈会触发相应的 attribute 写回调。用户可以在 app_att.c 中的自定义 characteristic 的 write callback 中处理数据例如intmy_char_write_callback(u16 conn_handle,void*p){u8*p_data((rf_packet_att_write_t*)p)-value;u16 len((rf_packet_att_write_t*)p)-len;// 处理收到的数据return0;}3.HCI 接收UART/USB 命令通过 blc_register_hci_handler() 注册的接收函数 blc_rx_from_uart 或 app_hci_cmd_from_usb 会将收到的数据存入 hci_rx_fifo应用层可通过相关 API 读取例如u8 lenmy_fifo_get(hci_rx_fifo,p_buf,sizeof(p_buf));// 解析 p_buf 中的 HCI 命令或数据1.5 发包流程简介以节点间发送 Generic OnOff Set 命令为例发包流程如下应用层调用调用封装好的 access 函数如 access_cmd_onoff(u16 dst_addr, u8 onoff, u8 ack)。access 层打包根据 SIG Mesh 模型规范将 opcode0x82 02和参数onoff 值填入 payload设置必要的传输参数如重传次数、TTL 等。传输层加密与分片transport 层对 payload 进行加密若数据超过 15 字节则进行分段Segmentation。网络层加密与组包network 层添加源地址、目标地址、序列号等信息并进行网络层加密。承载层发送bearer 层将最终数据包通过广播信道ADV或 GATT 连接发送出去。对应 API 为 mesh_tx_cmd2normal_primary()。硬件发送BLE 协议栈将数据交给 RF 驱动通过天线发出。流程图示意用户调用access_cmd_onoff()│ ▼ access 层构建 payload │ ▼ transport 层加密、分段 │ ▼ network 层加密、组网头 │ ▼ bearer 层选择承载方式(adv/gatt)│ ▼mesh_tx_cmd2normal_primary()│ ▼ RF 驱动发送1.6 收包流程简介以节点接收 Generic OnOff Set 命令为例收包流程如下RF 接收中断BLE 硬件收到广播包触发中断将数据交给协议栈。承载层过滤bearer 层检查包类型ADV_NONCONN_IND若为 mesh message 则递交给网络层。网络层解密与验证network 层根据网络密钥解密检查目标地址、序列号防重放攻击及 TTL。传输层重组与解密若为分段包则等待收齐所有分段后重组然后使用应用密钥解密 payload。access 层解析access 层根据 opcode 查找对应的模型回调函数并传入解析出的参数。用户回调执行用户注册的回调函数如 mesh_rx_callback被调用执行相应的业务逻辑如开关灯、回复状态等。RF 接收中断 │ ▼ bearer 层递交给 network 层 │ ▼ network 层解密、检查地址与 SEQ │ ▼ transport 层解密、重组分段 │ ▼ access 层解析 opcode │ ▼ 用户回调mesh_rx_callback()│ ▼ 执行应用逻辑1.7 SIG Mesh 信道SIG Mesh的通信信道分为两种序号承载层功能1adv-bearer通过adv机制实现相互通信的通信双方不需要建立BLE的连接2gatt-bearer通过建立BLE的连接实现通信