人体感应之上传数据到平台
【摘要】 上传数据 1:登录huawei iot平台登录地址如下:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product 2:新建产品点击产品-创建产品-产品名字自定义 3:添加属性对创建完的产品添加属性,属性名字自定义。 4:修改代码,配置MQTT协议原来的文件是基于LWM2M协议的,现在改成MQTT...
上传数据
1:登录huawei iot平台
登录地址如下:
https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product
2:新建产品
点击产品-创建产品-产品名字自定义
3:添加属性
对创建完的产品添加属性,属性名字自定义。
4:修改代码,配置MQTT协议
原来的文件是基于LWM2M协议的,现在改成MQTT协议传输
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <osal.h>
#include <oc_lwm2m_al.h>
#include <link_endian.h>
#include "E53_IS1.h"
#include "lcd.h"
#include <gpio.h>
#include <stm32l4xx_it.h>
#define cn_endpoint_id "BearPi_0001"
#define cn_app_server "119.3.250.80"
#define cn_app_port "5683"
typedef unsigned char int8u;
typedef char int8s;
typedef unsigned short int16u;
typedef short int16s;
typedef unsigned char int24u;
typedef char int24s;
typedef int int32s;
typedef char string;
typedef char array;
typedef char varstring;
typedef char variant;
#define cn_app_infrared 0x0
#pragma pack(1)
typedef struct
{
int8u messageId;
string Status[4];
} tag_app_infrared;
#pragma pack()
tag_app_infrared infrared;
//if your command is very fast,please use a queue here--TODO
#define cn_app_rcv_buf_len 128
static int s_rcv_buffer[cn_app_rcv_buf_len];
static int s_rcv_datalen;
static osal_semp_t s_rcv_sync;
//use this function to push all the message to the buffer
static int app_msg_deal(void *usr_data, en_oc_lwm2m_msg_t type, void *data, int len)
{
unsigned char *msg;
msg = data;
int ret = -1;
if(len <= cn_app_rcv_buf_len)
{
if (msg[0] == 0xaa && msg[1] == 0xaa)
{
printf("OC respond message received! \n\r");
return ret;
}
memcpy(s_rcv_buffer,msg,len);
s_rcv_datalen = len;
osal_semp_post(s_rcv_sync);
ret = 0;
}
return ret;
}
static int app_report_task_entry()
{
int ret = -1;
oc_config_param_t oc_param;
memset(&oc_param,0,sizeof(oc_param));
oc_param.app_server.address = cn_app_server;
oc_param.app_server.port = cn_app_port;
oc_param.app_server.ep_id = cn_endpoint_id;
oc_param.boot_mode = en_oc_boot_strap_mode_factory;
oc_param.rcv_func = app_msg_deal;
ret = oc_lwm2m_config( &oc_param);
if (0 != ret)
{
return ret;
}
//install a dealer for the led message received
while(1) //--TODO ,you could add your own code here
{
infrared.messageId = cn_app_infrared;
oc_lwm2m_report((char *)&infrared, sizeof(infrared), 1000);
osal_task_sleep(2*1000);
}
return 0;
}
static int app_collect_task_entry()
{
Init_E53_IS1();
while (1)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==SET)
{
E53_IS1_Beep_StatusSet(ON);
infrared.Status[0] = 'H';
infrared.Status[1] = 'a';
infrared.Status[2] = 'v';
infrared.Status[3] = 'e';
}
else
{
E53_IS1_Beep_StatusSet(OFF);
infrared.Status[0] = ' ';
infrared.Status[1] = ' ';
infrared.Status[2] = 'N';
infrared.Status[3] = 'O';
}
osal_task_sleep(2*1000);
}
return 0;
}
#include <stimer.h>
int standard_app_demo_main()
{
LCD_Clear(BLACK);
POINT_COLOR = GREEN;
LCD_ShowString(10, 10, 200, 16, 24, "Welcome to BearPi");
LCD_ShowString(40, 50, 200, 16, 24, "Infrared Demo");
LCD_ShowString(10, 90, 200, 16, 16, "NCDP_IP:");
LCD_ShowString(80, 90, 200, 16, 16, cn_app_server);
LCD_ShowString(10, 130, 200, 16, 16, "NCDP_PORT:");
LCD_ShowString(100, 130, 200, 16, 16, cn_app_port);
osal_semp_create(&s_rcv_sync,1,0);
osal_task_create("app_collect",app_collect_task_entry,NULL,0x400,NULL,3);
osal_task_create("app_report",app_report_task_entry,NULL,0x1000,NULL,2);
return 0;
}
主要查看app_report_task_entry函数这个函数是上传数据的。
修改MQTT协议主要有以下几个方面
1:头文件的修改,添加的头文件如下,原来的文件内容看下面,这里添加的是改过之后的。
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <osal.h>
#include <oc_mqtt_al.h>
#include <link_endian.h>
#include <cJSON.h>
#include "E53_IS1.h"
#include "lcd.h"
#include <gpio.h>
#include <stm32l4xx_it.h>
2:消息处理函数的修改,app_msg_deal,原来的文件内容看下面,这里添加的是改过之后的。
//use this function to push all the message to the buffer
static int app_msg_deal(void *arg, mqtt_al_msgrcv_t *msgrcv)
{
int ret = -1;
char *p_str = NULL;
if (msgrcv->msg.data != NULL)
{
memcpy(s_rcv_buffer, msgrcv->msg.data, msgrcv->msg.len);
s_rcv_datalen = msgrcv->msg.len;
s_qos = msgrcv->qos;
((char *)msgrcv->topic.data)[msgrcv->topic.len] = '\0'; //防止将后面的数据也读入数组
p_str = strstr(msgrcv->topic.data, "=");
p_str++;
strcpy(s_topic_request_id, p_str); //Save request id
(void) osal_semp_post(s_rcv_sync);
ret = 0;
return ret;
}
return ret;
}
3:数据上传函数app_report_task_entry,改成使用MQTT协议上传,这里要注意的是平台上传数据是采用json格式的,如果发现无法上传数据,首先分析上传数据的信息格式是否一致。
static int app_report_task_entry()
{
int ret = -1;
cJSON* cjson_root = NULL;
cJSON* cjson_services = NULL;
cJSON* cjson_item = NULL;
cJSON* cjson_data = NULL;
char *str_json = NULL;
oc_mqtt_config_t oc_param;
(void) memset(&oc_param,0,sizeof(oc_param));
oc_param.boot_mode = en_oc_mqtt_mode_nobs_static_nodeid_hmacsha256_notimecheck_json;
oc_param.id = MQTT_ID;
oc_param.pwd = MQTT_PWD;
oc_param.lifetime = MQTT_LIFETIME;
oc_param.server_addr = MQTT_SERVER_ADDR;
oc_param.server_port = MQTT_SERVER_PORT;
oc_param.msg_deal = app_msg_deal;
ret = oc_mqtt_config( &oc_param);
if (0 != ret)
{
return ret;
}
oc_mqtt_subscribe(TOPIC_PROPERTIES_REPORT, 2);
//install a dealer for the led message received
while(1) //--TODO ,you could add your own code here
{
cjson_root = cJSON_CreateObject();
cjson_services = cJSON_CreateArray();
cjson_data = cJSON_CreateObject();
cjson_item = cJSON_CreateObject();
cJSON_AddStringToObject(cjson_item, "service_id", "Agriculture");
cJSON_AddNumberToObject(cjson_data, "InfraRed", (int8_t)InfarRedStatus);
cJSON_AddItemToObject(cjson_item, "properties", cjson_data);
cJSON_AddItemToArray(cjson_services, cjson_item);
cJSON_AddItemToObject(cjson_root, "services", cjson_services);
str_json = cJSON_Print(cjson_root);
printf("\r\n%s\r\n",str_json);
oc_mqtt_report((uint8_t *)str_json, strlen(str_json), 2);
cJSON_Delete(cjson_root);
if (str_json != NULL)
{
printf("Free str_json");
osal_free(str_json);
}
osal_task_sleep(2*1000);
}
return ret;
}
可以用串口工具查看我上传的信息数据。
这个数据可以使用json格式在线解析,查看自己的json格式对不对。
5:查看云平台,数据是否上传
登录云平台,查看监控运维信息,链接地址如下:
https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/online-debugger
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)