【12月原创】利用ART-PI 向 ONENET 上传甲醛浓度信息
前言
上篇文章《【12月原创】 ART-PI 连接 ONENET 物联网平台》介绍了如何使用 ART-PI 连接 ONENT物联网平台。这篇文章接着分享一下如何使用 rt-thread 提供的 onenet 软件包来向 onenet 平台上传甲醛浓度信息。
关于甲醛检测仪的设计说明请参考《【12月原创】基于ART-PI的智能甲醛检测仪》。
onenet 软件包说明
在 onenet 软件包中,提供了非常详细的说明文档,相关的api 都已经在 api.md
文档中有详细的介绍。
这里只介绍使用到的两个 API.
OneNET 初始化
int onenet_mqtt_init(void);
OneNET 初始化函数,需要在使用 OneNET 功能前调用。
参数 | 描述 |
---|---|
无 | 无 |
返回 | – |
0 | 成功 |
-1 | 获得设备信息失败 |
-2 | mqtt 客户端初始化失败 |
mqtt 上传数字到 OneNET
rt_err_t onenet_mqtt_upload_digit(const char *ds_name, const double digit);
利用 mqtt 向 OneNET 平台发送数字数据。
参数 | 描述 |
---|---|
ds_name | 数据流名称 |
digit | 要上传的数字 |
返回 | – |
0 | 上传成功 |
-5 | 内存不足 |
onenet 软件包中提供有mqtt协议上传数字、mqtt协议上传字符串、mqtt协议上传二进制文件 等接口,这是使用上传数字接口即可。
代码
在 原有甲醛检测仪的基础上,添加 onenet 数据上传线程部分代码,其中甲醛浓度值通过消息队列的方式从甲醛传感器数据读取线程中获取。
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"
#include "onenet.h"
#define NET_READY_TIME_OUT (rt_tick_from_millisecond(10 * 1000))
rt_thread_t onenet_update_thread=RT_NULL;
static rt_sem_t net_ready = RT_NULL;
extern struct rt_messagequeue onenet_mq;
extern void wlan_autoconnect_init(void);
/* onenet 数据上传线程函数 */
static void onenet_mqtt_update_data_entry(void *parameter)
{
uint16_t gas_ppb ;
float gas_f;
float gas_mg_m3;
char float_str[10];
char update_count=0;
rt_thread_delay(rt_tick_from_millisecond(15 * 1000));//等待 wifi 连接成功 网络正常
/* OneNET 连接初始化 */
rt_kprintf("start init onenet mqtt \n");
if(onenet_mqtt_init()<0)
{
rt_kprintf("onenet_mqtt_init failed\n");
}
else {
rt_kprintf("onenet_mqtt_init finished\n");
}
while(1)
{
if (rt_mq_recv(&onenet_mq, &gas_ppb, sizeof(gas_ppb), RT_WAITING_FOREVER) == RT_EOK) //读取消息队列
{
update_count++;
if(update_count>4)
{
update_count=0;
gas_f = (float)(gas_ppb/1000.0);
gas_mg_m3 = gas_f * 0.74666;
rt_memset(float_str, 0, sizeof(float_str));
sprintf(float_str, "%.3f",gas_mg_m3);
if (onenet_mqtt_upload_digit("hcho", gas_mg_m3) < 0)
{
rt_kprintf("upload has an error\n");
}
else
{
rt_kprintf("HCHO: %s mg/m3\n", float_str);
}
}
}
rt_thread_mdelay(5);
}
}
int onenet_mqtt_task(void)
{
rt_err_t result = RT_EOK;
/*初始化 wifi 自动连接*/
wlan_autoconnect_init();
/* 使能 wifi 自动连接 */
rt_wlan_config_autoreconnect(RT_TRUE);
rt_thread_delay(rt_tick_from_millisecond(3* 1000));
/* 创建 onenet 数据上传线程 */
if(onenet_update_thread)
{
rt_kprintf("onenet_update_thread is created\n");
return -1;
}
onenet_update_thread = rt_thread_create("onenet", onenet_mqtt_update_data_entry, RT_NULL, 2*1024, 26, 5);
/* 创建成功则启动线程 */
if (onenet_update_thread != RT_NULL)
{
rt_thread_startup(onenet_update_thread);
}
else
{
rt_kprintf("onenet_update_thread create error\n");
}
return 0;
}
INIT_APP_EXPORT(onenet_mqtt_task);
效果
结束
使用 onenet 软件包上传数据到 onenet 还是比较简单的,这得益于 onenet 软件包的完整性。
至此,已经可以完成一个传感器联网并上传数据了,接着就该考虑如何利用这些数据来执行一些任务了。