GPIO
GPIO 可用于配置 MikroTik 路由器上的数字和模拟输入/输出引脚,实现电压测量、干接点检测和继电器控制等任务。相关设置通过 CLI 的
/iot/gpio及其子菜单管理。
GPIO
注意:要访问 GPIO 设置,请先确认已安装 iot 软件包。
关于 GPIO 的更多信息,请参阅此链接。
GPIO 是 General-Purpose Input/Output(通用输入/输出)的缩写,指路由器板上的数字信号引脚,可用于发送或接收信号。它适用于多种场景,例如:
- 通过 ADC 输入测量电压。
- 读取来自其他设备的 0 和 1 信号,即“干接点”。
- 向引脚发送逻辑 0 或 1 信号,以控制已连接的继电器。
信息
KNOT、KNOT Embedded LTE4 和 RBM33G 支持 GPIO 功能。
RouterOS 配置
GPIO 设置只能通过 CLI 访问。
子菜单: /iot/gpio
GPIO 设置分为:
- analog(
/iot/gpio/analog) - digital(
/iot/gpio/digital)
警告
以下示例以 KNOT 作为参考设备(具有 2 个模拟输入引脚、2 个数字输出引脚和 1 个数字输入引脚)。其他设备的引脚定义可能不同,但原理相同。
模拟引脚
子菜单: /iot/gpio/analog
注意:请在产品页面确认您的硬件是否支持模拟输入。
在 “analog” 设置中,可以测量模拟输入/ADC 输入引脚上的电压:
[admin@device] /iot/gpio/analog> print
# NAME VALUE OFFSET
0 pin2 0mV 0mV
1 pin3 32mV 0mV
“OFFSET” 可用于手动补偿线路上的电压降。“VALUE” 的测量方式为 value = adc_input + offset,其中 adc_input 是引脚上的电压。
“OFFSET” 配置示例如下:
[admin@device] /iot/gpio/analog> set pin2 offset
Offset ::= [-]Num[mV]
Num ::= -2147483648..2147483647 (integer number)
[admin@device] /iot/gpio/analog> set pin2 offset 2
[admin@device] /iot/gpio/analog> print
# NAME VALUE OFFSET
0 pin2 2mV 2mV
1 pin3 0mV 0mV
数字引脚
子菜单: /iot/gpio/digital
在 “digital” 部分,可以使用数字输出/输入引脚发送或接收逻辑 0 或 1 信号(输出引脚为“开漏”):
[admin@device] /iot/gpio/digital> print
Flags: X - disabled
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin5 input 0 0
1 pin4 output 0
2 pin6 output 0
引脚的 “DIRECTION” 可以是 “input”(可接收信号的引脚)或 “output”(可发送信号的引脚)。
信息
KNOT 的 pin4 和 pin6 的 “DIRECTION” 无法更改,这两个引脚只能作为 “output” 使用。 当引脚方向设置为 “output” 时,可以配置 “OUTPUT” 值。更改 “OUTPUT” 值会向引脚发送信号。
[admin@device] /iot/gpio/digital> set pin4 output=
Output ::= 0 | 1
[admin@device] /iot/gpio/digital> set pin4 output=1
[admin@device] /iot/gpio/digital> print
Flags: X - disabled
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin5 input 0 0
1 pin4 output 1
2 pin6 output 0
“script” 字段用于配置脚本,当 “INPUT” 或 “OUTPUT” 值发生变化(从 0 变为 1 或从 1 变为 0)时会触发该脚本。
[admin@device] /iot/gpio/digital> set pin4 script=script1
[admin@device] /iot/gpio/digital> set pin5 script="/system .."
[admin@device] /iot/gpio/digital> print
Flags: X - disabled
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin5 input 0 0 /system ..
1 pin4 output 1 script1
2 pin6 output 0
不同场景
控制继电器
GPIO 的一种应用场景是使用数字输出引脚“控制其他继电器”,即向连接到引脚的设备发送 “0” 或 “1” 信号。要自动化该过程,可以使用调度器,在指定时间运行脚本。
例如,先添加第一个脚本(如下所示的一行),并将其命名为 “output=0”:
/iot/gpio/digital set pin4 output=0
然后添加第二个脚本(如下所示的一行),并将其命名为 “output=1”:
/iot/gpio/digital set pin4 output=1
创建这两个脚本后,就可以配置调度:
[admin@device] /system/scheduler> add name=run-30s interval=30s on-event="output=0"
上述调度配置会每 30 秒运行一次名为 “output=0” 的脚本。
[admin@device] /system/scheduler> add name=run-45s interval=45s on-event="output=1"
上述调度配置会每 45 秒运行一次名为 “output=1” 的脚本。
最终,设备会每 30 秒向第 4 个引脚(数字输出引脚)发送 output 值为 0 的信号,并每 45 秒发送 output 值为 1 的信号。
您可以根据实际需求调整调度时间。
监控输入信号
另一种场景是使用数字输入引脚“监控输入信号”。您需要一个脚本,当方向为 “input” 的引脚上 “INPUT” 值发生变化时(即 RouterOS 设备从连接到该引脚的其他设备收到 “0 或 1” 信号时),触发电子邮件通知或 MQTT/HTTPS(fetch)发布。
电子邮件通知脚本:
/tool/e-mail/send to="config@mydomain.com" subject="$[/system/identity/get name]" body="$[/iot/gpio/digital/get pin5 input]"
创建脚本后,将其应用/设置到 “input” 引脚:
[admin@device] /iot/gpio/digital> set pin5 script=script1
[admin@device] /iot/gpio/digital> print
Flags: X - disabled
# NAME DIRECTION OUTPUT INPUT SCRIPT
0 pin5 input 0 0 script1
1 pin4 output 0 script1
2 pin6 output 0
上例中的电子邮件通知脚本名为 “script1”。
这样,每当输入值发生变化(从 0 变为 1 或从 1 变为 0),脚本都会自动发送电子邮件通知,并在邮件正文中显示输入值。
请记得修改脚本内容,并相应配置电子邮件设置(/tool/e-mail):
/tool/e-mail/send to="config@mydomain.com" subject="$[/system/identity/get name]" body="$[/iot/gpio/digital/get pin5 input]"
请配置您实际使用的电子邮件地址,也可以根据需要修改邮件主题和正文。
MQTT 发布脚本:
:local broker "name"
:local topic "topic"
:local message "\{\"inputVALUE\":$[/iot/gpio/digital/get pin5 input]}"
/iot/mqtt/publish broker=$broker topic=$topic message=$message
该脚本的工作方式与“电子邮件通知”脚本相同,只是当输入值变化时,脚本会发起 MQTT 发布(而非电子邮件通知),并以 JSON 格式发送引脚收到的输入值。
请记得先设置 MQTT broker(/iot/mqtt/brokers/add ..),并修改脚本中的几行内容:
:local broker "name"
broker 的 “name” 应相应更改(可使用 CLI 命令 /iot/mqtt/brokers/print 查看所有已创建 broker 及其名称)。
:local topic "topic"
topic 也应更改。topic 本身在服务器端配置,因此请确保使用正确的 topic。
请记得将脚本应用/设置到 pin5(/iot/gpio/digital/set pin5 script=script\_name),如上面的“电子邮件通知”示例所示。
如果使用机械开关向 GPIO 引脚发送信号,建议改用以下脚本(用于处理引脚收到信号时脚本被多次触发的情况):
:global gpioscriptrunning;
if (!$gpioscriptrunning) do=\{:set $gpioscriptrunning true;
:log info "script started - GPIO changed";
:do \{if ([/iot/gpio/digital/get pin5 input] = "0") do=\{/tool/e-mail/send to="config@mydomain.com" subject="$[/system/identity/get name]" body="pin5 received logical 0"} else \{/tool/e-mail/send to="config@mydomain.com" subject="$[/system/identity/get name]" body="pin5 received logical 1"};
:delay 1s;
:set $gpioscriptrunning false} on-error=\{:set $gpioscriptrunning false;
:log info "e-mail error, resetting script state..."}}
如果 GPIO 引脚状态在毫秒或微秒内多次变化,上述脚本可确保电子邮件通知不会重复发送。
监控电压
最后一种场景是使用模拟引脚“监控电压”。您需要一个按调度读取/监控电压的脚本,然后通过电子邮件、MQTT 或 HTTPS(fetch)发送数据。
创建如下脚本。本示例使用 MQTT 发布(您也可以创建使用 /tool/e-mail .. 的类似脚本以发送电子邮件通知):
:local broker "name"
:local topic "topic"
:local message "\{\"voltage(mV)\":$[/iot/gpio/analog/get pin3 value]}"
/iot/mqtt/publish broker=$broker topic=$topic message=$message
该脚本会读取/测量 pin3 上的电压,并将数据发布到 MQTT broker。
请记得先设置 MQTT broker(/iot/mqtt/brokers/add ..),并修改脚本中的几行内容:
:local broker "name"
broker 的 “name” 应相应更改(可使用 CLI 命令 /iot/mqtt/brokers/print 查看所有已创建 broker 及其名称)。
:local topic "topic"
topic 也应更改。topic 本身在服务器端配置,因此请确保使用正确的 topic。
保存脚本并命名,例如 “voltagepublish”。要自动化该过程,可以使用调度器。
[admin@device] /system/scheduler> add name=run-45s interval=45s on-event="voltagepublish"
上述调度配置会每 45 秒运行一次该脚本。