ESP32蓝牙mesh多网关方案后续(完整功能)

文接上回,没看过上篇文章可能理解不了这篇 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))

  1. 检查配网节点数量是否为0,不为零才往下走
  2. 解码函数

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。

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值