【问题标题】:How do I calculate this checksum?我如何计算这个校验和?
【发布时间】:2012-03-27 15:09:16
【问题描述】:

我有一个警报系统,我已将其配置为向我的手机以及通过以太网发送 SMS 消息。

以下是我收到的一些短信:

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,接下来的 4 个是事件代码,2 个组字节和 3 个区域编号。最后有 4 个字节,我怀疑是某种校验和。

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

当通过 DTMF 发送时,0 的值应该是 10,但我不知道 SMS 是否是这种情况。很可能不会。

【问题讨论】:

  • 为什么不向 Ademco 询问精度?
  • 它实际上在文档中有所描述:DC-07-2001.04,但在这个爱好项目上对我来说这很花钱而且不值得。它被称为 CRC 校验和。
  • 恐怕倒车才是正道。
  • 将收到的短信作为附件的大样本怎么样?
  • 其实列出的 SMSer 就是我的全部了。

标签: checksum crc


【解决方案1】:

#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 表示没有特定的区域或用户信息适用。

要查找事件代码,请参阅 this document (pdf)。

【讨论】:

  • 这是信息。但它没有回答问题,即CCC 后面的四位数字。
【解决方案2】:

Ademco 的 Contact ID 中的校验和公式使用以下公式计算:

S= HEX 校验和,一位数。

(所有消息数字的总和 + 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

然后我们需要 15 的最接近的倍数高于 32,即 45。

45-32=13

让我们测试一下。

45 modulo 15 is congruent to 0

这是正确的,因为联系人 ID 是 16 位,而您有 19 位,我怀疑您的面板使用了不同的联系人 ID 专有实现。如果您发布此面板的品牌/型号,我可能会进一步解释。

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

-亚历克斯

P.S.:要计算 mod,请在 Google 中使用百分号 P.P.S:描述Contact ID的文档其实是:DC-05-1999.09 你引用的文档其实是计算机接口通讯协议规范。

【讨论】:

    【解决方案3】:

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

    比 100-92 = 8

    所以校验和是 8

    无论如何,在这个问题中,校验和似乎丢失了,最后 4 位是什么,只知道谁制造了发送它的面板:)

    【讨论】:

      【解决方案4】:

      我在试图找出我自己的警报系统 (Woonveilig/Egardia) 的校验和时遇到了这篇文章,它似乎使用了相同的格式。我找到了一个forum post on the german alarm forum,其中包含一个用于计算 LUPUS 警报系统的 CRC 的 C 代码 sn-p。这种 CRC 计算方法似乎与我自己和 Lasse 的基于 SMS 的系统相匹配。下面是转换成简单计算工具的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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 2015-12-21
        • 1970-01-01
        相关资源
        最近更新 更多