web-dev-qa-db-fra.com

Obtenir l'adresse MAC du périphérique Bluetooth basse consommation

Je travaille actuellement sur une application iOS basée sur des appareils Bluetooth basse consommation. Afin d'obtenir un identifiant unique pour comparer les périphériques obtenus, je dois obtenir l'adresse MAC des périphériques.

Il est observé que la propriété UUID d'un périphérique varie selon les appareils iOS et que pour que le périphérique obtienne un UUID, il devra se connecter à un périphérique maître au moins une fois. Étant donné que je dois gérer les enregistrements, je ne veux pas établir de connexion. En parcourant le portail des services Bluetooth, j'ai découvert que les informations sur l'appareil lui-même étaient un service, qui ne pouvait pas être récupéré à moins qu'une connexion n'ait été établie entre l'appareil maître iOS et l'appareil périphérique Bluetooth à faible consommation d'énergie.

J'ai trouvé que dans Android nous obtenons toutes les informations de l'appareil, y compris son adresse MAC (en utilisant getAddress ()) lorsque nous obtenons la réponse de l'appareil lors de la numérisation elle-même.

Je n'ai trouvé aucune propriété dans la classe CBPeripheral liée à l'adresse du périphérique. Une autre façon d'obtenir un paramètre unique serait de personnaliser les données de publicité pour envoyer des informations supplémentaires concernant l'appareil, ce qui nécessite plus de travail du côté du firmware.

Existe-t-il un moyen dans iOS de pouvoir obtenir l'adresse MAC du périphérique Bluetooth basse énergie sans établir de connexion?

Toute aide serait grandement appréciée.

43
Feby Sam

Il n'y a pas d'API publique pour obtenir ces informations.

S'il s'agit d'une application interne ou de jailbreak, vous pouvez obtenir la valeur de la clé kLockdownBluetoothAddressKey via liblockdown.dylib

14
Jogendra.Com

La propriété d'identificateur de CBPeripheral servira votre objectif, disponible à partir d'un périphérique encore non connecté dans la méthode déléguée didDiscoverPeripheral de CBCentralManager:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

CBPeripheral *peripheral ...

NSUUID* serverId = [peripheral identifier];

J'ai une demi-douzaine d'appareils LE que j'expérimente, y compris plusieurs ensembles d'appareils identiques. Je viens de confirmer que sur deux appareils iOS, les identifiants de tous ces widgets LE étaient différents, mais pour CHAQUE appareil iOS, l'identifiant de chaque widget a été conservé lors des lancements d'applications et même lors des suppressions et réinstallations d'applications. Je dirais que cela prouve définitivement que le système d'exploitation stocke suffisamment d'informations en interne pour que pour un iThing donné, vous serez en mesure de distinguer et de ré-identifier tous les périphériques rencontrés par votre application, sans réellement vous y connecter. Notez également que le advertisementData, également disponible avant la connexion, regorge d'informations utiles comme CBAdvertisementDataLocalNameKey, CBAdvertisementDataManufacturerDataKey, CBAdvertisementDataServiceUUIDsKey, CBAdvertisementDataSolicitedServiceUUIDsKey, et d'autres, bien qu'aucun ne soit aussi certain d'identifier de façon unique l'appareil que [l'identifiant périphérique].

Je n'ai pas essayé de faire une sauvegarde et une restauration de l'appareil pour prouver que les UUID ont été conservés, mais je parierais qu'ils le sont, et s'ils ne le sont pas, c'est quelque chose Apple considérerait un bogue.

29
Taryn

Les périphériques à faible consommation d'énergie peuvent utiliser une fonction de confidentialité qui masque l'adresse MAC, il n'est donc pas nécessairement possible d'obtenir l'adresse avant la connexion ou la liaison. Si vous obtenez en quelque sorte l'adresse MAC qui passe par les ondes, vous devez gérer la confidentialité ou vous avez des problèmes d'interopérabilité.

Apple utilise des UUID pour résumer ces fonctionnalités de confidentialité afin que les utilisateurs n'aient pas à s'en soucier.

La façon correcte de le faire, comme vous l'avez écrit, consiste à ajouter des données spécifiques au fournisseur au paquet publicitaire ou à utiliser le service d'informations sur le périphérique.

12
makkara

Au nom de la discussion des autres professionnels, j'ai trouvé certains faits qui disent -

" iOS masque l'adresse MAC de l'appareil et génère un UUID. L'UUID sur iOS est généré par l'appareil iOS. Différents appareils iOS obtiendront différents UUID pour le même périphérique. L'adresse MAC est généralement basée sur le matériel. Si nous avons tous deux des iPhones et analysons le même périphérique, nous verrons différents UUID. iOS génère l'UUID sur l'appareil et masque l'adresse MAC. Résumé - iOS ne vous permet pas d'obtenir l'adresse MAC d'un appareil, il vous donne plutôt un UUID aléatoire. "

Source - https://github.com/don/cordova-plugin-ble-central/issues/77

Selon l'étude ci-dessus, j'ai trouvé qu'il n'y a pas de moyen unique de se connecter à la carte jusqu'à présent, chaque carte a une adresse MAC, qui ne change pas et facile d'accès dans (uniquement) Android, tandis que iOS ne le fait pas '' t permettre d'accéder à l'adresse MAC du périphérique, mais iOS utilise cette adresse MAC pour créer un identifiant de périphérique (UUID), qui est unique sur le périphérique (unique) uniquement. L'identifiant périphérique pour une seule carte est différent pour différents appareils iPhones (mais unique sur un seul appareil).

Cependant, nous pouvons nous connecter à une carte en recherchant avec l'UUID du service Bluetooth du périphérique, mais cet UUID de service est le même pour toutes les cartes du même type: "Adafruit Feather M0". Cela signifie que l'application examinera les cartes BLE du même type ("Adafruit Feather M0") et se connectera à N'IMPORTE QUELLE d'entre elles. Pour se connecter à un utilisateur particulier sur une carte spécifique, il ne semble pas possible pour l'instant en raison de l'inaccessibilité de MAC et de la fourniture de l'UUID aléatoire dans iOS.

7
Mohit G.

Vous pouvez accéder à l'adresse MAC sans problème dans iOS 12. Pour obtenir l'adresse mac, vous devez suivre les étapes suivantes.

  1. Analyser les données reçues par le périphérique BLE en chaîne.
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)
    }
}

  1. Ajoutez un séparateur ":" à l'adresse.
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())
    }
}
  1. Dans didReadValueForCharacteristic (caractéristique: CBCharacteritic), vous pouvez utiliser les 2 fonctions précédentes pour obtenir l'adresse mac.
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)")
        }
}
  1. profitez de votre adresse mac: "MAC_ADDRESS: 00: 0A: 57: 4E: 86: F2"
0
jlandyr