参考资料:
万耦启物开发板资料开放链接:
链接:https://pan.baidu.com/s/1V2BfALH-WsQ8JFAIzfIJkQ?pwd=xfyl
提取码:xfyl
简介:本链接资料包含原理图、说明书等,并包含一个基于OneOS V3.1.0裁切添加组件实现的OneNET示例组合。
准备阶段:
OneOS-Lite源码:OneOS-Lite-V3.1.0、OneOS-Lite-V3.2.0
Cube:OneOS-Cube-V2.0.3、Cube2.1.0
注意:如果使用OneOS-Lite-V3.2.0需配套使用Cube2.1.0
进入OneOS-Lite-V3.2.0\projects文件夹打开OneOS_Cube_2.1输入命令oos pack(OneOS-Lite-V3.2.0新特性)
勾选onenet-studio
勾选cjson
输入Q,选择退出并下载
输入oos project配置开发板型号
S保存Q退出
进入生成的目标文件目录
输入oos config
配置WIFI相关信息
使能onenet-studio mqtt-kit。保存退出
打开template工程文件,修改相关配置
点击OK后关闭模板工程窗口,然后回到OneOS_Cube_2.1页面
输入oos init -I keil,生成工程代码。
打开project工程文件,编译,下载。
串口显示这样,即初始化正常,SD Card Error!是因为没有插SD卡,插上就一切正常了。
但是我们发现项目工程目录没有我们勾选的onenet相关文件
(此处应该是一个bug)
将OneOS-Lite-V3.1.0\components中的cloud目录复制到OneOS-Lite-V3.2.0\components中
输入oos config重新配置
注意这里的路径,不是之前的OneNET-Studio
并且回到之前勾选的地方,取消勾选。
保存,退出,重新生成代码。
可以看到这里是有onenet的。
修改这里的OneNET登录信息。
修改这里的IP地址,使用域名解析会出错。(我遇到的BUG)
/*********************************************************************************************************************
* 文件名称 user_task
* 公司名称 成都逐飞科技有限公司
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境 MDK 5.37
* 适用平台 mm32f3277g8p-cmcc-oneos
* 店铺链接 https://seekfree.taobao.com/
*
* 修改记录
* 日期 作者 备注
* 2024-05-06 Teternal first version
********************************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <os_task.h>
#include <os_errno.h>
#include <os_assert.h>
#include <shell.h>
#include <dlog.h>
#include <sensor.h>
#include <onenet_mqtts.h>
#include <onenet_device_sample.h>
// OneNET 推送消息示范格式
char *publish_data1 = "onenet_mqtts_publish"; // 前两个是固定数据格式
char *publish_data2 = "0"; // 前两个是固定数据格式
char publish_data[128];
uint8_t publish_flag = 0; // OneNET 命令下发后置位数据更新标志
char *argv[3]; // 数据发送用的缓冲区指针
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 OneNET 命令接收用户处理函数
// 参数说明 *payload 命令缓冲区指针
// 参数说明 payloadlen 命令字节数
// 返回参数 void 无返回值
// 使用示例
// 备注信息 需要注意的是 本函数重载了修改过的 OneOS/components/cloud/onenet/mqtt-kit/mqtts_device/onenet_mqtts.c 文件中
// 的 __weak void submessage_cmd_request_arrived_customer_handler (char *payload, int payloadlen) 函数
// 该函数在修改过的 static void submessage_cmd_request_arrived_handler(MessageData *data) 函数中调用
// 如果自行拉取最新的 OneOS 源码 需要参照修改 onenet_mqtts.c 文件 否则不能使用本示例用法
//-------------------------------------------------------------------------------------------------------------------
void submessage_cmd_request_arrived_customer_handler (char *payload, int payloadlen)
{
uint8_t cmd_type = *payload;
publish_flag = cmd_type > 2 ? 2 : cmd_type; // 仅接收第一个字节作为命令控制
os_kprintf("Recv submessage cmd: 0x%02x\r\n", publish_flag); // 输出接收的数据转换为命令的类型
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 OneNET 测试任务
// 参数说明 *parameter 线程传参 固定参数
// 返回参数 void 无返回值
// 使用示例
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
static void onenet_test_task (void *parameter)
{
os_device_t *humi_aht20_dev = OS_NULL; // AHT20 被注册成两个部分 湿度是一个设备
os_device_t *temp_aht20_dev = OS_NULL; // 温度是另一个设备
struct os_sensor_data humi_aht20_data, temp_aht20_data; // sensor 传感器架构通用的数据缓冲类型
while( OS_NULL == humi_aht20_dev // 湿度设备是否获取到
|| OS_NULL == temp_aht20_dev) // 温度设备是否获取到
{
os_kprintf("Try to find device.\r\n");
humi_aht20_dev = (OS_NULL == humi_aht20_dev) ? os_device_find("humi_aht20") : humi_aht20_dev;
temp_aht20_dev = (OS_NULL == temp_aht20_dev) ? os_device_find("temp_aht20") : temp_aht20_dev;
os_task_msleep(1000);
}
os_device_open(humi_aht20_dev); // 启动湿度设备
os_device_open(temp_aht20_dev); // 启动温度设备
argv[0] = publish_data1; // 缓冲区指针指向默认数据
argv[1] = publish_data2; // 缓冲区指针指向默认数据
argv[2] = publish_data; // 缓冲区指针指向默认数据
os_kprintf("Wait for device connect.\r\n");
onenet_mqtts_device_start(); // 由于 OneOS-Cube 配置了相关参数 所以这里直接启动连接
while (1)
{ // 请按照说明书新建好自己的 OneNET 设备
os_task_msleep(1000); // 并修改 onenet_device_sample.h 中的信息
if(onenet_mqtts_device_is_connected()) // 如果参数没有配置错误 连接成功后就会从这里退出
{
break;
}
os_kprintf("Wait for device connect retry.\r\n");
}
os_kprintf("Device connected, try to send message.\r\n");
while (1)
{
os_task_msleep(10000); // 每 10s 上传一次数据
os_device_read_nonblock(humi_aht20_dev, 0, &humi_aht20_data, 4); // 读取湿度设备
os_device_read_nonblock(temp_aht20_dev, 0, &temp_aht20_data, 4); // 读取温度设备
// JSON 消息格式
// {
// "id":101,
// "dp":
// {
// "humidity":[{"v":49.723}],
// "temperature":[{"v":29.316}]
// }
// }
sprintf
(
publish_data,
"{\"id\":101,\"dp\":{\"humidity\":[{\"v\":%f,}],\"temperature\":[{\"v\":%f,}]}}",
humi_aht20_data.data.humi / 1000.0,
temp_aht20_data.data.temp / 1000.0
);
if(OS_SUCCESS != onenet_mqtts_publish(3, argv)) // 调用推送消息命令 这里第一个参数固定为 3
{
while (1)
{
os_task_msleep(1000);
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 OneNET 测试任务注册函数
// 参数说明 void 无参数
// 返回参数 int 执行结果
// 使用示例
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
int onenet_test_task_register (void)
{
os_task_id task;
task = os_task_create(OS_NULL, OS_NULL, 1024, "user", onenet_test_task, OS_NULL, 3);
OS_ASSERT(task);
os_task_startup(task);
return 0;
}
OS_INIT_CALL(onenet_test_task_register, OS_INIT_LEVEL_APPLICATION, OS_INIT_SUBLEVEL_LOW);
通过修改weave.yaml内容,来实现配置添加源文件/头文件。
编译,下载。
平台连接成功,数据发送成功。
注意:OneNET创建产品时数据协议需选择数据流,不然数据上报会出错。