2017-09-30 3 views
1

En termes de base, j'utilise nativescript pour une application multiplateforme. Cette application interagit avec les périphériques BLE. Les périphériques BLE envoient une réponse d'analyse après le paquet de publicité, que je suis capable de récupérer en tant qu'objet NSData du côté iOS.Commande Little-Endian Byte (iOS, réponse BLE scan)

Voici la sortie (pseudo) de la propriété de description: < 54fca267 0b00>.

La sortie représente l'adresse matérielle du périphérique.

Les gars du matériel me disent que c'est en little-endian, et je sais que c'est une chaîne de 48 bits. Il vient du périphérique, qui a son firmware écrit en C.

J'ai essayé pendant quelques jours de convertir ceci en chaîne (avec l'endianness correct) de sorte que je puisse stocker l'adresse matérielle sur notre dos -end, mais je suis incapable de trouver une solution élégante.

J'ai trouvé une solution en lisant la propriété: description de l'objet NSData, puis en la décodant manuellement (en javascript). Je n'ai tout simplement pas l'impression que cette solution est suffisante pour un environnement de production et que j'utiliserais plutôt des utilitaires natifs.

J'ai essayé d'utiliser:

NSString.alloc().initWithDataEncoding(mac, NSUTF8StringEncoding); 

..avec chaque type de codage de THIS page de la documentation. Je reçois soit zéro en retour, soit des caractères incorrects.

Comme je l'ai déjà dit, ceci est écrit en NativeScript; cependant, j'ai une bonne compréhension de l'objectif C, je devrais donc être capable de convertir tous les exemples fournis dans ce langage.

Toute contribution serait grandement appréciée. Merci d'avance!

Répondre

2

réponse du CRD est sur la bonne voie, mais je devine est pas ce que vous demandez. Vous voulez un résultat qui ressemble à "54: fc: a2: 67: 0b: 00" (une adresse Bluetooth/MAC), n'est-ce pas? Voici une approche simple et brute de la force (vous pouvez le faire dans une boucle ou similaire, mais ne vaut pas la peine IMO).

// Just for testing; you already have data. 
uint8_t address[6] = { 0x54, 0xfc, 0xa2, 0x67, 0x0b, 0x00 }; 
NSData *data = [NSData dataWithBytes:address length:6]; 

// Check the length before proceeding (maybe return an error rather than crash :D) 
assert([data length] == 6); 

// Grab the bytes 
const uint8_t *bytes = data.bytes; 

// Format them 
NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", 
          bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]]; 

// 3. Profit 
NSLog(@"%@", addressString); 

Mais ....

Je ne suis pas tout à fait certain de ce que l'ingénieur signifie ici "petit-boutiste". 54:fc:a2 n'est pas un code de fabricant assigné. En règle générale, je suppose que "little-endian" signifie qu'ils ont inversé les mots de 16 bits (que j'ai rencontrés sur les plates-formes CSR), et que cela devrait être fc:54:67, mais cela n'est pas assigné non plus.Traiter le tout comme complètement en arrière nous donne 00:0b:67 qui est assigné à TopView, qui fait des caméras Bluetooth, donc je parie que c'est ce que signifie "little-endian" ici (ce qui est logique, car la façon normale d'écrire des adresses MAC sur le fil est exactement en arrière de cela, et est "big-endian").

Alors que cela changerait le code:

NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", 
          bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]]; 

est l'adresse 00: b0: 67: a2: fc: 54?

+0

C'est l'adresse correcte, mes excuses. OUI devrait être enregistré à si-labs. – AzraelPwnz

+0

Rob, pourriez-vous s'il vous plaît examiner cette question: https://stackoverflow.com/questions/46518084/nativescript-get-string-from-interop-reference Si je travaillais dans obj-c, votre solution ont été doré! Cela dit, en raison des limitations NativeScript (possibles), je ne peux pas implémenter la méthode stringWithFormat. – AzraelPwnz

0

Vous semblez avoir un objet NSData contenant 6 octets, le premier octet est le moins significatif (little-endian). N'essayez pas d'utiliser la représentation de caractères, il s'agit de données binaires, traitez-la comme telle.

Utilisez la propriété bytes de NSData pour obtenir un pointeur vers le premier octet et l'enregistrer dans une variable Byte *, disons, bPtr. Il suffit maintenant d'indexer les octets à leur tour et de les insérer dans une variable entière non signée de 64 bits dans l'ordre. Vous pouvez le faire en déplaçant le nombre entier et en utilisant l'octet suivant - commencez par bPtr[5] jusqu'à bPtr[0] et décalez le nombre entier 8 à chaque fois.

HTH