Open Source French Drone Identification

Bonsoir Pierre,
Perso, j’ai du mal à capturer les trames de management 802.11 avec Wireshark, il faut pouvoir mettre la carte Wifi en mode monitor et sur mon PC linux, ça ne vaut pas rester en monitor.
Par contre, la suite aircrack-ng sur laquelle est basé le code de la Gendarmerie bascule bien la carte en monitor, donc là ça fonctionne.
Il faudrait interfacer le code de la gendarmerie avec GoogleEarth pour voir la position du drone sur un fond de carte…
Je suppose que la Gendarmerie développera une appli pour smartphone de ce type…
Bonne soirée,
Patrick

Bon, j’ai installé la version de F5SOH, et pareil le ReceptionInfoDrone que je lance maintenant avec python3 (avant j’avais le module object has no attributes) me répond
Lancement du script.
Lancement du mode monitor.
Mode monitor de l’interface wlan1
JSON du drone : {“92”:""}

Attention, le code de f5soh fonctionne avec un module ESP8266, le SDK est différent, notamment l’émission de la trame beacon façonnée sur mesure, je ne pense pas que l’on puisse faire ça avec la librairie WiFi Arduino…
Quelle fonction as-tu utilisé pour émettre la trame avec l’ESP32 ?

Désolé j’ai oublié de dire que j’avais installé le code de F5SOH sur un D1 Mini Pro (ESP8266) bien sur
si j’active la trace j’ai ça :

beaconPacket :
80 0 0 0 FF FF FF FF FF FF 1 2 3 4 5 6 1 2 3 4 5 6 0 0 83 51 F7 8F F 0 0 0 E8 3 21 4 3 1 6 0 8 44 52 4F 4E 45 5F 41 50 DD 4E 6A 5C 35 1 1 1 1 2 1E 55 41 53 2D 46 52 2D 31 31 34 32 30 38 0 44 52 4F 4E 45 5F 41 50 0 0 6 4 1 4 3 47 4 4 0 44 9D AC 5 4 FF FE A7 9D 6 2 0 25 7 2 0 8 8 4 0 44 9D AA 9 4 FF FE A7 9D A 1 0 B 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

et pourtant en écoute je n’ai que JSON du drone : {“92”:“”}

Alors ça, c’est la trame que tu es sensé émettre, il n’est pas impossible qu’elle ne sorte pas en WiFi, et que le code de la gendarmerie trouve autre chose…
Es-tu en mode WIFI_STA ou en SoftAP ? En SoftAP, il y a les balises SSID de l’AP de l’ESP8266 qui sortent…
Mais celle là on les voit sur un analyseur WIFI comme WIFIAnalyzer sur Android par exemple.

Voici ce que j’obtiens dans wireshark :

Frame 595: 291 bytes on wire (2328 bits), 291 bytes captured (2328 bits) on interface wlan1mon, id 0
Radiotap Header v0, Length 36
802.11 radio information
IEEE 802.11 Beacon frame, Flags: …C
IEEE 802.11 Wireless Management
Fixed parameters (12 bytes)
Tagged parameters (215 bytes)
Tag: DS Parameter set: Current Channel: 6
Tag: SSID parameter set: DRONE_AP
Tag: Vendor Specific: Secrétariat général de la défense et de la sécurité natio
Tag Number: Vendor Specific (221)
Tag length: 78
OUI: 6a:5c:35 (Secrétariat généra
Vendor Specific OUI Type: 1
Vendor Specific Data: 01010101021e5541532d46522d3131343230380044524f4e…
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded
Tag: SSID parameter set: Undecoded

et dans le code je vois
wifi_set_opmode(STATION_MODE);

C’est bon avec signalement_drone_python et le lolin32 j’ai réussi à vérifier les coordonnées GPS.

Reste à savoir pourquoi le programme de la gendarmerie ne fonctionne pas

ce qui est curieux c’est que mon portage sur lolin32 est décodé par signalement_drone_python/decoder.py

tandis que le code de F5SOH fait planter le même python :

Empty DataFrame
Columns: [L, V]
Index: []
ID 221, OUI 0x6a5c35, len 78
Traceback (most recent call last):
File “decoder.py”, line 88, in
sniff(iface=interface, prn=findSSID, lfilter=lambda x: x.haslayer(Dot11Beacon), monitor=True)
File “/usr/lib/python3/dist-packages/scapy/sendrecv.py”, line 972, in sniff
sniffer._run(*args, **kwargs)
File “/usr/lib/python3/dist-packages/scapy/sendrecv.py”, line 925, in _run
session.on_packet_received§
File “/usr/lib/python3/dist-packages/scapy/sessions.py”, line 47, in on_packet_received
result = self.prn(pkt)
File “decoder.py”, line 73, in findSSID
V = struct.unpack_from(’>%s’ % FRAME_TLV_LENGTH_TYPE[T], payload, count)[0]
struct.error: unpack_from requires a buffer of at least 1 bytes

Le programme de la gendarmerie a une erreur quand on utilise un version récent de scapy (qui est le logiciel python utilisé pour décoder les trames), voir ici : https://github.com/GendarmerieNationale/ReceptionInfoDrone/pull/2

Si le code de F5SOH fait planter le python c’est qu’il y a une erreur sur la trame. Le format de donnée est assez strict.
Si tu peux m’envoyer le contenu de la trame en hexa quand elle reçu, je peux te dire ce qui ne va pas dedans ! Surement un décalage au démarrage de la trame avec l’histoire du VS_TYPE…

Génial ! la version esp32 et celle de F5SOH fonctionnent grace à la modif du lib/json.py.
Merci encore

Ok, super. De mon côté, avec le code de f5soh, j’ai un petit changement dans le décodage, mais ça ne plantait pas avant…

Avant patch json.py :
JSON du drone : {“1”:1,“2”:“DIY-PERSO-0123456789\u0000AP_DRONE_”,“4”:48.000,“5”:1.0007,“6”:177,“7”:30,“8”:48.00007,“9”:1.00055,“10”:0,“11”:298}

Après patch :
JSON du drone : {“2”:“DIY-PERSO-0123456789\u0000AP_DRONE_”,“4”:48.00007,“5”:1.00054,“6”:162,“7”:15,“8”:48.00007,“9”:1.00055,“10”:0,“11”:160}
JSON du drone : {“2”:“DIY-PERSO-0123456789\u0000AP_DRONE_”,“4”:48.00017,“5”:1.00049,“6”:161,“7”:14,“8”:48.00007,“9”:1.00055,“10”:0,“11”:160}
JSON du drone : {“2”:“DIY-PERSO-0123456789\u0000AP_DRONE_”,“4”:48.00033,“5”:1.00041,“6”:159,“7”:12,“8”:48.00007,“9”:1.00055,“10”:1,“11”:340}

Je suppose que c’était faux avant, et que c’est OK maintenant.
Toutefois la partie “\u0000AP_DRONE_” me parait louche , mon SSID est AP_DRONE_ID et on le retrouve tronqué et précédé de \u0000, est-ce normal ?
Patrick

Ici c’est vrai que le retour a l’air un peu bizarre (mon wifi est ‘DRONE_AP’ :

avec le code de F5SOH :

JSON du drone : {“1”:1,“2”:“UAS-FR-114208\u0000DRONE_AP\u0000\u0000\u0006\u0004\u0001\u0004\u0003G”,“4”:44.96809,“5”:-0.88164,“6”:40,“7”:17,“8”:44.96804,“9”:-0.88173,“10”:0,“11”:0}

Avec mon code pour le lolin32 :

JSON du drone : {“1”:1,“2”:“UAS-FR-114208\u0000DRONE_AP\u0000GPRMC\u0000G”,“4”:44.96809,“5”:-0.88158,“6”:40,“7”:0,“8”:44.96816,“9”:-0.88169,“10”:0,“11”:309}

Voilà une capture de wireshark avec le code de F5SOH, sous trois formats différents mais la trame est la même :

0000 00 00 24 00 2f 40 00 a0 20 08 00 00 00 00 00 00 …$./@… …
0010 6f 4d 6b 00 00 00 00 00 10 02 85 09 a0 00 dc 00 oMk…
0020 00 00 dc 00 80 00 00 00 ff ff ff ff ff ff 01 02 …
0030 03 04 05 06 01 02 03 04 05 06 00 00 00 00 00 00 …
0040 00 00 00 00 e8 03 21 04 03 01 06 00 08 44 52 4f …!..DRO
0050 4e 45 5f 41 50 dd 4e 6a 5c 35 01 01 01 01 02 1e NE_AP.Nj\5…
0060 55 41 53 2d 46 52 2d 31 31 34 32 30 38 00 44 52 UAS-FR-114208.DR
0070 4f 4e 45 5f 41 50 00 00 06 04 01 04 03 47 04 04 ONE_AP…G…
0080 00 44 9d a7 05 04 ff fe a7 a0 06 02 00 21 07 02 .D…!..
0090 00 20 08 04 00 44 9d bb 09 04 ff fe a7 83 0a 01 . …D…
00a0 00 0b 02 01 64 00 00 00 00 00 00 00 00 00 00 00 …d…
00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 …
0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 …"
0120 da 41 3d .A=

0000 00 00 24 00 2f 40 00 a0 20 08 00 00 00 00 00 00
0010 6f 4d 6b 00 00 00 00 00 10 02 85 09 a0 00 dc 00
0020 00 00 dc 00 80 00 00 00 ff ff ff ff ff ff 01 02
0030 03 04 05 06 01 02 03 04 05 06 00 00 00 00 00 00
0040 00 00 00 00 e8 03 21 04 03 01 06 00 08 44 52 4f
0050 4e 45 5f 41 50 dd 4e 6a 5c 35 01 01 01 01 02 1e
0060 55 41 53 2d 46 52 2d 31 31 34 32 30 38 00 44 52
0070 4f 4e 45 5f 41 50 00 00 06 04 01 04 03 47 04 04
0080 00 44 9d a7 05 04 ff fe a7 a0 06 02 00 21 07 02
0090 00 20 08 04 00 44 9d bb 09 04 ff fe a7 83 0a 01
00a0 00 0b 02 01 64 00 00 00 00 00 00 00 00 00 00 00
00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22
0120 da 41 3d

000024002f4000a020080000000000006f4d6b000000000010028509a000dc000000dc0080000000ffffffffffff01020304050601020304050600000000000000000000e8032104030106000844524f4e455f4150dd4e6a5c3501010101021e5541532d46522d3131343230380044524f4e455f41500000060401040347040400449da70504fffea7a00602002107020020080400449dbb0904fffea7830a01000b020164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022da413d

Voilà ce que donne la trame capturée par Wireshark ici :


Elle est déclarée mal formée par Wireshark, je pense qu’elle est vue comme une trame beacon d’AP Wifi, celles (nombreuses) de mon AP ont le SSID FTTH_CX2411.
Ca explique peut-être le warning de Wireshark, mais je ne sais pas dire si elle est totalement conforme aux specs du JO…

Bizarre… du NMEA ?

Pour “mon” code j’ai été certainement un peu vite…
uint8_t beaconPacket[251]
Mettre 323 (40 + 32 + droneIDFR::FRAME_PAYLOAD_LEN_MAX) au lieu de 251

@F5SOH
est ce que chez toi le decoder.py fonctionne ? chez moi il plante. même avec ta correction

Laurent, la trame est plus longue, il y a surtout des “00” en plus…


Mais pas de différence sur les défauts suspectés…
Patrick

J’ai mis à jour le code, si tu peux essayer voir…
Pas de trame malformée avec wireshark maintenant.

Testé, tout a l’air de fonctionner maintenant, sauf que je ne reçoit que très très très rarement des données.
je ne comprend pas pourquoi. Un test de conformité n’est pas respecté ? pourtant dans les logs rien de tel n’est écrit.

j’ai mis 0xB8, 0x0B, // 32-33: Beacon interval: set to 3s == 3000TU== BB8, bytes in reverse order

J’ai ajouté un “return” : avec une réception GPS pas terrible ça évite d’envoyer des données erronées et avec les tests en intérieur ça n’envoie pas forcement la trame.