You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过AT+CMGL命令识别WhatsApp等服务商发送的OTP短信?

解决ZTE MF190S接收WhatsApp短信时发送方显示无效数字的问题

我来帮你搞定这个困扰——那个看起来无效的数字81084326797126204其实是WhatsApp的字母数字发送者ID(也就是"WhatsApp")经过GSM短信协议编码后的十进制形式,厂商配套软件做了额外的解析工作,所以能直接显示成文本,而你用AT命令直接读取时拿到的是原始编码值。下面给你具体的解决思路和实操方法:

为什么会显示成数字?

GSM短信协议里,像"WhatsApp"这类非手机号的发送者ID(Alphanumeric Sender ID)不能直接传输,必须转换成特定的二进制格式,再打包成十进制数放在address字段里。普通的手机号用ITU E.164格式传输,所以能直接显示,而这类字母ID就会变成你看到的长数字。

如何解码这个数字获取发送者文本?

你之前尝试转十六进制没成功,大概率是转换后的解析方式不对,正确步骤如下:

  1. 先获取完整的短信字段:执行AT+CMGR=0(读取索引为0的这条短信),它会返回更详细的信息,包括address_type(地址类型)。比如返回可能包含类似,127,这样的字段,127就是地址类型的十进制值(对应十六进制0x7F,表示国际字母数字地址)。
  2. 转换数字为十六进制:把81084326797126204转换成十六进制,得到0xE11000000000000C(你可以用Node.js的(81084326797126204).toString(16)来快速转换)。
  3. 解码十六进制为文本
    • 如果地址类型是字母数字类型(比如0x5F0x7F),就提取十六进制里的有效字符部分,按GSM 7位编码或UCS2解码。比如这个十六进制对应的就是编码后的"WhatsApp"。
    • 更简单的方式:在Node.js的Modem模块里,你可以找一下是否有内置的短信解码方法,很多模块会自动处理这类编码转换。

如何识别短信来自WhatsApp或其他服务商?

有几种可靠的方法:

  • 解码发送者ID:按照上面的步骤解码address字段,得到文本标识(比如"WhatsApp"),这是最直接的方式。
  • 检查短信内容特征:WhatsApp的OTP短信有固定格式,比如开头通常是"Your WhatsApp code is XXX-XXX",你可以通过匹配内容里的关键词(如"WhatsApp"、"code")来快速识别。
  • 调整AT命令参数:尝试设置字符集为UCS2(AT+CSCS="UCS2"),再执行AT+CMGL="ALL",有些设备会直接返回十六进制的发送者ID字符串,更易解码。
  • 查看用户数据头(UDHI):部分服务商的短信会包含特定的用户数据头,你可以通过AT命令读取TP-UDHI字段,根据头信息识别来源。

实操小技巧

  1. 先执行AT+CSCS="UCS2"切换字符集,再读取短信,可能会得到更易处理的十六进制地址。
  2. 如果用Node.js的Modem模块,查看模块文档里的短信解析选项,很多模块支持自动解码Alphanumeric Sender ID。

内容的提问来源于stack exchange,提问作者Mamdouh Saeed

火山引擎 最新活动