stm32 esp8266-01使用 get,post 请求数据以及json解析

12 篇文章 8 订阅

之前写的只是esp8266 AT指令详解说明,就写一个esp8266 get请求数据json解析。json 解析用的是Cjson,网上可以大家看一下。引用调用就行。
下面是esp8266 一些列操作,写博客目的是让自己加深学习。部分代码来源网上,


#define WIFI_NAME "dajiating"
#define WIFI_PSW	"DJT13619252979"

void SendATCmd(char *cmd, int waitms); 
void esp8266_config(void);




void SendATCmd(char *cmd, int waitms) 
{ // 发送AT指令给串口3
	if (NULL != cmd)
	{
		u3_printf("%s\r\n",cmd);	//发送命令,需要加换行符
		if (waitms > 0)
			delay_ms(waitms);  // 延时等待ESP01模块应答时间
	}
}

void esp8266_config(void)
{
		char str[200];
		sprintf(str, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_NAME, WIFI_PSW);
//		SendATCmd("+++", 500);				// 退出透传模式
		SendATCmd("AT\r\n", 2000);			// 测试ESP01模块是否存在
//		SendATCmd("AT+GMR\r\n",3000);	// 查看模块版本信息
		SendATCmd("AT+CWMODE=1\r\n", 2000);	// 开启STA+AP模式 ==================		
		SendATCmd("AT+RST\r\n", 3000);	
		SendATCmd(str, 10000);	// 连接无线路由器或者手机热点,等待10秒 ============
		SendATCmd("AT+CIPMUX=0\r\n", 2000);	// 关闭多连接
		SendATCmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", 2000);	// 连接心知天气TCP服务器
		SendATCmd("AT+CIPMODE=1\r\n", 500);	// 开启透传模式
		SendATCmd("AT+CIPSEND\r\n", 500);		// 开始透传
		//SendATCmd("GET https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=c\r\n", 2000);
		SendATCmd("GET https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=c\r\n", 2000);
}

/***********************上面是简单版AT操作,只是链接网络***********************************************************/

esp8266.c



#include "esp8266.h"
#include "string.h"
#include "usart.h"
#include "usart3.h"
#include "SysTick.h"
#include <string.h>
#include <stdio.h>











/*********************************************************************************/


void SendATCmd(char *cmd, int waitms) 
{ // 发送AT指令给串口3
	if (NULL != cmd)
	{
		u3_printf("%s\r\n",cmd);	//发送命令,需要加换行符
		if (waitms > 0)
			delay_ms(waitms);  // 延时等待ESP01模块应答时间
	}
}

void esp8266_config(void)
{
		char str[200];
		sprintf(str, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_NAME, WIFI_PSW);
//		SendATCmd("+++", 500);				// 退出透传模式
		SendATCmd("AT\r\n", 2000);			// 测试ESP01模块是否存在
//		SendATCmd("AT+GMR\r\n",3000);	// 查看模块版本信息
		SendATCmd("AT+CWMODE=1\r\n", 2000);	// 开启STA+AP模式 ==================		
		SendATCmd("AT+RST\r\n", 3000);	
		SendATCmd(str, 10000);	// 连接无线路由器或者手机热点,等待10秒 ============
		SendATCmd("AT+CIPMUX=0\r\n", 2000);	// 关闭多连接
		SendATCmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n", 2000);	// 连接心知天气TCP服务器
		SendATCmd("AT+CIPMODE=1\r\n", 500);	// 开启透传模式
		SendATCmd("AT+CIPSEND\r\n", 500);		// 开始透传
		//https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=c\r\n\",80\r\n
	printf("请求开始了\n");
	  	
}



//向ATK-ESP8266发送指定数据
//data:发送的数据(不需要添加回车了)
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)luojian
u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s",data);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(atk_8266_check_cmd(ack))break;//得到有效数据 
				USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}


//usmart支持部分
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART2_RX_STA;
//     1,清零USART2_RX_STA;
void atk_8266_at_response(u8 mode)
{
	if(USART3_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
		printf("%s",USART3_RX_BUF);	//发送到串口
		if(mode)USART3_RX_STA=0;
	} 
}



//ATK-ESP8266发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//    其他,期待应答结果的位置(str的位置)
u8* atk_8266_check_cmd(u8 *str)
{
	
	char *strx=0;
	if(USART3_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} 
	return (u8*)strx;
}


//向ATK-ESP8266发送命令
//cmd:发送的命令字符串
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 atk_8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(atk_8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
} 

//ATK-ESP8266退出透传模式
//返回值:0,退出成功;
//       1,退出失败
u8 atk_8266_quit_trans(void)
{
//	while((USART2->SR&0X40)==0);	//等待发送空
//	USART3->DR='+';      
//	delay_ms(15);					//大于串口组帧时间(10ms)
//	while((USART2->SR&0X40)==0);	//等待发送空
//	USART3->DR='+';      
//	delay_ms(15);					//大于串口组帧时间(10ms)
//	while((USART2->SR&0X40)==0);	//等待发送空
//	USART3->DR='+';      
//	delay_ms(500);					//等待500ms
	
	SendATCmd("+++", 500);				// 退出透传模式
	return atk_8266_send_cmd("AT","OK",20);//退出透传判断.
}



//获取AP+STA ip地址并在指定位置显示
//ipbuf:ip地址输出缓存区
void atk_8266_get_ip(u8 x,u8 y)
{
		if(atk_8266_send_cmd("AT+CIFSR","OK",50))//获取WAN IP地址失败
		{ 
			printf("IP获取失败\r\n");
		}
		else
		{		
			printf("IP获取成功\r\n");
		}
}

//获取ATK-ESP8266模块的连接状态
//返回值:0,未连接;1,连接成功.
u8 atk_8266_consta_check(void)
{
	u8 *p;
	u8 res;
	if(atk_8266_quit_trans())return 0;			//退出透传 
	atk_8266_send_cmd("AT+CIPSTATUS",":",50);	//发送AT+CIPSTATUS指令,查询连接状态
	p=atk_8266_check_cmd("+CIPSTATUS:"); 
	res=*p;		
	return res;
}



const u8* portnum="80";	

//ATK-ESP8266 AP+STA模式测试
//用于测试TCP/UDP连接
//返回值:0,正常
//    其他,错误代码
u8 atk_8266_apsta_test(void)
{	
	u8 url[100];
	u16 reclen;
	//u16 t=999;		//加速第一次获取链接状态
	u16 t=2;		//加速第一次获取链接状态
	//	u8 res=0;
	u16 rlen=0;
	u8 constate=0;	//连接状态
	//	p=mymalloc(32);							//申请32字节内存
	atk_8266_send_cmd("AT+CWMODE=3","OK",50);		//设置WIFI AP+STA模式
	printf("设置AP+STA成功,准备创建AP\r\n");
	//	atk_8266_send_cmd("AT+RST","OK",20);		//重启模块 
	//	delay_ms(1000);         //延时2S等待重启成功
	//	delay_ms(1000);
	//	delay_ms(1000);
	//设置模块AP模式的WIFI网络名称/加密方式/密码,这几个参数看自己喜好设置
	sprintf((char*)url,"AT+CWSAP=\"%s\",\"%s\",1,4",WIFI_NAME,WIFI_PSW);//设置无线参数:ssid,密码
	atk_8266_send_cmd(url,"OK",1000);					//设置AP模式参数
	printf("设置AP成功,准备链接服务器\r\n");
	//设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!! 
	sprintf((char*)url,"AT+CWJAP=\"%s\",\"%s\"",WIFI_NAME,WIFI_PSW);//设置无线参数:ssid,密码
	atk_8266_send_cmd(url,"WIFI GOT IP",1000);						//连接目标路由器,并获得IP
	while(atk_8266_send_cmd("AT+CIFSR","STAIP",20));   //检测是否获得STA IP
	while(atk_8266_send_cmd("AT+CIFSR","APIP",20));   //检测是否获得AP IP
	printf("ATK-ESP AP+STA模式测试\r\n");
	//	while((atk_8266_consta_check()-'2'));   //获得IP
	//LCD_Clear(WHITE);
	//POINT_COLOR=RED;
	//	Show_Str(30,30,200,16,"ATK-ESP AP+STA模式测试",16,0); 
	atk_8266_send_cmd("AT+CIPMUX=1","OK",50);   //0:单连接,1:多连接
	delay_ms(500);
	sprintf((char*)url,"AT+CIPSERVER=1,%s",(u8*)portnum);
	atk_8266_send_cmd(url,"OK",50);     //开启Server模式,端口号为8086
	delay_ms(500);
	atk_8266_send_cmd("AT+CIPSTO=1200","OK",50);     //设置服务器超时时间

	printf("need chose\r\n");
	printf("ESP8266 WIFI-STA 测试\r\n");
	printf("正在配置ESP8266 模块,请稍等...\r\n");
	sprintf((char*)url,"AT+CIPSTART=0,\"TCP\",\"%s\",%s","116.62.81.138",(u8*)portnum);    //配置目标TCP服务器,及ID号,STA模式下为0	
	
	while(atk_8266_send_cmd(url,"OK",200))
	{
		printf("正在测试是否连接成功\r\n");
		atk_8266_apsta_test();//断线重连
	}	
	atk_8266_get_ip(15,65);//STA+AP模式,获取 IP,并显示	
	USART3_RX_STA=0;
	
	
	
	while(1)
	{
		
		//sprintf((char*)p,"GET http://192.168.253.1:8080/test_TCP/ChatServlet?signname=%d HTTP/1.1\r\nHost:192.168.253.1:8080\r\nConnection: keep-alive\r\n\r\n",DHT11_Data.humi_int);//测试数据	

		sprintf((char*)url,"GET http://116.62.81.138:80/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en HTTP/1.1\r\nHost: 116.62.81.138:80\r\nConnection: keep-alive\r\n\r\n");//测试数据	

		//sprintf((char*)url,"POST https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=c\r\n");//测试数据
		u3_printf("AT+CIPSEND=0,%d\r\n",strlen((char*)url));//发送数据的AT指令,先写指令后发送数据
		// delay_ms(200);
		// u2_printf("%s\r\n",p);   //发送指定长度的数据		
		delay_ms(200);
		atk_8266_send_data(url,"OK",1024);  //发送指定长度的数据	

		t++;
		//delay_ms(10);
		delay_ms(300);
		if(USART3_RX_STA&0X8000)		//接收到一次数据了
		{ 
			rlen=USART3_RX_STA&0X7FFF;	//得到本次接收到的数据长度
			USART3_RX_BUF[rlen]=0;		//添加结束符 
			//printf("%s",USART2_RX_BUF);	//发送到串口   
			printf("收到%d字节,内容如下\r\n",rlen);
			printf("---%s\r\n",USART3_RX_BUF);
			//sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数 
			USART3_RX_STA=0;
			//receive_flag=1;
			//if(constate!='+')t=1000;		//状态为还未连接,立即更新连接状态
			//if(constate!='+')t=300;		//状态为还未连接,立即更新连接状态
			if(constate!='+')t=3;		//状态为还未连接,立即更新连接状态
			else t=0;                   //状态为已经连接了,10秒后再检查

		}  
		//printf("测试t=%d,constate=%c,receive_flag=%d\r\n",t,constate,receive_flag);
		if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在.
		//if(t==300)//连续3秒钟没有收到任何数据,检查连接是不是还存在.
		//if(t==3)//连续3秒钟没有收到任何数据,检查连接是不是还存在.
		{
			printf("测试连接状态\r\n");
			constate=atk_8266_consta_check();//得到连接状态
			if(constate=='+'){
				printf("连接成功\r\n");
			}else{
				printf("连接失败\r\n");
				atk_8266_apsta_test();//断线重连
			}
			t=0;
		}
		//	if(t>1000)t=0;
		if(t>3)t=0;
			//if((t%20)==0)LED0=!LED0;
			atk_8266_at_response(1);
		}	

		//	myfree(p);		//释放内存 
		//	return res;		
} 





/**发送测试数据**/

void esp8266_test()
{
	
		/*
	while(atk_8266_send_cmd("AT","OK",20));//检查WIFI模块是否在线
	while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显
	//atk_8266_msg_show(32,155,0);
	*/
	printf("WIFI模块测试\r\n");
	while(atk_8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线
	{
		atk_8266_quit_trans();//退出透传
		atk_8266_send_cmd("AT+CIPMODE=0","OK",200);  //关闭透传模式	
		printf("未检测到模块!!!");
		delay_ms(800);
	} 
	while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显
	while(1)
	{
		delay_ms(10); 
		atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑
	//	atk_8266_wifiap_test();	//WIFI AP测试	 
		atk_8266_apsta_test();//ap+sta测试
	}
}















/*********************************************************************************/

//char a[]="AT+CWMODE=1";
//char b[]="AT+RST";
//char c[]="AT+CWJAP=\"dajiating\",\"DJT13619252979\"";                
//char d[]="AT+CIPMUX=1";
char e[]="AT+CIPSTART=0,\"TCP\",\"192.168.0.101\",1234";
//char e[]="AT+CIPSTART=\"TCP\",\"192.168.0.101\",1234";


//void esp8266_start_trans(void)
//{
//	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
//	esp8266_send_cmd1((u8 *)a);
//	delay_ms(1000);
//	delay_ms(1000);
//	
//	printf("%s\r\n",a);
//	//重启
//	esp8266_send_cmd1((u8 *)b);
//  delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//printf("%s\r\n",b);
//	//连接WIFI
//	esp8266_send_cmd1((u8 *)c);
//  delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//printf("%s\r\n",c);
//	
	esp8266_send_cmd1((u8 *)d);
  delay_ms(1000);
	delay_ms(1000);
printf("%s\r\n",d);
//	//连接TCP服务端
//	esp8266_send_cmd1((u8 *)e);
//	delay_ms(1000);
//	delay_ms(1000);
//	delay_ms(1000);
//printf("%s\r\n",e);
//}

//void esp8266_send_cmd1(u8 *cmd)
//{
//  u3_printf("%s\r\n",cmd);	//发送命令,需要加换行符
//}
 


esp8266.h

#ifndef __ESP8266_H
#define __ESP8266_H
#include "stdio.h"	
#include "stm32f10x.h"




/*********************************************************************************/

#define WIFI_NAME "dajiating"
#define WIFI_PSW	"DJT13619252979"


void SendATCmd(char *cmd, int waitms); 
void esp8266_config(void);

void esp8266_test();



u8* atk_8266_check_cmd(u8 *str);
/*********************************************************************************/

函数
//void esp8266_send_cmd1(u8 *cmd);

//void esp8266_start_trans(void);


#endif

主函数使用

USART1_Init(115200);	 	//串口初始化为115200,串口调试助手显示内容
USART3_Init(9600);          //使用的是esp8266-01 模块
esp8266_test();             //初始化以及get 请求

代码大家可以借鉴,部分也是来源网络,都是整理的别人的。多学习,多看别人的思路。后面就开始写物联网8266模块

上一节:ESP8266 无线wifi AT 指令操作详解

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闰土小蒋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值