■はじめに
Bluetoothで「kCBAdvDataManufacturerData」の値を取得してどうのこうのしたい時があります。
その方法で結構詰まったので、メモ。
スポンサードリンク
■手順
「kCBAdvDataManufacturerData」の値を以下とします。
"kCBAdvDataManufacturerData": <68656c6c 6f20776f 726c64>
以下のExtensionを用意します。
//// Data extension
extension Data {
var dataToHexString: String {
return reduce("") {$0 + String(format: "%02x", $1)}
}
}
以下の通り、実装することで、値が取得できます。(具体的な値はコメントに記載。)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
let aaa = advertisementData["kCBAdvDataManufacturerData"] as? NSData {
let publicData = Data(bytes: aaa.bytes, count: Int(aaa.length))
let str = publicData.dataToHexString
print(str) // 68656c6c6f20776f726c64
}
}
以下の通りにすることで、文字列に復元することもできます。
let str = publicData.dataToHexString
var bytes = [UInt8]()
for idx in stride(from: 0, to: str.count, by: 2) {
let hex = str[str.index(str.startIndex, offsetBy: idx)..<str.index(str.startIndex, offsetBy: idx + 2)]
bytes.append(UInt8(hex, radix: 16)!)
}
print(String(bytes: bytes, encoding: .utf8)!) // Hello World
スポンサードリンク
■ソースコード全量
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
let aaa = advertisementData["kCBAdvDataManufacturerData"] as? NSData {
let publicData = Data(bytes: aaa.bytes, count: Int(aaa.length))
let str = publicData.dataToHexString
print(str) // 68656c6c6f20776f726c64
var bytes = [UInt8]()
for idx in stride(from: 0, to: str.count, by: 2) {
let hex = str[str.index(str.startIndex, offsetBy: idx)..<str.index(str.startIndex, offsetBy: idx + 2)]
bytes.append(UInt8(hex, radix: 16)!)
}
print(String(bytes: bytes, encoding: .utf8)!) // Hello World
}
}
//// Data extension
extension Data {
var dataToHexString: String {
return reduce("") {$0 + String(format: "%02x", $1)}
}
}