2016-09-07 67 views
0

我有4個不同的int值,我需要發送到BLE設備(建立連接正常)。發送int數據到BLE設備

爲了清楚起見,我將調用int值A,B,C,D。 A和B的範圍在0-100之間,C的範圍是0-2000,D的範圍是0-10000。所有值由用戶輸入確定。我需要快速連續地將這四個值發送到BLE設備,並且將它們分別以A和B(8位),C(16位)和D(32位)進行不同的打包。我不確定如何正確打包值。

以下是我嘗試過的三種不同程度的成功方法。

  1. 將int轉換爲數據併發送,例如,對於A(8位)int:

    const unsigned char CHR = (float)A; 
    float size = sizeof(CHR); 
    NSData * aData = [NSData dataWithBytes:&CHR length:size]; 
    [p writeValue:aData forCharacteristic:aCHAR type:CBCharacteristicWriteWithResponse]; 
    
  2. 首先轉換爲字符串,例如, (16位)C:

    NSString * cString = [NSString stringWithFormat:@"%i",C]; 
    NSData * cData = [cString dataUsingEncoding:NSUTF16StringEncoding]; 
    [p writeValue:cData forCharacteristic:cCHAR type:CBCharacteristicWriteWithResponse]; 
    
  3. 使用uint,例如,對於(32位)d INT:

    uint32_t val = D; 
    float size = sizeof(val); 
    NSData * dData = [NSData dataWithBytes:(void*)&val length:size]; 
    [p writeValue:valData forCharacteristic:dCHAR type:CBCharacteristicWriteWithResponse]; 
    

什麼我在上面做錯了,以及如何最好地轉換併發送一個int值的設備,允許所需的3種格式?

回答

1

你需要了解你的設備希望的格式多一點信息:

假設你想使用iOS使用的little-endian格式,您可以使用dataWithBytes -

unsigned char a = 100 
NSData *aData = [NSData dataWithBytes:&a length:sizeof(i)]; 

UInt16 c = 1000 
NSData *cData = [NSData dataWithBytes:&c length:sizeof(c)]; 

Unit32 d = 10000 
NSData *dData = [NSData dataWithBytes:&d length:sizeof(d)]; 

然後只需使用writeValue:forCharacteristic:type:

寫入NSData如果設備需要big-endian數據,那麼您將需要操縱字節到正確的順序。出於這個原因,只需將數字值作爲ASCII字符串發送並在接收端將其轉換回數值通常更簡單,但這取決於您是否能控制設備所期望的格式。