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命令未能完整發出。
希望得到專業人士的指點。