使用Web頁面配置ESP8266的參數

来源:http://www.cnblogs.com/jay-yang/archive/2017/07/11/7151634.html
-Advertisement-
Play Games

前言 使用Web頁面配置ESP8266的參數相對於使用串口AT指令配置更加直觀和簡單。與配置路由器方式類似。 基本思路 基本思路是ESP8266工作AP模式下,作為TCP Server監聽TCP Client的連接。因為網頁HTTP預設的埠是80,所以ESP8266作為TCP Server的埠需 ...


前言  

  使用Web頁面配置ESP8266的參數相對於使用串口AT指令配置更加直觀和簡單。與配置路由器方式類似。

基本思路

  基本思路是ESP8266工作AP模式下,作為TCP Server監聽TCP Client的連接。因為網頁HTTP預設的埠是80,所以ESP8266作為TCP Server的埠需要設置為80。電腦連接上ESP8266的AP後,網頁訪問預設IP地址192.168.4.1,此時ESP8266就會收到來自網頁的HTTP的Get請求,此請求數據為HTML格式。ESP8266收到請求後,讀出保存在Flash中的HTML格式網頁,並將帶有HTML應答頭的HTML網頁發送給網頁,網頁端就可以顯示出網頁。下麵是具體實現步驟:

開發環境

  • ESP8266 SDK版本:ESP8266_NONOS_SDK_2.0.0
  • IDE:ESP8266 IDE v2.0
  • 操作系統:64位 Win7

步驟

  1. 設置ESP8266工作模式

    設置為AP模式,並設置AP模式下的參數,作為TCP Server,註冊連接回調函數,監聽TCP Client的連接。具體不詳述。

 1 void ICACHE_FLASH_ATTR
 2 user_init(void)
 3 {
 4     os_printf("SDK version:%s\r\n", system_get_sdk_version());
 5     os_printf("Compile time:%s %s\r\n", __DATE__, __TIME__);
 6     
 7     wifi_set_opmode(STATIONAP_MODE);
 8     // ESP8266 softAP set config.
 9     user_set_softap_config();
10 
11     user_webserver_init(SERVER_PORT);
12 }
 1 void ICACHE_FLASH_ATTR
 2 user_webserver_init(uint32 port)
 3 {
 4     LOCAL struct espconn esp_conn;
 5     LOCAL esp_tcp esptcp;
 6 
 7     esp_conn.type = ESPCONN_TCP;
 8     esp_conn.state = ESPCONN_NONE;
 9     esp_conn.proto.tcp = &esptcp;
10     esp_conn.proto.tcp->local_port = port;
11     espconn_regist_connectcb(&esp_conn, webserver_listen);
12 
13     espconn_accept(&esp_conn);
14 }

 

         2.  在連接回調函數中註冊接收回調函數,在接收回調函數中處理Client發送的數據

 1 LOCAL void ICACHE_FLASH_ATTR
 2 webserver_listen(void *arg)
 3 {
 4     struct espconn *pesp_conn = arg;
 5 
 6     espconn_regist_recvcb(pesp_conn, webserver_recv); 
 7     espconn_regist_reconcb(pesp_conn, webserver_recon);
 8     espconn_regist_disconcb(pesp_conn, webserver_discon);
 9     espconn_regist_sentcb(pesp_conn, webserver_sent);
10 }

   3. 帶無線網卡的電腦連接ESP8266的AP,併在路由器中輸入192.168.4.1

    此時瀏覽器會將HTML格式的GET請求發送給TCP Server。這時網頁是顯示錯誤的,因為TCP Server並沒有上傳網頁到Web端。可以使用HttpWatch這個IE瀏覽器插件抓取網頁發送的GET請求數據。

 

  4. 在TCP Server接收函數中實現解析GET請求並上傳保存在Flash中的HTML網頁

          這裡主要是解析HTML格式字元串,請求網頁的那個GET請求時不帶Filename的,需要區別不同的GET請求,具體看網頁實現。如果是GET請求網頁,就從Flash中讀取保存的網頁,並通過HTML格式發送給網頁端,然後就可以顯示出網頁了。

 1 void ICACHE_FLASH_ATTR
 2 webserver_recv(void *arg, char *pusrdata, unsigned short length)
 3 {
 4     URL_Frame *pURL_Frame = NULL;
 5     char *pParseBuffer = NULL;
 6     char *index = NULL;
 7     SpiFlashOpResult ret = 0;
 8 
 9     USER_DBG("len:%u\r\n",length);
10     USER_DBG("Webserver recv:-------------------------------\r\n%s\r\n", pusrdata);
11 
12     pURL_Frame = (URL_Frame *)os_zalloc(sizeof(URL_Frame));
13     parse_url(pusrdata, pURL_Frame);
14 
15     switch (pURL_Frame->Type) {
16         case GET:
17             USER_DBG("We have a GET request.\r\n");
18 
19             if(pURL_Frame->pFilename[0] == 0){
20                 index = (char *)os_zalloc(FLASH_READ_SIZE+1);
21                 if(index == NULL){
22                     ERR_LOG("os_zalloc error!\r\n");
23                     goto _temp_exit;
24                 }
25 
26                 // Flash read/write has to be aligned to the 4-bytes boundary
27                 ret = spi_flash_read(0xD0*SPI_FLASH_SEC_SIZE, (uint32 *)index, FLASH_READ_SIZE);  // start address:0x10000 + 0xC0000
28                 if(ret != SPI_FLASH_RESULT_OK){
29                     ERR_LOG("spi_flash_read err:%d\r\n", ret);
30                     os_free(index);
31                     index = NULL;
32                     goto _temp_exit;
33                 }
34 
35                 index[HTML_FILE_SIZE] = 0;   // put 0 to the end
36                 data_send(arg, true, index);
37 
38                 os_free(index);
39                 index = NULL;
40             }
41             break;
42 
43         case POST:
44             USER_DBG("We have a POST request.\r\n");
45 
46             pParseBuffer = (char *)os_strstr(pusrdata, "\r\n\r\n");
47             if (pParseBuffer == NULL) {
48                 data_send(arg, false, NULL);
49                 break;
50             }
51             // Prase the POST data ...
52             break;
53     }
54 
55     _temp_exit:
56         ;
57     if(pURL_Frame != NULL){
58         os_free(pURL_Frame);
59         pURL_Frame = NULL;
60     }
61 }

 

         5. 網頁配置就是POST請求,網頁發送HTML格式的POST請求,ESP8266解析數據並作出設置。

    POST請求數據中的Content內容可以是自定也格式,一般使用json格式比較好。這裡就詳細列出如何處理了。ESP8266 SDK的IOT demo中有HTML格式的解析以及回應HTML格式數據的常式,可以參考。

 

註意點

  網頁是通過燒錄固件的工具燒錄到Flash的。當時如何把網頁的數據保存到Flash中這個問題困擾我很久,網上找很久都沒有具體說明,是直接將xx.html文件燒錄到Flash中的,此Flash空間是用戶可用區間,具體見官方文檔。不同Flash都是不同的,這個地址也是需要記下的,SPI讀取時需要用到,文件大小也是需要記下。下麵是32Mbit 的Flash的燒錄截圖。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫索引是為了增加查詢速度而對錶欄位附加的一種標識。很多人機械的理解索引的概念,認為增加索引只有好處沒有壞處。其實遠不是那樣的,這裡將其介紹儘量詳細些。 首先明白為什麼索引會增加速度,DB在執行一條Sql語句的時候,預設的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對 ...
  • 前陣子遇到一個案例,需要將資料庫中的幾個表從USER A 移動到USER B下麵,在ORACLE中,這個叫做更改表的所有者或者修改表的Schema。其實遇到這種案例,有好幾種解決方法。下麵我們通過實驗來測試、驗證一下。首先準備簡單測試數據,如下所示: SQL> CREATE TABLE TEST.K... ...
  • 第一次寫事件調用存儲過程,在網上找了一些資料,特此做下總結,鞏固一下: 事件調用存儲過程主要有三種: (1)創建事件馬上執行,調用存儲過程 CREATE EVENT if not exists Event_Stat_Daily on schedule EVERY 1 DAY on completio ...
  • 環境為centos 7.2+mysql 5.7,網上教程很多,原理也不複雜(深知自己踩的坑還不夠) 正常情況下,配置起來比較簡單。另外,根據個人感受,MySQL的複製感覺要比SQL Server的複製要清爽很多(儘管功能上可能有一些差異)。 master伺服器,首先是開啟了二進位日誌,同時設置ser ...
  • 經歷過一次mysql主從延遲之後,就開始思考,主從複製是什麼東西?它是怎麼實現的呢?它的原理是什麼?於是乎就開始查閱資料、文章,現將自己理解到的內容總結在此,加深印象。 ...
  • 一、什麼是Redis? 學習Redis最好的是看官網了,下麵是Redis的官網對Redis的介紹 可見,Redis是一個記憶體存儲的數據結構伺服器,可以用作資料庫、緩存等。支持的數據結構也很豐富,有字元串、列表、哈希表、集合、有序集合。而且Redis還提供了持久化功能。不僅如此,Redis還可用於集群 ...
  • 1.重命名文件 將D盤下的A.txt 重命名為B.txt mv D:\\A.txt D:\\B.txt 2.刪除文件 刪除D盤下的A.txt文件 rm D:\\A.txt 3.修改文件內容並保存 //獲得D盤下A.txt內容 oldtime=$(cat D:\\A.txt) //獲得當前年月日tim ...
  • 這個不是nginx的問題,也不是dotnet core的問題,也不是mvc的問題,更不是防火牆的問題! 原因在於這個SeLinux 把它關了就可以了 感謝這個文章的作者! http://www.cnblogs.com/hager/p/5689493.html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...