0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP8266模組的HTTP編程

CHANBAEK ? 來源:嵌入式攻城獅 ? 作者:安迪西 ? 2023-04-19 11:20 ? 次閱讀

ESP8266 模組的 HTTP 編程

超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標(biāo)記語(yǔ)言文檔從Web服務(wù)器傳送到客戶端瀏覽器; HTTP是一個(gè)屬于應(yīng)用層面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、決速的方式,適用于分布式超媒體信息系統(tǒng)

超文本是包含有超鏈接和各種多媒體元素標(biāo)記的文本。 這些超文本文件彼此鏈接,形成網(wǎng)狀(Web),因此又被稱為網(wǎng)頁(yè)(Web Page)。 這些鏈接使用URL表示。 最常見的超文本格式是超文本標(biāo)記語(yǔ)言HTML

圖片

URL即統(tǒng)一資源定位符(Uniform Resource Locator),用來唯一地標(biāo)識(shí)萬(wàn)維網(wǎng)中的某一個(gè)文檔。 URL由協(xié)議、主機(jī)和端口(默認(rèn)為80)以及文件名三部分構(gòu)成。 如:

圖片

HTTP工作原理如下圖示

圖片

HTTP報(bào)文結(jié)構(gòu):

請(qǐng)求報(bào)文:即從客戶端(瀏覽器)向Web服務(wù)器發(fā)送的請(qǐng)求報(bào)文。 報(bào)文的所有字段都是ASCII碼

圖片

響應(yīng)報(bào)文:即從Web服務(wù)器到客戶端(瀏覽器)的應(yīng)答。 報(bào)文的所有字段都是ASCII碼

圖片

請(qǐng)求方法:請(qǐng)求報(bào)文中的方法,是對(duì)所請(qǐng)求對(duì)象所進(jìn)行的操作,也就是一些命令

圖片

下面將介紹如何使用 ESP8266 SDK開發(fā) HTTP通信的客戶端和服務(wù)端

1. HTTP Client 編程

HTTP Client 要實(shí)現(xiàn)的功能:

  • 模擬http協(xié)議,訪問百度首頁(yè):
    www.baidu.com/index.html
  • 串口打印出百度返回的數(shù)據(jù)

HTTP Client 任務(wù)流程如下示:

圖片

實(shí)現(xiàn)步驟如下:

在ESP8266_RTOS_SDK目錄下新建 httpclient文件夾,把 station實(shí)驗(yàn)中的 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()函數(shù)下添加如下代碼

#define SSID "Hotspot"	//ESP8266要加入的無線網(wǎng)
#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,打開串口助手,即可接收到百度服務(wù)器返回的數(shù)據(jù)

圖片

2. HTTP Server 編程

HTTP Server 要實(shí)現(xiàn)的功能:

  • 模擬httpserver等待網(wǎng)頁(yè)訪問
  • PC訪問網(wǎng)頁(yè),查看網(wǎng)頁(yè)信息

HTTP Server 任務(wù)流程如下示:

圖片

實(shí)現(xiàn)步驟如下:

在ESP8266_RTOS_SDK目錄下新建 httpserver文件夾,把 station實(shí)驗(yàn)中的 station目錄下所有文件拷貝到該文件夾中

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

/*******************httpserver.c******************************************/
#defineSERVERADDR"192.168.191.29"//esp8266連上WiFi后的IP地址
#define SERVERPORT 8000
//ATaskHttpServer任務(wù)
constchar*DefaultPage=
""
""
""
"歡迎進(jìn)入html世界"
""
""
"歡迎關(guān)注微信公眾號(hào):andyxi_linux"
""
"";

// 發(fā)送200 ok報(bào)頭
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 任務(wù)
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()函數(shù)下添加如下代碼

#define SSID "Hotspot"	//PC端和ESP8266要加入的無線網(wǎng)
#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在同一個(gè)網(wǎng)絡(luò)中,模組復(fù)位后,在瀏覽器中輸入 ESP8266的 IP地址(192.168.191.29),即可訪問到 ESP8266返回的網(wǎng)頁(yè)信息(如下圖示)

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    885

    瀏覽量

    40315
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1263

    瀏覽量

    69508
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9184

    瀏覽量

    85490
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3616

    瀏覽量

    93763
  • ESP8266
    +關(guān)注

    關(guān)注

    50

    文章

    962

    瀏覽量

    45064
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ESP8266_SDK_編程手冊(cè)_Version 1.5

    ESP8266__SDK__Programming Guide,非OS SDK編程手冊(cè),基于esp_iot_sdk_v1.5.0
    發(fā)表于 12-30 14:26 ?580次下載

    ESP8266中文版SDK編程手冊(cè)

    2A-ESP8266__IOT_SDK_User_Manual SDK使用手冊(cè) 2B-ESP8266__SDK__IOT_Demo 2C-ESP8266__SDK__Programming Guide SDK
    發(fā)表于 12-30 14:48 ?0次下載

    ESP8266_SDK編程手冊(cè)

    樂鑫官方esp8266編程指南,中文版,比較詳盡
    發(fā)表于 03-24 14:50 ?56次下載

    Ardnino的ESP8266編程源碼

    這是采用Ardniuo for ESP8266 IDE 編寫的ESP8266編程,簡(jiǎn)單實(shí)現(xiàn)WIFI串口通訊,讓51單片機(jī)不用在寫AT指令的編程。 可以通過電腦串口調(diào)試查看信息,不過
    發(fā)表于 12-04 11:54 ?9次下載

    ESP8266 SDK 編程手冊(cè)

    ESP8266 SDK 編程手冊(cè)Version 1.0.1
    發(fā)表于 12-11 17:05 ?49次下載

    機(jī)智云ESP8266模組固件資料下載

    機(jī)智云ESP8266模組固件
    發(fā)表于 04-23 15:55 ?67次下載
    機(jī)智云<b class='flag-5'>ESP8266</b><b class='flag-5'>模組</b>固件資料下載

    ESP8266硬件設(shè)計(jì)指南的詳細(xì)資料免費(fèi)下載

    本手冊(cè)提供了 ESP8266EX 系列的產(chǎn)品信息,包括 ESP8266EX 芯片,配置 ESP8266EX 芯片的 ESP-LAUNCHER 開發(fā)板,以及
    發(fā)表于 03-15 08:00 ?34次下載
    <b class='flag-5'>ESP8266</b>硬件設(shè)計(jì)指南的詳細(xì)資料免費(fèi)下載

    ESP8266模塊的的硬件設(shè)計(jì)指南資料免費(fèi)下載

    本手冊(cè)提供了ESP8266EX 系列的產(chǎn)品信息,包括 ESP8266EX 芯片,配置 ESP8266EX 芯片的 ESP-LAUNCHER 開發(fā)板,以及
    發(fā)表于 03-18 08:00 ?47次下載
    <b class='flag-5'>ESP8266</b>模塊的的硬件設(shè)計(jì)指南資料免費(fèi)下載

    ESP8266 WiFi模組的改進(jìn)文件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是ESP8266 WiFi模組的改進(jìn)文件免費(fèi)下載。
    發(fā)表于 12-18 08:00 ?15次下載

    ESP8266 Nodemcu學(xué)習(xí)心得②

    服務(wù)器響應(yīng)http請(qǐng)求的端口號(hào),網(wǎng)絡(luò)服務(wù)器標(biāo)準(zhǔn)http端口號(hào)為80,因此這里使用80為端口號(hào)esp8266_server.begin(); // 啟動(dòng)網(wǎng)絡(luò)服務(wù)功能esp8266_se
    發(fā)表于 10-25 11:36 ?14次下載
    <b class='flag-5'>ESP8266</b> Nodemcu學(xué)習(xí)心得②

    簡(jiǎn)單的ESP32和ESP8266編程

    電子發(fā)燒友網(wǎng)站提供《簡(jiǎn)單的ESP32和ESP8266編程器.zip》資料免費(fèi)下載
    發(fā)表于 07-22 09:43 ?7次下載
    簡(jiǎn)單的<b class='flag-5'>ESP</b>32和<b class='flag-5'>ESP8266</b><b class='flag-5'>編程</b>器

    如何使用Arduino UNO對(duì)ESP8266進(jìn)行編程

    電子發(fā)燒友網(wǎng)站提供《如何使用Arduino UNO對(duì)ESP8266進(jìn)行編程.zip》資料免費(fèi)下載
    發(fā)表于 12-16 10:13 ?1次下載
    如何使用Arduino UNO對(duì)<b class='flag-5'>ESP8266</b>進(jìn)行<b class='flag-5'>編程</b>

    ESP8266編程盾開源

    電子發(fā)燒友網(wǎng)站提供《ESP8266編程盾開源.zip》資料免費(fèi)下載
    發(fā)表于 02-02 14:25 ?1次下載
    <b class='flag-5'>ESP8266</b><b class='flag-5'>編程</b>盾開源

    使用Arduino編程ESP8266 ESP 01

    電子發(fā)燒友網(wǎng)站提供《使用Arduino編程ESP8266 ESP 01.zip》資料免費(fèi)下載
    發(fā)表于 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硬件

    目前市面上有關(guān)ESP8266模組有很多的種類,但是都是使用的樂鑫公司開發(fā)的ESP8266的wifi模組,而且種類也很多。
    的頭像 發(fā)表于 02-10 14:25 ?4795次閱讀
    <b class='flag-5'>ESP8266</b>硬件