智能家居入門DIY——【1、ESP8266之軟串口HTTP請求】

        前段時間作了一個激光雕刻,玩的不亦樂乎。對Arduino大感興趣,因而又入手一塊20大洋版,配上買學習套件時的諸多零件——紅外發射管、一體化紅外接收頭、DHT11溫溼度傳感器、ESP8266等,以及某寶來的LD3320、GP2Y1014AUOF準備搞一波屌絲智能家居。看了各類教程,感受本身距離大神只差那麼一丟丟了,因而在各類自我感受良好中,掉下各類坑去……反正我是用一個模塊下一個坑,弄得如今有點不太敢測試顆粒物傳感器了……這個主要仍是鏈接硬件和寫Arduino程序了,與上一個主要是寫上位機代碼不一樣——沒有那麼多準確而深刻的教程看的。因此,必要時擼一下官方文檔仍是頗有必要的。今天先說ESP軟串口通信這個坑如何爬上來:api

一、模塊:某寶買Arduino套件時送的某飛萊,當我敲SoftwareSerial wifi_SoftSerial後面的括號時隱約就看見了坑影憧憧……服務器

二、學習:雖然谷哥死了十幾年了,可是我仍是忍不住找不到有用的東西的時候吐槽。賣家給的教程先擼了一遍,發現確實RX,TX須要交換一下——不管是在代碼仍是接線上均可以;而後有那麼一丟丟鏈接wifi的代碼……以後各類度娘各類搜,然而各類良莠不齊、說法不一的卵用不大的基礎教程並無什麼真正的幫助,看了幾篇國外網站的問題帖子卻是解決了幾個問題。也許是我搜索時沒有目視正前方,擡頭挺胸,雙肩同高,兩腳與肩同寬,又或者椅子有點不太水平?總之,發過牢騷以後還得本身寫一點不成熟的邏輯,由於沒找到能夠用的軟串口HTTP請求的庫,又沒有給軟轉促銷的決心……函數

        因此,讓咱們找一個AT命令詳解先打開。擼一遍以後,發現大致分這麼幾個部分:post

一、初始化這個開發板:並無什麼其餘接口,RX,TX,GND,VCC仍是5V,反正我接了5V這麼久沒燒。不用刷因此也不用下載什麼開發板,修改什麼開發環境,仍是UNO就能夠。命令主要就是這麼幾條:學習

int initESP8266() {
    int result = 0;
    String val = "";
    if (!DoATCommand("AT+CIPMODE=1", 1000, 10, "OK", val)) {
        result ++;
    }

    if (!DoATCommand("AT+RST", 1000, 100, "OK", val)) {
        result++;
    }

    if (!DoATCommand("AT+CIPMUX=0", 1000, 10, "ready", val)) {
        result++;
    }

    if (!DoATCommand("AT+CWMODE=1", 1000, 10, "OK", val)) {
        result++;
    }
    return result;
}

就是客戶端、單連接、透傳模式什麼的,參考AT文檔吧,這個有順序,注意一下。而後,這個函數返回了錯誤個數,但其實歷來沒測試過,這樣過去就能夠了,由於有的已經設置過或者各類我不懂的緣由不成功也不影響後面。測試

二、鏈接WIFI:網站

bool initWifi(String ssid, String pwd) {
    String val = "";
    //查詢是否鏈接到了指定的wifi
    if (DoATCommand("AT+CWJAP?", 1000, 10, ssid, val)) {
        return true;
    }
    //鏈接到WIFI
    if (!DoATCommand("AT+CWJAP=\"" + ssid + "\",\"" + pwd + "\"", 20000, 100, "OK", val)) {
        Serial.println("AT+CWJAP:ERROR:" + val);
        return false;
    }
    return true;
}

這個函數也沒有太多內容,只是先斷定是否已經鏈接了,不然就重連。ui

三、POST請求:spa

        由於本身的主機早就到期,連個域名都不讓申請,因此申請了lewei50.com的服務,用起來比較簡單,免費用戶也沒有多少用到收費功能的地方,因此成本比較低咯:code

    //鏈接服務器
    if (!DoATCommand("AT+CIPSTART=\"TCP\",\""+ Host + "\"," + HostPort , 10000, 500, "OK", val)) {
        if (val.indexOf("FAIL") >= 0) {
            Serial.println("AT+CIPSTART:ERROR:" + val);
            return false;
        }
    }

    //進入透傳模式
    if (!DoATCommand("AT+CIPSEND=" + (String)postRequest.length(), 10000, 500, ">", val)) {
        Serial.println("AT+CIPSEND:ERROR:" + val);
        result = false;
    }else{
        //POST請求
        wifi_SoftSerial.println(postRequest);
        result = WaitSoftSerialResult(20000,"SEND OK",val);
    }
    
    //退出透傳模式
    wifi_SoftSerial.print("+++");
    delay(10);
    //關閉TCP/UDP鏈接
    wifi_SoftSerial.print("AT+CIPCLOSE");
    delay(10);

就是鏈接服務器,成功以後讓ESP8266進入收什麼發什麼模式……好吧,透傳模式,而後寫構造的POST請求內容,等待發送完成(固然,也能夠等待對方返回正確返回值),以後退出透傳,關閉TCP鏈接。

        關於POST請求構建這塊,各類說法各類都有,貴圈真亂!

//必要信息
struct sensor{
 String Name;
 String Value;
};
String Crlf = "\r\n";
sensor infos[] = { {"T1","22.33"},{"H1","44.55"} }; //傳感器名,數值 String Host = "www.lewei50.com";       //主機地址
String HostPort = "80";
String HostApiPath = "/api/V1/gateway/Updatesensors/01"; //API地址
String UserKey = "*****************************";  //用戶識別碼

//開始構建 String data
= "["; int count = sizeof(infos) / sizeof(infos[0]); //設置發送數據 for (int i = 0; i<count; i++) { data += "{\"Name\":\"" + infos[i].Name + "\",\"Value\":\"" + infos[i].Value + "\"},"; } data = data.substring(0, data.length() - 1); data += "]"; String postRequest = (String)("POST") + " " + HostApiPath + " " + "HTTP/1.1" + Crlf + "userkey:" + UserKey + Crlf + "Accept:*/*" + Crlf + "Host: " + Host + Crlf + "Content-Length: " + data.length() + Crlf + "Connection: close" + Crlf + Crlf + data;

很少說,測試代碼就能夠了。下一篇說說這個LD3320模塊,主要說說接線吧,好擼半小時官方文檔…各類教程各類圖片各類不匹配我也很無奈…測試時識別精度確實不高,容量確實不大,但能用代碼解決的就都不叫事兒。

相關文章
相關標籤/搜索