开发中心(测试环境) |
进入 开发中心 的具体项目中,在 页面查看 “设备接入信息”和“应用接入信息”。 |
设备管理服务(商用环境) |
在物联网平台的 管理控制台 ,选择设备接入,在“设备和应用接入信息”下可查看设备和应用的接入地址信息。 |
设备接入云端可分为直连接入和BS引导接入,如下示意图
- 硬件设备:野火STM32F429开发板,调试下载器(J-Link、ST-Link等)、网线、路由器、USB转串口线。说明:
本章以野火STM32F429IG开发板为例进行介绍,板子的详细资料可以从http://www.firebbs.cn/forum.php下载。
- STM32F429IG_FIRE开发板外设
- 开发中心的访问账号/密码,需要向OceanConnect IoT平台申请
创建项目时,物联网平台会分配一个应用ID(接口调用时参数名为appId)作为项目的唯一标识。若应用服务器需要调用物联网平台的API接口进行一些业务处理, 请求中必须携带appId以接入对应的项目空间,鉴权接口携带在Body中,其他接口的appId的值一般携带在Header中。 创建项目后,可以在项目中查看应用服务器和设备的接入地址和端口信息,方便您快速对接应用服务器和设备。 项目被删除后项目内的所有资源,如设备、产品、订阅数据在平台中的信息会被全部删除,并且不可恢复,请谨慎操作。
- 登录物联网平台。
- 进入开发者中心,在我的项目中点击“新建项目”。
- 在新弹出窗口中,配置项目信息,点击“确定”。
配置示例如下图,点击“确定”后,IoT平台会返回项目对应的应用ID和应用密钥,请妥善保存应用密钥,以便于应用服务器接入平台时使用。如果遗忘密钥,需要通过“对接信息”->"重置密钥”进行重置。
在物联网平台中,某一类具有相同能力或特征的设备的合集被称为一款产品。产品包含Profile(产品模型)、编解码插件、测试报告等资源, 其中产品信息被记录在Profile中。产品的Profile文件用来描述设备类型和设备服务能力。它定义了设备具备的服务能力,每个服务具备的属性、 命令以及命令参数。
在一个项目里最多可以创建20个产品。产品开发最重要的是开发Profile,Profile用于描述设备具备的能力和特性。定义Profile,即在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息。如果设备上报的数据是二进制码流格式,就需要开发对应的编解码插件,用于物联网平台完成二进制格式和JSON格式的转换。 删除产品后,该产品下的Profile、编解码插件等资源将被清空,请谨慎操作。
开发中心上提供了多种创建产品的方法。
方式 |
描述 |
---|---|
基于系统模板创建 |
开发中心提供了多种产品模板,这些模板涉及多个领域。模板中提供了已经编辑好的Profile文件,可以根据自己的需要对Profile中的字段进行修改和增删。有的模板同时提供了开发好的编解码插件,用户也可以进行修改。 |
基于快速集成模板创建 |
类似系统模板,快速集成也是提供了一些产品模板,这些模板适用快速体验平台的集成对接,或者适用一些研讨或培训的学习场合。 |
基于已有产品创建 |
可以基于已有的产品进行克隆,创建新的产品。 |
本地导入产品创建 |
将本地写好的Profile文件上传到平台,开发一个新产品。 |
自定义产品 |
可以从零自定义构建产品。 |
- 登录IoT平台的开发者中心。
- 进入项目->选择“产品开发”->点击“新建产品”->选择“自定义产品”->点击“自定义产品”。
IoT平台提供了产品的Profile模板库,开发者可以根据自己需要,选择合适的模板直接使用。如果在模板库中未找到需要的Profile,再自己定义,示例如下。
- 选择新创建的产品,点击“新建服务”,配置设备的服务能力。
可参考“产品开发”->“添加”->“基于系统模板创建”中的产品进行配置。例如新建一个名为LightControl的服务,包含一种属性light(灯亮LUX数)和一种命令(设置灯亮on或者灭off)
- (可选)开发者中心提供了Profile文件的导出功能。
选择“产品开发”->选择已创建的产品->点击右上角“导出Profile”,可以对线上开发的Profile文件进行导出。
IoT设备和IoT平台之间采用LwM2M协议通信,LwM2M消息的数据为应用层数据,应用层数据的格式由设备厂商自行定义。由于IoT设备对省电要求较高,所以应用层数据一般采用二进制格式。IoT平台在对应用层数据进行协议解析时,会转换成统一的json格式,以方便应用服务器使用。要实现二进制消息与json格式消息的转换,IoT平台需要使用编解码插件。- 选择“产品开发”->选择已创建的产品->选择“编解码插件开发”,选择“在线编解码插件编辑器”。
- 点击“新增消息”,配置二进制码流和Profile属性/命令/命令响应的映射关系。
编解码插件的开发,即定义:
- Profile文件定义的属性/响应在设备上报的二进制码流中的位置,以便于平台对设备上报数据和命令响应进行解码。
- Profile文件定义的命令在平台下发的二进制码流中的位置,以便于平台对下发命令进行编码。
- 点击右上角“部署”。
点击部署后,需要先“保存”插件,之后才开始部署。部署需要等待时间小于60s。
- (可选)开发者中心提供了编解码插件的下载功能。
选择“产品开发”->选择已创建的产品->选择“编解码插件开发”,选择“插件管理”,点击“下载”可以对线上开发的编解码插件进行导出。
平台通过接入真实&虚拟的设备,对开发的应用和设备进行在线调测,并进行统一的设备管理。- 选择“设备管理”->“添加真实设备”->选择已创建的产品->输入设备名称和设备标识,并根据业务需求选择是否加密设备。最后点击“确定”。
添加设备后,IoT平台会返回设备ID和PSK码,请妥善保存。新添加的设备状态为“离线”。
直连模式设备侧开发包括: 配置Demo中对接云端设备的信息、编译、运行SDK、数据上报任务与命令下发调测。 在开发之前,需要提前进行如下操作:- 搭建好Eclipse开发工具软件环境
- 使用网线将野火STM32F429开发板接入互联网并使用USB转串口线连接开发版的串口1与PC
- 获取端云互通组件代码:https://github.com/LiteOS/LiteOS/tree/iot_link
在net_driver.c中修改device接入的局域网的IP地址值。目前demo程序采用的是静态IP地址的方式,如果需要使用DHCP方式,请在main.c中顶部头文件包含之后定义USE_DHCP宏即可。
```
void net_init(void)
{
/* IP addresses initialization */
IP_ADDRESS[0] = 192;
IP_ADDRESS[1] = 168;
IP_ADDRESS[2] = 0;
IP_ADDRESS[3] = 115;
NETMASK_ADDRESS[0] = 255;
NETMASK_ADDRESS[1] = 255;
NETMASK_ADDRESS[2] = 255;
NETMASK_ADDRESS[3] = 0;
GATEWAY_ADDRESS[0] = 192;
GATEWAY_ADDRESS[1] = 168;
GATEWAY_ADDRESS[2] = 0;
GATEWAY_ADDRESS[3] = 1;
}
```
接口net_init()的作用是完成lwip协议相关的初始化。net_driver.c位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/Src。
- 网口的mac地址修改。
在eth.c中将MAC_ADDR0~MAC_ADDR5修改成真实的mac地址值保证不重复。
```
static int8_t eth_init(struct netif* netif)
{
HAL_StatusTypeDef hal_eth_init_status;
MACAddr[0] = 0x00;
MACAddr[1] = 0x80;
MACAddr[2] = 0xE1;
MACAddr[3] = 0x00;
MACAddr[4] = 0x00;
MACAddr[5] = 0x00;
}
```
注意:
接口eth_init()将在步骤2中的net_init()中被调用。eth.c位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/Src。
- 设置云平台IP以及设备EP Name和PSK。
根据开发中心添加的设备信息修改oc_dtls_lwm2m_demo.c中参数。
```
/**/#define cn_endpoint_id "LedLight001"
/**/#define cn_app_server "49.4.85.232"
/**/#define cn_app_port "5684"
const unsigned char s_app_psk[]={0xd6,0x69,0x42,0x7e,0x2d,0xd4,0x38,0xf1,0xd5,0xb5,0xed,0x32,0x96,0x29,0xe6,0x20};
```
oc_dtls_lwm2m_demo.c位于 LiteOS-iot_link/demos。
- 编译并运行程序。
config.mk位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/GCC。
修改配置参数为:
```
CONFIG_OS_TYPE := "liteos"
CONFIG_ARCH_CPU_TYPE := "armv7-m"
CONFIG_SHELL_ENABLE := y
CONFIG_STIMER_ENABLE := y
CONFIG_DRIVER_ENABLE := y
CONFIG_AT_ENABLE := y
CONFIG_CJSON_ENABLE := y
CONFIG_TCPIP_ENABLE := y
CONFIG_TCPIP_TYPE := "lwip_socket"
CONFIG_DTLS_ENABLE := y
CONFIG_DTLS_TYPE := "mbedtls_psk"
CONFIG_MQTT_ENABLE := n
CONFIG_MQTT_TYPE := "lite_mqtt"
CONFIG_LWM2M_ENABLE := y
CONFIG_LWM2M_TYPE := "wakaama_lwm2m"
CONFIG_COAP_ENABLE := n
CONFIG_COAP_TYPE := "lite_coap"
CONFIG_OC_COAP_ENABLE := n
CONFIG_OC_COAP_TYPE := "soft"
CONFIG_OC_MQTT_ENABLE := n
CONFIG_OC_MQTT_TYPE := "soft"
CONFIG_OC_LWM2M_ENABLE := y
CONFIG_OC_LWM2M_TYPE := "soft"
CONFIG_OTA_ENABLE := n
CONFIG_PCP_ENABLE := n
CONFIG_DEMO_ENABLE := y
CONFIG_DEMO_TYPE := "oc_dtls_lwm2m_demo"
include $(TOP_DIR)/iot_link/iot.mk
```
- 查看设备状态。
登录IoT平台开发者中心,选择“设备管理”,在设备列表中查看对应设备的状态。如果状态为“在线”,则表示设备已经成功接入IoT平台。
对于开发者来说,只需在app\_report\_task\_entry\(\)中将其传递给数据上报结构体 light 即可。具体调测过程如下:- 设备侧执行app_report_task_entry函数,使设备上报数据。
oc_lwm2m_demo_dtls.c中的函数app_report_task_entry如下:
```
static int app_report_task_entry()
{
int ret = -1;
int lux = 0;
oc_config_param_t oc_param;
app_light_intensity_t light;
(void) memset(&oc_param,0,sizeof(oc_param));
oc_param.app_server.address = cn_app_server;
oc_param.app_server.port = cn_app_port;
oc_param.app_server.ep_id = cn_endpoint_id;
oc_param.app_server.psk = (char *)s_app_psk;
oc_param.app_server.psk_len = sizeof(s_app_psk);
oc_param.app_server.psk_id = cn_endpoint_id;
oc_param.boot_mode = en_oc_boot_strap_mode_factory;
oc_param.rcv_func = app_msg_deal;
ret = oc_lwm2m_config(&oc_param);
if(ret == 0) //success ,so we could receive and send
{
//install a dealer for the led message received
while(1) //--TODO ,you could add your own code here
{
lux++;
lux= lux%10000;
light.msgid = cn_app_light;
light.intensity = htons(lux);
oc_lwm2m_report((char *)&light,sizeof(light),1000); ///< report the light message
osal_task_sleep(10*1000);
}
}
return ret;
}
```
oc_dtls_lwm2m_demo.c位于 LiteOS-iot_link/demos。
- 查看设备状态
登录IoT平台的开发者中心,在“设备管理”界面的设备列表中,选择上报数据的设备,查看“历史数据”,验证设备数据上报的情况。
命令下发一般分为两种形式:立即下发和缓存下发。- 立即下发: IoT平台立即发送收到的命令,如果设备不在线或者设备没收到指令则下发失败。立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,应用服务器需要自己保证命令下发的时机。
- 缓存下发: 平台收到命令后放入队列。在设备上线的时候,平台依次下发命令队列中的命令。缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。缓存下发平台根据设备的省电模式进行不同处理。
应用服务器向IoT平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
expireTime=0:命令立即下发。
expireTime>0:命令缓存下发。
端云互通组件场景命令下发的调测过程,命令下发步骤如下:
- 登录IoT平台的开发者中心。开发者中心的账号和密码需要向IoT平台服务商申请。
- 在“设备管理”界面的设备列表中,点击接收命令的设备,点击“调试产品”。在弹出应用模拟器界面中选择“命令发送”,配置下发给设备的命令参数。
- 在“设备管理”界面的设备列表中,点击接收命令的设备->“历史命令”,查看“状态”栏的显示。
状态说明如下:
- 超期: 表示命令在IoT平台缓存时间超期,未向设备下发。
- 成功: 表示IoT平台已经将命令下发给设备,且收到设备上报的命令执行结果。
- 失败: 表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
- 超时: 表示IoT平台等待ACK响应超时。
- 取消: 表示应用侧已经取消命令下发。
- 等待: 表示命令在IoT平台缓存,还未下发给设备。
- 已发送: 表示IoT平台已经将命令下发给设备。
- 已送达: 表示IoT平台已经将命令下发给设备,且收到设备返回的ACK消息。
- 物联网平台的访问账号/密码,需要向OceanConnect IoT平台申请
如果使用设备接入和设备管理服务,需要提前在开发中心完成产品模型定义并发布到产品中心,选择“从产品中心导入”。 如果仅使用设备接入服务,则选择“创建产品”。创建产品仅支持创建MQTT协议产品。
- 登录IoT云平台。IoT云平台的访问账号和密码需要向IoT平台服务商申请。
- 进入设备发放服务,点击“从产品中心导入”。
- 在新弹出界面中,产品名称输入“EVB”,协议类型选择“LwM2M”,点击“搜索”,在搜索结果列表中选择产品点击“导入”。
设备导入用于将设备基本信息导入设备发放平台中,用于后续发放至不同的物联网平台,支持批量导入和单个导入。设备导入成功后,可在设备仓库中查看设备的详细信息。
- 登录IoT平台的开发者中心。
- 进入设备发放服务页面,选择“设备导入”,点击页面右上角“单个导入”。
- 在配置设备基本信息界面中,产品信息选择上一步导入的产品、设置好设置设备标识码、设备名称、访问方式选择“IP”,点击“确认导入”
发放策略用于控制设备按照指定策略或规则发放至不同的物联网平台。当前支持按照设备名称中的关键字设置发放示例,最多可添加20个发放实例。
- 在设备发放服务页面选择“发放策略”,点击“设备名称筛选”,添加实例。
- 在添加实例配置框内填写关键字,关键字为设备导入中的设备名称、选择发放区域、点击“确定”。
- 选择“设备仓库”,在设备列表选择要发放的设备,点击“发放设备”,弹出对话框点击“确定”,点击“立即启动”。
- 在虚拟机中搭建好Ubuntu操作系统
- 获取端云互通组件代码:https://github.com/LiteOS/LiteOS/tree/iot_link
- 在Demo源文件中设置云平台IP以及设备EP Name。
oc_lwm2m_bs_demo.c位于 LiteOS-iot_link/demos。
这些参数将作为入参传入oc_lwm2m_config()以对LiteOS端云互通组件进行初始化。EP Name就是在云平台上注册设备时开发者设定的验证码,必须保证是唯一的;oc_lwm2m_bs_demo.c中示例如下:
```
//#define cn_app_server "iot-bs.cn-north-4.myhuaweicloud.com"
\#define cn_app_server "119.3.251.30"
\#define cn_endpoint_id "test_lwm2m10"
\#define cn_app_port "5683"
```
- 修改编译配置文件。
config.mk位于 LiteOS-iot_link/targets/LINUX/GCC。
参考如下配置:
```
CONFIG_OS_TYPE := "linux"
CONFIG_ARCH_CPU_TYPE := "x86-64"
CONFIG_SHELL_ENABLE := n
CONFIG_STIMER_ENABLE := y
CONFIG_DRIVER_ENABLE := n
CONFIG_AT_ENABLE := n
CONFIG_CJSON_ENABLE := y
CONFIG_TCPIP_ENABLE := y
CONFIG_TCPIP_TYPE := "linux_socket"
CONFIG_DTLS_ENABLE := n
CONFIG_DTLS_TYPE := "mbedtls_psk"
CONFIG_MQTT_ENABLE := n
CONFIG_MQTT_TYPE := "lite_mqtt"
CONFIG_LWM2M_ENABLE := y
CONFIG_LWM2M_TYPE := "wakaama_lwm2m"
CONFIG_COAP_ENABLE := n
CONFIG_COAP_TYPE := "lite_coap"
CONFIG_OC_COAP_ENABLE := n
CONFIG_OC_COAP_TYPE := "soft"
CONFIG_OC_MQTT_ENABLE := n
CONFIG_OC_MQTT_TYPE := "soft"
CONFIG_OC_LWM2M_ENABLE := y
CONFIG_OC_LWM2M_TYPE := "soft"
CONFIG_OTA_ENABLE := n
CONFIG_PCP_ENABLE := n
CONFIG_DEMO_ENABLE := y
CONFIG_DEMO_TYPE := "oc_lwm2m_bs_demo"
include $(TOP_DIR)/iot_link/iot.mk
```
- 编译并运行。
进入到LiteOS-iot_link/targets/LINUX/GCC目录下执行“make”命令,编译成功后会在当前文件夹下生成"build"目录,输入“./build/Huawei_LiteOS.elf”运行。
- 查看设备状态。
登录IoT平台进入设备管理服务,选择“所有设备”,在设备列表中查看对应设备的状态。如果状态为“在线”,则表示设备已经成功接入IoT平台。
对于开发者来说,只需在app\_report\_task\_entry\(\)中将其传递给数据上报结构体 light 即可。具体调测过程如下:- 设备侧执行app_report_task_entry函数,使设备上报数据。
oc_lwm2m_bs_demo.c中的函数app_data_report如下:
```
static int app_report_task_entry()
{
int ret = -1;
int lux = 0;
oc_config_param_t oc_param;
app_light_intensity_t light;
(void) memset(&oc_param,0,sizeof(oc_param));
oc_param.app_server.ep_id = cn_endpoint_id;
oc_param.boot_server.address = cn_app_server;
oc_param.boot_server.port = cn_app_port;
oc_param.boot_server.ep_id = cn_endpoint_id;
oc_param.boot_mode = en_oc_boot_strap_mode_client_initialize;
oc_param.rcv_func = app_msg_deal;
while(1) //--TODO ,you could add your own code here
{
if(NULL == s_lwm2m_context)
{
oc_lwm2m_config(&oc_param);
}
else if(s_lwm2m_reconnect)
{
s_lwm2m_reconnect = 0;
oc_lwm2m_deconfig();
oc_lwm2m_config(&oc_param);
}
else
{
lux++;
lux= lux%10000;
light.msgid = cn_app_light;
light.intensity = htons(lux);
oc_lwm2m_report((char *)&light,sizeof(light),1000); ///< report the light message
}
osal_task_sleep(10*1000);
}
return ret;
}
```
oc_lwm2m_bs_demo.c位于 LiteOS-iot_link/demos。
- 查看设备状态
登录IoT平台进入设备管理服务,选择“所有设备”,在设备列表中,点击上报数据的设备,查看设备信息”,验证设备数据上报的情况。