
# 云端下发消息到边缘节点
#### 操作场景
IEF支持从云端SystemREST下发消息到边缘节点的SystemEventBus（MQTT broker）或ServiceBus两种场景，本章节是以前者为例。
通过调用开放在公网的IEF云端的REST Gateway接口，结合节点ID和自定义Topic，向边缘节点中的SystemEventBus发送消息。您的终端设备可以通过订阅对应的自定义Topic进行消息接收，实现自定义Topic的从云到边的消息下发。
使用方法主要分如下三个步骤。
1. [创建消息路由]
2. [发送消息]
3. [接收消息]
 
 #### 创建消息路由
SystemREST和SystemEventBus为系统默认端点，无需创建。其中SystemREST代表该Region下IEF云端REST Gateway接口。SystemEventBus代表边缘节点的MQTT broker。
1. 登录[IEF控制台](https://console.huaweicloud.com/ief2.0/)。
2. 选择左侧导航栏"边云消息 \> 消息路由"。
3. 单击页面右上角"创建消息路由"。
4. 填写相关参数。 
   图1创建消息路由   
   ![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0000001388663425.png "点击放大")
   - **消息路由名称** ：输入消息路由名称，如SystemREST2SystemEventBus。
     ![](https://support.huaweicloud.com/usermanual-ief/public_sys-resources/caution_3.0-zh-cn.png)
     消息路由和[系统订阅](https://support.huaweicloud.com/usermanual-ief/ief_01_0076.html#ief_01_0076__section1197181954112)是同一种资源，命名不能冲突。
     
   
   - **源端点**：选择SystemREST。
   
   - **源端点资源**：填写符合URL路径的以"/"开头的字符串，可以使用{}作为入参进行层级模糊匹配，如/aaa/{any-str}/bbb可以匹配/aaa/ccc/bbb或者/aaa/ddd/bbb。整个源端点资源为调用REST接口时的匹配字段。
   
   - **目的端点**：选择SystemEventBus。
   
   - **目的端点资源**：目的端点资源为消息转发至MQTT时对应的Topic前缀。
   
   
   ![](https://support.huaweicloud.com/usermanual-ief/public_sys-resources/note_3.0-zh-cn.png)
   源端点资源和目的端点资源都填写为"/"时，IEF会对所有发送到REST接口的请求转发到对应节点的MQTT中，且消息的Topic与请求URL一致。
   
   
5. 单击"创建"。 
   在"消息路由"页面可以看到已创建的路由。
   图2消息路由   
   ![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0260213851.png "点击放大")
   
   
 
 #### 发送消息
从云端SystemREST下发到边缘节点的SystemEventBus，您首先需要获取SystemREST的Endpoint，然后需要构造请求，将消息通过路由发送至SystemEventBus。
1. 获取SystemREST的Endpoint。
   
   1. 登录[IEF控制台](https://console.huaweicloud.com/ief2.0/)。
   
   2. 选择左侧导航栏"边云消息 \> 消息端点"。在SystemREST所在行"消息端点属性"列，public的取值即为SystemREST的Endpoint，如下图。
      图3SystemREST的Endpoint   
      ![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0262645486.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-ief/public_sys-resources/note_3.0-zh-cn.png)
      此处SystemREST的Endpoint还支持如下地址，如下地址同时支持AK/SK和Token认证，推荐使用下面地址。
      - 华南-广州：ief-stargate.cn-south-1.myhuaweicloud.com
      
      - 华北-北京一：ief-stargate.cn-north-1.myhuaweicloud.com
      
      - 华北-北京四：ief-stargate.cn-north-4.myhuaweicloud.com
      
      - 华东-上海一：ief-stargate.cn-east-3.myhuaweicloud.com
        
   
   
   
   
2. 构造请求，发送消息。 
   往SystemREST发送消息，需构造HTTPS请求，具体信息如下。
   - Method：POST
   
   - URL：**https://{rest_endpoint}/{node_id}/{topic}** ，rest_endpoint即[1]中获取的Endpoint，node_id为边缘节点ID，topic为消息的主题，即[创建消息路由]中定义的源端点资源。
   
   - Body：发送的消息内容，由用户自定义。
   
   - Header：X-Auth-Token，取值为该用户在IAM获取的有效Token，Token获取方法请参见[用户Token](https://support.huaweicloud.com/api-iam/iam_30_0001.html)。
   
   - AK/SK认证方法请参见[AK/SK认证](https://support.huaweicloud.com/api-ief/ief_02_0011.html#section1)。
   
   
   例如使用Postman发送如下消息。
   图4发送消息   
   ![](https://support.huaweicloud.com/usermanual-ief/zh-cn_image_0219905084.png "点击放大")
   
   
 
 #### 接收消息
1. 登录边缘节点。
2. 使用MQTT客户端接收消息。 
   当前边缘节点MQTT支持两种模式。
   - 一种是内置的MQTT broker（使用8883端口），需要使用节点证书认证，然后订阅对应Topic接收消息，具体使用方式请参见[使用证书进行安全认证](https://support.huaweicloud.com/usermanual-ief/ief_01_0034.html)。
   
   - 另外一种是使用外置的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"
   }
   ```
   
   
 
