其中一个选项可用于监视控件广播的信息蓝牙标签是云系统,比如AWS(亚马逊网络服务)。在本文中,我们将展示如何配置AWS和RouterOS,以便使用MQTT和HTTPS协议发布数据。l雷竞技l雷竞技在这种情况下,RouterOS将充当网关,并将BLEtag广播的数据发布到云(AWS)。在此场景中,AWS将充当MQTT代理和MQTT订阅者(服务器,数据将在其中发布/显示)。
在继续设置之前,您需要在AWS系统中创建一个帐户。你可以在下面找到更多关于如何做到这一点的信息链接.
创建帐户后,确保支付卡在下面验证Your_Username >我的帐户,否则该帐户将不活跃。
去服务>物联网>物联网核心.
在测试节中,您可以使用内置的MQTT测试客户机,这样您就可以测试发布和订阅主题。你有订阅一个主题和发布到主题选项卡,允许您检查两个进程。MQTT测试客户端部分还可以显示HTTPS帖子。
请注意:本节中显示的配置适用于MQTT发布/订阅场景,但您也可以使用相同的AWS设置测试HTTPS发布。
步骤1:导航到管理>的事情.这是配置开始的菜单(Things菜单是设备或逻辑实体的表示)。
新闻创建>创建一个单独的东西>选择一个名字下一步> >创建证书。
第二步:下载“AmazonRootCA1”。xxxx.cert. pem”证书(AWS的根CA),“xxxx.cert. pem”证书。Pem”证书(thing的证书)和“xxxx.private. Pem”证书。密钥(私钥)-“xxxx”部分对于每个新创建的证书是唯一的。
步骤3:您可以选择完成设置(通过选择)完成)或制定策略(通过选择)附加保单)。您需要向创建的“事物”添加策略,但如果您使用的是新帐户,则可能没有任何策略可供选择。不用担心,稍后您可以手动创建它们。
还有另外两个很重要的菜单安全>证书和安全>政策.
在证书菜单中,您可以创建证书、激活它们并将它们附加到策略。“Things”配置应该已经创建了证书。只需确保证书是“激活的”。要做到这一点,选择证书,单击“行动“然后点击”激活”。
步骤1:创建新策略。点击“创建然后输入保单的名称。在“创建策略选项卡中有一个设置“动作”的选项。在本例中,我们将使用4个操作(物联网:发布,物联网:接收,物联网:订阅和物联网:连接)。的示例中可以找到有关策略的更多信息链接.
物联网:发布
物联网:接收
物联网:订阅
物联网:连接
第二步:导航到添加语句”一节。在“行动“场,选物联网:发布和物联网:接收动作,用逗号“,”分隔。在“资源是"字段替换文本"replaceWithATopic与实际相关的主题(例如)我的/测试/主题”)。在“效果“复选框标记”允许”。
replaceWithATopic
我的/测试/主题
第三步:点击“添加新语句”添加声明”。通过选择向语句添加操作物联网:订阅并将文本替换为资源是“场”replaceWithATopicFilter”与实际相关的主题(例如“我的/测试/主题”)。在“效果“复选框标记”允许”。
replaceWithATopicFilter”
步骤4:添加最后一条语句和设置物联网:连接行动。只更改“replaceWithAClientId使用适当的客户端id(例如)测试客户端),并在“允许”复选框。要完成设置,请单击“创建”。
replaceWithAClientId
测试客户端
步骤5:您需要将证书附加到新创建的策略。要做到这一点,请转到安全>证书,选择证书,点击“行动"和"附加的政策”。
选择策略并单击“附加”。
这样,AWS设置就完成了。
你可以找到端点地址在“设置部分(设置>设备数据端点)。该地址应该在RouterOS设置中配置为代理的IP/FQDN地址。l雷竞技
请注意为了配置MQTT,请确保物联网包预先安装。
在我们的示例中,我们使用结作为网关和脚本(专门为KNOT创建)来发布数据。在你的特定应用场景中,你可以使用任何RouterOS设备(安装了iot包)来发布你需要的任何数据。l雷竞技
由于AWS使用SSL连接,我们将需要以前下载的证书和密钥。
进入“文件”菜单,添加到“文件列表”AmazonRootCA1.pem,xxxx.cert.pem.crt和xxxx.private.pem.crt.
进入系统>证书并导入所有3个文件(通过“导入”按钮-一个接一个):
确保两个证书都是可信的(T),并确保“xxxx.certificate.pem”。crt”带有私钥(K)。
导航到IoT>MQTT并添加一个新的代理(“+”按钮)。
在“Name”字段中命名代理(例如,AWS)。
在“地址”字段中输入/粘贴AWS地址(您可以在AWS设置中找到它)。设置>设备数据端点”- - -端点地址)。
在“port”字段中配置代理使用的端口,并通过SSL复选框(在本例中,AWS使用)启用SSL8883而且,由于我们使用证书,它需要启用SSL)。
“Username”和“Password”字段在此场景中不需要(取决于代理的配置-跳过这两个字段)。
在“客户端Id”字段中设置一个客户端Id(它是在AWS策略中配置的Id -在本例中,测试客户端)。
由于使用了SSL,因此必须在“证书”字段中选择证书(selectxxxx.certificate.pem.crt)。
点击“Apply”和“OK”完成代理的设置。
为了将数据从蓝牙标签(在我们的示例中为TG-BT5-IN)发布到AWS,我们将使用该脚本。脚本示例如下所示,可以使用此下载链接.
每一行都以一个符号开头"#是指导性的,它描述了将在线下配置的参数。更改将应用于特定情况的引号“”内的参数。
#必需的包:iot ################################ 配置 ################################应该用于发布的现有MQTT代理的名称:本地代理“AWS” 应该发布消息的# MQTT主题:本地主题“my/test/topic” 接口的MAC应该被用作“定位器ID”locallocatorface“ether1” # POSIX regex用于过滤广告蓝牙地址。如。“公元前^:33:交流”#只包括以这3个八位字节开头的地址。#要禁用此过滤器,请将其设置为“”: localaddressregex "" # POSIX regex用于过滤蓝牙广告基于他们的数据。相同#用法与'addressRegex'相同。:本地广告dataregex "" #信号强度滤波器。例如-40只包括蓝牙广告#信号强度大于-40dBm。#要禁用此过滤器,请将其设置为“”:local rssiThreshold "-40" #################################### 系统 ###################################:put("[*]收集系统信息…"):local ifaceMac [/interface get [/interface find name=$locatorIface] mac-address]:local cpuLoad [/system resource get cpu-load]:local free-memory[/系统资源获取free-memory]: localusedmemory ([/system resource get total-memory] - $freeMemory):local rosVersion [/system package get value-name=version \[/system package find where name ~ "^l雷竞技routeros"]]:local model [/system ios版雷竞技官网入口routerboard get value-name=model]:local serialNumber [/system ios版雷竞技官网入口routerboard get value-name=serial-number]# Health有点不确定,因为'/system Health '在ROS6中没有'find:本地运行状况[/系统运行状况打印为值]:本地供电电压0: localboardtemp 0:foreach entry in=$health do={:如果($ entry - >“名字”=“电压”)做={:设置supplyVoltage美元($ entry - >“价值”)}:if ($entry->"name" = "board-temperature1") do={:set $boardTemp ($entry->"value")}} ################################## 蓝牙 ##################################:put("[*]正在收集蓝牙信息…"):全球btOldestAdvertisementTimestamp:if ([:typeof $btOldestAdvertisementTimestamp] = " none ") do={#启动后第一次运行这个脚本,需要初始化# persistent变量:set $btOldestAdvertisementTimestamp 0}: localbtprocessingstart [/system clock get time]:本地广告[/iot蓝牙扫描仪广告打印详情\As-value where \epoch > $btOldestAdvertisementTimestamp和\地址~ $addressRegex和\data ~ $advertisingDataRegex和\rssi > $rssiThreshold]:local advJson "":local advCount 0:local advSeparator "":local lastAdvTimestamp 0删除MAC/蓝牙地址中的分号: localminimizemac do={:本地最小化:local lastIdx ([:len $address] - 1)$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $:local char [:pick $address $idx]:if ($char != ":")设置$最小化$char}}:返回$最小化} :foreach adv =$ advertising ={:本地地址($adv->"address"): localts ($adv->"epoch"):本地rssi ($adv->"rssi"):本地AD ($adv->"data"): localobj "\{\\ \“id”:\ " $ [$ minimizeMac地址= $地址]\”、\ts \“\”:ts美元,\rssi \“\”:$ rssi \\“ed \”:{\\ \“广告”:\ \“美元广告\”} \}”:设置$advCount ($advCount + 1)设置$lastAdvTimestamp $ts确保最后一个对象不以逗号结束$advJson$advSeparator$obj":if ($advSeparator = "") do={:set $advSeparator ","}} :if ($advCount > 0) do={ :set $btOldestAdvertisementTimestamp $lastAdvTimestamp } :put("[*]找到$advCount新广告\(处理时间:$[([/system clock get time] - $btProcessingStart)])") #################################### MQTT #####################################:本地消息\“{\\"clientId\":\"$[/iot mqtt broker get value-name=client-id \[/iot MQTT broker find name=$broker]]\",\\ " t \”:0 \\ \“v \ ": 1日OldestAdvertisementTimestamp \“\”:$ btOldestAdvertisementTimestamp \\“loc \”:[{\\ \“id”:\ " $ $ minimizeMac地址= $ ifaceMac \”、\\ \“标签”:[$ advJson], \\“ed \”:{\\”模式\”:\ " $模型\ ",\serialNumber美元\“sn \”,\“\”,\rosVersion美元\“活性氧\”,\“\”,\cpu \“\”:cpuLoad美元,\“眉目”\ \”:usedMemory美元,\fmem \“\”:$ freeMemory \\“事业单位\”:$ supplyVoltage \\ temp \”:$ boardTemp \} \}) \}”:日志信息"$message";:put("[*]总消息大小:$[:len $message] bytes"):put("[*]向MQTT代理发送消息…")/iot MQTT publish broker=$broker topic=$topic message=$message:put ("[*] Done")
#必需的包:iot
################################ 配置 ################################应该用于发布的现有MQTT代理的名称:本地代理“AWS”
应该发布消息的# MQTT主题:本地主题“my/test/topic”
接口的MAC应该被用作“定位器ID”locallocatorface“ether1”
# POSIX regex用于过滤广告蓝牙地址。如。“公元前^:33:交流”#只包括以这3个八位字节开头的地址。#要禁用此过滤器,请将其设置为“”: localaddressregex ""
# POSIX regex用于过滤蓝牙广告基于他们的数据。相同#用法与'addressRegex'相同。:本地广告dataregex ""
#信号强度滤波器。例如-40只包括蓝牙广告#信号强度大于-40dBm。#要禁用此过滤器,请将其设置为“”:local rssiThreshold "-40"
#################################### 系统 ###################################:put("[*]收集系统信息…"):local ifaceMac [/interface get [/interface find name=$locatorIface] mac-address]:local cpuLoad [/system resource get cpu-load]:local free-memory[/系统资源获取free-memory]: localusedmemory ([/system resource get total-memory] - $freeMemory):local rosVersion [/system package get value-name=version \[/system package find where name ~ "^l雷竞技routeros"]]:local model [/system ios版雷竞技官网入口routerboard get value-name=model]:local serialNumber [/system ios版雷竞技官网入口routerboard get value-name=serial-number]# Health有点不确定,因为'/system Health '在ROS6中没有'find:本地运行状况[/系统运行状况打印为值]:本地供电电压0: localboardtemp 0:foreach entry in=$health do={:如果($ entry - >“名字”=“电压”)做={:设置supplyVoltage美元($ entry - >“价值”)}:if ($entry->"name" = "board-temperature1") do={:set $boardTemp ($entry->"value")}}
################################## 蓝牙 ##################################:put("[*]正在收集蓝牙信息…"):全球btOldestAdvertisementTimestamp:if ([:typeof $btOldestAdvertisementTimestamp] = " none ") do={#启动后第一次运行这个脚本,需要初始化# persistent变量:set $btOldestAdvertisementTimestamp 0}: localbtprocessingstart [/system clock get time]:本地广告[/iot蓝牙扫描仪广告打印详情\As-value where \epoch > $btOldestAdvertisementTimestamp和\地址~ $addressRegex和\data ~ $advertisingDataRegex和\rssi > $rssiThreshold]:local advJson "":local advCount 0:local advSeparator "":local lastAdvTimestamp 0删除MAC/蓝牙地址中的分号: localminimizemac do={:本地最小化:local lastIdx ([:len $address] - 1)$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $:local char [:pick $address $idx]:if ($char != ":")设置$最小化$char}}:返回$最小化}
:foreach adv =$ advertising ={:本地地址($adv->"address"): localts ($adv->"epoch"):本地rssi ($adv->"rssi"):本地AD ($adv->"data"): localobj "\{\\ \“id”:\ " $ [$ minimizeMac地址= $地址]\”、\ts \“\”:ts美元,\rssi \“\”:$ rssi \\“ed \”:{\\ \“广告”:\ \“美元广告\”} \}”:设置$advCount ($advCount + 1)设置$lastAdvTimestamp $ts确保最后一个对象不以逗号结束$advJson$advSeparator$obj":if ($advSeparator = "") do={:set $advSeparator ","}}
:if ($advCount > 0) do={
:set $btOldestAdvertisementTimestamp $lastAdvTimestamp
}
:put("[*]找到$advCount新广告\(处理时间:$[([/system clock get time] - $btProcessingStart)])")
#################################### MQTT #####################################:本地消息\“{\\"clientId\":\"$[/iot mqtt broker get value-name=client-id \[/iot MQTT broker find name=$broker]]\",\\ " t \”:0 \\ \“v \ ": 1日OldestAdvertisementTimestamp \“\”:$ btOldestAdvertisementTimestamp \\“loc \”:[{\\ \“id”:\ " $ $ minimizeMac地址= $ ifaceMac \”、\\ \“标签”:[$ advJson], \\“ed \”:{\\”模式\”:\ " $模型\ ",\serialNumber美元\“sn \”,\“\”,\rosVersion美元\“活性氧\”,\“\”,\cpu \“\”:cpuLoad美元,\“眉目”\ \”:usedMemory美元,\fmem \“\”:$ freeMemory \\“事业单位\”:$ supplyVoltage \\ temp \”:$ boardTemp \} \}) \}”:日志信息"$message";:put("[*]总消息大小:$[:len $message] bytes"):put("[*]向MQTT代理发送消息…")/iot MQTT publish broker=$broker topic=$topic message=$message:put ("[*] Done")
要考虑2条脚本线。
:本地代理“AWS”
行,您应该在引号“”中指定经纪人的名称(在我们的示例中,AWS)。
:本地主题“my/test/topic”
行,您应该在引号“”中指定正确的主题。主题是在AWS策略中配置的(在我们的示例中,我的/测试/主题)。
脚本配置的其余部分取决于总体需求。该脚本解释了哪些参数被配置为要发布。
导航到System>Scripts,在那里添加一个新脚本,并粘贴上面显示的脚本(将其命名为script1)。
要运行该脚本,可以使用命令行:
/system script运行script1
另一种可用于将数据从网关发送到云的协议是HTTPS。方法可以实现这一点获取工具。直到7.1beta6 Routl雷竞技erOS版本, fetch没有选择客户端证书进行身份验证的选项(这意味着不支持使用客户端证书进行HTTPS发布),在7.1beta6中添加了一个新特性来启用此设置/支持。使用CURL和Python的HTTPS post示例(以及其他有用信息)显示在AWS HTTPS手册.
为了将来自蓝牙标签(在我们的示例中为TG-BT5-IN)的数据发布到AWS,我们将使用该脚本。脚本示例如下所示,可以使用此下载链接.
################################ 配置 ################################接口的MAC应该被用作“定位器ID”locallocatorface“ether1” # POSIX regex用于过滤广告蓝牙地址。如。“公元前^:33:交流”#只包括以这3个八位字节开头的地址。#要禁用此过滤器,请将其设置为“”: localaddressregex "" # POSIX regex用于过滤蓝牙广告基于他们的数据。相同#用法与'addressRegex'相同。:本地广告dataregex "" #信号强度滤波器。例如-40只包括蓝牙广告#信号强度大于-40dBm。#要禁用此过滤器,请将其设置为“”:local rssiThreshold "-40" #################################### 系统 ###################################:put("[*]收集系统信息…"):local ifaceMac [/interface get [/interface find name=$locatorIface] mac-address]:local cpuLoad [/system resource get cpu-load]:local free-memory[/系统资源获取free-memory]: localusedmemory ([/system resource get total-memory] - $freeMemory):local rosVersion [/system package get value-name=version \[/system package find where name ~ "^l雷竞技routeros"]]:local model [/system ios版雷竞技官网入口routerboard get value-name=model]:local serialNumber [/system ios版雷竞技官网入口routerboard get value-name=serial-number]# Health有点不确定,因为'/system Health '在ROS6中没有'find:本地运行状况[/系统运行状况打印为值]:本地供电电压0: localboardtemp 0:foreach entry in=$health do={:如果($ entry - >“名字”=“电压”)做={:设置supplyVoltage美元($ entry - >“价值”)}:if ($entry->"name" = "board-temperature1") do={:set $boardTemp ($entry->"value")}} ################################## 蓝牙 ##################################:put("[*]正在收集蓝牙信息…"):全球btOldestAdvertisementTimestamp:if ([:typeof $btOldestAdvertisementTimestamp] = " none ") do={#启动后第一次运行这个脚本,需要初始化# persistent变量:set $btOldestAdvertisementTimestamp 0}: localbtprocessingstart [/system clock get time]:本地广告[/iot蓝牙扫描仪广告打印详情\As-value where \epoch > $btOldestAdvertisementTimestamp和\地址~ $addressRegex和\data ~ $advertisingDataRegex和\rssi > $rssiThreshold]:local advJson "":local advCount 0:local advSeparator "":local lastAdvTimestamp 0删除MAC/蓝牙地址中的分号: localminimizemac do={:本地最小化:local lastIdx ([:len $address] - 1)$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $:local char [:pick $address $idx]:if ($char != ":")设置$最小化$char}}:返回$最小化} :foreach adv =$ advertising ={:本地地址($adv->"address"): localts ($adv->"epoch"):本地rssi ($adv->"rssi"):本地AD ($adv->"data"): localobj "\{\\ \“id”:\ " $ [$ minimizeMac地址= $地址]\”、\ts \“\”:ts美元,\rssi \“\”:$ rssi \\“ed \”:{\\ \“广告”:\ \“美元广告\”} \}”:设置$advCount ($advCount + 1)设置$lastAdvTimestamp $ts确保最后一个对象不以逗号结束$advJson$advSeparator$obj":if ($advSeparator = "") do={:set $advSeparator ","}} :if ($advCount > 0) do={ :set $btOldestAdvertisementTimestamp $lastAdvTimestamp } :put("[*]找到$advCount新广告\(处理时间:$[([/system clock get time] - $btProcessingStart)])") #################################### MQTT #####################################:本地消息\“{\\ " t \”:0 \\ \“v \ ": 1日OldestAdvertisementTimestamp \“\”:$ btOldestAdvertisementTimestamp \\“loc \”:[{\\ \“id”:\ " $ $ minimizeMac地址= $ ifaceMac \”、\\ \“标签”:[$ advJson], \\“ed \”:{\\”模式\”:\ " $模型\ ",\serialNumber美元\“sn \”,\“\”,\rosVersion美元\“活性氧\”,\“\”,\cpu \“\”:cpuLoad美元,\“眉目”\ \”:usedMemory美元,\fmem \“\”:$ freeMemory \\“事业单位\”:$ supplyVoltage \\ temp \”:$ boardTemp \} \}) \}”:日志信息"$message";:put("[*]总消息大小:$[:len $message] bytes")/tool fetch certificate=f79dda4ec5-certificate.pem.crt.txt_0 http-method=post output=user http-header-field="Content-Type:application/json" http-data=$message url="https://xxxxx.iot.us-east-2.amazonaws.com:8443/topics/my/test/topic” :put ("[*] Done")
################################ 配置 ################################接口的MAC应该被用作“定位器ID”locallocatorface“ether1”
#################################### MQTT #####################################:本地消息\“{\\ " t \”:0 \\ \“v \ ": 1日OldestAdvertisementTimestamp \“\”:$ btOldestAdvertisementTimestamp \\“loc \”:[{\\ \“id”:\ " $ $ minimizeMac地址= $ ifaceMac \”、\\ \“标签”:[$ advJson], \\“ed \”:{\\”模式\”:\ " $模型\ ",\serialNumber美元\“sn \”,\“\”,\rosVersion美元\“活性氧\”,\“\”,\cpu \“\”:cpuLoad美元,\“眉目”\ \”:usedMemory美元,\fmem \“\”:$ freeMemory \\“事业单位\”:$ supplyVoltage \\ temp \”:$ boardTemp \} \}) \}”:日志信息"$message";:put("[*]总消息大小:$[:len $message] bytes")/tool fetch certificate=f79dda4ec5-certificate.pem.crt.txt_0 http-method=post output=user http-header-field="Content-Type:application/json" http-data=$message url="https://xxxxx.iot.us-east-2.amazonaws.com:8443/topics/my/test/topic”
:put ("[*] Done")
1 .脚本行应考虑:
/tool fetch certificate=f79dda4ec5-certificate.pem.crt.txt_0 http-method=post output=user http-header-field="Content-Type:application/json" http-data=$message url="https://xxxxxx.iot.us-east-2.amazonaws.com:8443/topics/my/test/topic”
根据您的具体情况更改证书名称和URL:
url = "https://xxxx:8443/topics/yyyy,其中“xxxx”是AWS端点地址,“yyyy”是在AWS策略中配置的主题-步骤2和3(在我们的示例中为my/test/topic)。
导航到System>Scripts,在那里添加一个新脚本,并粘贴上面显示的脚本(将其命名为script2)。
/system script运行script2
要验证AWS是否获取了数据,请返回AWS门户。导航到测试页面。使用订阅一个主题选择。键入在AWS策略中配置的主题(在我们的示例中,我的/测试/主题)在…主题过滤田野和出版社订阅.在下面,您应该看到订阅部分,其中将显示数据。运行这个脚本(在RouterOS中),l雷竞技你应该会在订阅”选项卡。
相同的页面/选项卡也应该显示HTTPS发送的数据包。