更新时间:2023-11-23 GMT+08:00

设备数据上云

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语言代码样例

获取节点关联的终端设备成员

  1. 设备成员获取发送获取终端设备成员消息的请求。

    Topic:$hw/events/node/{node_id}/membership/get

    Payload:{"event_id":"自定义ID"}

    示例如下:

    $hw/events/node/{node_id}/membership/get
    
    {"event_id":""}

  2. 设备成员获取结果订阅终端设备成员的返回结果。

    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"
                        }
                    }
                }
            }
        ]
    }

获取设备孪生

  1. 设备孪生获取发送请求获取设备孪生。

    Topic:$hw/events/device/{device_id}/twin/get

    Payload:{"event_id":"自定义id"}

  2. 设备孪生获取结果订阅设备孪生的返回结果。

    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"
                }
            }
        }
    }

监听设备孪生事件

通过获取节点关联的终端设备成员获取设备孪生以后,即可获取到节点绑定的终端设备ID,随后即可监听该终端设备的事件。

在云端更新设备孪生属性,设置期望值从而达到控制边侧终端设备的目的。

例如某个设备有两个孪生属性,humidity和temperature。

图1 孪生属性

“设备孪生”页签中编辑孪生属性,将humidity由9改为10。属性修改完成以后,在端侧可收到两个事件:“设备孪生变更事件”和“设备孪生delta事件”。

  • 设备孪生变更事件:包含变更前和变更后的设备孪生信息详情。
  • 设备孪生delta事件:包含设备孪生的详情信息以及设备孪生属性期望值与实际值不一致的delta部分。

订阅这两个Topic,就可以收到变更设备孪生的消息。

  1. 订阅设备孪生变更

    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"
                    }
                }
            }
        }
    }

  2. 订阅设备孪生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"
        }
    }

上报设备属性实际值

  1. 发布终端设备孪生更新事件。

    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 孪生属性值发生变化

  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"
                }
            }
        }
    }