在调试公司项目中的蓝牙生理传感器(该传感器为Peripheral,连接上Central后等待pc机端指令,指令到达将Peripheral中采集到的生理数据经由Central传输到PC端)过程中,遇到一个问题,主从机连接上后,Server接收到指令向Client发送数据,这是突然将Server重启,重新与Client连接上后,接收到PC端指令,Server开始发送数据,出现Server每发送一组数据,Client都会接收到两组相同的数据,连续进入到ble_nus_c_evt_handler函数两次。

       分析:

     (1)经过几次咨询与讨论,了解到,有之前的同事在做从机不做主机的情况下直接与手机app端对接,将从机重新启动,然后从机每发送一组数据,手机app端就会接收到两组。经过安卓app工程师,修改bug了解到,从机重新启动断开连接后,手机app需要关闭一个相关的通知,下一次重启之后才不会接收到两组数据。

     (2)若是这类问题无法解决,可以强制屏蔽此类问题。

       解决过程:

     (1)参考分析(1)中的问题,由于自己是蓝牙方面的小白,身边也没有什么技术上真正的懂这方面的,所以只能在艾克姆用户讨论群中,分享自己的问题,并向大佬请教,可是群里的管理员说自己并没有遇到此类的问题;所以我向管理员要了他说过的没有出现过这类问题的例程,一个一对多主机程序和一个从机程序,两个从机串口助手端  都以2hz的速度自动发送数据, 主机的串口助手端也是可以以4hz接收到两个从机的数据,这个时候我将从机A断开, 主机串口端  一开始 会以2hz的速度接收从机B的数据,过了大概3秒左右,主机的串口助手又以4hz的速度接收数据 ,而且是主机是接收到从机一次的数据,它串口连续发送两次 连续进入

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_ble


这个函数也是两次。说明这不单单是我自己存在这个问题。

ble_nus_c_evt_handler函数中的BLE_NUS_C_EVT_DISCONNECTED位置中,当我将其中一个从机断开连接后,主机死机;然后,我又将函数添加到ble_event_handler函数的BLE_GAP_EVT_DISCONNECTED位置中,发现还是主机死机;(经过我的思考,添加到的这两个位置是ble协议栈中的从机断开连接的处理事件的位置,此时在协议栈中可能设置与内核相关的内容,既然如此我就不在你协议栈运行的时候去软件复位,我在主循环中进行处理,当然这只是我的猜测。)  然后我就在ble_nus_c_evt_handler函数中的BLE_NUS_C_EVT_DISCONNECTED位置中,放置一个标志位,当运行从机断开连接,运行到此位置时,标志位置一,然后在主循环中(此时与ble协议栈无关)运行NVIC_SystemReset(),成功复位(看来我的猜测也是比较符合的)。这也是一种解决问题的方式。

       办法:

主要修改的思路是,连接断开后清空客户端的全部参数。如下几幅图这是ble_nus_c.c文件修改位置之前的配置。

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_nrf52832_02

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_nrf52832_03

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_重复发送_04

下几幅图为修改之后的配置:

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_client_05

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_client_06

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_nrf52832_07

Android 蓝牙 写数据提示蓝牙断开 蓝牙已断开连接怎么办_server_08

改好的例程请参考:

                

     (2)根据解决过程(2)主机主动断开蓝牙或者重新启动。可以作为,备选方案。

 

 

注:在主设备与从设备未发生连接之前两个角色分别叫:Central和 Peripheral;连接建立后,角色更变为Client和Server。