GPIO

GPIO 可用于配置 MikroTik 路由器上的数字和模拟输入/输出引脚,实现电压测量、干接点检测和继电器控制等任务。相关设置通过 CLI 的 /iot/gpio 及其子菜单管理。

GPIO

注意:要访问 GPIO 设置,请先确认已安装 iot 软件包。

关于 GPIO 的更多信息,请参阅此链接。

GPIO 是 General-Purpose Input/Output(通用输入/输出)的缩写,指路由器板上的数字信号引脚,可用于发送或接收信号。它适用于多种场景,例如:

  1. 通过 ADC 输入测量电压。
  2. 读取来自其他设备的 0 和 1 信号,即“干接点”。
  3. 向引脚发送逻辑 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 秒运行一次该脚本。