人体感应之上传数据到平台

举报
秦玉安 发表于 2021/08/30 16:58:47 2021/08/30
【摘要】 上传数据 1:登录huawei iot平台登录地址如下:https://console.huaweicloud.cn/iotdm/?region=cn-north-4#/dm-dev/all-product 2:新建产品点击产品-创建产品-产品名字自定义 3:添加属性对创建完的产品添加属性,属性名字自定义。 4:修改代码,配置MQTT协议原来的文件是基于LWM2M协议的,现在改成MQTT...

上传数据

1:登录huawei iot平台

登录地址如下:

https://console.huaweicloud.cn/iotdm/?region=cn-north-4#/dm-dev/all-product

2:新建产品

点击产品-创建产品-产品名字自定义

image-20210830153141466

3:添加属性

对创建完的产品添加属性,属性名字自定义。

image-20210830153824716

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函数这个函数是上传数据的。

image-20210830164613618

修改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;


}

可以用串口工具查看我上传的信息数据。

image-20210830165159461

这个数据可以使用json格式在线解析,查看自己的json格式对不对。

image-20210830165314865

5:查看云平台,数据是否上传

登录云平台,查看监控运维信息,链接地址如下:

https://console.huaweicloud.cn/iotdm/?region=cn-north-4#/dm-dev/online-debugger

image-20210830165556332

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。