
# 基于NB-IoT小熊派开发智慧路灯
#### 场景说明
智慧路灯是城市智能化道路上重要一环，智慧路灯的实施具有节约公共照明能耗、减少因照明引起的交通事故等多种社会意义。路灯也是大家在日常生活中可以强烈感知到的公共设施，更易理解其智能化的场景。
在该文档中，我们基于华为一站式开发工具平台（VS code工具IoTlink插件），从设备（小熊派开发套件）、平台（IoTDA华为物联网平台）、端到端构建一款智慧路灯解决方案样例，带您体验十分钟快速上云。实现智慧路灯检测并上报光照强度，显示在IoTDA控制台，并在IoTDA控制台远程控制LED灯开关的功能。
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0263162059.png "点击放大")
#### 开发环境
- 硬件：小熊派BearPi-IoT开发套件（包含NB卡、NB模组、智慧路灯功能模块、USB数据线等）。
- 软件：VScode，IoT Link插件、华为云（已开通[设备接入服务](https://www.huaweicloud.com/product/iothub.html)）、win7及以上版本的64位操作系统（本文以windows 10 64-bit系统调试）。
 
#### 整体流程
智慧路灯案例的端到端整体流程如下图所示。
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0261371663.png "点击放大")
该场景主要描述的是设备可以通过LWM2M协议（NB卡）与物联网平台进行交互，应用侧可以查看设备侧属性变化，也可以给设备侧下发命令。
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0267423746.png)
#### 小熊派开发板简介
开发板在物联网系统架构中属于感知设备，该类设备通常由传感器、通信模组、芯片以及操作系统组成。为增加开发板的可扩展性，小熊派开发板没有采用传统的板载设计，而是使用了可更换传感器扩展板以及可更换通信模组扩展板设计，通信模组是数据传输的出入口，常用的通信模组包括NB-IoT，Wifi以及4G等，芯片是设备的主控设备，该开发板内置了一个低功耗的STM32L431单片机作为主控芯片，即MCU。操作系统使用的是华为的LiteOS操作系统，其提供了丰富的端云互通组件。
为了便于开发调试，如[图1]所示，该开发板板载了2.1版本的ST-Link，它具有在线调试烧录，拖拽下载以及虚拟串口等功能。开发板中间板载一块分辨率为240 \* 240的LCD屏幕，其主要用于显示传感器数据以及调试日志。LCD屏幕下方是主控芯片。
开发板右上角具有一个拨码开关，将其拨至左侧AT-PC模式，通过电脑端的串口助手，发送AT指令调试通信模组。右侧AT-MCU模式，通过MCU发送AT指令与通信模组进行交互，将采集到的传感器数据通过通信模组发送到云端。
图1小熊派开发板
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0291322116.png "点击放大")
#### 硬件连接
1. 将NB卡插入到NB-IoT扩展板的SIM卡卡槽，确保插卡的时候卡的**缺口朝外** 插入，如[图2]所示。
2. 将光敏传感器以及NB-IoT扩展板插入到开发板上，注意安装方向，然后用USB数据线将小熊派开发板与电脑连接起来。显示屏有显示，电源灯被点亮，说明开发板通电成功。
   图2硬件连接   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0261383212.png "点击放大") 
 
#### 安装IoT Link Studio插件
IoT Link Studio是针对IoT物联网端侧开发的IDE环境，提供了编译、烧录、调试等一站式开发体验，支持 C、 C++、汇编等多种开发语言，让您快速、高效地进行物联网开发。
1. 以win10为例，获取电脑的系统配置：在运行窗口中输入pc，然后单击"属性"，查看系统配置，因为后续安装软件要选择操作系统。 
   图3获取系统配置   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260806804.png "点击放大")
   
   
2. 访问 [这里](https://code.visualstudio.com/updates/v1_49) ，根据您电脑系统配置，下载匹配的Visual Studio Code并安装。（本文以windows 10 64-bit系统Visual Studio Code为例。请下载1.49版本，其他版本不支持IoT Link）。
   
   图4下载Visual Studio Code   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001113781472.png "点击放大")
   注：Visual Studio Code不支持苹果Mac系统。
   
   
3. 安装成功后，打开VSCode 插件应用商店，搜索 IoT Link 找到IoT Link，然后单击安装。 
   图5安装   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260807394.png "点击放大")
   
   
4. 首次启动配置。 
   IoT Link Studio 首次启动时会自动从网络下载最新的SDK包以及gcc依赖环境，请确保您的网络可用。安装过程中请不要关闭窗口，耐心等待。安装完成后重启VSCode使插件生效。
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   若您的网络需要配置代理，请在VSCode主页，选择左下角![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001739736977.png)-设置-应用程序-代理服务器，在Proxy Support下拉框中选择"on"。
   
   
5. 假如下载SDK包及gcc依赖环境失败，请手动下载[SDK包](https://github.com/LiteOS/LiteOS_Lab/tree/iot_link)，放到C:\\Users\\${用户名}\\.iotlink\\sdk目录下,文件名修改为IoT_LINK。放置完后，重新打开VSCode即可。目录格式如下图：
   
   图6SDK下载失败   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001691578440.png "点击放大")
   图7SDK存放目录   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001739745609.png "点击放大")
   
   
 
#### 配置IoT link Studio工程
1. 单击VSCode底部工具栏的"Home"。 
   - Home：管理IoT Link工程；
   
   - Serial：输入AT指令检查开发板状态；
   
   - Build：编译示例代码（步骤3后可见）；
   
   - Download：把编译后的代码烧录到MCU（步骤3后可见）。
   
   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001739624817.png "点击放大")
   
   
2. 配置交叉编译工具链。在弹出界面中单击"IoT Link设置"，选择工具链，若GCC工具目录或文件不存在，单击[下载安装](https://developer.arm.com/downloads/-/gnu-rm)。
   
   图8IoT Link设置   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001739627185.png "点击放大")
   图9交叉编译工具链   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001745744717.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   小熊派STM32431下载的编译工具链版本为win32.zip。
   
   
3. 在弹出界面中单击"创建 IoT 工程"，输入工程名称，工程目录，并选择开发板的硬件平台和示例工程模板。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001815805837.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001769006022.png "点击放大")
   - 工程名称：自定义，如QuickStart。
   
   - 工程目录：可以使用工具安装的默认路径，也可以选择系统盘以外的其他盘，如D:\\。
   
   - 硬件平台：当前提供的demo只适配STM32L431_BearPI硬件平台，请选择STM32L431_BearPI。
   
   - 示例工程：本示例中，我们以智慧路灯为例，请选择oc_streetlight_template，否则烧录的demo样例和在控制台定义的产品模型不匹配，无法上报数据。如果您需要适配智慧烟感等其他场景，请选择对应的oc_smoke_template demo样例。
   
   
   
   
4. 单击"确定"，导入完成。
 
#### 编译并烧录代码
由于提供的demo样例中已配置好和华为云物联网平台的对接信息，您可以直接编译（代码不用做任何修改），并烧录到小熊派开发板MCU，节省开发时间。
1. 单击VSCode底部工具栏的"Build"，等待系统编译完成。编译成功后，界面显示"编译成功"。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260900914.png "点击放大")
   
   
2. 使用USB数据线，将小熊派开发与电脑连接，开发板右上角的拨测开关拨到右侧"AT-MCU模式"。
3. 单击VSCode底部工具栏的"Download"，等待系统烧录完成。烧录成功后，界面显示"烧录成功"。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260901145.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   如果显示烧录失败，可能是开发板没有驱动导致与电脑无法串口通信，请参考[2]检查ST-Link驱动是否安装成功，如果驱动未安装，则参考[这里]下载并安装ST-Link驱动。
   
   
4. （可选）安装ST-Link驱动。 
   1. 访问[ST官网](https://www.st.com/en/development-tools/stsw-link009.html)，下载ST-Link驱动，双击stlink_winusb_install.bat文件进行自动安装。（本文以Windows10-64bit ST-Link 2.0.1为例）。
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0261570193.png "点击放大")
      注：您也可以使用适配您系统版本的exe文件进行安装。
      
   
   2. 打开PC设备管理器可查看对应的驱动是否安装成功。若下图所示，表明驱动安装成功。
      ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260929143.png "点击放大")
      
   
   
   
   
 
#### 使用AT指令定位模组通信问题
IoT Link在与物联网平台连接使用时，可使用AT指令快速定位模组与云端连通性问题，提高开发效率。本节以"小熊派开发板"为例，介绍如何使用AT指令检测通信模组常见问题，如设备无法上线，数据上报不成功等。
1. 小熊派开发板和电脑已正常连接（确保驱动已安装），并将开发板右上角的拨测开关切换到**AT-PC**模式。
2. 单击VSCode底部工具栏的"Serial"。 ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260929142.png)
   
3. 选择[2]中查看的端口号，波特率设置为9600，然后单击"打开"。
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260911271.png "点击放大")
   
4. 输入"AT+CGATT?"，然后单击"发送"，若返回"+CGATT:1"，表示网络附着成功（附着成功代表NB-IoT联网正常），返回"+CGATT:0"表示网络附着失败（附着失败代表NB-IoT联网异常），请查看SIM卡是否插入正确，或联系运营商检查网络状态。 ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0260925897.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   - 使用AT指令检测完模组通信后，请将拨测开关拨到**AT-MCU**模式，以便完成控制台的开发后，将采集到的传感器数据通过通信模组发送到平台。
   
   - PC模式是开发板与电脑串口通信，AT指令读写开发板的状态等数据；MCU模式是开发板通过模组上插的SIM连接网络，实现NB-IoT通信。
     
5. "AT+CSQ\<CR\>"指令用于检查网络信号强度和SIM卡情况。输入"AT+CSQ\<CR\>"，然后单击"发送"，返回 "+CSQ:\*\*,##" 。其中\*\*应在 10 到 31 之间，数值越大表明信号质量越好，##为误码率,值在 0 到 99 之间。若返回的值不在这个范围，应检查天线或 SIM 卡是否正确安装。
注：本文仅列举两个通用的AT指令，用于检测模组的网络状况。更多AT指令，您可以参考小熊派模组的说明书，进行调测。
#### 控制台操作概览
在完成实体设备硬件连接和代码编译烧录之后，我们需要在设备接入服务控制台创建产品、定义产品模型、开发编解码插件和注册设备。
- 创建产品：在物联网平台上规定好某一款产品的协议类型、数据格式、厂商名称、设备类型。此处我们需要按照智慧路灯的特征，在控制台创建智慧路灯的产品。
- 定义产品模型：产品模型是用来描述设备能力的文件，通过JSON的格式定义了设备的基本属性、上报数据和下发命令的消息格式。定义产品模型，即在物联网平台构建一款设备的抽象模型，使平台理解该款设备支持的属性信息。此处，我们需要在控制台上，定义开关灯控制、光照强度、信号质量等。
- 编解插件开发：编解码插件是供物联网平台调用，完成二进制格式和JSON格式相互转换的。它将设备上报的二进制数据解码为JSON格式供应用服务器"阅读"，将应用服务器下行的JSON格式命令编码为二进制格式数据供终端设备（UE）"理解执行"。智慧路灯的数据格式是二进制，因此我们需要开发编解码插件，让物联网能够理解智慧路灯上报的数据，智慧路灯也能理解物联网平台下发的命令。
- 注册设备：将小熊派智慧路灯注册到物联网平台。
 
#### 创建产品
某一类具有相同能力或特征的设备的集合称为一款产品。除了设备实体，产品还包含该类设备在物联网能力建设中产生的产品信息、产品模型（Product Model）、编解码插件等资源。下面，我们按照小熊派智慧路灯的基本特征，在控制台上创建智慧路灯产品。
1. 登录[管理控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home)，选择您的实例，单击实例卡片进入。单击左侧导航栏"产品"，单击页面左侧的"创建产品"。
   
   图10产品-创建产品   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002358714305.png "点击放大")
   
   
2. 创建一个协议类型为LwM2M/CoAP协议、设备类型为StreetLamp的产品，参考页面提示填写参数后，单击"确定"。 
   图11创建产品-CoAP   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981466709.png "点击放大")
   
   
 
#### 上传产品模型
产品模型是用来描述设备能力的文件，通过JSON的格式定义了设备的基本属性、上报数据和下发命令的消息格式。定义产品模型，即在物联网平台构建一款设备的抽象模型，使平台理解该款设备的功能。我们已提供开发好的产品模型，帮助您快速体验上云流程，如果您想体验产品模型的开发流程，可参考[开发产品模型]。
**操作步骤**：
1. 找到新增的产品，单击产品进入产品界面。
2. 在产品详情"基本信息"页面，单击"上传模型文件"。 
   图12上传产品模型-CoAP   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981311981.png "点击放大")
   
   
3. 在弹出的页面中，上传提供的产品模型（[本示例的产品模型](https://developer.obs.cn-north-4.myhuaweicloud.com/manage/tool/StreetLight_58f383040b1e2eed2e99f77c7888b5f9_4e2de3d750c21480.zip)），然后单击"确定"。
   
   图13上传模型文件-CoAP   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950353070.png "点击放大")
   
   
 
#### 注册设备
本文介绍集成NB模组设备的注册方法，将小熊派智慧路灯在物联网平台注册。
1. 在产品详情页面，选择"在线调试"，单击"新增测试设备"，此处新增的是非安全的NB-IoT设备。
2. 在新增测试设备页面，选择"真实设备"，完成设备参数的填写后，单击"确定"。 
   图14在线调试-新增测试设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981481933.png "点击放大")
   - 设备名称：自定义。
   
   - 设备标识码：设备的IMEI号，用于设备在接入物联网平台时携带该标识信息完成接入鉴权，可在NB模组上查看。您也可以将拨测开关拨到**AT-** **PC模式，** 选择STM的端口，波特率设置为9600，输入指令"AT+CGSN=1"获取IMEI号。
     **注：获取IMEI注册完设备后，需要将开发板的拨测开关拨到"AT-MCU"模式，** **因为开发板在MCU模式下才会通过NB卡连接网络。**
     ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001768754458.png "点击放大")
     
   
   - 设备注册方式：不加密。
   
   
   
   
3. 设备创建成功，可在页面看到创建的设备。
 
#### 数据上报
平台和开发板建立连接后，根据烧录至开发板的代码，小熊派智慧路灯每隔2秒（上报频率可根据业务需要在demo中自行设置）上报光照传感器数据。您可以通过用手遮挡光线改变光照强度，查看设备上报给平台的光照强度数据的实时变化。
**注：先检查确认开发板的拨测开关是"AT-MCU"模式** **。**
1. 登录[设备接入服务控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home)，选择您的实例，单击实例卡片进入。选择" 设备 \> 所有设备"。
2. 选择此处注册的设备，单击"详情"进入设备详情，查看上报到平台的数据。 
   图15NB设备数据上报-查看数据   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001956273806.png "点击放大")
   
   
 
#### 命令下发
1. 登录[设备接入服务控制台](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home)，选择您的实例，单击实例卡片进入。选择之前创建的产品，单击产品进入产品界面。
2. 选择"在线调试"，单击注册的设备的"调试"进入调试页面。
3. 设置命令参数后，单击"发送"。 
   图16命令下发调试-SmokeDetector   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002295265508.png "点击放大")
   
   
4. 小熊派板子灯被点亮，下发OFF命令后，灯熄灭。 
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0261758271.png "点击放大")
   
   
至此，基于NB-IoT小熊派开发智慧路灯的最佳实践，端到端流程就全部体验完成了。
#### 更多参考
- **开发产品模型**
  在产品详情"基本信息"页面，单击"自定义模型"，配置产品的服务。
  
  产品模型设计思路：
  表1设备服务列表 
  | 服务类型（ServiceID） | 服务描述     |
  |:---|:---|
  | Button          | 实时按键检测   |
  | LED             | LED灯控制   |
  | Sensor          | 实时检测光照强度 |
  | Connectivity    | 实时检测信号质量 |
     
  服务能力如下表所示。
  表2Button 
  | 能力描述 | 属性名称   | 数据类型 | 数据范围       |
  |:---|:---|:---|:---|
  | 属性列表 | toggle | int  | 0 \~ 65535 |
     
  表3LED命令列表 
  | **能力描述** | **命令名称** | **命令字段** | **字段名称**        | **类型** | **数据长度** | **枚举** |
  |:---|:---|:---|:---|:---|:---|:---|
  | 命令列表     | Set_LED  | 下发命令     | **LED**         | string | 3        | ON、OFF |
  | 命令列表     | Set_LED  | 响应命令     | **Light_state** | string | 3        | ON、OFF |
     
  表4Sensor 
  | 能力描述 | 属性名称      | 数据类型 | 数据范围       |
  |:---|:---|:---|:---|
  | 属性列表 | luminance | int  | 0 \~ 65535 |
     
  表5Connectivity 
  | 能力描述 | 属性名称        | 数据类型 | 数据范围        |
  |:---|:---|:---|:---|
  | 属性列表 | SignalPower | int  | -140 \~ -44 |
  | 属性列表 | ECL         | int  | 0 \~ 2      |
  | 属性列表 | SNR         | int  | -20 \~ 30   |
  | 属性列表 | CellID      | int  | 0 \~ 65535  |
     
  
 
