学习了RT-Thread的内核也有一段时间了,由于各种各样的琐事自己没有去做一个综合应用示例,刚最近有点时间,做了一个对接OneNET的历程,采用的是OneNET的EDP协议,关于OneNET的EDP协议可以点击跳转至OneNET EDP协议讲解与应用这篇博客看一下,这篇博客会比较详细的介绍对接EDP协议的思路。本篇博客会根据着重的将RT-Thread的应用思路,在本应用示例也只是用来软件定时器、线程管理、信号量而已,因为我用的是潘多拉开发板进行实验,所以AP6181驱动就直接用RT-Thread的,自己也只是在这个基础上做了应用。
使用AP6181 WiFi模组对接OneNET应用示例:STM32+AP6181(SDIO WiFi模组)对接OneNET,实现温湿度定时上报,控制上报周期、控制设备LED灯、蜂鸣器以及电机,掉线自动连接、WiFi自动连接。整个工程代码点击跳转至GitHub获取。
一、移植需要修改的地方
在移植时,主要也就是修改几个地方,代码如下:
#define ONENET_EDP_PRODUCT_ID "190254" /* 产品id */
#define ONENET_EDP_PRODUCT_APIKEY "cWPICK6PDU6cOHP=T0SqMcXWRc4=" /* api key */
#define ONENET_EDP_DEVICE_ID "504890772" /* 设备id */
#define ONENET_EDP_DEVICE_AUTHKEY "edp20181122" /* 设备鉴权信息 */
需要修改的为产品ID、APIKEY、设备ID、设备鉴权信息,将这些信息修改为你自己在OneNET开发者中心的产品信息或设备信息。
二、连接OneNET思路
1、开机后,RT-Thread完成一系列的初始化后进入main线程,首先进入main函数会进行执行onenet_edp_sample();
函数进行信号量创建、软件定时器创建以及线程创建:
rt_err_t onenet_edp_sample(void)
{
/* 连接OneNET信号量 */
link_onenet_sem = rt_sem_create("link_onenet_sem", 0, RT_IPC_FLAG_FIFO);
if(link_onenet_sem == RT_NULL)
{
rt_kprintf("[EDP]link_onenet_sem create failed\r\n");
return RT_ERROR;
}
/* 发送心跳信号量 */
send_heart_sem = rt_sem_create("send_heart_sem", 0, RT_IPC_FLAG_FIFO);
if(send_heart_sem == RT_NULL)
{
rt_kprintf("[EDP]send_heart_sem create failed\r\n");
return RT_ERROR;
}
/* 用于获取温湿度和发送温湿度信号量 */
humi_temp_sem = rt_sem_create("humi_temp_sem", 1, RT_IPC_FLAG_FIFO);
if(humi_temp_sem == RT_NULL)
{
rt_kprintf("[EDP]humi_temp_sem create failed\r\n");
return RT_ERROR;
}
/* 用于定时触发上报温湿度数据信号量 */
send_humi_temp_sem = rt_sem_create("send_humi_temp_sem", 0, RT_IPC_FLAG_FIFO);
if(send_humi_temp_sem == RT_NULL)
{
rt_kprintf("[EDP]send_humi_temp_sem create failed\r\n");
return RT_ERROR;
}
/* 软件定时器,周期执行,120秒 */
send_heart_timer = rt_timer_create("send_heart_timer", send_heart_timer_callback, RT_NULL, 120000, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
if(send_heart_timer == RT_NULL)
{
rt_kprintf("[EDP]send_heart_timer create failed\r\n");
return RT_ERROR;
}
/* 软件定时器,周期执行,300秒 */
send_humi_temp_timer = rt_timer_create("send_humi_temp_timer", send_humi_temp_timer_callback, RT_NULL, 30000, RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_PERIODIC);
if(send_humi_temp_timer == RT_NULL)
{
rt_kprintf("[EDP]send_humi_temp_timer create failed\r\n");
return RT_ERROR;
}
/* 连接设备线程 */
link_dev_thread = rt_thread_create("link_dev_thread", onenet_edp_link_device_thread, RT_NULL, 2048, 4, 200);
if(link_dev_thread == RT_NULL)
{
rt_kprintf("[EDP]link_dev_thread create failed\r\n");
return RT_ERROR;
}
rt_thread_startup(link_dev_thread);
/* 发送心跳线程 */
send_heart_thread = rt_thread_create("send_heart_thread", onenet_edp_send_heart_thread, RT_NULL, 1024, 4, 50);
if(send_heart_thread == RT_NULL)
{
rt_kprintf("[EDP]send_heart_thread create failed\r\n");
return RT_ERROR;
}
rt_thread_startup(send_heart_thread);
/* 平台下发命令或结果处理线程 */
recv_data_pro_thread = rt_thread_create("recv_data_pro_thread",onenet_edp_receive_process_thread, RT_NULL, 4096, 4, 100);
if(recv_data_pro_thread == RT_NULL)
{
rt_kprintf("[EDP]recv_data_pro_thread create failed\r\n");
return RT_ERROR;
}
rt_thread_startup(recv_data_pro_thread);
/* 获取温湿度数据线程 */
get_humi_temp_thread = rt_thread_create("get_humi_temp_thread", onenet_edp_get_humi_t