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:) sensitiveSIM 卡的 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 命令交换期间则在超过两秒后超时。