返回首页

MikroTik 中的 SMS 解码:PDU、消息拼接(面向开发者)

本文介绍了如何在 MikroTik RouterOS 中处理 SMS,包括通过 PDU 提取数据、解码各种文本编码以及拼接多部分消息。该材料面向创建用于监控和自动化的 Android 应用的开发者。

如何在 MikroTik 中解码 SMS:完整的 PDU 和拼接分解
Advertisement 728x90

MikroTik 短信解码:解析 PDU 并重组长消息

通过 MikroTik RouterOS 接收和处理短信,可以解锁强大的监控和自动化功能。本文深入探讨使用邮件脚本提取消息、解码 PDU 以准确显示文本,以及重组多段短信。特别适合寻求可靠技术实现的 Android 应用开发者。

从 MikroTik 提取短信数据

从 RouterOS 7.15 开始,您可以通过 /tool/sms/inbox/print detail 命令全面访问短信详情,包括 PDU(协议数据单元)。PDU 封装了所有元数据和编码的消息文本。为实现自动化,可使用 mikrotik-java 库直接集成 API,或通过自定义脚本以邮件方式获取数据。

脚本会将每条短信格式化为 JSON 字符串,并发送至指定邮箱。以下是示例条目:

Google AdInline article slot
{"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 解析的关键步骤:

Google AdInline article slot
  • SMSC(服务中心地址):首字节指示 SMSC 地址长度。
  • 首八位组:设置 PDU 类型,包括用于多段消息的 UDHI 标志(用户数据头)。
  • 发送地址:发件人号码,包含长度和格式详情。
  • PID(协议标识符):标准短信通常为 0x00。
  • DCS(数据编码方案):关键字段,决定文本编码(7 位、8 位或 UCS2)。
  • SCTS(服务中心时间戳):消息接收时间戳。
  • UDL(用户数据长度):用户数据长度,根据编码解释。

处理多段消息与编码

如果首八位组设置了 UDHI 标志(位 0x40),则属于长消息的一部分。这会触发用户数据头(UDH),包含重组细节:消息 ID、总段数和序列号。

UDH 处理算法:

  • 确定头长度和类型(8 位或 16 位引用)。
  • 提取段序列号用于重组。
  • 根据编码调整数据索引和文本长度。

对于 7 位编码,UDH 占用固定数量的七位组,解码文本前需跳过。使用此公式:

Google AdInline article slot
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

Advertisement 728x90

继续阅读