MikroTik 短信解码:解析 PDU 并重组长消息
通过 MikroTik RouterOS 接收和处理短信,可以解锁强大的监控和自动化功能。本文深入探讨使用邮件脚本提取消息、解码 PDU 以准确显示文本,以及重组多段短信。特别适合寻求可靠技术实现的 Android 应用开发者。
从 MikroTik 提取短信数据
从 RouterOS 7.15 开始,您可以通过 /tool/sms/inbox/print detail 命令全面访问短信详情,包括 PDU(协议数据单元)。PDU 封装了所有元数据和编码的消息文本。为实现自动化,可使用 mikrotik-java 库直接集成 API,或通过自定义脚本以邮件方式获取数据。
脚本会将每条短信格式化为 JSON 字符串,并发送至指定邮箱。以下是示例条目:
{"phone":"+79011234567","timestamp":"2026-03-09 21:30:51+03:00","message":"some text","pdu":"07919761980644F0040B919720481784F50000623090120315211BF377BB0CA297F17410FDFE06DDDF72F21C34AFC3E16F391D","source":"usb2,0","type":"class-0"}
您的应用随后解析此 JSON,创建 Sms 对象进行进一步处理。
PDU 结构与初步解析
PDU 是一个十六进制字符串,包含服务字段和用户数据。解码从将 HEX 字符串转换为字节数组开始——需去除非十六进制字符并确保长度为偶数。
初步 PDU 解析的关键步骤:
- SMSC(服务中心地址):首字节指示 SMSC 地址长度。
- 首八位组:设置 PDU 类型,包括用于多段消息的 UDHI 标志(用户数据头)。
- 发送地址:发件人号码,包含长度和格式详情。
- PID(协议标识符):标准短信通常为 0x00。
- DCS(数据编码方案):关键字段,决定文本编码(7 位、8 位或 UCS2)。
- SCTS(服务中心时间戳):消息接收时间戳。
- UDL(用户数据长度):用户数据长度,根据编码解释。
处理多段消息与编码
如果首八位组设置了 UDHI 标志(位 0x40),则属于长消息的一部分。这会触发用户数据头(UDH),包含重组细节:消息 ID、总段数和序列号。
UDH 处理算法:
- 确定头长度和类型(8 位或 16 位引用)。
- 提取段序列号用于重组。
- 根据编码调整数据索引和文本长度。
对于 7 位编码,UDH 占用固定数量的七位组,解码文本前需跳过。使用此公式:
private static int getUdhSeptetsCount(int udhLen) {
return (udhLen * 8 + 6) / 7;
}
对于 UCS2 和 8 位编码,直接从总数据长度中减去头长度。
解码消息文本
最后一步:根据 DCS 将字节转换为可读文本。主要编码及处理方式:
- UCS2 (UTF-16BE):DCS 位 2–3 为 10xx 时触发,使用
StandardCharsets.UTF_16BE解码。 - 8 位数据:匹配 DCS 01xx,用于二进制数据或替代编码。
- 7 位 GSM:拉丁文和基本字符的默认编码;需自定义七位组到字节的解包器。
解码后,在应用中显示文本,或将其输入事件通知和逻辑处理。
关键要点
- RouterOS 7.15+ 暴露 PDU,实现完全短信控制。
- 多段消息需处理 UDH 以正确重组。
- DCS 字段决定文本编码和解码方法。
- 邮件脚本自动化简化外部系统集成。
- 正确清理 HEX 字符串并检查边界,避免解析错误。
— Editorial Team
暂无评论。