【IoT】产品设计之 BLE 蓝牙连接不稳定的原因和处理方法

简介: BLE基础

设计 BLE 相关产品时经常会遇到连接突然断开的情况,比如刚连接上就断开、连接成功之后传输数据随机断开。

一般有四种原因:

天线匹配、芯片兼容性、连接参数以及代码逻辑。

1、天线匹配

一般严格按照官方 DEMO 板的参考设计不会有什么问题,但为了适应自己板子的要求做了一些修改,会造成天线匹配问题、信号不稳定、信号范围小等问题,最终导致连接的不稳定。

这个就需要做阻抗匹配、找天线厂家匹配天线等。另外晶振参数(尤其是频偏)也可能影响到 RF 射频的性能,所以选用晶振的时候最好使用官方 DEMO 板建议的晶振或者相同参数的晶振代替。

2、芯片兼容性

通过调节连接参数进行改善,如果还不行就只能换一个芯片试一下,或者直接找原厂的 FAE 支持。

以上两个原因是硬件问题,需要具体调试解决。

3、连接参数

广播间隔、最大连接间隔、最小连接间隔、连接监听时间等都会影响连接的稳定性。

4、代码逻辑

一般有两种情况,一个是刚连接就断开,在连接成功之后执行的一些代码有问题,直接排查连接之后执行的函数即可。

另一种情况就是连接成功之后,可以传输数据,但是会随机断开,有时候连接很稳定。

尤其对于定时发送数据的时候,当把时间间隔调的长一点时,稳定性明显提高;

时间间隔短的时候稳定性就明显降低,出现这种情况是因为 BLE 将数据发送出去之后需要收到底层的确认信号才能进行下一次发送,如果在没有收到底层的确认信号就调用发送函数会报错,从而触发看门狗复位导致断开连接。

在高数据率通信的情况下,调用 BLE 发送函数之后,一定要在收到底层的确认信号之后才能再次调用 BLE 发送函数进行下一次数据的发送。

以 NRF52832 的蓝牙串口例程为例,当我们调用发送函数 ble_nus_string_send 发送函数发送数据之后,如果发送成功则会进入 ble_nus_on_ble_evt(串口服务的 ble 事件中断),该函数中有一个事件为发送完成 BLE_GATTS_EVT_HVN_TX_COMPLETE。

对于以上问题可以优先排除连接参数和代码逻辑问题,因为这些修改容易、成本低。

如果问题依然存在就是天线、兼容性的问题了,后面再集中精力去解决。最后,如果有条件直接联系原厂的技术支持是最好的。

5、其他异常断连

BLE 通信过程是建立在连接基础之上的,按角色不同可以分为蓝牙主设备、蓝牙从设备,也叫中央设备和外围设备,一次蓝牙通信,通常由主机发起,从机响应。

2019052118380576.png

上图中,设备 A 是蓝牙主机,B 是蓝牙从机,BLE 的连接过程,大致分为 6 个步骤:

1)主机进入连接态,侦听待连接设备的广播包,如果在指定时间内没侦听到,会导致连接超时,这个时间由开发者指定;

2)主机成功接收到从机的广播包;

3)主机发送一个连接请求包;

4)主机发出连接请求包后,不管从机有没有收到,都会立即转入连接状态,同时报给用户层一个“已连接上”的消息,也就是图中的 4A。

如果从机能收到这个连接请求包,则从机也立即转入连接状态,并报给用户层一个“已连接上”的消息。

如果从机未能收到连接请求包,则不会发 4B 的消息。

5)主机随即发送一个同步包;

6)从机收到同步包后,回给主机一个同步包,然后不停循环 5 和 6 两个步骤,连接才是真正建立了。

如果 5 和 6 任何一个包丢失,都会导致连接建立失败,报 0x3e 的断开原因。

丢失第 5 步或者第 6 步的数据包,导致连接建立失败。

而这两个包丢失,通常发生在周围存在很多蓝牙设备,导致信道十分拥挤的情况下。

通过在空旷无多余蓝牙设备的地方实验发现,出现这个现象的概率大大降低,由此验证了这个推论。

当周围蓝牙设备不可避免地过多时,应用层可以通过多次重连来规避这个问题。

卫朋

人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。

卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。

文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。

相关文章
|
3月前
|
物联网 Linux C#
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
微软的开源跨平台框架 Uno Platform 支持使用 C# 和 XAML 一次性编写代码并部署至多个平台,如 Windows、macOS、Linux、WebAssembly 及 iOS/Android,这使其成为 IoT 设备开发的理想选择。本文通过创建控制网络 LED 灯的应用,详细介绍了 Uno Platform 的环境搭建及 MQTT 客户端配置过程,实现了 LED 状态订阅与控制指令发送功能。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
317 58
|
2月前
|
物联网 Linux Android开发
一键掌控未来!用 Uno Platform 打造跨平台 IoT 应用,轻松连接你的智能设备,让生活更智能!
本文通过具体案例介绍了如何使用微软的开源框架 Uno Platform 实现与 IoT 设备的集成。Uno Platform 支持一次编写、多平台部署,适用于 Windows、macOS、Linux、WebAssembly 及 iOS/Android。本例创建了一个控制网络 LED 灯的应用,详细说明了环境搭建、MQTT 客户端配置、主题订阅及控制指令发送等步骤。该案例展示了 Uno Platform 在 IoT 领域的潜力及其跨平台优势,未来可扩展至更多设备类型,构建智能家居系统。
91 0
|
4月前
|
存储 SQL JSON
【Azure IoT Hub】从设备端如何向IOT发送海量数据,可以使用从设备到IoT连接的直接传输吗?如何把IoT Hub中的数据存储到Azure Storage中?
【Azure IoT Hub】从设备端如何向IOT发送海量数据,可以使用从设备到IoT连接的直接传输吗?如何把IoT Hub中的数据存储到Azure Storage中?
|
7月前
|
消息中间件 弹性计算 物联网
【阿里云弹性计算】阿里云ECS在IoT领域的应用:支撑大规模设备连接与数据处理
【5月更文挑战第26天】阿里云ECS是弹性计算服务,支持IoT设备的连接与数据处理。通过MQTT协议实现设备快速接入,配合消息队列处理异构实时数据。ECS可用于部署数据处理工具、应用服务,如智能家居控制系统,通过弹性伸缩适应负载变化。结合阿里云其他服务,ECS为IoT提供完整解决方案,助力企业数字化转型。
104 0
|
7月前
|
安全 物联网 Android开发
安卓物联网(IoT)应用开发:连接物理世界
【4月更文挑战第14天】本文探讨了安卓平台在物联网应用开发中的角色,强调了设备连接性、数据处理、用户界面、安全性和可扩展性五大关键点。通过举例说明了一个智能家居应用的开发流程,涉及通信协议、用户界面设计、数据安全及可扩展性的实现。安卓物联网应用开发结合了多领域知识,为创造智能、安全的生活解决方案提供了广阔空间。
501 2
EMQ
|
传感器 算法 网络协议
MQTT 客户端自动重连最佳实践|构建可靠 IoT 设备连接
本文介绍在MQTT客户端代码实现过程中,自动重连逻辑设计的重要性与示例,帮助读者设计更为合理的重连代码,构建更加稳定可靠的物联网设备连接。
EMQ
1177 0
MQTT 客户端自动重连最佳实践|构建可靠 IoT 设备连接
|
存储 网络协议 物联网
|
运维 物联网 机器人
阿里云入选Gartner CPaaS全球代表服务商 IoT连接能力受关注
阿里云此次入选CPaaS代表性服务厂商,IoT连接能力是其重要指标。
220 15
阿里云入选Gartner CPaaS全球代表服务商 IoT连接能力受关注
下一篇
DataWorks