技術ブログ

プログラミング、IT関連の記事中心

「kCBAdvDataManufacturerData」の操作【Swift】

■はじめに

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)}
    }
}