我需要计算从 Iridium 模块(短突发数据)接收到的消息(以字节为单位)的校验和的最低有效 2 个字节。
我使用的代码在大多数情况下都有效,但不适用于下面的示例。
我的代码是:
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)
在上述情况下,校验和与我收到的校验和不同(我尝试多次发送消息以确保我确实没有收到传输错误)。
我已经使用以下消息测试了代码,并且两个校验和相同:
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{"
Iridium SBDS 手册中提供的唯一信息是:
校验和是整个 SBD 消息总和的最低有效 2 字节。必须先发送高位字节。例如,如果 FA 向 ISU 发送以 ASCII 编码的单词“hello”,则二进制流将为十六进制 68 65 6c 6c 6f 02 14。