VID app具有一个修改当前与其连接的蓝牙设备名称的功能,以添加一些设备个性化的元素。
修改蓝牙设备的名称并不是一件困难的事情,按照手册规定的AT指令通过串口发送到蓝牙设备即可。不过手机要通过蓝牙连接的无线通信方式来修改蓝牙设备的名称,则并不简单。原因在于:
- 手机发送的遵循AT指令格式的数据会被蓝牙当作普通数据内容而传送到单片机;
- 蓝牙设备处于连接的状态下,AT指令并不能完成对设备名称的修改。
解决办法:
- 必须由单片机通过串口来进行AT指令的操作;
- App发送携带有用户输入的自定义名称信息的命令给单片机;然后自动取消蓝牙连接;
- 单片机在解读手机发来的命令后,通过AT指令将蓝牙设备的名称修改为用户所输入的名称。
当中遇到了一个问题,使耗费了两天:
在确保单片机程序的正确性之后,
iOS源代码如下:
-(void) setDevice_Name { [self Bluetooth_Send : command ]; //发送带有用户输入的自定义名称信息的命令command; if ( sensor.activePeripheral.state == CBPeripheralStateConnected) { //判定是否为连接状态 [sensor.manager cancelPeripheralConnection : sensor.activePeripheral ] ; //取消连接 Sensor.activePeripheral = nil; } } |
Ps:蓝牙连接及其它相关操作的代码直接引用了蓝牙模块供应商提供的例程,所以不必提供上来了。
现象是:成功修改蓝牙设备名称的机率极低!
跟踪单片机程序的运行发现:单片机并没有收到手机端发来的命令。
在修改代码之后,代码大意如下:
-(void)setDevice_Name { [self Bluetooth_Send : command ]; //发送带有用户输入的自定义名称信息的命令command; [NSTimer scheduledTimerWithInterval : 1.0f target : self selector : @selector(disconnectBLE) userInfo : nil repeats :NO]; //在延时1s后,执行disconnectBLE; } ? -(void)disconnectBLE { if ( sensor.activePeripheral.state == CBPeripheralStateConnected) { //判定是否为连接状态 [sensor.manager cancelPeripheralConnection : sensor.activePeripheral ] ; //取消连接 Sensor.activePeripheral = nil; } } |
成功实现了修改名称的功能。
作为非计算机/app开发专业人员,未能理解其中的原因。个人猜想为:程序并非在将command发送完成之后才执行取消连接。而是先把command读取到发送缓冲区,在另一线程中进行发送,而取消连接的操作在同步进行,导致command命令未能完整发出。
希望得到专业人士的指点。