Azure IoT Edge Hub模块的消息路由
分类: Azure物联网 ◆ 标签: #Azure #IoT Edge # ◆ 发布于: 2023-06-15 9:21:10

Azure IoT Edge
两个系统模块Edge Agent
和Edge Hub
, edge Agent
主要是管理模块的安装和监控,Edge Hub
用于模块或者子设备和IoT Hub
之间的通讯。
我们可以把Edge Hub
模块认为是缩小版的IoT Hub
, 它拥有很多的IoT Hub
的特性,在IoT Edge
设备不在线的时候,它可以充当部分的IoT Hub
的功能。 为了将模块或者子设备的消息路由到IoT Hub
, Edge Hub
提供了消息路由的功能。在用户使用部署的时候可以对消息路由进行定义,如果你不熟悉部署,请参考文章:<>
当我们使用Azure Portal
添加部署的时候,无论是标准的自动部署,还是分层部署,都需要配置消息的路由,如下图:
从最后生成的部署清单中也可以看到edge hub
的消息路由的基本语法是:
{ "modulesContent": { "$edgeAgent": { ... }, "$edgeHub": { "properties.desired": { "schemaVersion": "1.1", "routes": { "route1": "FROM <source> WHERE <condition> INTO <sink>", "route2": { "route": "FROM <source> WHERE <condition> INTO <sink>", "priority": 0, "timeToLiveSecs": 86400 } }, "storeAndForwardConfiguration": { "timeToLiveSecs": 10 } } }, "module1": { ... }, "module2": { ... } } }
声明路由
路由声明是在模块Edge Hub
的预期属性(desired property
)的routes
中声明,基本语法如下:
FROM {source|源} WHERE {condition|条件语句} INTO {sink|数据接收}
消息源的定义
对于路由的消息源可以采用如下的值:
- "/*": 所有从子设备或者模块的D2C消息,或者是twin更改的通知消息。
- "/twinChangeNotifications": 代表任何模块或者设备的twin更改事件或者(reported propertity)
- "/messages/*": 任何模块或者子设备的D2C消息
- "/messages/modules/*": 任何模块的消息(注意:这里没有子设备)
- "/messages/modules/
- "/messages/modules/
- "/messages/modules/
需要注意路由适用范围:子设备或者是模块。
消息选择的条件
在转发消息中,条件是可选的,如果不指定WHERE
语句就表示所有的消息都会被路由,如果加上了WHERE
,那么只有符合条件的语句才会被路由。
由于在IoT Edge和模块或者子设备之间传递的消息被格式化为json
文档的格式,例如:
{ "message": { "systemProperties": { "contentType": "application/json", "contentEncoding": "UTF-8", "iothub-message-source": "deviceMessages", "iothub-enqueuedtime": "2017-05-08T18:55:31.8514657Z" }, "appProperties": { "processingPath": "{cold | warm | hot}", "verbose": "{true, false}", "severity": 1-5, "testDevice": "{true | false}" }, "body": "{\"Weather\":{\"Temperature\":50}}" } }
上面的例子是IoT Hub
定义的消息的通用格式。
WHERE
条件语句是针对消息格式中的SystemProperties
、appProperties
、body
中的属性。
那如何在条件语句中引用这三类属性呢?
- 引用
SystemProperties
:$<propertyName>
或者{$<propertyName>}
引用, 例如{$<contentType>}
、{$<iothub-message-source>}
- 引用
appProperties
:<propertyName>
, 直接使用名字,例如:processingPath
, 或者servertity
- 引用
body
:$body.<propertyName>
, 例如$body.Weather
再举例,例如引用systemProperties
:
FROM /messages/* WHERE NOT IS_DEFINED($contentType) INTO $upstream
消息接收(sink
)
只有模块和IoT Hub
可以接收消息,因此它的定义相对简单:
$upstream
: 代表消息会送到IoT Hub
BrokeredEndpoint("/modules/<moduleId>/inputs/<input>)
: 定义消息被指定模块<moduleId>
的指定<input>
接收。
路由的其他属性
消息路由还有另外两个属性:
priority
: 优先级, 值的范围是0-9, 0代表最高的优先级, 消息会优先处理。timeToLiveSecs
: 如果不设定该值,默认是从edge Hub
的属性storeAndForwardConfiguration
配置继承。
定义格式
支持两种格式:
格式1:
"route1": "FROM <source> WHERE <condition> INTO <sink>",
格式2:
"route2": { "route": "FROM <source> WHERE <condition> INTO <sink>", "priority": 0, "timeToLiveSecs": 86400 }
消息路由介绍到这里,我们接下来介绍如何自定义edge agent
和edge hub
的存储。