基于CW32的物联网应用

例程资料链接如下(群文件也可下载):
BD网盘链接:
链接:https://pan.baidu.com/s/1oomZQ8A5sfXw2KVkvKPkAw
提取码:f5lz
相关视频:
基于CW32的物联网应用(一):OneNET平台的使用

基于CW32的物联网应用(二):代码讲解+实物演示

一、简介

这期视频向大家介绍如何使用CW32单片机通过ESP8266连接OneNET物联网平台,发送温湿度数据到平台,并接受平台的云控制。

二、所需物料


本实验使用到了CW32-48F大学计划开发板、DHT11温湿度传感器模块、ESP8266WIFI模块及Keil5开发环境。


在这里插入图片描述
在这里插入图片描述

实物图

三、接线


根据原理图,把模块连接到开发板上 (1)ESP8266WIFI模块: 开发板上预留了该模块接口,通过串口向ESP8266写入指令。

在这里插入图片描述

(2)DHT11模块:开发板上预留了该模块接口
在这里插入图片描述

四、协议代码介绍


(1)MQTT协议介绍:
MQTT是一种轻量级的发布/订阅消息传输协议,常用于物联网领域。它的特点是简化和减少了网络流量,可以高效地进行数据传输。在本次应用中,我们将使用MQTT协议进行数据上传。

(2)OneNET代码介绍:
在使用OneNet平台时,我们需要使用TCP协议进行连接。首先需要设置好TCP协议的相关参数,然后通过POST方法将温湿度数据上传到OneNet平台中。在上传数据时需要使用OneNet平台提供的API接口进行数据传输。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、核心代码

main.c:
int main(void)
{	
	unsigned short timeCount = 0;	//发送间隔变量	
	unsigned char *dataPtr = NULL;
	
	Hardware_Init();				//初始化外围硬件
	 while(DHT11_Init())		//检测DHT11
		Delay_ms(200);
	ESP8266_Init();					//初始化ESP8266
	UsartPrintf(USART_DEBUG, "Connect MQTTs Server...\r\n");
	while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) //ESP8266联网
		Delay_ms(500);
	UsartPrintf(USART_DEBUG, "NET_OK\r\n");	
	while(OneNet_DevLink())			//接入OneNET
		Delay_ms(500);
	OneNET_Subscribe();     //订阅消息传输,允许接受下发指令
	TFTShowString(0,0,"     OneNET     ");  //界面
	TFTShowString(1,0,"  智能物联平台  ");
	TFTShowString(3,0,"humidity:    %");
	TFTShowString(4,0,"temperature:  C");
	while(1)
	{
		if(++timeCount >= 50)									
		{
			DHT11_Read_Data(&temperature,&humidity);	//读取温湿度值	
			TFTShowNumber(3,10,humidity);
			TFTShowNumber(4,12,temperature);
			UsartPrintf(USART_DEBUG,"TEMP:%d HUMI:%d\r\n",temperature,humidity);
			UsartPrintf(USART_DEBUG, "OneNet_SendData\r\n");
			OneNet_SendData();				//数据上传
			timeCount = 0;
			ESP8266_Clear();    //清除缓存
		}	
		
		dataPtr = ESP8266_GetIPD(0); //接收OneNET平台返回的数据
		if(dataPtr != NULL)
			OneNet_RevPro(dataPtr); //确认返回数据,执行下发命令
		
		Delay_ms(10);
	}
}
Onenet.c:
#define PROID			"3OB4R7cKCw"       //产品ID(名称)
#define ACCESS_KEY		"n7GptYNpf9U97zHTz2ltc1Pvy4GB+0MXsU1nKel9ixc="  //产品访问密钥
#define DEVICE_NAME		"111"     //设备ID(名称)
void OneNet_RevPro(unsigned char *cmd)
{
	char *req_payload = NULL;
	char *cmdid_topic = NULL;
	unsigned short topic_len = 0;
	unsigned short req_len = 0;
	unsigned char qos = 0;
	static unsigned short pkt_id = 0;
	unsigned char type = 0;
	short result = 0;
	char *dataPtr = NULL;
	char numBuf[10];
	int num = 0;
	
	type = MQTT_UnPacketRecv(cmd);
	switch(type)
	{
		case MQTT_PKT_PUBLISH:																//接收的Publish消息
		
			result = MQTT_UnPacketPublish(cmd, &cmdid_topic, &topic_len, &req_payload, &req_len, &qos, &pkt_id);
			if(result == 0)
			{
				char *data_ptr = NULL;
				UsartPrintf(USART_DEBUG, "topic: %s, topic_len: %d, payload: %s, payload_len: %d\r\n",	cmdid_topic, topic_len, req_payload, req_len);
				data_ptr = strstr(cmdid_topic, "request/");									//查找cmdid
				if(data_ptr)
				{
					char topic_buf[80], cmdid[40];
					
					data_ptr = strchr(data_ptr, '/');
					data_ptr++;
					
					memcpy(cmdid, data_ptr, 36);											//复制cmdid
					cmdid[36] = 0;
					snprintf(topic_buf, sizeof(topic_buf), "$sys/%s/%s/cmd/response/%s",
															PROID, DEVICE_NAME, cmdid);
					OneNET_Publish(topic_buf, "ojbk");										//回复命令
				}
			}
			case MQTT_PKT_PUBACK:														//发送Publish消息,平台回复的Ack
		    	if(MQTT_UnPacketPublishAck(cmd) == 0)
				UsartPrintf(USART_DEBUG, "Tips:	MQTT Publish Send OK\r\n");
		break;
		case MQTT_PKT_SUBACK:																//发送Subscribe消息的Ack
		
			if(MQTT_UnPacketSubscribe(cmd) == 0)
				UsartPrintf(USART_DEBUG, "Tips:	MQTT Subscribe OK\r\n");
			else
				UsartPrintf(USART_DEBUG, "Tips:	MQTT Subscribe Err\r\n");
		break;
		default:
			result = -1;
		break;
	}
	
	ESP8266_Clear();									//清空缓存
	
	if(result == -1)
		return;
	
	dataPtr = strchr(req_payload, ':');					//搜索':'
	if(dataPtr != NULL)					//如果找到了
	{
		dataPtr++;
		while(*dataPtr >= '0' && *dataPtr <= '9')		//判断是否是下发的命令控制数据
		{
			numBuf[num++] = *dataPtr++;
		}
		numBuf[num] = 0;
		num = atoi((const char *)numBuf);				//转为数值形式
		if(strstr((char *)req_payload, "light"))		//搜索"light",判断":"后面的数值进行控制
		{
			if(num == 1)								//控制数据如果为1,代表开
			{
				UsartPrintf(USART_DEBUG, "接收到1\r\n");
				//开灯
				PA07_SETLOW();
				TFTShowString(5,0,"light: ON ");
			}
			else if(num == 0)							//控制数据如果为0,代表关
			{
				UsartPrintf(USART_DEBUG, "接收到0\r\n");
				//关灯
				PA07_SETHIGH();
				TFTShowString(5,0,"light: OFF");
			}
		}
	}
	if(type == MQTT_PKT_CMD || type == MQTT_PKT_PUBLISH)
	{
		MQTT_FreeBuffer(cmdid_topic);
		MQTT_FreeBuffer(req_payload);
	}
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值