目录

①初始化及配网过程中出错

②发送模型返回错误代码

③发送方成功,接收方丢包

①初始化及配网过程中出错

1-1.返回错误代码-16,表示给dataflash分配的单个扇区的空间不够,需要加大CONFIG_MESH_SECTOR_SIZE_DEF。

1-2.返回错误代码-2,表示重复配网。对于运用到自配网的例程,烧录代码时没有清空dataflash,易见此错误。更改配网信息,直接调用bt_mesh_provision()不能覆盖原有的网络信息,会报错-2;需要调用bt_mesh_reset重置一下节点,再调用bt_mesh_provision()函数来配网;或者擦除datafalsh后,调用SYS_ResetExecute()复位一下从头运行配网。

1-3.配网连接关闭,返回原因9,表示超时。检查一下信号是否正常,若信号良好的情况下必定复现,检查一下配网器与未配网设备再app_mesh_config.h中的CONFIG_MESH_UNSEG_LENGTH_DEF宏是否一致。如果需要兼容标准mesh协议,CONFIG_MESH_UNSEG_LENGTH_DEF需要设置为7。

1-4.启用了flash存储功能后,dataflash中保存的网络信息,会在运行到blemesh_on_sync过程中的settings_load函数时恢复。如果发现代码运行到settings_load时进入了死循环,通常意味着dataflash被篡改,检查一下是否有代码破坏了dataflash中保存的数值。如果dataflash被误修改,排查一下原因后再烧录时清空dataflash或者再代码中擦除datafalsh即可。

在代码中,mesh初始化之前,调用EEPROM_READ函数,可以打印flash中保存的配网信息情况。打印出的是已经解密的内容,可以查看保存的数值是否正确。默认mesh协议栈占用的dataflash首地址从0开始,占用3个扇区,每个扇区大小4K,配网信息只占用最前面的部分,即默认保存在dataflash首地址起往后的200个字节内。

settings_load函数中没有判断配网信息是否合法的过程,可以在运行到settings_load前自行添加判断。比如说对于自配网代码,在codeflash中保存一个数值,如果dataflash中的网络信息与codefalsh中的数值不一致,则清空dataflash,重新配网。再比如说配网时规定好了net key带有奇偶校验(奇偶校验附加数据保存在另外的dataflash区域),那恢复前检查一下net key是否复合原先的奇偶校验。最保险还是用一个定时器来监控,类似看门狗,长时间卡死就清空dataflash然后复位。

②发送模型返回错误代码

常见错误代码可以在《沁恒低功耗蓝牙MESH软件开发参考手册.pdf》中7.1.2小节查到。

2-1.返回错误代码-1,表示找不到发送参数或者参数非法。

如果发送方是非配网器的节点,检查一下模型的app key是否成功绑定。可以在代码中读dataflash打印出来看看数值是否正常,如上,或者利用ISP工具读dataflash查看是否保存网络信息。保存网络信息的数据的起始位置由CONFIG_MESH_NVS_ADDR_DEF这个宏决定,默认是0。可以利用ISP工具读dataflash查看实际写在dataflash中的数值。不过由于涉及加密,实际写的数值与应用层看到的数值不同,右边解密后的ascii码只能看出有没有保存,实际写的的数值是否正确直接看hex是看不出的。

如果发送方是配网器,还需要再关注一下串口打印,或者轮询app_nodes结构体数组的node_addr成员,检查一下有没有给目标地址配网,有可能找不到目标地址。

2-2.返回错误代码-4,表示当前已有一个流程正在执行,需要等待其执行完毕。

2-3.返回错误代码-7,表示发送缓存已满。上层每调用单次发送,会占用一个Net数据缓存,底层发送完成后自动释放。可以调大app_mesh_config.h中的CONFIG_MESH_ADV_BUF_COUNT_DEF或者等待底层发送完成后再发下一则消息。

2-4.返回错误代码-9,表示内存占用已满,需要扩大给蓝牙库分配的大小即BLE_MEMHEAP_SIZE,注意该值会占用ram,也不宜过大。

③发送方成功,接收方丢包

建议两蓝牙mesh节点的布置距离在100m以内,如果距离太远且没有中继,或者TTL数值不够没有中继到,或者干扰太大,真的没收到包,那没办法在代码层面处理。如果收发双方距离适当,检查接收方是否真的“丢包”,就需要查看一些底层参数。蓝牙mesh不走连接,所有通信数据最终都走广播发出,需要一套机制来过滤消息,故存在有底层能够解析消息包,但被判断无需上报的情况。

3-1.检查一下发送方的seq num是否正常,发消息时的seq num是否在前一则消息的seq num上+1。接收方会记录发送方的历史消息的seq num,若接收方判断此刻收到的消息的seq num不比缓存的历史消息的seq num大,则判断其为过往消息,不再处理,也就不会上报。最新EVT中包含有查询seq num和设置seq num的接口函数。设置目标seq num时,除了要小于0xb0e500外,还要比当前seq num数值大。

3-2.检查一下接收方的tid,与seq num类似,每则消息都需要tid值自+1。如果收到消息时的tid一直解析为同一个数值,该消息会被判断为重复消息而不上报。可以在app_vendor_model_srv.c 中打印tid值。如果一直重复,需要检查一下发送方发消息时的发送参数是否设置有误。

3-3.IV值不同步也会造成接收方不再上报消息。待配网节点,需要配网器为其配网时,设置IV值为正在工作的网络中的IV值;待自配网节点,需要第三方介入,获取一下当前网络中的IV值,传递给自配网节点后进行自配网。最新EVT中包含了获取IV值的接口函数。若发现某一方的IV值与网络中的不一致,需要重新配网以设置IV值。

蓝牙mesh组网实践(常见调试问题整理)的更多相关文章

  1. 常见无线组网分析(NB-IOT组网和Mesh组网)

      NB-IOT LoRa Zigbee WIFI 蓝牙 组网方式 基于现有蜂窝组网 基于LoRa网关 基于Zigbee网关 基于无线路由器 居于蓝牙Mesh的网关 网络部署方式 节点 节点 + 网关 ...

  2. SIG蓝牙mesh笔记2_mesh组成

    目录 SIG 蓝牙 mesh 组成 mesh网络概述 网络和子网 设备和节点 devices & nodes 入网 mesh中的几个概念 智能插座例子 SIG 蓝牙 mesh 组成 mesh网 ...

  3. [蓝牙前沿应用] 照明即平台 —— 通过蓝牙增强服务提高照明投资回报率(蓝牙MESH、定位AoA、AoD)

      1.照明即平台(LAAP) 随着照明设施向LED转型,他们也在利用类似于蓝牙MESH的技术,创建一个可连接的照明平台,作为他们建筑的中枢神经系统.这些系统除了提供先进的照明控制,还建立了一个增强版 ...

  4. Tengine HTTPS原理解析、实践与调试【转】

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  5. 《Visual C++ 2010入门教程》系列六:VC2010常见调试技术

    <Visual C++ 2010入门教程>系列六:VC2010常见调试技术   犹豫了好久,最终还是决定开始这一章,因为我不清楚到底有没有必要写这样的一章,是应该在这里说明一些简单的调试方 ...

  6. PHP 中使用ajax时一些常见错误总结整理

    这篇文章主要介绍了PHP 中使用ajax时一些常见错误总结整理的相关资料,需要的朋友可以参考下 PHP作为后端时,前端js使用ajax技术进行相互信息传送时,经常会出错误,对于新手来说有些手足无措.总 ...

  7. CSS常见布局问题整理

    实现div的水平居中和垂直居中 多元素水平居中 实现栅格化布局 1. 实现div的水平居中和垂直居中 实现效果: 这大概是最经典的一个题目了,所以放在第一个. 方法有好多, 一一列来 主要思路其实就是 ...

  8. 蓝牙mesh介绍

    了解一下关于蓝牙Mesh的知识. 蓝牙mesh网络使用,并且依赖于低功耗蓝牙(BLE).低功耗蓝牙技术是蓝牙mesh使用的无线通信协议栈. 蓝牙BR / EDR能够实现一台设备到另一台设备的连接和通信 ...

  9. 解密蓝牙mesh系列

    解密蓝牙mesh系列 https://mp.weixin.qq.com/s/KdVhkgcmHIboA0xPFqFCgQ 1.NRF52832 & NRF52840 BLE mesh 协议栈 ...

  10. 蓝牙mesh网络技术的亮点

    蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...

随机推荐

  1. 【转】C#接口知识

    参考:日常收集 C# 接口知识 (知识全面) 目录 第一节 接口慨述 第二节 定义接口 第三节 定义接口成员 第四节.访问接口 第五节.实现接口 第六节.接口转换 第七节.覆盖虚接口 第一节 接口慨述 ...

  2. 代码小DEMO随笔---不经过后端接口,JS上传文件读取文件,展示到页面提供下载功能

    如果文件不大的话,我们可以不经过后端的接口,直接进行文件保存与展示下载~~ 目前,IE8.Firfox.Chrome.Opera浏览器都支持这种小文件嵌入. 好处:节省了一个HTTP 请求. 坏处:就 ...

  3. 痞子衡单片机排行榜(2022Q4)

    痞子衡单片机排行榜(2022Q4) 继2020年开办的<痞子衡嵌入式半月刊>之后,从2023年1月份开始痞子衡将为大家带来新项目<痞子衡单片机排行榜>(一年分四季,每个季度发布 ...

  4. 使用 NineData 高效编写 SQL

    SQL 是 Structured Query Language 的缩写,中文翻译为"结构化查询语言".它是关系型数据库的标准语言,所有的关系型数据库管理系统(RDBMS),比如 M ...

  5. .Net 7 高端玩法,自定义一个CLR运行时

    前言: 曾几何时,一直想自己定制一个CLR运行时玩玩.满足下技术控的虚荣心,本篇带你一步一步打造一个属于自己的.Net 7运行时. 概括 假设你的电脑已经安装了.Net,并且运行正常.在进行自定义运行 ...

  6. Django-request、django连接数据库、ORM

    1.静态文件配置 1.静态文件:不经常变化的文件,主要针对html文件(CSS文件.js文件.img文件.第三方框架文件). 2.django针对静态文件资源需要单独开始一个目录统一存放:static ...

  7. redis实现分布式锁(包含代码以及分析利弊)

    redis实现分布式锁(基础版) 使用redis实现分布式锁的方法有多种,基础版本是基于setnx命令,即如果不存在则设置.这个命令可以保证只有一个客户端能够成功设置一个key,从而获得锁.设置key ...

  8. python3中,isinstance() 函数

    #isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). #返回值:如果对象的类型与参数二的类型相同则返回True,否则返回False 使用isinstance函数的实 ...

  9. 安卓逆向 创建自己一个SO库

    要求 1.能调用java中的方法 2.有返回值 如何完成一个SO ? public native String getText(); //第一肯定是得创建一个方法 cmd指令自动生成对应接口 生成完后 ...

  10. JZOJ 【2021.11.10NOIP提高组联考】

    简要题解 这套题比较 \(H_2O\) 建议题目背景美文共赏 \(\text{T1}\) 显然一个 \(O(n^3)\) 不能过的 \(dp\) 然而过了?! 用心在该卡时间的地方卡一卡 \(\tex ...