0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP8266模组的HTTP编程

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-19 11:20 次阅读

ESP8266 模组的 HTTP 编程

超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言文档从Web服务器传送到客户端浏览器; HTTP是一个属于应用层面向对象的协议,由于其简捷、决速的方式,适用于分布式超媒体信息系统

超文本是包含有超链接和各种多媒体元素标记的文本。 这些超文本文件彼此链接,形成网状(Web),因此又被称为网页(Web Page)。 这些链接使用URL表示。 最常见的超文本格式是超文本标记语言HTML

图片

URL即统一资源定位符(Uniform Resource Locator),用来唯一地标识万维网中的某一个文档。 URL由协议、主机和端口(默认为80)以及文件名三部分构成。 如:

图片

HTTP工作原理如下图示

图片

HTTP报文结构:

请求报文:即从客户端(浏览器)向Web服务器发送的请求报文。 报文的所有字段都是ASCII码

图片

响应报文:即从Web服务器到客户端(浏览器)的应答。 报文的所有字段都是ASCII码

图片

请求方法:请求报文中的方法,是对所请求对象所进行的操作,也就是一些命令

图片

下面将介绍如何使用 ESP8266 SDK开发 HTTP通信的客户端和服务端

1. HTTP Client 编程

HTTP Client 要实现的功能:

  • 模拟http协议,访问百度首页:
    www.baidu.com/index.html
  • 串口打印出百度返回的数据

HTTP Client 任务流程如下示:

图片

实现步骤如下:

在ESP8266_RTOS_SDK目录下新建 httpclient文件夹,把 station实验中的 station目录下所有文件拷贝到该文件夹中

在 user目录下新建 httpclient.c文件,并添加如下代码

/*******************httpclient.c************************************/
constchar GetStr[]="GET /index.html HTTP/1.1\\r\\n"
"Host: www.baidu.com\\r\\n"
"\\r\\n";
#define HTTP_RCV_LEN 50000
voidATaskHttpClient(void*pvParameters ){
int iVariableExample =0;
int fd =-1;
int NetTimeOnt =20000;
int ret;
int i;
structhostent*phostent;
structsockaddr_in ServerAddr;
char*Httpmsg;
char*ipaddr =NULL;
  STATION_STATUS StaStatus;
do{
    StaStatus =wifi_station_get_connect_status();
vTaskDelay(100);
}while(StaStatus != STATION_GOT_IP);

  fd =socket(PF_INET,SOCK_STREAM,0);
if(fd ==-1){
printf("get socket fail!\\n");
vTaskDelete(NULL);
return;
}

setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
  phostent =gethostbyname("www.baidu.com");
if(phostent ==NULL){
printf("get host ip fail!\\n");
vTaskDelete(NULL);
return;
}
else{
for(i =0;phostent->h_addr_list[i];i++){
      ipaddr =inet_ntoa(*(structin_addr*)(phostent->h_addr_list[i]));
if(ipaddr !=NULL){
printf("host addr is:%s\\n",  ipaddr );
break;
}
}
if(ipaddr ==NULL){
printf("error:get ip fail!\\r\\n");
vTaskDelete(NULL);
return;
}
}
memset(&ServerAddr,0,sizeof(ServerAddr));
  ServerAddr.sin_family = AF_INET;
  ServerAddr.sin_addr.s_addr =inet_addr(ipaddr);
  ServerAddr.sin_port =htons(80);
  ServerAddr.sin_len =sizeof(ServerAddr);

do{
    ret =connect(fd,(structsockaddr*)&ServerAddr,ServerAddr.sin_len);
if(ret !=0){
printf("connect is fail!\\n");
vTaskDelay(100);
}
}while(ret !=0);

  Httpmsg =zalloc(HTTP_RCV_LEN);
send(fd,GetStr,strlen(GetStr),0);
for(;;){
do{
      ret =recv(fd,Httpmsg,50000,0);
if(ret >0){
printf("%s",Httpmsg);
}else{
printf("HttpServer data is no!\\n");
}
}while(ret ==-1);
}
free(Httpmsg);
vTaskDelete(NULL);
}
//HttpClient_init 初始化
voidHttpClient_init(void){
xTaskCreate(ATaskHttpClient,"HttpClient",256,NULL,4,NULL);
}

在 include目录下新建 httpclient.h文件,并添加声明

void ATaskHttpClient(void *pvParameters);
void HttpClient_init(void);

在 user_main.c文件中的 user_init()函数下添加如下代码

#define SSID "Hotspot"	//ESP8266要加入的无线网
#define PASSWORD "88888888"
void ICACHE_FLASH_ATTR
user_init(void){
printf("SDK version:%s\\n",system_get_sdk_version());
Led_init();
wifi_set_opmode(STATION_MODE);
structstation_config*config =(structstation_config*)\\
zalloc(sizeof(structstation_config));
sprintf(config->ssid,SSID);
sprintf(config->password,PASSWORD);
wifi_station_set_config(config);
free(config);
wifi_station_set_auto_connect(TRUE);
HttpClient_init();
xTaskCreate(ATaskLed,"LED",256,NULL,2,NULL);
}

在ESP8266编译器中编译完成,烧写 bin文件到 ESP8266,打开串口助手,即可接收到百度服务器返回的数据

图片

2. HTTP Server 编程

HTTP Server 要实现的功能:

  • 模拟httpserver等待网页访问
  • PC访问网页,查看网页信息

HTTP Server 任务流程如下示:

图片

实现步骤如下:

在ESP8266_RTOS_SDK目录下新建 httpserver文件夹,把 station实验中的 station目录下所有文件拷贝到该文件夹中

在 user目录下新建 httpserver.c文件,并添加如下代码

/*******************httpserver.c******************************************/
#defineSERVERADDR"192.168.191.29"//esp8266连上WiFi后的IP地址
#define SERVERPORT 8000
//ATaskHttpServer任务
constchar*DefaultPage=
""
""
""
"欢迎进入html世界"
""
""
"欢迎关注微信公众号:andyxi_linux"
""
"";

// 发送200 ok报头
intfile_ok(int cfd,long flen){
char*send_buf =zalloc(sizeof(char)*100);
sprintf(send_buf,"HTTP/1.1 200 OK\\r\\n");
send(cfd, send_buf,strlen(send_buf),0);
sprintf(send_buf,"Connection: keep-alive\\r\\n");
send(cfd, send_buf,strlen(send_buf),0);
sprintf(send_buf,"Content-Length: %ld\\r\\n", flen);
send(cfd, send_buf,strlen(send_buf),0);
sprintf(send_buf,"Content-Type: text/html\\r\\n");
send(cfd, send_buf,strlen(send_buf),0);
sprintf(send_buf,"\\r\\n");
send(cfd, send_buf,strlen(send_buf),0);
free(send_buf);
return0;
}
//ATaskHttpServer 任务
voidATaskHttpServer(void*pvParameters ){
int iVariableExample =0;
int fd =-1;
int cfd =-1;
int NetTimeOnt =2000;
int ret;
structsockaddr_in ServerAddr;
structsockaddr ClientAddr;
socklen_t ClientAddrlen =sizeof(structsockaddr);
char*Httpmsg;
char*Sendmsg;

  STATION_STATUS StaStatus;
do{
    StaStatus =wifi_station_get_connect_status();
vTaskDelay(100);
}while(StaStatus != STATION_GOT_IP);

  fd =socket(PF_INET,SOCK_STREAM,0);
if(fd ==-1){
printf("get socket fail!\\n");
vTaskDelete(NULL);
return;
}

setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
memset(&ServerAddr,0,sizeof(ServerAddr));
  ServerAddr.sin_family = AF_INET;
  ServerAddr.sin_addr.s_addr = INADDR_ANY;
  ServerAddr.sin_port =htons(SERVERPORT);
  ServerAddr.sin_len =sizeof(ServerAddr);

if(bind(fd,(structsockaddr*)&ServerAddr,ServerAddr.sin_len)!=0){
printf("bind socket fail!\\n");
vTaskDelete(NULL);
return;
}

if(listen(fd,5)!=0){
printf("listen socket fail!\\n");
vTaskDelete(NULL);
return;
}
  Httpmsg =(char*)zalloc(sizeof(char)*1000);
for(;;){
    cfd =accept(fd,&ClientAddr,&ClientAddrlen);
if(cfd !=-1){
printf("HttpClient accept\\n");
      ret =recv(cfd,Httpmsg,1000,0);
if(ret >0){
printf("HttpClient recv\\n");
printf("%s\\n",Httpmsg);
file_ok(cfd,strlen(DefaultPage));
send(cfd,DefaultPage,strlen(DefaultPage),0);
}else{
printf("HttpClient data is no!\\n");
}
}
close(cfd);
}
free(Httpmsg);
vTaskDelete(NULL);
}
//HttpServer_init 初始化
voidHttpServer_init(void){
xTaskCreate(ATaskHttpServer,"HttpServer",256,NULL,4,NULL);
}

在 include目录下新建 httpserver.h文件,并添加声明

void ATaskHttcpserver( void *pvParameters );
void Httpserver_init(void);

在 user_main.c文件中的 user_init()函数下添加如下代码

#define SSID "Hotspot"	//PC端和ESP8266要加入的无线网
#define PASSWORD "88888888"	
void ICACHE_FLASH_ATTR
user_init(void){
  printf("SDK version:%s\\n", system_get_sdk_version());
  Led_init();
  wifi_set_opmode(STATION_MODE);
  struct station_config *config = (struct station_config *)\\
        zalloc(sizeof(struct station_config));
  sprintf(config->ssid,SSID);
  sprintf(config->password,PASSWORD);
  wifi_station_set_config(config);
  free(config);
  wifi_station_set_auto_connect(TRUE);    
  HttpServer_init();
  xTaskCreate(ATaskLed, "LED", 256, NULL, 2, NULL);
}

在ESP8266编译器中编译完成,烧写 bin文件到 ESP8266,确保 PC与 ESP8266在同一个网络中,模组复位后,在浏览器中输入 ESP8266的 IP地址(192.168.191.29),即可访问到 ESP8266返回的网页信息(如下图示)

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    805

    浏览量

    40074
  • Web
    Web
    +关注

    关注

    2

    文章

    1252

    浏览量

    69015
  • 服务器
    +关注

    关注

    12

    文章

    8660

    浏览量

    84421
  • 编程
    +关注

    关注

    88

    文章

    3514

    浏览量

    93185
  • ESP8266
    +关注

    关注

    50

    文章

    959

    浏览量

    44496
收藏 人收藏

    评论

    相关推荐

    ESP8266中文版SDK编程手册

    2A-ESP8266__IOT_SDK_User_Manual SDK使用手册 2B-ESP8266__SDK__IOT_Demo 2C-ESP8266__SDK__Programming Guide SDK
    发表于 12-30 14:48 0次下载

    ESP8266_SDK编程手册

    乐鑫官方esp8266编程指南,中文版,比较详尽
    发表于 03-24 14:50 55次下载

    Ardnino的ESP8266编程源码

    这是采用Ardniuo for ESP8266 IDE 编写的ESP8266编程,简单实现WIFI串口通讯,让51单片机不用在写AT指令的编程。 可以通过电脑串口调试查看信息,不过
    发表于 12-04 11:54 9次下载

    ESP8266 SDK 编程手册

    ESP8266 SDK 编程手册Version 1.0.1
    发表于 12-11 17:05 49次下载

    机智云ESP8266模组固件资料下载

    机智云ESP8266模组固件
    发表于 04-23 15:55 65次下载
    机智云<b class='flag-5'>ESP8266</b><b class='flag-5'>模组</b>固件资料下载

    ESP8266硬件设计指南的详细资料免费下载

    本手册提供了 ESP8266EX 系列的产品信息,包括 ESP8266EX 芯片,配置 ESP8266EX 芯片的 ESP-LAUNCHER 开发板,以及
    发表于 03-15 08:00 34次下载
    <b class='flag-5'>ESP8266</b>硬件设计指南的详细资料免费下载

    ESP8266模块的的硬件设计指南资料免费下载

    本手册提供了ESP8266EX 系列的产品信息,包括 ESP8266EX 芯片,配置 ESP8266EX 芯片的 ESP-LAUNCHER 开发板,以及
    发表于 03-18 08:00 47次下载
    <b class='flag-5'>ESP8266</b>模块的的硬件设计指南资料免费下载

    如何将ESP8266连接到WiFi

    在之前的ESP8266项目中,我简要介绍了ESP8266 WiFi模块,如何开始使用ESP8266和Arduino,ESP8266 ESP-
    的头像 发表于 07-29 11:32 8.6w次阅读
    如何将<b class='flag-5'>ESP8266</b>连接到WiFi

    ESP8266 WiFi模组的改进文件免费下载

    本文档的主要内容详细介绍的是ESP8266 WiFi模组的改进文件免费下载。
    发表于 12-18 08:00 14次下载

    ESP8266 Nodemcu学习心得②

    服务器响应http请求的端口号,网络服务器标准http端口号为80,因此这里使用80为端口号esp8266_server.begin(); // 启动网络服务功能esp8266_se
    发表于 10-25 11:36 14次下载
    <b class='flag-5'>ESP8266</b> Nodemcu学习心得②

    简单的ESP32和ESP8266编程

    电子发烧友网站提供《简单的ESP32和ESP8266编程器.zip》资料免费下载
    发表于 07-22 09:43 7次下载
    简单的<b class='flag-5'>ESP</b>32和<b class='flag-5'>ESP8266</b><b class='flag-5'>编程</b>器

    如何使用Arduino UNO对ESP8266进行编程

    电子发烧友网站提供《如何使用Arduino UNO对ESP8266进行编程.zip》资料免费下载
    发表于 12-16 10:13 1次下载
    如何使用Arduino UNO对<b class='flag-5'>ESP8266</b>进行<b class='flag-5'>编程</b>

    ESP8266编程盾开源

    电子发烧友网站提供《ESP8266编程盾开源.zip》资料免费下载
    发表于 02-02 14:25 1次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>编程</b>盾开源

    使用Arduino编程ESP8266 ESP 01

    电子发烧友网站提供《使用Arduino编程ESP8266 ESP 01.zip》资料免费下载
    发表于 02-07 14:30 8次下载
    使用Arduino<b class='flag-5'>编程</b><b class='flag-5'>ESP8266</b> <b class='flag-5'>ESP</b> 01

    ESP8266硬件

    目前市面上有关ESP8266模组有很多的种类,但是都是使用的乐鑫公司开发的ESP8266的wifi模组,而且种类也很多。
    的头像 发表于 02-10 14:25 4115次阅读
    <b class='flag-5'>ESP8266</b>硬件