如何通过AT+CMGL命令识别WhatsApp等服务商发送的OTP短信?
解决ZTE MF190S接收WhatsApp短信时发送方显示无效数字的问题
我来帮你搞定这个困扰——那个看起来无效的数字81084326797126204其实是WhatsApp的字母数字发送者ID(也就是"WhatsApp")经过GSM短信协议编码后的十进制形式,厂商配套软件做了额外的解析工作,所以能直接显示成文本,而你用AT命令直接读取时拿到的是原始编码值。下面给你具体的解决思路和实操方法:
为什么会显示成数字?
GSM短信协议里,像"WhatsApp"这类非手机号的发送者ID(Alphanumeric Sender ID)不能直接传输,必须转换成特定的二进制格式,再打包成十进制数放在address字段里。普通的手机号用ITU E.164格式传输,所以能直接显示,而这类字母ID就会变成你看到的长数字。
如何解码这个数字获取发送者文本?
你之前尝试转十六进制没成功,大概率是转换后的解析方式不对,正确步骤如下:
- 先获取完整的短信字段:执行
AT+CMGR=0(读取索引为0的这条短信),它会返回更详细的信息,包括address_type(地址类型)。比如返回可能包含类似,127,这样的字段,127就是地址类型的十进制值(对应十六进制0x7F,表示国际字母数字地址)。 - 转换数字为十六进制:把
81084326797126204转换成十六进制,得到0xE11000000000000C(你可以用Node.js的(81084326797126204).toString(16)来快速转换)。 - 解码十六进制为文本:
- 如果地址类型是字母数字类型(比如
0x5F或0x7F),就提取十六进制里的有效字符部分,按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字段,根据头信息识别来源。
实操小技巧
- 先执行
AT+CSCS="UCS2"切换字符集,再读取短信,可能会得到更易处理的十六进制地址。 - 如果用Node.js的Modem模块,查看模块文档里的短信解析选项,很多模块支持自动解码Alphanumeric Sender ID。
内容的提问来源于stack exchange,提问作者Mamdouh Saeed




