(参考)端云互通组件以太网接入实例
接入IoT平台
开发板的网口通过网线连接到路由器。
设置本地IP。
在sys_init.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()的调用在agent tiny入口函数agent_tiny_entry()之前,作用是完成lwip协议相关的初始化。
sys_init.c位于 LiteOS/targets/Cloud_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/targets/Cloud_STM32F429IGTx_FIRE/Src。设置云平台IP以及设备EP Name和PSK。
现在需要设定相关配置参数。这些参数将作为入参传入atiny_init()以对LiteOS端云互通组件进行初始化。EP Name就是在云平台上注册设备时开发者设定的验证码,必须保证是唯一的;而PSK(预共享密钥)是用来加密传输的秘钥,agent_tiny_demo.c中示例如下:
#define DEFAULT_SERVER_IPV4 "139.159.140.34" //OC
char * g_endpoint_name = "44440003"; //与IoT平台上一致
#ifdef WITH_DTLS
char *g_endpoint_name_s = "11110006";
unsigned char g_psk_value[16] = {0xef,0xe8,0x18,0x45,0xa3,0x53,0xc1,0x3c,0x0c,0x89,0x92,0xb3,0x1d,0x6b,0x6a,0x96};
#endif
agent_tiny_demo.c位于 LiteOS/demos/agenttiny_lwm2m。
编译并运行程序。
查看设备状态。
登录IoT平台开发者Portal,选择“我的设备”,在设备列表中查看对应设备的状态。如果状态为“绑定(bound)”,则表示设备已经成功接入IoT平台。
图 1 查看设备状态
数据上报
本文档在 第4章 中详细介绍了LiteOS SDK端云互通组件设备进行数据上报的完整流程。对于开发者来说,只需要获取传感器数据,并在接口app_data_report()中将其传递给数据上报结构体report_data即可。具体调测过程如下:
在设备侧执行app_data_report函数,使设备上报数据。
修改agent_tiny_demo.c中的函数app_data_report如下:
struct Led_Light
{
uint8_t lightvalue;
…
};
extern get_led_lightvalue (void); //获取传感器数据
void app_data_report(void)
{
struct Led_Light light;
data_report_t report_data;
int ret;
int cnt = 0;
report_data.buf = (uint8_t *)&light;
report_data.callback = ack_callback;
report_data.cookie = 0;
report_data.len = sizeof(struct Led_Light);
report_data.type = APP_DATA;
while(1)
{
report_data.cookie = cnt;
cnt++;
ret = atiny_data_report(g_phandle, &report_data);
printf("report ret:%d\n",ret);
(void)LOS_TaskDelay(250*8);
}
}
agent_tiny_demo.c位于 LiteOS/demos/agenttiny_lwm2m。
查看设备状态
登录IoT平台的开发者Portal,在“我的设备”界面的设备列表中,选择上报数据的设备,查看“历史数据”,验证设备数据上报的情况。
图 1 使用LiteOS SDK端云互通组件的IoT设备数据上报业务流程
图 2 查看数据上报结果
命令下发
命令下发一般分为两种形式:立即下发和缓存下发。
- 立即下发: IoT平台立即发送收到的命令,如果设备不在线或者设备没收到指令则下发失败。立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,应用服务器需要自己保证命令下发的时机。
图 1 命令立即下发流程
- 缓存下发: 平台收到命令后放入队列。在设备上线的时候,平台依次下发命令队列中的命令。缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。缓存下发平台根据设备的省电模式进行不同处理。
图 2 命令缓存下发流程
应用服务器向IoT平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
expireTime=0:命令立即下发。
expireTime>0:命令缓存下发。
LiteOS SDK端云互通组件场景命令下发的调测过程,命令下发步骤如下:
登录IoT平台的开发者Portal。开发者Portal的访问地址、账号和密码需要向IoT平台服务商申请。
在“我的设备”界面的设备列表中,选择接收命令的设备,点击“命令下发(</>)”。在弹出界面中,配置下发给设备的命令参数。
图 3 命令下发
在“我的设备”界面的设备列表中,选择接收命令的设备->“历史命令”,查看“状态”栏的显示。
图 4 命令下发状态
状态说明如下:
- 超期: 表示命令在IoT平台缓存时间超期,未向设备下发。
- 成功: 表示IoT平台已经将命令下发给设备,且收到设备上报的命令执行结果。
- 失败: 表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
- 超时: 表示IoT平台等待ACK响应超时。
- 取消: 表示应用侧已经取消命令下发。
- 等待: 表示命令在IoT平台缓存,还未下发给设备。
- 已发送: 表示IoT平台已经将命令下发给设备。
- 已送达: 表示IoT平台已经将命令下发给设备,且收到设备返回的ACK消息。
LiteOS SDK端云互通组件从消息缓存中获取消息码流并解析,agent_tiny_cmd_ioctl.c中atiny_cmd_ioctl()接口对应的回调函数(实际调用atiny_write_app_write()处理下发命令)。
int atiny_write_app_write(void* user_data, int len)
{
int i;
uint8_t cmd_data[len];
memcpy(cmd_data, user_data, len);
for(i=0;i<len;i++)
{
//打印下发的命令数据,用户可以处理下发的命令,根据具体的命令控制硬件设备
printf("######## %d",cmd_data[i]);
}
(void)atiny_printf("write num19 object success\r\n");
return ATINY_OK;
}
agent_tiny_cmd_ioctl.c位于 LiteOS/demos/agenttiny_lwm2m。