最近公司固件工程師在調試時發現一個問題,藍牙設備和安卓APP可以正常通訊,但是和iOS APP總是傳輸數據超時,之後斷開連接,應該是程式問題,之前遇到過一次,但是只有那一次,想偷下懶所以就沒改,這次又出現了就不得不改了。用xcode運行項目,打開log,在 方法中輸出了接收到的數據,發現接收到的數據 ...
最近公司固件工程師在調試時發現一個問題,藍牙設備和安卓APP可以正常通訊,但是和iOS APP總是傳輸數據超時,之後斷開連接,應該是程式問題,之前遇到過一次,但是只有那一次,想偷下懶所以就沒改,這次又出現了就不得不改了。用xcode運行項目,打開log,在
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error
方法中輸出了接收到的數據,發現接收到的數據總長度時對的,但是分包發送每次接收到的數據長度和其他的設備不一樣,而代碼裡面寫的是按照分包的長度來接收的,所以就導致最後拼接的數據不對,那就需要改動了,雖然這部分代碼已經用了一年多了,那也沒辦法,有問題必須得改呀。
根據log看岀接收到的數據格式是這樣的:5b24xxxx 5b05xxxx,其中第一位元組固定為5b,第二位元組為本次發送數據總長度。如果有36位元組數據,分3次接收10+10+10+6,然而部分讀卡器不是按照這種順序發的,可能是9+8+9+9+1這樣發的,所以就不能根據固定長度來接收數據。
每次接收數據前先清空之前的數據:
self.receiveData = [[NSMutableData alloc] initWithCapacity:50];
然後接收數據,並拼接到receiveData中:
[_receiveData appendData:characteristic.value];
每次接收完數據都檢查receiveData,看其長度是否等於第一個位元組:
if (bytes[1] == 0x24 && _receiveData.length == 0x24 && [BLEUtil verifyReceivedData:_receiveData]) {}
如果等於表明本次數據接收完畢,檢查數據格式是否正確,如果正確再繼續下麵的操作。
這樣只判斷數據總長度就可以了,不用判斷分包接收的數據,完美解決上面的問題。