2012-03-22 64 views
1

我嘗試閱讀和CoreBluetoothCoreBluetooth閱讀的NSData

所以我的設備(外設)寫的東西給我一個陣列 的lenght和陣列爲一體。

我用這種方法

(void)readValueForCharacteristic:(CBCharacteristic *)characteristic; 

讀取數值時,我從周圍的

(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error; 

呼籲 當我讀到一個值得到的答覆是沒有問題的

char arrayLength; 

charakteristik.value getBytes:&arrayLength lenght:SERVICE_ARRAYLENGTH_LEN]

self.MyArrayLenght=(float)arrayLength; -

但是,當我得到的數組從外圍我不知道如何讀他們

charakteristik.value是NSData的

當我試圖

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:charakteristik.value] 

我有錯誤

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x4e, 0x49, 0x42, 0x41, 0x72, 0x63, 0x68, 0x69)' 

十六進制(0x4e,0x49,0x42,0x41,0x72,0x63,0x68,0x69 .......)是我想要讀取和稍後顯示的數據

如何讀取NSData?或者我可以如何將NSData轉換爲NSArray?

編輯: 問題解決

回答

-1

大概應該已經回答了你的問題。

以防萬一:你可以閱讀NSData的內容與方法:

它是否包含你的數據,你可以簡單地
char *data = [NSData data]; 

數據的長度與

[NSData length]; 

檢索檢查做類似這樣的事情:

strncmp(blah, [NSDataObject data], [NSDataObject length]); 

話雖如此,你可以定義你想要發現一個服務只有那一個。然後,您可以限制甚至進一步只聽你有興趣在

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error 

呼叫

[peripheral discoverCharacteristics:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"ABCD"]] forService:service]; 

希望這有助於

1

恐怕特定特徵,從未存檔的NSData對象外圍設備不完整。 CoreBluetooth限制每個特性的最大大小,這是由中央設備設置的。超出部分在轉移時會被截斷。可能陣列的大小超過了大小限制,因此中央設備沒有收到競爭的設備,這導致了異常。

的最大長度的限制從設備而變化的裝置,就可以得到從由CBPeipheralManagerDelegate方法給出的CBCentral對象的maximumUpdateValueLength屬性的大小限制:

- (void)peripheralManager:(CBPeripheralManager *)peripheral central:(CBCentral *)central didSubscribeToCharacteristic:(CBCharacteristic *)characteristic

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request

- (void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests

或提供CBCe的任何其他方法中心對象。

如果您想要發送超大小的數據,您應該將數據分段並通過幾次發送。在中央設備上,您可以通過將各個部分組合在一起來重建原始數據對象。 Apple提供了一個示例代碼來說明如何發送超大尺寸的數據。 BTLE Central Peripheral Transfer