現在、Bluetooth Low EnergyデバイスをベースにしたiOSアプリケーションで作業しています。取得した周辺機器を比較する一意の識別子を取得するには、周辺機器のMACアドレスを取得する必要があります。
周辺機器のUUIDプロパティはiOSデバイスによって異なり、周辺機器がUUIDを取得するためには、少なくとも1回はマスターデバイスに接続する必要があります。チェックインを処理する必要があるため、接続を確立する必要はありません。ブルートゥースサービスポータルを調べてみると、デバイス情報自体がサービスであり、マスターiOSデバイスと周辺機器のブルートゥース低エネルギーデバイスの間に接続が確立されない限り取得できないサービスであることがわかりました。
Androidでは、デバイス自体のスキャン時にデバイスから応答を取得するときに、MACアドレスを含むデバイスの情報全体を取得します(getAddress()を使用))。
デバイスアドレスに関連するCBPeripheralクラスのプロパティが見つかりませんでした。固有のパラメーターを取得する別の方法は、広告データをカスタマイズしてデバイスに関する追加情報を送信することです。これには、ファームウェア側でより多くの作業が必要です。
接続を確立せずにBluetooth低エネルギー周辺機器のMACアドレスを取得できる方法はiOSにありますか?
どんな助けも大歓迎です。
この情報を取得するためのパブリックAPIはありません。
これが内部アプリケーションまたはジェイルブレイクアプリケーションの場合、kLockdownBluetoothAddressKeyキーの値を liblockdown.dylib で取得できます。
低エネルギーの周辺機器は、MACアドレスを隠すプライバシー機能を使用する場合があるため、接続またはボンディングの前にアドレスを取得することは必ずしも可能とは限りません。どういうわけか無線で送信されるMACアドレスを取得する場合、プライバシーを処理する必要があるか、相互運用性の問題があります。
AppleはUUIDを使用してこれらのプライバシー機能を抽象化するので、ユーザーはそれらを心配する必要がありません。
あなたが書いたようにそれを行う正しい方法は、いくつかのベンダー固有のデータを広告パケットに追加するか、デバイス情報サービスを使用することです。
他の専門家の議論に代わって、私が言ういくつかの事実を見つけました-
「iOSはデバイスのMACアドレスを隠し、UUIDを生成します。 iOSのUUIDは、iOSデバイスによって生成されます。異なるiOSデバイスは、同じ周辺機器に対して異なるUUIDを取得します。 MACアドレスは通常、ハードウェアに基づいています。両方にiPhoneがあり、同じ周辺機器をスキャンすると、異なるUUIDが表示されます。 iOSはデバイス上でUUIDを生成し、MACアドレスを隠します。要約-iOSはデバイスのMACアドレスを取得できません。代わりにランダムなUUIDを提供します。
ソース- https://github.com/don/cordova-plugin-ble-central/issues/77
上記の調査によると、ボードに接続するためのユニークな方法はこれまでのところないことがわかりました。すべてのボードにはMACアドレスがあり、iOSでは変更されず、Androidだけで簡単にアクセスできます。周辺機器のMACアドレスへのアクセスを許可しますが、iOSはこのMACアドレスを使用して、(一意の)デバイスでのみ一意の周辺機器識別子(UUID)を作成します。単一のボードの周辺機器識別子は、iPhoneデバイスによって異なります(ただし、単一のデバイスで一意です)。
ただし、PeripheralのBluetoothサービスUUIDを使用して検索することでボードに接続できますが、このサービスUUIDは「Adafruit Feather M0」などのすべてのボードで同じです。これは、アプリが同じタイプのBLEボード(「Adafruit Feather M0」)を見て、それらのいずれかに接続することを意味します。特定のユーザーを特定のボードに接続することは、MACにアクセスできず、iOSでランダムなUUIDを提供するため、これまでのところ不可能と思われます。
IOS 12では問題なくMACアドレスにアクセスできます。MACアドレスを取得するには、次の手順に従う必要があります。
extension Data{
func hexEncodedString() -> String {
let hexDigits = Array("0123456789abcdef".utf16)
var hexChars = [UTF16.CodeUnit]()
hexChars.reserveCapacity(count * 2)
for byte in self {
let (index1, index2) = Int(byte).quotientAndRemainder(dividingBy: 16)
hexChars.insert(hexDigits[index2], at: 0)
hexChars.insert(hexDigits[index1], at: 0)
}
return String(utf16CodeUnits: hexChars, count: hexChars.count)
}
}
extension String {
func separate(every stride: Int = 4, with separator: Character = " ") -> String {
return String(enumerated().map { $0 > 0 && $0 % stride == 0 ? [separator, $1] : [$1]}.joined())
}
}
func didReadValueForCharacteristic(_ characteristic: CBCharacteristic) {
if characteristic.uuid == BleDeviceProfile.MAC_ADDRESS, let mac_address = characteristic.value?.hexEncodedString().uppercased(){
let macAddress = mac_address.separate(every: 2, with: ":")
print("MAC_ADDRESS: \(macAddress)")
}
}