概述
之前写的只是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("%srn",cmd); //发送命令,需要加换行符
if (waitms > 0)
delay_ms(waitms); // 延时等待ESP01模块应答时间
}
}
void esp8266_config(void)
{
char str[200];
sprintf(str, "AT+CWJAP="%s","%s"rn", WIFI_NAME, WIFI_PSW);
// SendATCmd("+++", 500); // 退出透传模式
SendATCmd("ATrn", 2000); // 测试ESP01模块是否存在
// SendATCmd("AT+GMRrn",3000); // 查看模块版本信息
SendATCmd("AT+CWMODE=1rn", 2000); // 开启STA+AP模式 ==================
SendATCmd("AT+RSTrn", 3000);
SendATCmd(str, 10000); // 连接无线路由器或者手机热点,等待10秒 ============
SendATCmd("AT+CIPMUX=0rn", 2000); // 关闭多连接
SendATCmd("AT+CIPSTART="TCP","api.seniverse.com",80rn", 2000); // 连接心知天气TCP服务器
SendATCmd("AT+CIPMODE=1rn", 500); // 开启透传模式
SendATCmd("AT+CIPSENDrn", 500); // 开始透传
//SendATCmd("GET https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=crn", 2000);
SendATCmd("GET https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=crn", 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("%srn",cmd); //发送命令,需要加换行符
if (waitms > 0)
delay_ms(waitms); // 延时等待ESP01模块应答时间
}
}
void esp8266_config(void)
{
char str[200];
sprintf(str, "AT+CWJAP="%s","%s"rn", WIFI_NAME, WIFI_PSW);
// SendATCmd("+++", 500); // 退出透传模式
SendATCmd("ATrn", 2000); // 测试ESP01模块是否存在
// SendATCmd("AT+GMRrn",3000); // 查看模块版本信息
SendATCmd("AT+CWMODE=1rn", 2000); // 开启STA+AP模式 ==================
SendATCmd("AT+RSTrn", 3000);
SendATCmd(str, 10000); // 连接无线路由器或者手机热点,等待10秒 ============
SendATCmd("AT+CIPMUX=0rn", 2000); // 关闭多连接
SendATCmd("AT+CIPSTART="TCP","api.seniverse.com",80rn", 2000); // 连接心知天气TCP服务器
SendATCmd("AT+CIPMODE=1rn", 500); // 开启透传模式
SendATCmd("AT+CIPSENDrn", 500); // 开始透传
//https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=crn",80rn
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("%srn",cmd); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(atk_8266_check_cmd(ack))
{
printf("ack:%srn",(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获取失败rn");
}
else
{
printf("IP获取成功rn");
}
}
//获取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成功,准备创建APrn");
// 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成功,准备链接服务器rn");
//设置连接到的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模式测试rn");
// 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 chosern");
printf("ESP8266 WIFI-STA 测试rn");
printf("正在配置ESP8266 模块,请稍等...rn");
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("正在测试是否连接成功rn");
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.1rnHost:192.168.253.1:8080rnConnection: keep-alivernrn",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.1rnHost: 116.62.81.138:80rnConnection: keep-alivernrn");//测试数据
//sprintf((char*)url,"POST https://api.seniverse.com/v3/weather/daily.json?key=SkV9zIBpwJAOixrJZ&location=zhenjiang&language=en&unit=crn");//测试数据
u3_printf("AT+CIPSEND=0,%drn",strlen((char*)url));//发送数据的AT指令,先写指令后发送数据
// delay_ms(200);
// u2_printf("%srn",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字节,内容如下rn",rlen);
printf("---%srn",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=%drn",t,constate,receive_flag);
if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在.
//if(t==300)//连续3秒钟没有收到任何数据,检查连接是不是还存在.
//if(t==3)//连续3秒钟没有收到任何数据,检查连接是不是还存在.
{
printf("测试连接状态rn");
constate=atk_8266_consta_check();//得到连接状态
if(constate=='+'){
printf("连接成功rn");
}else{
printf("连接失败rn");
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模块测试rn");
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("%srn",a);
// //重启
// esp8266_send_cmd1((u8 *)b);
// delay_ms(1000);
// delay_ms(1000);
// delay_ms(1000);
// delay_ms(1000);
//printf("%srn",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("%srn",c);
//
esp8266_send_cmd1((u8 *)d);
delay_ms(1000);
delay_ms(1000);
printf("%srn",d);
// //连接TCP服务端
// esp8266_send_cmd1((u8 *)e);
// delay_ms(1000);
// delay_ms(1000);
// delay_ms(1000);
//printf("%srn",e);
//}
//void esp8266_send_cmd1(u8 *cmd)
//{
// u3_printf("%srn",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 指令操作详解
最后
以上就是安静手链为你收集整理的stm32 esp8266-01使用 get,post 请求数据以及json解析的全部内容,希望文章能够帮你解决stm32 esp8266-01使用 get,post 请求数据以及json解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复