华为云用户手册

  • 示例 当用户名为test的时候,才可以使用该策略。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "ief:deployment:create", "ief:appVersion:update", "ief:deployment:update", "ief:application:create" ], "Condition": { "StringEquals": { "ief:AssumeUserName": [ "test" ] } }, "Resource": [ "ief:*:*:deployment:*", "ief:*:*:appVersion:*", "ief:*:*:application:*" ] } ]}
  • 示例流程 图1 给用户授权IEF权限流程 创建用户组并授权 在 IAM 控制台创建用户组,并授予IEF只读权限“IEF ReadOnlyAccess”。为用户组授权时,作用范围选择“区域级项目”,然后根据以下原则设置: 在个别区域授权:选择指定的一个或多个项目,例如“cn-north-4 [华北-北京四]”。注意:此场景选择“所有项目”时,授权将不生效。 在所有区域授权:选择“所有项目”。 图2 在个别区域授权 图3 在所有区域授权 创建用户并加入用户组 在IAM控制台创建用户,并将其加入1.创建用户组并授权中创建的用户组。 用户登录并验证权限。 新创建的用户登录控制台,验证IEF服务的管理员权限。
  • 状态说明 批量应用部署作业有以下八种状态。 排队中:作业等待执行 执行中:作业处于执行状态 成功:全部任务执行成功 部分成功:部分任务执行成功 失败:全部任务执行失败 停止中:作业处于停止中 已停止:作业已停止 更新超时:作业排队和执行时间超过10分钟仍未完成 批量作业执行过程中可以停止,停止后可以继续。 如果批量作业执行失败、部分成功或更新超时,可以重试执行作业,将未执行成功的作业再次执行一遍。
  • 状态说明 批量应用部署作业有以下八种状态。 排队中:作业等待执行 执行中:作业处于执行状态 成功:全部任务执行成功 部分成功:部分任务执行成功 失败:全部任务执行失败 停止中:作业处于停止中 已停止:作业已停止 更新超时:作业排队和执行时间超过10分钟仍未完成 批量作业执行过程中可以停止,停止后可以继续。 如果批量作业执行失败、部分成功或更新超时,可以重试执行作业,将未执行成功的作业再次执行一遍。
  • 上报设备属性实际值 发布终端设备孪生更新事件。 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客户端就可以获取到加密数据。 请求时必须使用证书进行安全认证,认证方法请参见使用证书进行安全认证。 订阅获取加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/plaintext 发布请求加密数据。 Topic:$hw/{project_id}/encryptdatas/{encryptdata_name}/properties/{properties_name}/decrypt 请求发布后,1中就能收到解密后的明文数据。
  • 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语言代码样例。
  • 获取设备孪生 向设备孪生获取发送请求获取设备孪生。 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" }}
  • 密钥的使用 您可以在创建容器应用高级配置中选择数据存储时使用Secret。 图2 使用密钥 Secret挂载到容器后,会根据Secret的内容在挂载目录下创建文件,每条密钥数据(属性名-属性值)为一个文件,其中属性名即文件的名称,属性值为文件的内容。例如Secret的属性名为“key”,属性值为“ZXhhbXBsZSB2YWx1ZQ==”,这条Secret挂载到/tmp0目录下,那么挂载成功后,在/tmp0录下就存在一个名为“key”的文件,其内容为“example value”。
  • 设备孪生(DeviceTwin) 终端设备通常包含两类数据: 一是不会改变的元数据,包括序列号、资产标识符、Mac地址等描述设备信息的数据。这种数据也可以称为终端设备的静态属性或设备属性。 另一类是终端设备的动态数据,包括特定背景下的终端设备专有实时数据,例如灯的开、关状态。这种数据也可以称为终端设备的孪生属性。 设备孪生具有与物理设备相同的特性,便于终端设备与应用之间进行更好地通信。应用发送的命令首先到达设备孪生,设备孪生根据应用设置的Expected State(期望的状态)进行状态更新,此外终端设备实时反馈自身的Actual State(真实的状态),设备孪生同时记录终端设备的Actual State和Expected State 。这种方式也使终端设备在离线状况下再次上线时,终端设备的状态也能得到同步。 图2 DeviceTwin 在IEF中可以创建终端设备,并能将终端设备与边缘节点关联,关联后会在边缘节点上保存被关联设备的属性和孪生信息。边缘节点上的应用程序可在边缘节点获取终端设备属性、设备孪生信息、以及修改终端设备孪生期望值和真实值。同时IEF负责同步云、边的孪生信息,当有冲突时,将以边缘侧的修改为主。 详细的终端设备状态边云协同机制请参见设备孪生工作原理。
  • 操作步骤 安装GPU驱动。 下载GPU驱动,推荐驱动链接: https://www.nvidia.com/content/DriverDownload-March2009/confirmation.php?url=/tesla/440.33.01/NVIDIA-Linux-x86_64-440.33.01.run&lang=us&type=Tesla 执行如下安装驱动命令。 bash NVIDIA-Linux-x86_64-440.33.01.run 执行如下命令检查GPU驱动安装状态。 nvidia-smi 以root用户登录边缘节点。 执行如下命令。 nvidia-modprobe -c0 -u 创建文件夹。 mkdir -p /var/IEF/nvidia/drivers /var/IEF/nvidia/bin /var/IEF/nvidia/lib64 拷贝驱动文件。 对于CentOS,依次执行如下命令拷贝驱动文件: cp /lib/modules/{当前环境内核版本号}/kernel/drivers/video/nvi* /var/IEF/nvidia/drivers/ cp /usr/bin/nvidia-* /var/IEF/nvidia/bin/ cp -rd /usr/lib64/libcuda* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/libEG* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/libGL* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/libnv* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/libOpen* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/libvdpau_nvidia* /var/IEF/nvidia/lib64/ cp -rd /usr/lib64/vdpau /var/IEF/nvidia/lib64/ 对于Ubuntu,依次执行如下命令拷贝驱动文件: cp /lib/modules/{当前环境内核版本号}/kernel/drivers/video/nvi* /var/IEF/nvidia/drivers/ cp /usr/bin/nvidia-* /var/IEF/nvidia/bin/ cp -rd /usr/lib/x86_64-linux-gnu/libcuda* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/libEG* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/libGL* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/libnv* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/libOpen* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/libvdpau_nvidia* /var/IEF/nvidia/lib64/ cp -rd /usr/lib/x86_64-linux-gnu/vdpau /var/IEF/nvidia/lib64/ 其中,当前环境内核版本号可以使用uname -r命令查看获取,如下所示,请替换为实际取值。 # uname -r3.10.0-514.e17.x86_64 执行以下命令修改目录权限。 chmod -R 755 /var/IEF
  • Go语言代码样例 package mainimport ("crypto/tls""crypto/x509""fmt""math/rand""sync""time"MQTT "github.com/eclipse/paho.mqtt.golang")func main() {subClient := InitMqttClient(onSubConnectionLost)pubClient := InitMqttClient(onPubConnectionLost)wait := sync.WaitGroup{}wait.Add(1)go func() {for {time.Sleep(1*time.Second)pubClient.Publish("topic", 0, false, "hello world")}}()subClient.Subscribe("topic", 0, onReceived)wait.Wait()}func InitMqttClient(onConnectionLost MQTT.ConnectionLostHandler) MQTT.Client {pool := x509.NewCertPool()cert, err := tls.LoadX509KeyPair("/tmp/example_cert.crt", "/tmp/example_cert.key")if err != nil {panic(err)}tlsConfig := &tls.Config{RootCAs: pool,Certificates: []tls.Certificate{cert},// 单向认证,client不校验服务端证书InsecureSkipVerify: true,} // 使用tls或者ssl协议,连接8883端口opts := MQTT.NewClientOptions().AddBroker("tls://127.0.0.1:8883").SetClientID(fmt.Sprintf("%f",rand.Float64()))opts.SetTLSConfig(tlsConfig)opts.OnConnect = onConnectopts.AutoReconnect = false// 回调函数,客户端与服务端断连后立刻被触发opts.OnConnectionLost = onConnectionLostclient := MQTT.NewClient(opts)loopConnect(client)return client}func onReceived(client MQTT.Client, message MQTT.Message) {fmt.Printf("Receive topic: %s, payload: %s \n", message.Topic(), string(message.Payload()))}// sub客户端与服务端断连后,触发重连机制func onSubConnectionLost(client MQTT.Client, err error) {fmt.Println("on sub connect lost, try to reconnect")loopConnect(client)client.Subscribe("topic", 0, onReceived)}// pub客户端与服务端断连后,触发重连机制func onPubConnectionLost(client MQTT.Client, err error) {fmt.Println("on pub connect lost, try to reconnect")loopConnect(client)}func onConnect(client MQTT.Client) {fmt.Println("on connect")}func loopConnect(client MQTT.Client) {for {token := client.Connect()if rs, err := CheckClientToken(token); !rs {fmt.Printf("connect error: %s\n", err.Error())} else {break}time.Sleep(1 * time.Second)}}func CheckClientToken(token MQTT.Token) (bool, error) {if token.Wait() && token.Error() != nil {return false, token.Error()}return true, nil}
  • 操作场景 内置MQTT broker默认开启端口进行TLS(Transport Layer Security)安全认证,客户端必须带上证书才能访问MQTT broker。 终端设备和应用可以通过在对应节点详情页创建的证书进行安全认证。 在节点组中部署的应用可能调度到节点组内任意节点,终端设备可能访问节点组内任意节点,从边缘节点处创建的证书不能满足应用访问节点MQTT broker的需要,所以需要使用节点组证书。节点组证书创建方法请参见节点组证书。
  • 约束与限制 证书与边缘节点绑定,在一个边缘节点下申请的证书只能用来访问该边缘节点的MQTT broker,如果访问其他边缘节点的MQTT broker,会导致认证失败。 一个边缘节点最多只能申请10份证书。 证书的有效期为5年。 MQTT使用限制 表1 MQTT使用限制 描述 限制 支持的MQTT协议版本 3.1.1 与标准MQTT协议的区别 支持QoS 0 支持Topic自定义 不支持QoS 1和QoS 2 不支持will、retain msg MQ TTS 支持的安全等级 采用TCP通道基础 + TLS协议(TLSV1.2 版本)
  • 使用证书 证书用于终端设备与MQTT broker通信时鉴权。 下面是Go语言代码样例和Java语言代码样例,演示了如何使用证书做鉴权。 客户端不需要校验服务端证书,单向认证即可。 内置MQTT broker默认开启8883端口。 样例中的Go语言MQTT Client引用了github.com/eclipse/paho.mqtt.golang开源库。 客户端需要处理断连事件,实现掉线重连机制,提高连接可靠性。
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/get/result{ "event_id":"123456", "timestamp":1557317510926, "twin":{ "state":{ "expected":{ "value":"stop", "metadata":{ "timestamp":1557316778931 } }, "optional":true, "metadata":{ "type":"string" } } } }
  • 示例 终端设备绑定到边缘节点时可收到如下消息。 $hw/events/device/{device_id}/updated{ "event_id":"", "timestamp":1557314742136, "attributes":{ "address":{ "value":"xxx", "optional":true, "metadata":{ "type":"string" } } } }
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/update/result{ "event_id":"123457", "timestamp":1557317614026, "twin":{ "state":{ "actual":{ "value":"stop", "metadata":{ "timestamp":1557317614026 } }, "optional":true, "metadata":{ "type":"string" } } } }
  • 发送消息 在边缘节点使用MQTT客户端发送消息。 此处需要放到创建消息路由中指定的Topic,如下图所示使用mosquitto_pub发送。 [root@ief-node ~]# mosquitto_pub -t '05e1aef9040010e22fccc009adecb056/nodes/7092ad14-adee-4a09-b969-1505bbdecef5/user/aaa' -d -m '{ "edgemsg": "msgToCloud"}'Client mosq-p5LouPQIW2gx0JPkRF sending CONNECTClient mosq-p5LouPQIW2gx0JPkRF received CONNACK (0)Client mosq-p5LouPQIW2gx0JPkRF sending PUBLISH (d0, q0, r0, m1, '05e1aef9040010e22fccc009adecb056/nodes/7092ad14-adee-4a09-b969-1505bbdecef5/user/aaa', ... (26 bytes))Client mosq-p5LouPQIW2gx0JPkRF sending DISCONNECT 消息发送后,您可以在消息路由处看到已经成功转发一条消息,如下图所示。 图4 转发消息数 您可以在DIS界面看到有消息流入,如下图所示。 图5 DIS数据监控
  • IEF自定义策略样例 授权用户创建、更新应用和应用模板的权限。 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "ief:deployment:create", "ief:appVersion:update", "ief:deployment:update", "ief:application:create" ], "Condition": { "StringEquals": { "ief:AssumeUserName": [ "test" ] } }, "Resource": [ "ief:*:*:deployment:*", "ief:*:*:appVersion:*", "ief:*:*:application:*" ] } ]}
  • 示例 $hw/events/device/ab39361a-6fc0-4c94-b919-72b1e08ca690/twin/update/result{ "event_id":"123457", "timestamp":1557317614026, "twin":{ "state":{ "actual":{ "value":"stop", "metadata":{ "timestamp":1557317614026 } }, "optional":true, "metadata":{ "type":"string" } } } }
  • 操作场景 IEF支持从边缘节点上报消息到云端。 您可以将消息发送到边缘节点SystemEventBus(MQTT broker)的自定义Topic中,IEF会将这些数据转发到DIS通道或APIG后端地址。数据转发到DIS通道或者APIG后端地址后,您可以提取这些数据,并对数据进行处理分析。 本章节使用DIS端点作为示例,APIG端点的使用方法类似,主要分如下几个步骤。 创建消息端点 购买DIS接入通道 创建消息路由 发送消息
  • 创建铂金版服务实例 登录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请求检查
  • 设备孪生(DeviceTwin) 终端设备通常包含两类数据: 一是不会改变的元数据,包括序列号、资产标识符、Mac地址等描述设备信息的数据。这种数据也可以称为终端设备的静态属性或设备属性。 另一类是终端设备的动态数据,包括特定背景下的终端设备专有实时数据,例如灯的开、关状态。这种数据也可以称为终端设备的孪生属性。 设备孪生具有与物理设备相同的特性,便于终端设备与应用之间进行更好地通信。应用发送的命令首先到达设备孪生,设备孪生根据应用设置的Expected State(期望的状态)进行状态更新,此外终端设备实时反馈自身的Actual State(真实的状态),设备孪生同时记录终端设备的Actual State和Expected State 。这种方式也使终端设备在离线状况下再次上线时,终端设备的状态也能得到同步。 图2 DeviceTwin 在IEF中可以创建终端设备,并能将终端设备与边缘节点关联,关联后会在边缘节点上保存被关联设备的属性和孪生信息。边缘节点上的应用程序可在边缘节点获取终端设备属性、设备孪生信息、以及修改终端设备孪生期望值和真实值。同时IEF负责同步云、边的孪生信息,当有冲突时,将以边缘侧的修改为主。 详细的终端设备状态边云协同机制请参见设备孪生工作原理。
  • 使用IEF构建边缘计算 使用IEF构建边缘计算的步骤如图1所示。 纳管边缘节点,绑定终端设备。 使用IEF构建边缘计算首先需要将边缘节点纳入IEF的管理(通过在边缘节点安装边缘节点软件),并将终端设备绑定到边缘节点,做完这些后您就可以通过IEF往边缘节点部署应用。 纳管边缘节点、绑定终端设备的详细内容将在节点管理和终端设备管理中介绍。 开发应用并制作镜像,上传到 容器镜像服务 (SWR)。 这个步骤是针对实际业务场景开发应用,开发完成后制作成容器镜像,并上传到SWR上,这样后面IEF下发应用后,边缘节点就可以从SWR中拉取应用镜像。 虽然这里将开发应用放在了步骤 1之后,但这两个步骤之间并没有明确的先后顺序,您也可以先开发应用,然后再纳管边缘节点、绑定终端设备。 部署应用。 边缘节点纳管、应用开发完后,就可以通过IEF将应用部署到边缘节点,运行您的实际业务。 应用运行后,就能通过AOM对应用进行监控和告警,提供运维便利性。 部署应用的详细内容将在容器应用管理中详细介绍。 (可选)回传数据到云上做进一步处理,根据处理结果更新应用。 这个步骤与IEF的使用本身没有强相关,但是这是一个常见的根据数据改进应用的方法,您可以根据自身需求选择是否操作。 图1 构建边缘计算
  • 亲和与反亲和调度策略 在创建容器应用时,可以设置亲和/反亲和调度策略,例如将某类应用部署到某些特定的节点、不同应用部署到不同的节点等等。 IEF当前支持简易的调度策略,具体如下。 亲和性 容器应用与节点亲和:当容器应用与节点亲和时,容器应用只会调度到亲和的这些节点中。在设置节点的亲和与反亲和时,如果设置了与某些节点亲和,那就没有必要再设置与其他节点反亲和,因为与这些节点亲和了,必然不会调度到其他节点。 容器应用与容器应用亲和:当容器应用A与容器应用B亲和时,容器应用A只会调度到容器应用B所在的节点。 反亲和性 容器应用与节点反亲和:当容器应用与节点反亲和时,容器应用不会调度到反亲和的这些节点中。 容器应用与容器应用反亲和:当容器应用A与容器应用B反亲和时,容器应用A不会调度到容器应用B所在的节点。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全