修改藍牙裝置的名稱,修改藍牙裝置名稱
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命令未能完整發出。
希望得到專業人士的指點。