华为云用户手册

  • 操作场景 IEF支持从云端SystemREST下发消息到边缘节点的SystemEventBus(MQTT broker)或ServiceBus两种场景,本章节是以前者为例。 通过调用开放在公网的IEF云端的REST Gateway接口,结合节点ID和自定义Topic,向边缘节点中的SystemEventBus发送消息。您的终端设备可以通过订阅对应的自定义Topic进行消息接收,实现自定义Topic的从云到边的消息下发。 使用方法主要分如下三个步骤。 创建消息路由 发送消息 接收消息
  • 接收消息 登录边缘节点。 使用MQTT客户端接收消息。 当前边缘节点MQTT支持两种模式。 一种是内置的MQTT broker(使用8883端口),需要使用节点证书认证,然后订阅对应Topic接收消息,具体使用方式请参见使用证书进行安全认证。 另外一种是使用外置的MQTT broker(使用1883端口),需要先安装第三方MQTT broker,然后订阅对应Topic接收消息。 这里介绍使用外置的MQTT broker的方式,外置的MQTT broker需要先安装MQTT broker,例如安装Mosquitto,步骤如下。 对于Ubuntu操作系统,可以使用如下命令安装mosquitto: apt-get install mosquitto systemctl start mosquitto systemctl enable mosquitto 对于CentOS操作系统,使用如下命令安装mosquitto: yum install epel-release yum install mosquitto systemctl start mosquitto systemctl enable mosquitto 安装完成后,使用订阅命令订阅,订阅后如果有消息发送,就会收到消息,如下所示。其中#表示订阅任何主题,可以替换为指定的主题,如/aaa、/bbb等。 [root@ief-node ~]# mosquitto_sub -t '#' -d Client mosq-m02iwjsp4j2ISMw6rw sending CONNECT Client mosq-m02iwjsp4j2ISMw6rw received CONNACK (0) Client mosq-m02iwjsp4j2ISMw6rw sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0, Options: 0x00) Client mosq-m02iwjsp4j2ISMw6rw received SUBACK Subscribed (mid: 1): 0 Client mosq-m02iwjsp4j2ISMw6rw received PUBLISH (d0, q0, rQ, mQ, '/aaa', ... (31 bytes)) { "test-key": "test-value" }
  • 创建铂金版服务实例 登录IEF管理控制台。 选择左侧导航栏的“总览”,单击页面右上角的“创建铂金版服务实例”。 配置参数。 区域:选择服务实例所在区域。不同的区域之间服务实例不互通,建议您选择最靠近您业务的区域,这样可以减少网络时延、提高访问速度。 实例名称:填写实例名称。 终端节点服务白名单:输入需要添加至白名单的用户domainID。 边云接入方式:当前支持“互联网接入”和“专线接入”。专线连接IEF的具体方法请参见通过专线或VPN连接IEF。 边缘节点规模:选择服务实例能管理的边缘节点规模。当前支持选择50、200、1000节点。 接入带宽:接入方式为“互联网接入”时,根据边缘节点规模,分别对应为5Mbit/s、10Mbit/s、30Mbit/s。“专线接入”的带宽由专线决定。 高级设置:多可用区部署,即铂金版服务实例部署在多个可用区,支持多可用区容灾,但是对于集群性能有所损耗。 单击“下一步”。 确认订单详情,单击“创建”。 服务实例创建需要20-30分钟,您可以在服务实例列表的“详情”中查看状态。 在“总览”页面可以查看到铂金版服务实例的信息。 图1 查看实例信息
  • HTTP请求检查 向容器发送HTTP GET请求,如果探针收到2xx或3xx,说明容器是健康的。 例如下图这个配置,IEF会在容器启动10秒(延迟时间)后,发送HTTP GET请求到“http://{实例IP}/healthz:8080”,如果在2秒(超时时间)内没有响应则视为检查失败;如果请求响应的状态码为2xx或3xx,则说明容器是健康的。 这里无需填写主机地址,默认直接使用实例的IP(即往容器发送请求),除非您有特殊需求。 图1 HTTP请求检查
  • HTTP请求检查 向容器发送HTTP GET请求,如果探针收到2xx或3xx,说明容器是健康的。 例如下图这个配置,IEF会在容器启动10秒(延迟时间)后,发送HTTP GET请求到“http://{实例IP}/healthz:8080”,如果在2秒(超时时间)内没有响应则视为检查失败;如果请求响应的状态码为2xx或3xx,则说明容器是健康的。 这里无需填写主机地址,默认直接使用实例的IP(即往容器发送请求),除非您有特殊需求。 图1 HTTP请求检查
  • 示例 节点告警 { "alarmName": "测试##test", "alarmId": "73ccbccce05de74f9d3dda42f6ecfe20", "detailedInformation": "测试##test", "url": "", "source": "IEF", "cleared": false, "policyID": "", "perceivedSeverity": 4, "resourceId": { "namespace": "PAAS.NODE", "dimension": { "clusterId": "e277befa37a64ed1aa25b522e686bc28", "nameSpace": "default", "nodeIP": "192.168.0.164" } }, "neType": "Host", "eventType": 23 } 应用告警 { "alarmName": "应用重启test##Application restart", "alarmId": "b09076ff565c59d4da0db0c9223781", "detailedInformation": "应用重启 test##Application restart test", "url": "", "source": "IEF", "cleared": false, "policyID": "", "perceivedSeverity": 3, "resourceId": { "namespace": "PAAS.CONTAINER", "dimension": { "containerName": "container-e991acd3-864c-4038-8a90-e042eebab496", "containerID": "70b385315c8ac507b3de7dfe1258932cea0b53a850b7d030ce7ed0a55c47877c", "podID": "0e9ce4fd-b732-11e9-8a30-fa163e9b3546", "podName": "hxkapp1-7898f5bd4b-2lj8z" } }, "neType": "Application", "eventType": 23 }
  • alarmId生成方法 alarmId可以不使用本方法生成,只要保证唯一就可以。 使用{projectId}_{产生告警的服务名}_{维度信息}_{指标名称}_{告警类型}_{规则信息}生成md5值。 其中: projectId:项目ID,获取方式请参见获取项目ID。 维度信息: 节点信息:{clusterId}_{namespace}_{ip} 容器信息:{clusterId}_{namespace}_{appName}_{podName}_{containerId} 应用信息:{clusterId}_{namespace}_{appName} 告警类型: 21:动态阈值告警 22:批量阈值告警 23:阈值告警 24:系统类告警 25:新增/删除探针 26:agent安装类告警 规则信息:阈值规则的告警使用阈值规则名称;业务自己触发的告警(没有规则)则填写NA。动态阈值的则填写policyId。
  • 参数说明 参数 类型 说明 alarmName String 告警名称,需要支持中英文两个版本,格式为“中文##English”。 alarmId String 告警ID,需要保证为唯一值。可以参考alarmId生成方法。 detailedInformation String 告警描述,需要支持中英文两个版本,格式为“中文##English”。 url String 根因分析跳转入口,如果没有则填空。 source String 告警源,只能是由大小写字母组成的字符串。 cleared Boolean 清除告警标示。 true:表示上报的告警已经清除。 false:表示需要手动清除。 policyID String 告警的规则ID,阈值规则填写ruleId,没有则填写空。 objectInstance String 定位信息,如果没传此字段,则该字段默认取alarmId的值。 perceivedSeverity Integer 告警级别 1:紧急 2:重要 3:次要 4:提示 resourceId Object 告警信息,具体请参见表1。 neType String 产生告警的资源的类型 Application(应用) DB(数据库) Host(主机) eventType Integer 告警类型 21:动态阈值告警 22:批量阈值告警 23:阈值告警 24:系统类告警 25:新增/删除探针 26:agent安装类告警 27:配额超限类告警 probableCause String 可能原因 proposedRepairActions String 修复建议 表1 resourceId 参数 类型 说明 namespace String 资源类型,有如下几种指标 PAAS.CONTAINER表示容器指标 PAAS.NODE表示节点指标 dimension Object 维度信息,用于跟监控上报的节点应用信息关联起来。具体请参见表2。 目前涉及到告警主要是节点和应用两种类型,所以只需要关注节点和应用这两种维度。 应用维度可以细分为服务、实例、容器和进程,这四个维度可以选择一个或多个上报。 服务维度需要上报:clusterId、nameSpace和serviceID 实例维度需要上报:podID和podName 容器维度需要上报:containerID和containerName 进程维度需要上报:processID和processName 表2 Dimension 参数 类型 说明 clusterId String 项目ID,获取方式请参见获取项目ID。 nameSpace String 默认为default。 nodeIP String 节点IP。 serviceID String 服务ID。 容器应用为{projectId}_{hostid}_{appName}的md5值。 进程应用为{projectId}_{hostid}_{进程名}_{进程pid}的md5值。 processID定义方式:md5({projectId})_{hostid}_md5({进程名})_{进程pid}。 md5(projectId) 表示求projectId的md5值,md5({进程名})表示求进程名的md5值 这些维度信息需要与监控上报的维度信息一致,不一致会导致无法关联到对应的资源。 podID String 实例ID。 podName String 实例名称。 containerID String 容器ID。 containerName String 容器名称。 processID String 进程ID。 processName String 进程名称。 Application String 应用名称。
  • 参数说明 参数 类型 说明 alarmName String 告警名称,需要支持中英文两个版本,格式为“中文##English”。 alarmId String 告警ID,需要保证为唯一值。可以参考alarmId生成方法。 detailedInformation String 告警描述,需要支持中英文两个版本,格式为“中文##English”。 url String 根因分析跳转入口,如果没有则填空。 source String 告警源,只能是由大小写字母组成的字符串。 cleared Boolean 清除告警标示。 true:表示上报的告警已经清除。 false:表示需要手动清除。 policyID String 告警的规则ID,阈值规则填写ruleId,没有则填写空。 objectInstance String 定位信息,如果没传此字段,则该字段默认取alarmId的值。 perceivedSeverity Integer 告警级别 1:紧急 2:重要 3:次要 4:提示 resourceId Object 告警信息,具体请参见表1。 neType String 产生告警的资源的类型 Application(应用) DB(数据库) Host(主机) eventType Integer 告警类型 21:动态阈值告警 22:批量阈值告警 23:阈值告警 24:系统类告警 25:新增/删除探针 26:agent安装类告警 27:配额超限类告警 probableCause String 可能原因 proposedRepairActions String 修复建议 表1 resourceId 参数 类型 说明 namespace String 资源类型,有如下几种指标 PAAS.CONTAINER表示容器指标 PAAS.NODE表示节点指标 dimension Object 维度信息,用于跟监控上报的节点应用信息关联起来。具体请参见表2。 目前涉及到告警主要是节点和应用两种类型,所以只需要关注节点和应用这两种维度。 应用维度可以细分为服务、实例、容器和进程,这四个维度可以选择一个或多个上报。 服务维度需要上报:clusterId、nameSpace和serviceID 实例维度需要上报:podID和podName 容器维度需要上报:containerID和containerName 进程维度需要上报:processID和processName 表2 Dimension 参数 类型 说明 clusterId String 项目ID,获取方式请参见获取项目ID。 nameSpace String 默认为default。 nodeIP String 节点IP。 serviceID String 服务ID。 容器应用为{projectId}_{hostid}_{appName}的md5值。 进程应用为{projectId}_{hostid}_{进程名}_{进程pid}的md5值。 processID定义方式:md5({projectId})_{hostid}_md5({进程名})_{进程pid}。 md5(projectId) 表示求projectId的md5值,md5({进程名})表示求进程名的md5值 这些维度信息需要与监控上报的维度信息一致,不一致会导致无法关联到对应的资源。 podID String 实例ID。 podName String 实例名称。 containerID String 容器ID。 containerName String 容器名称。 processID String 进程ID。 processName String 进程名称。 Application String 应用名称。
  • alarmId生成方法 alarmId可以不使用本方法生成,只要保证唯一就可以。 使用{projectId}_{产生告警的服务名}_{维度信息}_{指标名称}_{告警类型}_{规则信息}生成md5值。 其中: projectId:项目ID,获取方式请参见获取项目ID。 维度信息: 节点信息:{clusterId}_{namespace}_{ip} 容器信息:{clusterId}_{namespace}_{appName}_{podName}_{containerId} 应用信息:{clusterId}_{namespace}_{appName} 告警类型: 21:动态阈值告警 22:批量阈值告警 23:阈值告警 24:系统类告警 25:新增/删除探针 26:agent安装类告警 规则信息:阈值规则的告警使用阈值规则名称;业务自己触发的告警(没有规则)则填写NA。动态阈值的则填写policyId。
  • 示例 节点告警 { "alarmName": "测试##test", "alarmId": "73ccbccce05de74f9d3dda42f6ecfe20", "detailedInformation": "测试##test", "url": "", "source": "IEF", "cleared": false, "policyID": "", "perceivedSeverity": 4, "resourceId": { "namespace": "PAAS.NODE", "dimension": { "clusterId": "e277befa37a64ed1aa25b522e686bc28", "nameSpace": "default", "nodeIP": "192.168.0.164" } }, "neType": "Host", "eventType": 23 } 应用告警 { "alarmName": "应用重启test##Application restart", "alarmId": "b09076ff565c59d4da0db0c9223781", "detailedInformation": "应用重启 test##Application restart test", "url": "", "source": "IEF", "cleared": false, "policyID": "", "perceivedSeverity": 3, "resourceId": { "namespace": "PAAS.CONTAINER", "dimension": { "containerName": "container-e991acd3-864c-4038-8a90-e042eebab496", "containerID": "70b385315c8ac507b3de7dfe1258932cea0b53a850b7d030ce7ed0a55c47877c", "podID": "0e9ce4fd-b732-11e9-8a30-fa163e9b3546", "podName": "hxkapp1-7898f5bd4b-2lj8z" } }, "neType": "Application", "eventType": 23 }
  • Topic $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 参数 类型 说明 project_id String 项目ID。获取方式请参见获取项目ID。 encryptdata_name String 加密数据集名称。 properties_name String 加密数据的“键名”。
  • Topic $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 参数 类型 说明 project_id String 项目ID。获取方式请参见获取项目ID。 encryptdata_name String 加密数据集名称。 properties_name String 加密数据的“键名”。
  • Topic $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 参数 类型 说明 project_id String 项目ID。获取方式请参见获取项目ID。 encryptdata_name String 加密数据集名称。 properties_name String 加密数据的“键名”。
  • Topic $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 参数 类型 说明 project_id String 项目ID。获取方式请参见获取项目ID。 encryptdata_name String 加密数据集名称。 properties_name String 加密数据的“键名”。
  • 加密数据的使用 加密数据绑定到边缘节点后,在边缘节点上使用MQTT客户端就可以获取到加密数据。 请求时必须使用证书进行安全认证,认证方法请参见使用证书进行安全认证。 订阅获取加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 发布请求加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 请求发布后,1中就能收到解密后的明文数据。
  • 加密数据的使用 加密数据绑定到边缘节点后,在边缘节点上使用MQTT客户端就可以获取到加密数据。 请求时必须使用证书进行安全认证,认证方法请参见使用证书进行安全认证。 订阅获取加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 发布请求加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 请求发布后,1中就能收到解密后的明文数据。
  • 参数说明 IEF转发自定义Topic内容是透传,可以转发任意内容。 “{custom_topic}”支持通配符“#”和“+”,可以将多条符合通配规则的消息进行统一转发。 “#”是一个匹配主题中任意层次数的通配符,多层通配符可以表示大于等于0的层次。“+”是单层通配符,只匹配主题的一层。 对于符合通配规则的Topic消息进行最小范围匹配后进行路由消息转发。如消息Topic为123/aaa/567和123/bbb/567,可以配置通配转发规则123/+/567进行统一转发。
  • 参数说明 IEF转发自定义Topic内容是透传,可以转发任意内容。 “{custom_topic}”支持通配符“#”和“+”,可以将多条符合通配规则的消息进行统一转发。 “#”是一个匹配主题中任意层次数的通配符,多层通配符可以表示大于等于0的层次。“+”是单层通配符,只匹配主题的一层。 对于符合通配规则的Topic消息进行最小范围匹配后进行路由消息转发。如消息Topic为123/aaa/567和123/bbb/567,可以配置通配转发规则123/+/567进行统一转发。
  • 获取设备孪生 向设备孪生获取发送请求获取设备孪生。 Topic:$hw/events/device/{device_id}/twin/get Payload:{"event_id":"自定义id"} 向设备孪生获取结果订阅设备孪生的返回结果。 Topic:$hw/events/device/{dvice_id}/twin/get/result 获取的结果如下: { "event_id": "", "timestamp": 1554988425592, "twin": { "humidity": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } } } }
  • 获取节点关联的终端设备成员 向设备成员获取发送获取终端设备成员消息的请求。 Topic:$hw/events/node/{node_id}/membership/get Payload:{"event_id":"自定义ID"} 示例如下: $hw/events/node/{node_id}/membership/get {"event_id":""} 向设备成员获取结果订阅终端设备成员的返回结果。 Topic:$hw/events/node/{node_id}/membership/get/result 返回结果示例如下: { "event_id": "", "timestamp": 1554986455386, "devices": [ { "id": "2144773f-13f1-43f5-af07-51991d4fd064", "name": "equipmentA", "state": "unknown", "attributes": { "name": { "value": "a", "optional": true, "metadata": { "type": "string" } } } } ] }
  • 监听设备孪生事件 通过获取节点关联的终端设备成员和获取设备孪生以后,即可获取到节点绑定的终端设备ID,随后即可监听该终端设备的事件。 在云端更新设备孪生属性,设置期望值从而达到控制边侧终端设备的目的。 例如某个设备有两个孪生属性,humidity和temperature。 图1 孪生属性 在“设备孪生”页签中编辑孪生属性,将humidity由9改为10。属性修改完成以后,在端侧可收到两个事件:“设备孪生变更事件”和“设备孪生delta事件”。 设备孪生变更事件:包含变更前和变更后的设备孪生信息详情。 设备孪生delta事件:包含设备孪生的详情信息以及设备孪生属性期望值与实际值不一致的delta部分。 订阅这两个Topic,就可以收到变更设备孪生的消息。 订阅设备孪生变更。 Topic:$hw/events/device/{device_id}/twin/update/document 在边侧收到变更消息如下: { "event_id": "0f921313-4074-46a2-96f6-aac610721059", "timestamp": 1555313685831, "twin": { "humidity": { "last": { "expected": { "value": "9", "metadata": { "timestamp": 1555313665978 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } } }, "temperature": { "last": { "expected": { "value": "0", "metadata": { "timestamp": 1555313665978 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } } } } 订阅设备孪生delta。 Topic:$hw/events/device/{device_id}/twin/update/delta 在边侧收到变更消息如下: { "event_id": "60fb5baf-d4ad-47b0-a21e-8b57b52d0978", "timestamp": 1555313685837, "twin": { "humidity": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } }, "delta": { "humidity": "10", "temperature": "0" } }
  • 上报设备属性实际值 发布终端设备孪生更新事件。 Topic:$hw/events/device/{device_id}/twin/update Payload:{"event_id":"", "timestamp":0, "twin":{"属性":{"actual":{"value":"设备实际值"}}}} 示例如下: { "event_id": "", "timestamp": 0, "twin": { "temperature": { "actual": { "value": "2" } } } } 发布后,在云端可以观察到设备孪生的实际值发生了相应的变化,如图2所示。 图2 孪生属性值发生变化 在边缘侧订阅设备孪生更新结果,能收到设备孪生更新事件的结果。 Topic:$hw/events/device/{device_id}/twin/update/result 更新的结果如下所示。 { "event_id": "", "timestamp": 1554992093859, "twin": { "temperature": { "actual": { "value": "2", "metadata": { "timestamp": 1554992093859 } }, "optional": true, "metadata": { "type": "int" } } } }
  • MQTT broker 终端设备可以通过MQTT协议与IEF云端进行通信,您也可以通过发送/订阅消息控制终端设备。 边缘节点上有一个内置MQTT broker,内置MQTT broker使用8883端口与终端设备通信,与内置MQTT broker通信需要经过安全认证,具体请参见使用证书进行安全认证。 另外,边缘节点还支持与外置MQTT broker通信,即在边缘节点上安装一个MQTT broker(如开源的Mosquitto,默认使用1883端口通信)。 如使用外置MQTT broker,请注意需要保证外置MQTT broker通信的端口能正常使用。
  • MQTT Topic 终端设备与边缘节点、IEF的通信都是通过给MQTT broker中转消息实现的,在MQTT broker中,默认提供如表1所示的Topic(消息主题),上报状态、控制终端设备状态都是通过发送/订阅消息实现的。 应用程序编写完后,可以通过应用部署功能,将应用从IEF中部署到边缘节点,详情请参见容器应用管理。 表1 IEF提供的默认Topic 名称 使用类型 Topic 说明 设备孪生变更 订阅 $hw/events/device/{device_id}/twin/update/document 设备孪生更新文档,当孪生变化时,反映孪生变化前、变化后的区别。 设备孪生delta 订阅 $hw/events/device/{device_id}/twin/update/delta 设备孪生delta事件,当孪生变化时,反映期望值与真实值不一致的孪生信息。 设备成员变更 订阅 $hw/events/node/{node_id}/membership/updated 绑定终端设备关系变化。 设备属性变更 订阅 $hw/events/device/{device_id}/updated 终端设备属性更新。 设备成员获取 发布 $hw/events/node/{node_id}/membership/get 绑定终端设备关系获取。 设备成员获取结果 订阅 $hw/events/node/{node_id}/membership/get/result 绑定终端设备关系获取结果。 设备孪生获取 发布 $hw/events/device/{device_id}/twin/get 设备孪生获取。 设备孪生获取结果 订阅 $hw/events/device/{device_id}/twin/get/result 设备孪生获取结果。 设备孪生更新 发布 $hw/events/device/{device_id}/twin/update 设备孪生更新。 设备孪生更新结果 订阅 $hw/events/device/{device_id}/twin/update/result 设备孪生更新结果。 请求加密数据 发布 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 发布获取加密数据请求。 获取加密数据 订阅 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 订阅获取加密数据。 添加告警 发布 $hw/alarm/{appname}/add 向 AOM 发送告警。 清除告警 发布 $hw/alarm/{appname}/clear 清除AOM中告警。 自定义Topic 发布 {project_id}/nodes/{node_id}/user/{custom_topic} 自定义Topic,Topic根据您的需要自行定义。 您可以将终端设备数据发送到边缘节点MQTT broker的自定义Topic中,IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后,您可以提取这些数据,并对数据进行处理分析。 接下来将介绍如何在边缘侧获取终端设备信息,接收云上的控制消息,以及如何将终端设备数据上报到云端。MQTT收发消息的示例代码请参见Go语言代码样例和Java语言代码样例。
  • 监听设备孪生事件 通过获取节点关联的终端设备成员和获取设备孪生以后,即可获取到节点绑定的终端设备ID,随后即可监听该终端设备的事件。 在云端更新设备孪生属性,设置期望值从而达到控制边侧终端设备的目的。 例如某个设备有两个孪生属性,humidity和temperature。 图1 孪生属性 在“设备孪生”页签中编辑孪生属性,将humidity由9改为10。属性修改完成以后,在端侧可收到两个事件:“设备孪生变更事件”和“设备孪生delta事件”。 设备孪生变更事件:包含变更前和变更后的设备孪生信息详情。 设备孪生delta事件:包含设备孪生的详情信息以及设备孪生属性期望值与实际值不一致的delta部分。 订阅这两个Topic,就可以收到变更设备孪生的消息。 订阅设备孪生变更。 Topic:$hw/events/device/{device_id}/twin/update/document 在边侧收到变更消息如下: { "event_id": "0f921313-4074-46a2-96f6-aac610721059", "timestamp": 1555313685831, "twin": { "humidity": { "last": { "expected": { "value": "9", "metadata": { "timestamp": 1555313665978 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } } }, "temperature": { "last": { "expected": { "value": "0", "metadata": { "timestamp": 1555313665978 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } }, "current": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } } } } 订阅设备孪生delta。 Topic:$hw/events/device/{device_id}/twin/update/delta 在边侧收到变更消息如下: { "event_id": "60fb5baf-d4ad-47b0-a21e-8b57b52d0978", "timestamp": 1555313685837, "twin": { "humidity": { "expected": { "value": "10", "metadata": { "timestamp": 1555313685831 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1555313685831 } }, "actual": { "value": "2", "metadata": { "timestamp": 1555299457284 } }, "optional": true, "metadata": { "type": "int" } } }, "delta": { "humidity": "10", "temperature": "0" } }
  • 上报设备属性实际值 发布终端设备孪生更新事件。 Topic:$hw/events/device/{device_id}/twin/update Payload:{"event_id":"", "timestamp":0, "twin":{"属性":{"actual":{"value":"设备实际值"}}}} 示例如下: { "event_id": "", "timestamp": 0, "twin": { "temperature": { "actual": { "value": "2" } } } } 发布后,在云端可以观察到设备孪生的实际值发生了相应的变化,如图2所示。 图2 孪生属性值发生变化 在边缘侧订阅设备孪生更新结果,能收到设备孪生更新事件的结果。 Topic:$hw/events/device/{device_id}/twin/update/result 更新的结果如下所示。 { "event_id": "", "timestamp": 1554992093859, "twin": { "temperature": { "actual": { "value": "2", "metadata": { "timestamp": 1554992093859 } }, "optional": true, "metadata": { "type": "int" } } } }
  • 获取设备孪生 向设备孪生获取发送请求获取设备孪生。 Topic:$hw/events/device/{device_id}/twin/get Payload:{"event_id":"自定义id"} 向设备孪生获取结果订阅设备孪生的返回结果。 Topic:$hw/events/device/{dvice_id}/twin/get/result 获取的结果如下: { "event_id": "", "timestamp": 1554988425592, "twin": { "humidity": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } }, "temperature": { "expected": { "value": "0", "metadata": { "timestamp": 1554988419529 } }, "optional": true, "metadata": { "type": "int" } } } }
  • MQTT Topic 终端设备与边缘节点、IEF的通信都是通过给MQTT broker中转消息实现的,在MQTT broker中,默认提供如表1所示的Topic(消息主题),上报状态、控制终端设备状态都是通过发送/订阅消息实现的。 应用程序编写完后,可以通过应用部署功能,将应用从IEF中部署到边缘节点,详情请参见容器应用管理。 表1 IEF提供的默认Topic 名称 使用类型 Topic 说明 设备孪生变更 订阅 $hw/events/device/{device_id}/twin/update/document 设备孪生更新文档,当孪生变化时,反映孪生变化前、变化后的区别。 设备孪生delta 订阅 $hw/events/device/{device_id}/twin/update/delta 设备孪生delta事件,当孪生变化时,反映期望值与真实值不一致的孪生信息。 设备成员变更 订阅 $hw/events/node/{node_id}/membership/updated 绑定终端设备关系变化。 设备属性变更 订阅 $hw/events/device/{device_id}/updated 终端设备属性更新。 设备成员获取 发布 $hw/events/node/{node_id}/membership/get 绑定终端设备关系获取。 设备成员获取结果 订阅 $hw/events/node/{node_id}/membership/get/result 绑定终端设备关系获取结果。 设备孪生获取 发布 $hw/events/device/{device_id}/twin/get 设备孪生获取。 设备孪生获取结果 订阅 $hw/events/device/{device_id}/twin/get/result 设备孪生获取结果。 设备孪生更新 发布 $hw/events/device/{device_id}/twin/update 设备孪生更新。 设备孪生更新结果 订阅 $hw/events/device/{device_id}/twin/update/result 设备孪生更新结果。 请求加密数据 发布 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 发布获取加密数据请求。 获取加密数据 订阅 $hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 订阅获取加密数据。 添加告警 发布 $hw/alarm/{appname}/add 向AOM发送告警。 清除告警 发布 $hw/alarm/{appname}/clear 清除AOM中告警。 自定义Topic 发布 {project_id}/nodes/{node_id}/user/{custom_topic} 自定义Topic,Topic根据您的需要自行定义。 您可以将终端设备数据发送到边缘节点MQTT broker的自定义Topic中,IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后,您可以提取这些数据,并对数据进行处理分析。 接下来将介绍如何在边缘侧获取终端设备信息,接收云上的控制消息,以及如何将终端设备数据上报到云端。MQTT收发消息的示例代码请参见Go语言代码样例和Java语言代码样例。
  • 获取节点关联的终端设备成员 向设备成员获取发送获取终端设备成员消息的请求。 Topic:$hw/events/node/{node_id}/membership/get Payload:{"event_id":"自定义ID"} 示例如下: $hw/events/node/{node_id}/membership/get {"event_id":""} 向设备成员获取结果订阅终端设备成员的返回结果。 Topic:$hw/events/node/{node_id}/membership/get/result 返回结果示例如下: { "event_id": "", "timestamp": 1554986455386, "devices": [ { "id": "2144773f-13f1-43f5-af07-51991d4fd064", "name": "equipmentA", "state": "unknown", "attributes": { "name": { "value": "a", "optional": true, "metadata": { "type": "string" } } } } ] }
共100000条