泰凌微的蓝牙MESH提供的SDK对于二次开发很不友好,废了大量精力整理出数据收发接口以及数据绑定模型等操作,记录笔记
📋 个人简介
- 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎
- 📝 个人主页:欢迎访问我的 Ethernet_Comm 博客主页🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:泰凌微蓝牙 mesh 🍁
- 💬格言:写文档啊不是写文章,重要的还是直白!🔥
【蓝牙mesh】泰凌微 sig_mesh_sdk SDK代码解读
SDK代码研读
蓝牙Mesh开发四 TLSR8258 ble mesh通信测评
数据收发接口
函数接口:
参考 SDK 数据手册 1.5.2
收发包流程图
【数据发送】
sim_tx_cmd_node2node() :定时发送开关命令接口,上电后,每隔 3 秒自动交替发送 ON/OFF 命令
access_cmd_onoff() /*发送开关灯的命令*/
-> SendOpParaDebug() /*通过 op 发送 cmd 命令,去操作所有的 model*/
-> mesh_tx_cmd2normal_primary() /*在 ble mesh 中,给 model 发送 cmd命令*/
-> mesh_tx_cmd2normal()
-> mesh_tx_cmd() /*库函数的 api 接口,再往里就是 协议栈层面了*/
/*数据发送最终的结构体*/
material_tx_cmd_t
【数据接收】
blt_sdk_main_loop ()
会检查 blt_rxfifo
, 如果检测到有数据需要处理,会调用
app_event_handle()
,用户在此回调函数的 if(LL_TYPE_ADV_NONCONN_IND !=
(pa->event_type & 0x0F))
分支下处理收到的可连接广播包即可。
回调处理,当BLE stack
收到各种类型的数据包时,回调函数 app_event_handler()
开始执行,并执行以下4个分支:
HCI_SUB_EVT_LE_ADVERTISING_REPORT: /*接收到,广播数据包*/
-> app_event_handler_adv(pa->data, MESH_BEAR_ADV, 1);
-> /*协议栈内部处理*/
->mesh_rc_data_layer_access_cb() /*用户接口,接收到ble mesh消息后,回调这个接口*/
/*当 ble mesh中的节点收到消息时,经过一系列的判断,opcode 支持 并且 addr 也匹配,则执行这个回调函数的功能*/
->mesh_rc_data_layer_access_cb()
->p_res->cb() --> mesh_cmd_sig_func[]
-> mesh_cmd_sig_g_onoff_set()
-> g_onoff_set()
-> g_level_set()
->light_g_level_set_idx()
->light_g_level_set()
->light_dim_refresh()
->light_dim_set_hw()
->led_onoff_gpio() /*操作硬件的 GPIO 口实现控制灯的亮灭*/
【数据接收与模型绑定】
描述:发送设备收到一条消息后,接收端是如何找到已经绑定的模型的?
比如:发送者发送消息,目的地址 0xffff,op = G_ONOFF_SET_NOACK , 内容是 G_ON ,物理意义表示开灯
// 发送端数据流程
access_cmd_onoff(0xffff, 0, G_ON, CMD_NO_ACK, 0); //开灯
-> SendOpParaDebug(0xffff, 0, ack ? G_ONOFF_SET : G_ONOFF_SET_NOACK, (u8 *)&par, par_len); // G_ONOFF_SET_NOACK 是定义好的 op
-> mesh_tx_cmd2normal_primary(op, par, len, 0xffff, rsp_max); // 目的地址为 0xffff,表示广播,op = G_ONOFF_SET_NOACK ,表示操作这个地址下特征(灯开关)
// 接收端数据流程
/********************** (1)第一步:首先进入回调函数,判断信息 *************************************************/
mesh_rc_data_layer_access_cb(u8 *params, int par_len, mesh_cb_fun_par_t *cb_par){
cb_par->op; // 先判断【op操作码】以及【地址】是否符合规范
p_res->cb(); // 判断回调函数是 来自于以下哪两个数组 mesh_cmd_sig_func[]:标准 op mesh_cmd_vd_func[] :用户自定义 op*/
}
/********************** (2)第2步:通过参数类型,找到op对应的回调函数 *************************************************/
// 通过第一步的 p_res->cb(params, par_len, cb_par); op = G_ONOFF_SET_NOACK ,找到对应的回调函数
/*
CMD_YS_STR(G_ONOFF_SET_NOACK, 0, SIG_MD_G_ONOFF_C, SIG_MD_G_ONOFF_S, mesh_cmd_sig_g_onoff_set, STATUS_NONE),
// 回调函数为: mesh_cmd_sig_g_onoff_set
*/
/********************** (3)第3步:执行回调函数的功能 *************************************************/
->mesh_cmd_sig_g_onoff_set(u8 *par, int par_len, mesh_cb_fun_par_t *cb_par)
-> g_onoff_set(p_set, par_len, 0, cb_par->model_idx, cb_par->retransaction, &pub_list) // 这里有 cb_par->model_idx 这个参数,表示模型索引号
-> g_level_set() // 在 light_model.c 中
->light_g_level_set_idx() // 在 light.c 中
->light_g_level_set()
-> light_res_sw_g_level_set() // 将接收到的数据信息放在数组中
-> light_dim_refresh() // 刷新信息
->light_dim_set_hw()
->led_onoff_gpio() /*操作硬件的 GPIO 口实现控制灯的亮灭*/