公式にここに記載されているように、Bluetooth LE/Bluetoothスマート/ BLE健康装置サービス(0x1809)に接続しようとしています:https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.health_thermometer.xml。具体的には、Health Thermometer Characteristic(0x2A1C)からの通知をリクエストしています。説明はhttps://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.temperature_measurement.xmlです。スウィフトでBLE特性フロートを読み取る方法
私はまともなスウィフト2の背景を持っていますが、私はこれをNSData、バイト、またはビット演算子と密接に関連付けることはありませんでした。私はリトルエンディアンとビッグエンディアンを全く新しくしています。私はいくつかの助けをすることができます。特性には、受け取るデータを決定するロジックが組み込まれています。これまでのFlags、Temperature Measurement Value、Time Stampの順番で100%のデータを受け取っていますが、残念ながら私は常に "010"の制御ロジックを取得しています。つまり、フラグを誤って読み取っています。実際には、私はタイムスタンプのすべてのことを間違って持ち込んでいると思います。私は、コードのコメントにどのようなデータが含まれているのかを含めています。
このバイナリデータを取得する方法は複数試みました。フラグはビット演算子を持つ1バイトです。温度測定そのものはフロートで、スウィフトフロートではなく、ISO/IEEE規格「IEEE-11073 32ビットFLOAT」で、BLE仕様書には「NO EXPONENT VALUE "ここ:https://www.bluetooth.com/specifications/assigned-numbers/format-types。私はその意味が分からない。ここでは、私は新しいものを試して、私はコメントアウト私の複数の試みを見ることができますdidUpdateValueForCharacteristic()関数からの私のコードは次のとおりです。
// Parse Characteristic Response
let stream = NSInputStream(data: characteristic.value!)
stream.open() // IMPORTANT
// Retrieve Flags
var readBuffer = Array<UInt8>(count: 1, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
var flags = String(readBuffer[ 0 ], radix: 2)
flags = String(count: 8 - flags.characters.count, repeatedValue: Character("0")) + flags
flags = String(flags.characters.reverse())
print("FLAGS: \(flags)")
// Example data:
// ["01000000"]
//
// This appears to be wrong. I should be getting "10000000" according to spec
// Bluetooth FLOAT-TYPE is defined in ISO/IEEE Std. 11073
// FLOATs are 32 bit
// Format [8bit exponent][24bit mantissa]
/* Attempt 1 - Read in a Float - Doesn't work since it's an IEEE Float
readBuffer = Array<UInt8>(count: 4, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
var tempData = UnsafePointer<Float>(readBuffer).memory
// Attempt 2 - Inverted bytes- Doesn't work since it's wrong and it's an IEEE Float
let readBuffer2 = [ readBuffer[ 3 ], readBuffer[ 2 ], readBuffer[ 1 ], readBuffer[ 0 ] ]
var tempValue = UnsafePointer<Float>(readBuffer2).memory
print("TEMP: \(tempValue)")
// Attempt 3 - Doesn't work for 1 or 2 since it's an IEEE Float
var f:Float = 0.0
memccpy(&f, readBuffer, 4, 4)
print("TEMP: \(f)")
var f2:Float = 0.0
memccpy(&f2, readBuffer2, 4, 4)
print("TEMP: \(f2)")
// Attempt 4 - Trying to Read an Exponent and a Mantissa - Didn't work
readBuffer = Array<UInt8>(count: 1, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let exponent = UnsafePointer<Int8>(readBuffer).memory
readBuffer = Array<UInt8>(count: 3, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let mantissa = UnsafePointer<Int16>(readBuffer).memory
let temp = NSDecimalNumber(mantissa: mantissa, exponent: exponent, isNegative: false)
print("TEMP: \(temp)")
// Attempt 5 - Invert bytes - Doesn't work
readBuffer = Array<UInt8>(count: 4, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let exponentBuffer = [ readBuffer[ 3 ] ]
let mantissaBuffer = [ readBuffer[ 2 ], readBuffer[ 1 ], readBuffer[ 0 ] ]
let exponent = UnsafePointer<Int16>(exponentBuffer).memory
let mantissa = UnsafePointer<UInt64>(mantissaBuffer).memory
let temp = NSDecimalNumber(mantissa: mantissa, exponent: exponent, isNegative: false)
print("TEMP: \(temp)")
// Attempt 6 - Tried a bitstream frontwards and backwards - Doesn't work
readBuffer = Array<UInt8>(count: 4, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
var bitBuffer: [String] = Array<String>(count:4, repeatedValue: "")
for var i = 0; i < bitBuffer.count; i++ {
bitBuffer[ i ] = String(readBuffer[ i ], radix: 2)
bitBuffer[ i ] = String(count: 8 - bitBuffer[ i ].characters.count, repeatedValue: Character("0")) + bitBuffer[ i ]
//bitBuffer[ i ] = String(bitBuffer[ i ].characters.reverse())
}
print("TEMP: \(bitBuffer)")
// Attempt 7 - More like the Obj. C code - Doesn't work
readBuffer = Array<UInt8>(count: 4, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let value = UnsafePointer<UInt32>(readBuffer).memory
let tempData = CFSwapInt32LittleToHost(value)
let exponent = tempData >> 24
let mantissa = tempData & 0x00FFFFFF
if (tempData == 0x007FFFFF) {
print(" *** INVALID *** ")
return
}
let tempValue = Double(mantissa) * pow(10.0, Double(exponent))
print("TEMP: \(tempValue)")
// Attempt 8 - Saw that BLE spec says "NO Exponent" - Doesnt' work
readBuffer = Array<UInt8>(count: 1, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
readBuffer = Array<UInt8>(count: 3, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let tempValue = UnsafePointer<Float>(readBuffer).memory
print("TEMP: \(tempValue)")
// Example data:
// ["00110110", "00000001", "00000000", "11111111"]
//
// Only the first byte appears to ever change.
*/
// Timestamp - Year - works
readBuffer = Array<UInt8>(count: 2, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let year = UnsafePointer<UInt16>(readBuffer).memory
// Timestamp Remainder - works
readBuffer = Array<UInt8>(count: 5, repeatedValue: 0)
stream.read(&readBuffer, maxLength: readBuffer.count)
let month = readBuffer[ 0 ]
let day = readBuffer[ 1 ]
let hour = readBuffer[ 2 ]
let minute = readBuffer[ 3 ]
let second = readBuffer[ 4 ]
print("TIMESTAMP: \(month)/\(day)/\(year) \(hour):\(minute):\(second)")
私はそうでない、Objective Cの中で、この例を見つけました正確に何が起こっているか(https://github.com/AngelSensor/angel-sdk/blob/b7459d9c86c6a5c72d8e58b696345b642286b876/iOS/SDK/Services/HealthThermometer/ANHTTemperatureMeasurmentCharacteristic.mを)知っている、と私はそれから作業しようとしたが、それは私にははっきりしていない:
// flags
uint8_t flags = dataPointer[0];
dataPointer++;
// temperature
uint32_t tempData = (uint32_t)CFSwapInt32LittleToHost(*(uint32_t *)dataPointer);
dataPointer += 4;
int8_t exponent = (int8_t)(tempData >> 24);
int32_t mantissa = (int32_t)(tempData & 0x00FFFFFF);
if (tempData == 0x007FFFFF) {
return;
}
float tempValue = (float)(mantissa*pow(10, exponent));
が誰かからフラグと温度計の測定値を引く方法で私を助けることができる場合このBLEの特徴は、私はとても感謝しています。ありがとう。
以下のサンプルデータを入力するように求められました。ここに私のサンプルデータ(12バイトの合計):私はあなたに似たいくつかのものをやった
["00000010", "00110011", "00000001", "00000000", "11111111", "11100000", "00000111", "00000100", "00001111", "00000001", "00000101", "00101100"]
-OR-
<025e0100 ffe00704 0f11150f>
を使用する他のBLEの特性のために必要とするすべてのトリックは、あなたの入力データの例を投稿することができますほとんどのですか? – pbush25
上記に含まれています。あなたが何か他のことを意味するかどうか私に教えてください。ありがとう。 – pennstump
BLEから受け取ったビットから文字列の配列を作成していますか?私はあなたがちょうどあなたが投稿した最後の機能の目的が何であるかについて混乱しています。 – pbush25