文接上回,没看过上篇文章可能理解不了这篇 ESP32和nrf mesh实现子节点共用,即蓝牙mesh设备的跨网关控制-CSDN博客
当我们将AppKey和NetKey统一之后,按理来说就可以完成通信,但是,实际网关收不到子设备发送的信息,网关也无法发消息给子设备。此时,我们需要解决的是消息没发出来还是收不到。
首先,我们先看网关发给子设备的函数接口
err=esp_ble_mesh_vendor_client_set_node(platId,ele_addr,model_id,value,ack);---》》
skyiot_ble_mesh_send_vendor_message(p_model,ele_addr,ESP_BLE_GATEWAY_VEND_CTL,ctx,sizeof(ctx)/sizeof(ctx[0]),0)--》》》;
err = esp_ble_mesh_client_model_send_msg(model, &ctx, vndOpcode,
sizeof(uint8_t)*len, txdata, MSG_TIMEOUT, ack, MSG_ROLE);---》》》
BTC_BLE_MESH_ACT_CLIENT_MODEL_SEND--》》》
bt_mesh_client_send_msg------》》》
bt_mesh_model_send-----》》》
model_send---》》》ready_to_send--》》》
需要先将其屏蔽,后续在修改回来
此时我们发现子设备已经可以接收到网关下发的信息,也就是说发送是没有问题的,因为设备也是使用此发送函数,此时网关还是收不到子设备信息。那么问题就是接收了。
为了追踪接收,我们直接从底层开始追踪
我们经过查找,查找到最底层的接收函数为bt_mesh_scan_cb,根据此函数追踪可得下表
bt_mesh_scan_cb | 接收广播数据最底层 |
bt_mesh_net_recv | net层接收数据处理部分 |
ready_to_recv 1(bt_mesh_provisioner_get_node_count) 2(bt_mesh_net_decode) 2.1(net_find_and_decrypt) 2.2(bt_mesh_elem_find(rx->ctx.addr)) |
2.1 netKey解码 2.2 此处会阻塞消息上报,单播地址,元素,元素数量都在这用于过滤 |
ignore_net_msg (bt_mesh_provisioner_get_node_with_addr) | 查找addr列表 |
bt_mesh_trans_recv | 上面的过滤都通过了,往传输层上抛 |
trans_seg trans_unseg | 未分段消息上抛 分段消息上抛 |
sdu_recv | 再往SDU层抛 |
bt_mesh_app_decrypt(bt_mesh_rx_devkey_get) | //利用appKEY解密 |
bt_mesh_model_recv | 往model层抛,涉及到opcode和appkey什么的了 |
由于上表中的函数ready_to_recv内部存在判断,我们就得到结论,代码底层还存在一个和应用层差不多的列表
进入此获取函数
因为node_count是一个全局变量,可以继续往下走
从函数名及动作可知此函数会增加节点数量,因此继续追
但是这么直接调用底层的函数还有风险,可能上面层还有其他动作,我们继续向上追一下
因为配网过程中会存储重要函数,重要函数接口provisioner_store_node,有下面3个分支调用
1.bt_mesh_provisioner_store_node_info--》ble_mesh_provisioner_add_node(AT指令)
2.bt_mesh_provisioner_provision--》prov_complete(components\bt\esp_ble_mesh\mesh_core\provisioner_prov.c)(应用层抄了一个同名函数)--》
3.bt_mesh_provisioner_restore_node_info--》node_info_set--》p_node_set(串口指令,相当于未使用)
经过分析可知,采用bt_mesh_provisioner_provision最为合适。
此时,函数已经确定,确定参数即可。这么多参数,我们需要具体情况具体分析,就目前的问题而言,devKey对我们接收数据是没什么影响的,可以不用管,其他参数就按照常规的填
关于调用位置:我们一般在手机端添加完成时调用
由于存在节点的增加删除和修改,由于底层并未找到修改函数,我们直接简单粗暴一点先删除在增加(perfect)。
此时,修改已经完成,测试
网关端
至此修改完毕,通信完成。记得最后去除最开始屏蔽的发送判断,同时去除多余LOG。