GPIO

GPIO 允许在 MikroTik 路由器上配置数字和模拟输入/输出引脚,用于电压测量、干接点检测和继电器控制等任务。设置通过 CLI 在 /iot/gpio 下管理,包含模拟和数字引脚子菜单,并支持电压偏移调整。

GPIO

note:要访问 GPIO 设置,请确保事先安装了 iot 软件包。

您可以通过以下链接找到有关 GPIO 的更多信息。

GPIO 代表通用输入/输出(General-Purpose Input/Output)。它是 routerboard 上的数字信号引脚,允许您发送/接收信号。它可用于不同场景,例如:

  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 作为参考设备(具有 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 秒运行一次脚本。