2017-10-18 5 views
1

J'ai besoin de calculer les 2 octets les moins significatifs de la somme de contrôle d'un message (en octets) reçu d'un module Iridium (Short Burst Data).Somme de contrôle de 2 octets en python pour l'iridium SBD

Le code que j'utilise fonctionne dans la plupart des cas, mais pas dans l'exemple ci-dessous.

mon code est:

z=b"AT+SBDRB\r\x00\x18this is a random message\x08\xdb"#message received from Iridium module 
msg=z[11:-2] 
print(msg) 
checksum_received = z[-2:] 
checksum = 0 
check_it = False 

for c in msg: 
    checksum = checksum + C#msg is a byte type 

a=chr(checksum >> 8) 
b=chr(checksum & 0xFF) 
c=a.encode() 
d=b.encode() 
checksum = c + d 

print(c.hex()) 
print(d.hex()) 
print(checksum.hex()) 
print(checksum_received.hex()) 
print(checksum == checksum_received) 

Dans le cas ci-dessus la somme de contrôle est différent de la somme de contrôle que je reçois (j'ai essayé d'envoyer le message à plusieurs reprises pour assurer que je ne en effet obtenir une erreur de trasmission).

J'ai testé le code avec les messages et les deux checksums suivants sont les mêmes:

z=b"AT+SBDRB\r\x00\x05hello\x02\x14" 
z=b"AT+SBDRB\r\x00\x14thisisarandommessage\x08[" 
z=b"AT+SBDRB\r\x00\x15this isarandommessage\x08{" 

Les seules informations données dans le manuel Iridium SBDS est:

La somme de contrôle est le moins significatif 2 -bytes de la sommation du message SBD complet . L'octet de poids fort doit être envoyé en premier. Par exemple si la FA envoie le mot « bonjour » codé en ASCII à l'ISU le flux binaire serait hex 68 65 6c 6c 6f 02 14.

Répondre

0

Vous semblez être convertir la somme de contrôle que vous calculez en deux séparés chr() valeurs, puis les coder.

Son plus simple:

z=b"AT+SBDRB\r\x00\x18this is a random message\x08\xdb"#message received from Iridium module 
msg=z[11:-2] 
print(msg) 
checksum_received = z[-2:] 

# checksum = 0 
# for c in msg: 
#  checksum = checksum + C#msg is a byte type 
checksum = sum(msg) 

# checksum is the correct value here 
print(hex(checksum)) 
a = checksum >> 8 
b = checksum & 0xFF 

# Now convert checksum back into a bytes object just like z[-2:] above 
checksum = bytes([a,b]) 
print(checksum.hex()) 
print(checksum_received.hex()) 

# now these two are the same 
print(checksum == checksum_received)