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