Bonjour à toutes et à tous,
N'étant pas un profesionnel de python (et de la programmation en général) je me tourne vers vous pour quelque conseil !
Tout d'abord, laissez moi vous expliquer un peu le contexte.
La 1ere partie du script, que je ne vous détaillerez pas pour la simple raison qu'elle fonctionne correctement, envoie une commande sous forme d'une chaîne de caractère hexadécimal à un boitier physique, ce boitier répond à son tour. cette réponse est sous cette forme : "ACK0p08000200F060010000"
Ces caractères hexadécimal correspondent chacun à une information contenu dans un fichier de mapping(mapfile.txt) dont voici la forme:
bit 0-15 | Project_id | RMC
bit 53 | SSPA-A | RMC
bitnumber | information | type de boitier
Chaque information est enregistrée sur 1 ou plusieurs bit, ici en l'occurence, l'information project_id est enregistrée sur 16 bit et SSPA-A est enregistrée seulement sur le bit numéro 53.
A noté que la conversation de l'hexa au binaire est ici un peu particulière, car ce sont seulement des demi octets, c'est à dire que par exemple, l'information présente au "demi"octet numéro 13 est 13* 4 = 52 > 52eme bit !
Dans l'exemple d'au dessus, dans le demi octet numéro 13, il y a donc 4 bit avec chacun une information différente, le bit 52 correpond par exemple à la température, le 53 au status du boitier, le 54 ...
Le code qui suit à des variables défini en dur pour éviter toute la 1ere partie.
Voici donc le code, ça sera surement plus compréhensible
En tous les cas, voici ce que donne l'exécution du script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 # On ouvre le fichier de mapping passé en paramètre msg = 'ACK0p08000200F060010000' # la variable "data" enlève la 1ere partie de la chaine qui nous sera inutile et prend donc seulement 08000200F060010000, je la transforme ensuite en nombre entier hexadécimal data = int(msg[5:],16) print ('\nNombre entier hexadécimal, on le traduit en binaire en isolant le numéro de bit :\n ' + str(data)) #ici se zabbix = [line.strip() for line in open('mapfileRMC.txt','r')] # On extrait ligne par ligne, le numéro de bit, la clé d'item, et le type de statut for line in zabbix: # J'essaie de récupérer les chiffres / lettres contenu dans le fichier avec une expression régulière result = re.search('bit\s([0-9]+)|([0-9]+)-([0-9]+)\s\|\s([a-zA-Z]*)\s\|\s([a-zA-Z]*)', line) if result: # On extrait le contenu de chaque ligne bitnumber = result.group(1) itemZabbix = result.group(2) typeboitier = result.group(3) # On génere le masque binaire associé au numéro de bit # ici on essaie d'isoler le numéro de bit, et masquer pour pourvoir ressortir seulement l'information dont on a besoin mask = "1" for i in range(0,int(bitnumber)): mask += "0" binarymask = int(mask,2) print ('\nMasque binaire : ' + str(binarymask)) # On masque la valeur et on décale pour obtenir la valeur du bit bitvalue = (data & binarymask)>>int(bitnumber) print('\nValeur du bit' + str(bitvalue)) print('Item zabbix' + str(itemZabbix)) print('typeboitier ' + str(typeBoitier))
j'ai coupé car ça descend encore plus bas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Nombre entier hexadécimal, on le traduit en binaire en isolant le numéro de bit : 147574516572032663552 Masque binaire : 1 Valeur du bit0 Item zabbixNone typeboitierNone Masque binaire : 65536 Valeur du bit1 Item zabbixNone typeboitierNone Masque binaire : 4294967296 Valeur du bit0 Item zabbixNone typeboitierNone Masque binaire : 8589934592 Valeur du bit0 Item zabbixNone typeboitierNone
Pour résumé, je n'arrive pas à voir si le code que j'ai fais, prend en compte n'importe quel informations > bitnumber = n et ressort la bonne information associé à ce numéro de bit.
Si vous avez des remarques quant au python en lui même, je suis également preneur.
Je ne pense pas que ça soit très clair, je répondrai aux éventuelles questions du mieux possible.
Merci pour vos réponses.
Cordialement,
Lysan
Partager