首先,要实现Bearpi(Hi3861)的数据上云,我们要先了解bearpi的上云案例是怎么运行的
这里我选取的是D9_iot_cloud_oc_manhole_cover这个案例
那么既然是上云,我们肯定要先链接平台,而在案例里链接平台的函数是 static int CloudMainTaskEntry(void)
你就记住你什都不用改,要改什么会在文章最后说的,这里是介绍怎么运作的
static int CloudMainTaskEntry(void)
{
app_msg_t *app_msg;
uint32_t ret;
WifiConnect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD); //WiFi连接(WiFi名称,WiFi密码)
dtls_al_init();
mqtt_al_init();
oc_mqtt_init();
g_app_cb.app_msg = osMessageQueueNew(MSGQUEUE_COUNT, MSGQUEUE_SIZE, NULL);
if (g_app_cb.app_msg == NULL) {
printf("Create receive msg queue failed");
}
oc_mqtt_profile_connect_t connect_para;
(void)memset_s(&connect_para, sizeof(connect_para), 0, sizeof(connect_para));
connect_para.boostrap = 0;
connect_para.device_id = CONFIG_APP_DEVICEID;
connect_para.device_passwd = CONFIG_APP_DEVICEPWD;
connect_para.server_addr = CONFIG_APP_SERVERIP;
connect_para.server_port = CONFIG_APP_SERVERPORT;
connect_para.life_time = CONFIG_APP_LIFETIME;
connect_para.rcvfunc = msg_rcv_callback;
connect_para.security.type = EN_DTLS_AL_SECURITY_TYPE_NONE;
//连接平台
ret = oc_mqtt_profile_connect(&connect_para);
if ((ret == (int)en_oc_mqtt_err_ok)) {
g_app_cb.connected = 1;
printf("oc_mqtt_profile_connect succed!\r\n");
} else {
printf("oc_mqtt_profile_connect faild!\r\n");
}
//这下面是
while (1) {
app_msg = NULL;
(void)osMessageQueueGet(g_app_cb.app_msg, (void **)&app_msg, NULL, 0xFFFFFFFF);
if (app_msg != NULL) {
switch (app_msg->msg_type) {
case en_msg_cmd:
deal_cmd_msg(&app_msg->msg.cmd);
break;
case en_msg_report:
deal_report_msg(&app_msg->msg.report);
break;
default:
break;
}
free(app_msg);
}
}
return 0;
}
下一步就是推送数据的操作,这里使用的是内核操作的消息队列,需要先拼装数据,然后通过oc_mqtt_profile_propertyreport上报数据
对应的代码部分是下面的一堆:
static void deal_report_msg(report_t *report)
{
//创建消息队列的参数
oc_mqtt_profile_service_t service;
oc_mqtt_profile_kv_t temperature;
oc_mqtt_profile_kv_t Accel_x;
oc_mqtt_profile_kv_t Accel_y;
oc_mqtt_profile_kv_t Accel_z;
oc_mqtt_profile_kv_t status;
if (g_app_cb.connected != 1) {
return;
}
//这个是服务的名字
service.event_time = NULL;
service.service_id = "Manhole_Cover";
service.service_property = &temperature;
service.nxt = NULL;
//下面的是服务包含的参数
temperature.key = "Temperature";
temperature.value = &report->temp;
temperature.type = EN_OC_MQTT_PROFILE_VALUE_INT;
temperature.nxt = &Accel_x; //这里一定是下一个数据的名字取地址,如果
Accel_x.key = "Accel_x";
Accel_x.value = &report->acce_x;
Accel_x.type = EN_OC_MQTT_PROFILE_VALUE_INT;
Accel_x.nxt = &Accel_y;
Accel_y.key = "Accel_y";
Accel_y.value = &report->acce_y;
Accel_y.type = EN_OC_MQTT_PROFILE_VALUE_INT;
Accel_y.nxt = &Accel_z;
Accel_z.key = "Accel_z";
Accel_z.value = &report->acce_z;
Accel_z.type = EN_OC_MQTT_PROFILE_VALUE_INT;
Accel_z.nxt = &status;
status.key = "Cover_Status";
status.value = g_coverStatus ? "Tilt" : "Level";
status.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
status.nxt = NULL;
//发送数据
oc_mqtt_profile_propertyreport(NULL,&service);
return;
这两部分最重要,重要的介绍完了,接下来该将他运行起来了,要实现这我们需要先从主源文件看起
首先是头文件
这里不需要我们改动,我们可以简单了解以下这些头文件的含义(博主自己的理解,如有错误,欢迎各位佬指正QAQ)
#include <stdio.h> //C语言的库
#include <stdlib.h> //C语言的库
#include <string.h> //C语言的库
#include <unistd.h> //C语言的库
#include "cmsis_os2.h" //OpenHarmony的内核库
#include "ohos_init.h" //OpenHarmony的内核库
#include <dtls_al.h> //网络的依赖库
#include <mqtt_al.h> //mqtt的相关库
#include <oc_mqtt_al.h> //mqtt的相关库
#include <oc_mqtt_profile.h> //mqtt的相关库
#include "E53_SC2.h" //E53的头文件
#include "wifi_connect.h" //WiFi连接的库
然后我在看接下的宏定义
#define CONFIG_WIFI_SSID "xxx" // 修改为自己的WiFi 热点账号
#define CONFIG_WIFI_PWD "xxxxxx" // 修改为自己的WiFi 热点密码
#define CONFIG_APP_SERVERIP "117.78.5.125" //标准版的IP地址
#define CONFIG_APP_SERVERPORT "1883"
#define CONFIG_APP_DEVICEID "xxxxxxx" // 替换为注册设备后生成的deviceid
#define CONFIG_APP_DEVICEPWD "xxxxxx" // 替换为注册设备后生成的密钥
#define CONFIG_APP_LIFETIME 60 // < seconds
#define CONFIG_QUEUE_TIMEOUT (5 * 1000)
#define MSGQUEUE_COUNT 16
#define MSGQUEUE_SIZE 10
#define CLOUD_TASK_STACK_SIZE (1024 * 10)
#define CLOUD_TASK_PRIO 24
#define SENSOR_TASK_STACK_SIZE (1024 * 4)
#define SENSOR_TASK_PRIO 25
#define TASK_DELAY 3
#define FLIP_THRESHOLD 100
这里的Wifi建议使用手机热点,毕竟手机我们天天带在身边,然后我们开始改平台的IP,我的华为云平台是标准版,如果你的也是,IP就为117.78.5.125,如果你的是基础版,IP就为121.36.42.100,然后就是CONFIG_APP_DEVICEID,CONFIG_APP_DEVICEPWD,这里我们先打开华为云平台,首先你要先注册一个华为账号
华为云地址:https://www.huaweicloud.com/
在华为云首页单击产品,找到IoT物联网,单击设备接入IoTDA 并单击立即使用。
接下来我们要创建产品
然后他就会多出来一个
点击那个蓝色的查看,我们接下来要自定义模型
这里会多出来三个要我们填写的框,第一个服务ID是我们在推送数据那,就是我下面标注出来的红框,服务类型我们填Senser,下面有一张我填写完整的图
创建完是这样的
接下来我们添加属性(只用像我这样填就行)
注意:最后一个是这样填的,因为是字符串类型
最后我们创建完属性应该是这样的
接下来我们开始注册设备,点击上面红色的注册设备
然后按照我图上的填,设备标识码20230906是因为我在注册这个设备的时候是2023的9月6号,你可以按照你喜欢的数字来,这里的设备ID就是代码的CONFIG_APP_DEVICEID,密钥就是CONFIG_APP_DEVICEPWD
点击更多的调试,进入下面的界面
好了,你现在把宏定义改成如下:
#define CONFIG_WIFI_SSID "xxx" // 修改为自己的WiFi 热点账号
#define CONFIG_WIFI_PWD "xxxxxx" // 修改为自己的WiFi 热点密码
#define CONFIG_APP_SERVERIP "117.78.5.125" //标准版的IP地址,
//如果你是基础版,则是121.36.42.100
#define CONFIG_APP_SERVERPORT "1883"
#define CONFIG_APP_DEVICEID "64f7fcd5a559fd7cd411a77b_20230906" // 替换为注册设备后生成的deviceid
#define CONFIG_APP_DEVICEPWD "12345678" // 替换为注册设备后生成的密钥
#define CONFIG_APP_LIFETIME 60 // < seconds
#define CONFIG_QUEUE_TIMEOUT (5 * 1000)
这里我不说明怎么修改文件去编译,你编译完以后,烧录,打开串口终端,等待一会就会在下面的界面看到数据上云了,点击设备右侧的“查看”,进入设备详情页面,可看到上报的数据(我用一下官方的图QwQ)