# 模拟NB设备智慧路灯的接入与调试
#### 场景说明
本文以"智慧路灯"为示例，通过设备接入控制台提供的设备模拟器和应用模拟器替代真实的设备和应用，带您快速体验设备上报数据到物联网平台和远程下发控制命令到设备的全过程。
假设：
路灯设备上报一条数据消息，包含路灯的光照强度（light_intensity）和路灯的开关状态（light_status）；支持远程控制路灯开关状态的命令（SWITCH_LIGHT），上报数据的格式为二进制格式。
#### 前提条件
- 已注册华为云官方账号。未注册可单击[注册页面](https://reg.huaweicloud.com/registerui/public/custom/register.html#/register)完成注册。
- 已完成实名制认证。未完成可在华为云上单击[实名认证](https://account.huaweicloud.com/usercenter/#/accountindex/realNameAuth)完成认证，否则无法使用设备接入功能。
- 已开通设备接入服务。未开通则访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"立即使用"后开通该服务。
 
#### （可选）创建资源空间
资源空间是物联网平台提供物联网应用和设备的调测空间，您可以根据场景的不同创建不同资源空间分别调测。
系统为您预置了一个资源空间，您可以直接在预置的资源空间下，在线开发设备的产品模型文件和编解码插件；也可以新建一个资源空间，具体步骤如下。
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"立即使用"进入设备接入控制台。
2. 单击左侧导航栏"IoTDA实例"，选择您的实例，单击实例卡片进入实例。
3. 选择左侧导航栏的"资源空间"，单击"新建资源空间"。在弹出的页面填写"空间名称"，然后单击"确定"。
 
#### 创建产品
基于开发的产品，用户可以在线开发设备的产品模型文件和编解码插件；另外，物联网平台提供了设备和应用模拟器，可以便捷地调测开发的产品模型文件和编解码插件的正确性。
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"立即使用"进入设备接入控制台。选择您的实例，单击实例卡片进入。
2. 选择左侧导航栏的"产品"。 
   图1产品-创建产品   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002358714305.png "点击放大")
   
   
3. 单击左侧的"创建产品"，创建一个基于LwM2M/CoAP协议的产品，填写参数后，单击"确定"。
   
   图2创建产品-CoAP   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981466709.png "点击放大")
   
   |                                                                                  **基本信息**                                                                                  ||
   |---|---|
   | 所属资源空间 | 选择新建产品所属的资源空间。                                                                                                              |
   | 产品名称   | 自定义，如Test_1。                                                                                                                |
   | 协议类型    | 选择"LwM2M/CoAP"。                                                                                                           |
   | 数据格式   | 选择"二进制码流"。 当"数据格式"配置为"二进制码流"时，该产品下需要进行编解码插件开发；当"数据格式"配置为"JSON"时，该产品下不需要进行编解码插件开发。 |
   | 所属行业   | 无                                                                                                                           |
   | 设备类型   | streetlamp                                                                                                               |
      
   
   
 
#### 定义产品模型
1. 找到[3]创建的产品，单击产品进入产品界面。
2. 在产品详情基本信息页面，单击"自定义模型"，配置产品的服务，然后单击"确定"。
   
   - "服务ID"：StreetLight
   
   - "服务类型"：建议和服务ID保持一致
   
   - "服务描述"：路灯上报的环境光强度和路灯开关状态的属性。
   
   
   
   
3. 单击[2]新增的服务ID，在展开的页面单击"添加属性"，定义一条属性为路灯采集的当前环境的光照强度。
   
   - "属性名称"：light_intensity
   
   - "数据类型"：int（整型）
   
   - "访问权限"：可读、可写
   
   - "取值范围"：0\~100，光照强度范围。
   
   
   图3新增属性-light_intensity   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950350286.png "点击放大")
   
   
4. 单击"添加属性"，定义一条属性为路灯当前的开关灯状态。 
   - "属性名称"：light_status
   
   - "数据类型"：int（整型）
   
   - "访问权限"：可读、可写
   
   - "取值范围"：0\~1，0代表关闭，1代表打开状态
   
   
   图4添加属性-light_status   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981469721.png "点击放大")
   
   
5. 接下来定义远程控制开关灯状态的命令。 
   1. 单击"添加命令"，定义命令名称：SWITCH_LIGHT。
   
   2. 单击"新增输入参数"，参数名称：SWITCH_LIGHT，数据类型为：string，长度为：3个字符，枚举值为：ON,OFF。
      图5新增命令参数-SWITCH_LIGHT   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981309865.png "点击放大") 
   
   3. 单击"新增响应参数"，参数名称：result，数据类型：int。
   
   
   图6新增响应参数-result   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950350294.png "点击放大")
   
   
6. 单击"确定"，完成该路灯的产品模型文件开发。
 
#### 在线开发插件
通常情况下设备为了省电，设备会采用"二进制"格式上报数据，编解码插件的作用就是将设备上报的"二进制"格式数据，按照产品模型文件的定义的属性转换为"JSON"格式数据，便于物联网平台和应用服务器识别。同时，用户远程下发控制命令时，物联网平台会将"JSON"格式的命令转换为"二进制"格式数据下发给设备。
![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
如果设备本身上报的是JSON格式数据，则不需要定义编解码插件。
1. 在智慧路灯产品的开发空间，选择"插件开发"，单击"图形化开发"。
2. 单击"新增消息"，配置数据上报消息，上报路灯的数据消息。 
   - 消息名：LightData
   
   - 消息类型：数据上报
   
   - 添加响应字段：是。添加响应字段后，物联网平台在收到设备上报的数据后，会下发用户设置的响应数据到设备。
   
   - 响应数据：AAAA0000（默认）
   
   
   图7插件开发-新增消息   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981477077.png "点击放大")
   1. 单击"添加字段"，添加**messageId** 字段，表示消息种类。
      图8插件开发-添加字段messageId   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981477093.png "点击放大") 
   
   2. 添加**LightIntensity** 字段，表示光照强度，数据类型：int8u（8位无符号整型），长度：1字节。
      图9插件开发-添加字段LightIntensity   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981317269.png "点击放大") 
   
   3. 添加**LightStatus** 字段，表示路灯上报的路灯开关状态数据。数据类型：int8u（8位无符号整型），长度：1字节。
      图10插件开发-添加字段LightStatus   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950357674.png "点击放大") 
   
   
   
   
3. 再次单击"新增消息"，定义远程控制路灯开关的命令对应的编解码插件消息。 
   - 消息名：SwitchStatus
   
   - 消息类型：命令下发
   
   - 添加响应字段：是。添加响应字段后，设备在接收命令后，会上报命令执行结果。
   
   
   图11插件开发-新增消息SwitchStatus   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981317229.png "点击放大")
   1. 单击"添加字段"，添加**messageId** 字段，表示消息种类。
      图12插件开发-添加字段messageId   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981477093.png "点击放大") 
   
   2. 添加**mid** 字段，用于将下发的命令和命令执行结果进行关联。
      图13插件开发-添加命令字段mid   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950357682.png "点击放大") 
   
   3. 添加**SwitchStatus** 字段，数据类型：string（字符串类型），长度：3字符。
      图14插件开发-添加命令字段SwitchStatus   
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981317285.png "点击放大") 
   
   4. 单击"添加响应字段"，配置命令下发响应消息。
      - 添加**messageId** ，表示消息种类。命令执行结果为上行消息，需要通过messageId和数据上报消息进行区分。
        图15插件开发-添加响应字段messageId   
        ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950357690.png "点击放大") 
      
      - 添加mid字段，用于将下发的命令和命令执行结果进行关联。
        图16插件开发-添加响应字段mid
        ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981317293.png "点击放大")
        
      
      - 添加errcode字段，用于表示命令执行状态：00表示成功，01表示失败，如果未携带该字段，则默认命令执行成功。
        图17插件开发-添加响应字段errcode   
        ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950357698.png "点击放大") 
      
      - 添加result字段，用于表示命令执行结果。
        图18插件开发-添加响应字段result   
        ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981477149.png "点击放大") 
       
   
   
   
   
4. 拖动右侧"产品模型"区域的属性字段和命令字段（产品模型文件定义的字段），与编解码插件定义的数据上报消息和命令下发消息的相应字段建立映射关系。 
   图19插件开发-在线开发插件   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950357706.png "点击放大")
   
   
5. 编解码插件与产品模型文件建立映射完成后，单击右上角"保存"，并单击"部署"，完成编解码插件的部署。
 
#### 使用真实设备在线调试
模拟器在线调测具备设备模拟和应用模拟功能，可以对定义的产品模型文件和编解码插件进行调试，用户可以直观地感受设备上报数据到物联网平台，以及使用物联网平台下发远程控制命令。
1. 在智慧路灯产品的开发空间，选择"在线调试"，单击"新增测试设备"。
2. 在新增测试设备页面，完成设备参数的填写后，单击"确定"。
   
   - 设备类型：真实设备。
   
   - 设备名称：自定义。
   
   - 设备标识码：设备的IMEI号，用于设备在接入物联网平台时携带该标识信息完成接入鉴权，可在NB模组上查看。
   
   - 密钥：如果使用DTLS传输层安全协议接入时，且请妥善保存密钥。
   
   
   图20在线调试-新增测试设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981481933.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   新添加的设备处于未激活状态，此时不能进行在线调试，可参考[连接鉴权](https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html)，待设备接入平台后，进行调试。
   
   
3. 单击"调试"，进入调试界面。 
   图21在线调试-进入调试   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950362398.png "点击放大")
   
   
4. 模拟远程下发控制命令场景，在应用模拟器中，选择服务：StreetLight，命令：SWITCH_LIGHT，命令取值为：ON，单击"发送"，我们可以看到路灯被点亮。
 
#### 使用虚拟设备在线调试
1. 在智慧路灯产品的开发空间，选择"在线调试"，单击"新增测试设备"。
2. 在新增测试设备页面，选择"虚拟设备"，然后单击"确定"，创建一个虚拟设备。虚拟设备名称包含 "DeviceSimulator"字样，每款产品下只能创建一个虚拟设备。 
   图22在线调试-创建虚拟设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950362494.png "点击放大")
   
   
3. 单击"调试"，进入调试界面。 
   图23在线调试-进入调试   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950362398.png "点击放大")
   
   
4. 模拟设备数据上报场景，在设备模拟器中，输入十六进制码流：002000（00为地址域messageId，长度为1个字节；20表示光照强度，长度为1个字节；00表示路灯开关状态为关闭状态，长度为1个字节），然后单击"发送"，我们可以在应用模拟器中看到转换为JSON格式的数据为："Light_Intensity":32, "Light_Status":0。 
   图24在线调试-模拟数据上报   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002297274236.png "点击放大")
   
   
5. 模拟远程下发控制命令场景，在应用模拟器中，选择服务：StreetLight，命令：SWITCH_LIGHT，命令取值为：ON，单击"发送"，我们可以在设备模拟器中看到转换为十六进制的码流：0100014F4E（经ASCII码转为为十六进制）。 
   图25在线调试-模拟命令下发   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002332228073.png "点击放大")
   
   
 
#### 使用离线模拟器调试
[NB-IoT设备模拟器](https://developer.obs.cn-north-4.myhuaweicloud.com/manage/tool/NBSimulate/NB-IoTDeviceSimulatorCh.zip)用于模拟以LwM2M/CoAP协议接入物联网平台的NB设备，实现数据上报和命令下发功能。
1. 获取[2]中注册设备时的设备标识码，密钥。
2. 下载并解压NB-IoT设备模拟器，然后双击"NB-IoTDeviceSimulator_zh.jar"，运行模拟器。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   - 推荐在Windows系统下运行，暂不支持MAC OS。
   
   - 请确保已经安装jdk，否则，无法运行jar文件。
    
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0229056357.png "点击放大")
   NB-IoT设备模拟器的文件说明如下：
   - **NB-IoTDeviceSimulator_zh.jar**：中文版模拟器。
   
   - **Californium.properties**：模拟器的配置文件。
   
   - **setting.properties**：设备模拟器接入物联网平台的配置文件。
   
   
   
   
3. 模拟器启动后，会提示"是否开启DTLS加密传输？"。若[注册设备]时，没有填写密钥，单击"否"，若[注册设备]时，已填写密钥，单击"是"。
   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0229056358.png)
   
   
4. 填写"IP地址"、"VerifyCode"和"PSK"，单击"注册设备"，将模拟器与物联网平台进行绑定。 
   **注**：如果未开启DTLS加密传输，则无需填写密钥。
   如下信息根据实际情况填写：
   - IP地址：[物联网平台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)的接入域名（也可以使用IP，通过ping命令"ping 域名"可以获得IP地址）。
   
   - VerifyCode：设备标识码，如：aaaaa11111。
   
   - PSK：注册设备时预置的密钥，如：\*\*\*\*\*\*\*。
    
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0229056359.png "点击放大")
   设备绑定成功，可以回到管理控制台，选择"设备 \> 所有设备"，看见设备"aaaaa11111"显示"在线"，表示模拟器绑定成功。
   
   
5. 模拟设备数据上报场景，则在NB-IoT设备模拟器中，输入十六进制码流：001400（00为地址域messageId，长度为1个字节；14表示光照强度，长度为1个字节；00表示路灯开关状态为关闭状态，长度为1个字节），然后单击"发送数据"。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0229056360.png "点击放大")
   数据上报成功，可以回到管理控制台，在"aaaaa11111"设备详情页面中查看到最新上报数据为："Light_Intensity": 20, "Light_Status": 0。
   
   
6. 模拟远程下发控制命令场景，在管理控制台，找到对应的产品，单击产品进入产品界面，选择"在线调试"页签，单击设备"aaaaa11111"右边的"调试"，进入调试界面。 
   在应用模拟器中，选择服务：StreetLight，命令：SWITCH_LIGHT，命令取值为：ON，单击"立即发送"。
   我们可以在"日志"栏看到CIG下发的数据内容：ON，且模拟器会提示"收到平台的下行消息，是否应答？"，单击"是"，可以在管理控制台的应用模拟器看到命令状态为"已送达"。
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0229056361.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   由于插件中的string类型是按照ascii码解析的，因此需要下发可显示字符，非可显示字符在模拟器中不会显示。
   
   
 
