HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。HTTP
是一种无状态 (stateless) 协议, HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。,所以在单片机中利用HTTP协议是简单的数据上传协议。
首先要利用AT指令配置esp01,具体可以在官方教程里面搜索。
这里我使用的是协议栈的串口二对esp进行配置。
具体代码为
void IOTInit(void)//初始化MQTT
{
unsigned char SendATData[200];
switch(IOT_Status.Status)
{
case 3:
memset(SendATData,0,200);
sprintf((char *)SendATData,"AT+CWJAP=\"%s\",\"%s\"\r\n",LYSSID,LYPASSWD);//链接到路由器
HalUARTWrite(1,SendATData,osal_strlen((char *)SendATData));
HalUARTWrite(0,SendATData,osal_strlen((char *)SendATData));
HalUARTWrite(0,"Connect To WiFi Route...\r\n",26);
break;
case 4:
HalUARTWrite(1,"AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n",sizeof("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n"));//设置登录到MQTT服务器
//IOT_Status.Status=5;//等待数据返回,调整到串口接收函数处理 获取到6
break;
case 5:
memset(SendATData,0,200);
sprintf((char *)SendATData,"AT+CIPSEND\r\n");
HalUARTWrite(1,SendATData,osal_strlen((char *)SendATData));//设置登录
//IOT_Status.Status=7;//等待数据返回,去串口函数处理函数进行判断反馈
break;
}
}
void IOT_RecdataPut(void)//对IOT返回的数据内容进行解析
{
char *strx;
switch(IOT_Status.Status)
{
case 0:
strx=strstr((const char*)uartbuf2,(const char*)"OK");//返回OK,表明通讯正常c s t x
if(strx)
{
LCD_P8x16Str(0, 4, "CONNET MODULE OK");
IOT_Status.Status=1;
}
break;
case 1:
strx=strstr((const char*)uartbuf2,(const char*)"OK");//设置下模式3
if(strx)
{
//LCD_P8x16Str(0, 4, "SIMCARD NUM [OK]");
LCD_P8x16Str(0, 4, "SET MODE 3 [OK]");
IOT_Status.Status=2;
}
break;
case 2:
strx=strstr((const char*)uartbuf2,(const char*)"OK");//设置模块为 透传模式 发送json到oennet
if(strx)
{
//LCD_P8x16Str(0, 4, "REGISTER NET[OK]");
LCD_P8x16Str(0, 4, "TRANSPARNET [OK]");
IOT_Status.Status=3;
}
break;
case 3://判断登录服务器情况
strx=strstr((const char*)uartbuf2,(const char*)"OK");//CSTX链接到路由器反馈,要上外网必须让WiFi去链接到路由器
if(strx)
{
//LCD_P8x16Str(0, 4, "CONNECT CLOUD OK");
LCD_P8x16Str(0, 4, "CONNECT Route OK");
IOT_Status.Status=4;//此时需要发布登录
}
break;
case 4://查看登录情况返回
strx=strstr((const char*)uartbuf2,(const char*)"OK");//ONENET登录成功,可以发布订阅数据了
if(strx)
{
LCD_P8x16Str(0, 4, "CONNECT CLOUD OK");
IOT_Status.Status=5;//此时就可以发数据了
}
break;
case 5://查看发布数据情况
strx=strstr((const char*)uartbuf2,(const char*)"OK");//发布数据成功c s t x
if(strx)
{
LCD_P8x16Str(0, 4, "SEND CLOUD DATA.");
IOT_Status.Status=6;//此时就可以发数据了
//isBUSY = 0;
}
else
{
//HalUARTWrite(0,"**SEND DATA FAILURE\r\n",21);
LCD_P8x16Str(0, 4, "SEND CLOUD DATA*");
IOT_Status.Status=6;//此时就可以发数据了
//isBUSY = 0;
}
break;
}
}
这两个就是配置esp01连接到WiFi和网站的具体代码,可以定义一个事件循环执行知道全部成功。
然后再数据发送中按照一定格式发送。
memset(RevData,0,256); //统计组成字符串串口打印
sprintf(RevData,"POST /devices/%s/datapoints?type=3 HTTP/1.1\r\napi-key:%s\r\nHost:api.heclouds.com\r\n",devid,devkey);
HalUARTWrite(0,(unsigned char *)RevData,osal_strlen(RevData));
HalUARTWrite(1,(unsigned char *)RevData,osal_strlen(RevData));
memset(strTemp,0,256); //统计组成字符串串口打印
sprintf(strTemp,"{\"temp%d\":%d,\"humi%d\":%d,\"light%d\":%d,\"CO2%d\":%d,\"soilhum%d\":%d}",id,temp,id,humi,id,sensor1,id,sensor2,id,sensor3);
memset(RevData,0,256); //统计组成字符串串口打印
sprintf(RevData,"Content-Length:%d\r\n\r\n%s",osal_strlen(strTemp),strTemp);
HalUARTWrite(0,(unsigned char *)RevData,osal_strlen(RevData));
HalUARTWrite(1,(unsigned char *)RevData,osal_strlen(RevData));
并且再我的代码中定义了变量可以方便更改和直接使用
#define devkey "snlOQBRYB19DJiZFfhrFaC4YQTY=" //onenet平台产品apikey
#define devid "1074546285" //onenet平台设备id
#define LYSSID "Redmi" // 修改你路由器的SSId
#define LYPASSWD "123456789" // 修改你路由器的密码
有需要的可以去我的资源里面去下载 cc2530通过esp01上传数据到onenet资源-CSDN文库