GPIO
GPIO 允许在 MikroTik 路由器上配置数字和模拟输入/输出引脚,用于电压测量、干接点检测和继电器控制等任务。设置通过 CLI 在 /iot/gpio 下管理,包含模拟和数字引脚子菜单,并支持电压偏移调整。
GPIO
note:要访问 GPIO 设置,请确保事先安装了 iot 软件包。
您可以通过以下链接找到有关 GPIO 的更多信息。
GPIO 代表通用输入/输出(General-Purpose Input/Output)。它是 routerboard 上的数字信号引脚,允许您发送/接收信号。它可用于不同场景,例如:
- 通过 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 作为参考设备(具有 x2 个模拟输入引脚、x2 个数字输出引脚和 x1 个数字输入引脚)。其他设备可能具有不同的引脚定义,但适用的原则相同。
模拟引脚
子菜单: /iot/gpio/analog
note:请在产品页面上查看您的硬件是否支持模拟输入。
在 "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 value=0 的信号,并每 45 秒发送一次 output value=1 的信号。
您可以根据需要(取决于需求)更改计划的时间。
监控输入信号
另一个场景是使用数字输入引脚"监控输入信号"。您需要一个脚本,当 direction="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),如上面的 "email notification" 示例所示。
如果使用机械开关向 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 秒运行一次脚本。