如何计算这个校验和?

3

我有一个警报系统,已配置为向我的手机和以太网发送短信。以下是我收到的一些短信:

5522 18 1137 00 003 1C76
5522 18 3137 00 003 3278
5522 18 1130 00 002 E36E
5522 18 1401 00 001 ED6E
5522 18 1302 00 003 ED70
5522 18 1302 00 004 EE71
5522 18 1302 00 009 F376
5522 18 3147 00 009 417F
5522 18 1137 00 004 1D77
5522 18 3137 00 009 3379
5522 18 1602 00 000 0870

前 4 个字节是账号编号,接下来的 2 个字节始终是 18,然后是事件代码、2 个组字节和 3 个区域编号。最后有 4 个字节,我猜测这是某种校验和。

这是某种 Ademco Contact ID 格式。但是,我不认识这个校验和。它不是时间戳,因为最后一个消息(0870)定期发送且始终相同。

通过 DTMF 发送时,0 应该具有值 10,但我不知道短信是否是这种情况。很可能不是。


为什么不向Ademco询问精度呢? - menjaraz
这实际上在一个文件中有描述:DC-07-2001.04,但是需要花费一些钱,对于我这个爱好项目来说不是很值得。它被称为CRC校验和。 - Lasse Magnussen
我害怕只有反转才是正确的方法。 - menjaraz
作为附件发送一大批收到的短信,怎么样? - menjaraz
实际上,列出的SMSer就是我拥有的全部。 - Lasse Magnussen
根据处理类似事项的规范DC-01,这可能是一个带有0xA001多项式的CRC-16,但我仍然无法正确匹配它。 - Lasse Magnussen
4个回答

1
我只想更正AdemcoGuy的计算,因为它似乎是不正确的: 所以,例子是5522 18 1602 00 000 0870 我们需要用10替换每个0。 所以: 5+5+2+2+1+8+1+6+10+2+10+10+10+10+10 = 92

然后100-92 = 8

所以校验和是8

无论如何,在问题中,似乎缺少校验和,而最后4位数字只有制造面板的人知道,他已经发送了它 :)


1
Ademco的Contact ID中的校验和公式计算如下:
S=一个十六进制数字的校验和。
(所有消息数字的总和+S)MOD 15 = 0,如果该值等于10,则校验和为0。
官方的Contact ID规范在这里:http://li0r.files.wordpress.com/2012/07/sia-dc-05-1999-09_contact_id.pdf 因此,以5522 18 1602 00 000 0870为例:
LET C = checksum

5+5+2+2+1+8+1+6+2=32

(32+S) modulo 15 is congruent to 0

我们需要找到比32更大的最接近15的倍数,即45。
45-32=13

让我们测试一下。

45 modulo 15 is congruent to 0

这是正确的,因为Contact ID有16位数字,而你有19位,我会怀疑你的面板使用了不同的专有实现方式。如果你发布这个信息来源的制造/型号,我可能能够进一步解释。

我希望这回答了你的问题!

-Alex

P.S.: 在谷歌中使用百分号计算模数。

P.P.S: 描述Contact ID的文档实际上是:DC-05-1999.09,你引用的文档实际上是计算机接口通信协议规范。


0

#ACCT MT QXYZ GG CCC 其中:

  • ACCT:4位数字账号(0-9,B-F)

  • MT:消息类型-始终为18

  • Q:事件限定符,提供特定的事件信息:

    • 1:新事件或开放

    • 3:新还原或关闭

    • 6:先前报告的条件仍然存在(状态报告)

  • XYZ:事件代码(3个十六进制数字0-9,B-F)

  • GG:组或分区编号(2个十六进制数字0-9,B-F)。使用00表示没有特定的组或分区信息适用。

  • CCC:区域编号(事件报告)或用户(打开/关闭报告)(3个十六进制数字0-9,B-F)。使用000表示没有特定的区域或用户信息适用。

如需查找事件代码,请参见此文档(pdf)。


这很有信息量。但它并没有回答问题,问题是关于跟在“CCC”后面的四个数字的。 - GargantuChet

0

我在尝试解决自己的警报系统(Woonveilig/Egardia)的校验和问题时,偶然发现了这篇文章。它似乎使用了相同的格式。我在德国警报论坛上找到了一篇帖子,其中包含了一个用于计算LUPUS警报系统CRC的C代码片段。这个CRC计算方法似乎与我的和Lasse的基于短信的系统匹配。下面是将C代码转换为简单计算工具的代码:

#include <stdio.h>
#include <string.h>

// Code from: https://www.alarmforum.de/showthread.php?tid=12037&pid=75893

/**
* Fletcher Checksum.(LUPUS version, 16-bit)
*/
static unsigned int fletcher_sum(char* data, int len) {
    unsigned int sum1 = 0x0, sum2 = 0x0;
    while (len) {
        unsigned int tlen = (len > 256) ? 256 : len;
        len -= tlen;
        do {
            sum1 += *data++;
            sum1 = (sum1 & 0xff);
            sum2 += sum1;
            sum2 = (sum2 & 0xff);
        } while (--tlen);
    }
    return sum2 << 8 | sum1;
}

int main() {
    char input[50];
    int sum;
    printf("Enter input: ");
    fgets(input, sizeof(input), stdin);
    sum = fletcher_sum(input, strlen(input)-1);
    printf("%x\n", sum);
    return 0;
}

示例(问题帖子中的第一条短信):

# cc checksum.c
# ./a.out
Enter input: 5522 18 1137 00 003
1c76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接