【泰凌微蓝牙mesh】泰凌微 sig_mesh_sdk SDK代码解读

泰凌微的蓝牙MESH提供的SDK对于二次开发很不友好,废了大量精力整理出数据收发接口以及数据绑定模型等操作,记录笔记

📋 个人简介

SDK代码研读

TLSR_8258开发之路:①蓝牙中文扫描响应包的设置方法

蓝牙Mesh开发四 TLSR8258 ble mesh通信测评

蓝牙mesh系统开发二 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 口实现控制灯的亮灭*/        
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值