SMS
本页介绍 MikroTik RouterOS 中的 SMS 功能,可通过 GSM modem 通信,使用 AT 命令发送和接收 SMS 消息。内容涵盖发送方法、port、电话号码、消息编码等参数,以及用于与网络运营商交互的 USSD 消息支持。
SMS
概述
可以将 GSM modem 连接到 RouterOS 设备,并使用它来发送和接收 SMS 消息。RouterOS 会将此类 modem 列为串口,并出现在 /port/print 列表中。GSM 标准定义了用于发送 SMS 消息的 AT 命令,并规定了这些命令中消息的编码方式。'/tool/sms/send' 使用标准 GSM AT 命令来发送 SMS。
发送
子菜单: /tool/sms/send
示例
为 ppp 接口发送命令:
/tool/sms/send usb3 "20000000" \ message="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#\$%^&*(){}[]\"'~"
对于 LTE 接口,请在 port 字段中使用 LTE 接口名称:
/tool/sms/send lte1 "20000000" \ message="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#\$%^&*(){}[]\"'~"
| 参数 | 描述 |
|---|---|
| port (string) | GSM modem 所连接的 /port 中的端口名称。 |
| phone-number (string) | 接收方电话号码。允许的字符为 "0123456789*#abc"。如果第一个字符是 "+",则电话号码类型设置为 international,否则设置为 unknown。 |
| channel (integer) | 用于发送的 modem 通道。 |
| message (string) | 消息内容。它使用 GSM 7 编码(目前不支持 UCS2),因此消息长度限制为 160 个字符。字符 ^{}\\[]~ 是扩展 GSM 7 位字符,每个会占用两个字符槽,存在这些字符时会将有效上限降低到 160 以下。 |
| smsc (string) | |
| type (string) | 如果设置为 class-0,则发送 class 0 SMS 消息。它会立即显示,不会存储在手机中。 |
| sms-storage (string) | 选择用于保存已接收 SMS 的存储位置(modem/sim) |
| status-report-request (yes | no; Default: yes) | 设置为 "no" 以不请求确认消息,该确认消息指示文本消息是否成功发送给接收方。 |
USSD 消息
USSD(Unstructured Supplementary Service Data,非结构化补充业务数据)消息可用于与移动网络运营商通信,以接收附加信息、启用附加服务或为预付费卡充值。USSD 消息可以通过 AT 命令来处理(在某些 modem 上命令可能不同,甚至可能被阻止)。
必须激活 3G 或 GSM 网络模式才能使用此功能,因为它在仅 LTE 模式下不受支持(R11e-LTE modem 会自动切换到 3G 模式以发送 USSD 消息)。
PDU(Protocol Data Unit,协议数据单元)消息及其解密后的版本会打印在 LTE debug 日志记录下。
示例
检查 LTE debug 日志记录是否处于活动状态:
/system/logging/print
Flags: X - disabled, I - invalid, * - default
# TOPICS ACTION PREFIX
0 * info memory
1 * error memory
2 * warning memory
3 * critical echo
如果没有日志记录条目,请运行以下命令来添加:
/system/logging/add topics=lte,!raw
/system/logging/print
Flags: X - disabled, I - invalid, * - default
# TOPICS ACTION PREFIX
0 * info memory
1 * error memory
2 * warning memory
3 * critical echo
4 lte,!raw memory
要从 *245# 接收账户状态
/interface/lte/at-chat lte1 input="AT+CUSD=1,\"*245#\",15"
output: OK
/log/print
11:51:20 lte,async lte1: sent AT+CUSD=1,"*245#",15
11:51:20 lte,async lte1: rcvd OK
11:51:23 lte,async,event +CUSD: 0,"EBB79B1E0685E9ECF4BADE9E03", 0
11:51:23 gsm,info USSD: konta atlikums
接收
RouterOS 还支持接收 SMS 消息、执行脚本,甚至回复发送者。
在路由器能够接收 SMS 之前,需要在 /tool/sms 菜单中进行相关配置。以下参数可配置:
| 参数 | 描述 |
|---|---|
| allowed-number (string; Default: "") | 允许运行命令的发送者号码,必须指定国家代码,例如 +371XXXXXXX |
| channel (integer; Default: 0) | 用于接收的 modem 通道。 |
| keep-max-sms (integer; Default: 0) | 将保存的最大消息数。如果设置得超过 SIM 支持的数量,将无法接收新消息。从 RouterOS v6.44.6 起由 auto-erase 参数取代 |
| auto-erase (yes | no; Default: no) | SIM 存储大小会被自动读取。当 auto-erase=no 时,如果存储已满,将不会接收新的 SMS。设置 auto-erase=yes 可自动删除最早接收的 SMS,为新消息释放空间。从 v6.44.6 起可用 |
| port (string; Default: (unknown)) | Modem 端口(modem 只能被一个进程使用 "/port> print") |
| receive-enabled (yes | no; Default: no) | 必须开启才能接收消息 |
| secret (string; Default: "") sensitive | 秘密密码,必填 |
| polling(yes | no; Default: no) | 每 10 秒检查 modem 是否有新 SMS,而不是仅在收到 modem 命令后才更新收件箱。从 v7.16 起可用 |
| sim-pin(string; Default:) sensitive | SIM 卡的 PIN 码。 |
能够查看已接收消息的基本示例配置
/tool/sms/set receive-enabled=yes port=lte1
/tool/sms/print
status: running
receive-enabled: yes
port: lte1
channel: 0
secret:
allowed-number:
auto-erase: no
sim-pin:
last-ussd:
收件箱
子菜单: /tool/sms/inbox
如果你已启用读取器,将在此子菜单中看到传入的消息:
只读属性:
| 属性 | 描述 |
|---|---|
| phone (string) | 发送者的电话号码。 |
| message (string) | 消息正文 |
| timestamp (time) | 消息接收的时间。该时间由运营商发送,而非路由器本地时间。 |
| type (string) | 消息类型 |
语法
:cmd SECRET script NAME [[ VAR[=VAL] ] ... ]
- SECRET - 密码
- NAME -
/system/script中可用脚本的名称 - VAR - 将传递给脚本的变量(可作为 VAR 或 VAR=value 传递),以空格分隔。
其他需要记住的事项:
- *如有必要,参数可以加上引号 "VAR"="VAL"。
- *不支持对值进行转义(VAR=""")。
- *不支持合并 SMS,每条 SMS 都会被单独处理。
- * 不支持 16 位 unicode 消息。
- * SMS 使用标准 GSM7 字母表解码,因此不能以其他编码发送,否则会被错误解码。
示例
错误
:cmd script mans_skripts
:cmd slepens script mans skripts
:cmd slepens script mans_skripts var=
:cmd slepens script mans_skripts var= a
:cmd slepens script mans_skripts var=a a
正确
:cmd slepens script mans_skripts
:cmd slepens script "mans skripts"
:cmd slepens script mans_skripts var
:cmd slepens script mans_skripts var=a
:cmd slepens script mans_skripts var="a a"
调试
/tool/sms/send 命令会记录写入和读取的数据。它使用 gsm,debug,write 和 gsm,debug,read 标签记录。有关更多信息,请参见 /system/logging。
实现细节
使用 AT+CMGS 和 AT+CMGF 命令。端口在命令执行期间被占用,不能由其他 RouterOS 组件同时使用。消息发送过程可能耗时较长。它会在超出一分钟后超时,而初始 AT 命令交换期间则在超过两秒后超时。