2017-07-12 22 views
2

こんにちは私は素早く初心者で、極限の心拍数で1つのBLEを伝達するアプリケーションを作成しようとしていますが、特性によって生成されたデータ構造から正しい情報を取得するのに問題があります。 、私は実際にそれをuint8からintや文字列のようなより単純なものに変換する問題があります。BLEから文字列を取得

は、彼女は私のコードです:私は多くの方法をトライが、私は迅速に新しいですし、毎年、この言語での更新があるため、迅速な3は容易ではありません

func peripheral(_ peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { 

    if characteristic.uuid == POLARH7_HRM_MEASUREMENT_CHARACTERISTIC_UUID { 
     print("Get the new heart BPM : ", terminator:"") 

     var wavelength: UInt16? 
     if let data = characteristic.value { 
      var bytes = Array(repeating: 0 as UInt8, count:(characteristic.value?.count)!/MemoryLayout<UInt8>.size) 

      data.copyBytes(to: &bytes, count:data.count) 
      let data16 = bytes.map { UInt16($0) } 
      wavelength = 256 * data16[1] + data16[0] 

     } 
     print("W : ") 
     print(wavelength) 
    } 

    if characteristic.uuid == POLARH7_HRM_BODY_LOCATION_CHARACTERISTIC_UUID { 
     print("Get the new sensor location", terminator:"") 
     print(characteristic.value) 
     //let data = NSData(data: characteristic.value as! Data) 

    } 

    if characteristic.uuid == POLARH7_HRM_MANUFACTURER_NAME_CHARACTERISTIC_UUID { 
     print("Get the new name", terminator:"") 
     print(characteristic.value) 
    } 

} 

ほとんどのヒントので見つかったObjective-CであったりSWIFT 2.このような中 はexemples:

// Instance method to get the manufacturer name of the device 
- (void) getManufacturerName:(CBCharacteristic *)characteristic 
{ 
    NSString *manufacturerName = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding]; // 1 
    self.manufacturer = [NSString stringWithFormat:@"Manufacturer: %@", manufacturerName]; // 2 
    return; 
} 

または

- (void) getHeartBPMData:(CBCharacteristic *)characteristic error:(NSError *)error 
{ 
    // Get the Heart Rate Monitor BPM 
    NSData *data = [characteristic value];  // 1 
    const uint8_t *reportData = [data bytes]; 
    uint16_t bpm = 0; 

    if ((reportData[0] & 0x01) == 0) {   // 2 
     // Retrieve the BPM value for the Heart Rate Monitor 
     bpm = reportData[1]; 
    } 
    else { 
     bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1])); // 3 
    } 
    // Display the heart rate value to the UI if no error occurred 
    if((characteristic.value) || !error) { // 4 
     self.heartRate = bpm; 
     self.heartRateBPM.text = [NSString stringWithFormat:@"%i bpm", bpm]; 
     self.heartRateBPM.font = [UIFont fontWithName:@"Futura-CondensedMedium" size:28]; 
     [self doHeartBeat]; 
     self.pulseTimer = [NSTimer scheduledTimerWithTimeInterval:(60./self.heartRate) target:self selector:@selector(doHeartBeat) userInfo:nil repeats:NO]; 
    } 
    return; 
} 

ありがとうございます

答えて

0

BLEデバイスから送信されるデータは通常ユニコードであるため、これらのユニコード値を必要なものに変換する必要があります。ここで

は文字列に変換する例です。

// Convert byte to unicode string 
let unicodeString = String(data: characteristic.value!, encoding: String.Encoding.utf8) 

// Initialize value 
var value: String? = nil 

// Convert unicode to actual value 
for element in unicodeString!.unicodeScalars { 
    value = "\(element.value)" 
} 

// If value exists 
if let value = value { 
    // Do something with the value 
} 
+0

ありがとうThomas ^^、どのようにuint8を取得し、bpmの例のようにuint16または標準intに変換してください。 –

+0

これを試しましたか? 'let bpm = Int(value)'? – Thomas

+0

はい、それは私に言っています: '(データ?)'型の引数を使ってinitialierを呼び出すことはできません –

0

は、おそらく他の人が後に同じ答えを検索します。ここで私はintを得る方法です。

let data = characteristic.value 
     let count = (data?.count)!/MemoryLayout<UInt8>.size 
     var array = [UInt8](repeating: 0, count: count) 
     data?.copyBytes(to: &array, count:count * MemoryLayout<UInt8>.size) 

     print("Get the new heart BPM : ", terminator : "") 

     if ((array[0] & 0x01) == 0) { 
      let bpm = array[1] 
      let bpmInt = Int(bpm) 
      print(bpmInt) 
     } 
関連する問題