1. 程式人生 > 實用技巧 >ESP8266 玩板記

ESP8266 玩板記

一、前言

esp8266的玩板記,後面應該會去更一些其他東西,這一塊內容,這算是收官之戰了。
IoT,江湖有緣再相會

二、ESP8266實現WiFi殺手/釣魚

這次的部落格做的是一個娛樂性較強的專案。
本文僅供娛樂學習,不得進行違法專案。

  1. 準備工作
  1. 寫入韌體
  • 環境和配置方式已經在 第一次的IoT部落格 解決過了
  • 開啟 flash_download_tools_v3.6.5.exe
    ,選擇 ESP8266 DownloadTool
  • 注意一下紅框內容

第一個選擇剛才的 DNS.ino.ino.nodemcu.bin 檔案
第二個地址輸入 0x00000(這裡可能會出現紅框,導致編譯上傳失敗)
[解決方案:重啟一下DownloadTool,手動輸入地址]
其他對照著面板修改一下就行了

  • 寫入後會出現WiFi

WiFi_name: HH
WiFi_password: m1234567

  • 咳咳,博主這裡出現了一點小插曲,使本應該四點半完成的工作變到了五點半TuT
  • 磚家建議:擦除Flash,但這個東西韌體刷入是在一週前,我現在用的時候,發現刷成功了ovo
  1. Ardunio 上傳 web端
  • web原始碼上傳工具
    • 放入根目錄中
    • 進入 Ardunio 開發板管理器 esp8266 2.2.0 版本安裝
    • 檔案 - 新建 - 清空程式碼 - 儲存 - 工具 - esp8266 sketch data upload - 選擇 no 選項
    • 此時會多一個 data 空資料夾,然後複製 data 檔案進去
    • 再點選 esp8266 sketch data upload,選擇 no 選項,此時開始上傳檔案,等一兩分鐘結束
    • 電腦連線 HH 的 WiFi,瀏覽器輸入 192.168.1.1/backdoor.html 進入 web 頁面,開始除錯(釣魚)
  1. 這裡再提供一個方法,比較方便,但沒有釣魚功能
  • 下載這個資源包esp8266資源包,並解壓
  • config 選擇韌體,把 Wi-PWN.ino.CH.bin 路徑新增進去
  • baudrate 選擇板子引數,我的是9600,4M,40Mhz,DIO
  • operation - flash,等待許久,韌體刷入
  • 重啟,出現 ESP_063FA7 的WiFi
  • 瀏覽器輸入 192.168.4.1 訪問,並設定密碼
  • 開始“操作”

三、ESP8266接入阿里雲物聯網平臺上傳溫溼度資料

  1. 準備工作
  • 硬體
    • NodeMcu esp8266資料線*1DHT11溫溼度模組杜邦線若干
  • 軟體
    • 阿里雲物聯網平臺(又回到了阿里雲hhhh)
      • 進入 控制檯,先開通
      • 建立產品 - 標準品類選擇溫溼度檢測 - 建立 - 新增裝置
      • 安裝 PubSubClientArduinoJsonDHT
  1. 修改 PubSubClient.h
  • #define MQTT_MAX_PACKET_SIZE 後面數字改為 1024
  • #define MQTT_KEEPALIVE 後面數字改為 60

3.原始碼

#include <ESP8266WiFi.h>
/* 依賴 PubSubClient 2.4.0 */
#include <PubSubClient.h>
/* 依賴 ArduinoJson 5.13.4 */
#include <ArduinoJson.h>
#include <DHT.h>        //呼叫DHT庫
/* 連線您的WIFI SSID和密碼 */
#define WIFI_SSID "Geohot"        //"路由器SSID"
#define WIFI_PASSWD "zheng123+"       //"密碼"


/* 裝置的三元組資訊*/
#define PRODUCT_KEY "a12FfFXIQgC"      //"裝置PRODUCT_KEY"
#define DEVICE_NAME "ESP8266"      //"替換DEVICE_NAME"
#define DEVICE_SECRET "aee1ff626995f85f43debede913e66a7"    //"替換DEVICE_SECRET"
#define REGION_ID         "cn-shanghai"

/* 線上環境域名和埠號,不需要改 */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEY

#define CLIENT_ID         "ESP8266|securemode=3,timestamp=1234567890,signmethod=hmacsha1|"
// 演算法工具: http://iot-face.oss-cn-shanghai.aliyuncs.com/tools.htm 進行加密生成password
// password教程 https://www.yuque.com/cloud-dev/iot-tech/mebm5g
#define MQTT_PASSWD "f8a546698d544b9fcd359d718f180095d1430f0f"      //"參考上面password教程,演算法工具生成"

#define ALINK_BODY_FORMAT         "{\"id\":\"ESP8266\",\"version\":\"1.0\",\"method\":\"thing.event.property.post\",\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"

unsigned long lastMs = 0;
float RH,T,RH_sum,T_sum;
unsigned char count=0;
WiFiClient espClient;
PubSubClient  client(espClient);
DHT dht(D1,DHT11);      //設定Data引腳所接IO口和感測器型別
void callback(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message arrived [");
    Serial.print(topic);
    Serial.print("] ");
    payload[length] = '\0';
    Serial.println((char *)payload);

}

void wifiInit()
{
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWD);   //連線WiFi
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("WiFi not Connect");
    }
    Serial.println("Connected to AP");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());  
    Serial.print("espClient [");
    client.setServer(MQTT_SERVER, MQTT_PORT);   /* 連線WiFi之後,連線MQTT伺服器 */
    client.setCallback(callback);
}


void mqttCheckConnect()
{
    while (!client.connected())
    {
        Serial.println("Connecting to MQTT Server ...");
        if (client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD))

        {

            Serial.println("MQTT Connected!");

        }
        else
        {
            Serial.print("MQTT Connect err:");
            Serial.println(client.state());
            delay(5000);
        }
    }
}


void mqttIntervalPost()
{
    char param[32];
    char jsonBuf[128];
    sprintf(param, "{\"CurrentTemperature\":%f}",T_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    Serial.println(jsonBuf);
    boolean d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      Serial.println("publish Temperature success"); 
    }else{
      Serial.println("publish Temperature fail"); 
    }
    //https://www.cnblogs.com/ZhengBlogs/p/add.html 
    sprintf(param, "{\"CurrentHumidity\":%f}",RH_sum/count);
    sprintf(jsonBuf, ALINK_BODY_FORMAT, param);
    Serial.println(jsonBuf);
    d = client.publish(ALINK_TOPIC_PROP_POST, jsonBuf);
    if(d){
      Serial.println("publish Humidity success"); 
    }else{
      Serial.println("publish Humidity fail"); 
    }
}

//https://www.cnblogs.com/ZhengBlogs
void setup() 
{
    /* initialize serial for debugging */
    Serial.begin(115200);
    Serial.println("Demo Start");
    wifiInit();
    dht.begin();
}


// the loop function runs over and over again forever
void loop()
{
  delay(1000);                  //延時1000毫秒
  RH = dht.readHumidity();   //讀取溼度資料                   
  T = dht.readTemperature();       //讀取溫度資料
  RH_sum+=RH;
  T_sum+=T;
  count+=1;                

  Serial.print("Humidity:");  //向串列埠列印 Humidity:
  Serial.print(RH);           //向串列埠列印溼度資料
  Serial.print("%");
  Serial.print("  Temperature:");
  Serial.print(T);            //向串列埠列印溫度資料
  Serial.println("C"); 
  Serial.println("https://www.cnblogs.com/ZhengBlogs");
  if (millis() - lastMs >= 30000)
  {
    lastMs = millis();
    mqttCheckConnect(); 

    /* 上報 */
    mqttIntervalPost();
    count=0;
    RH_sum=0;
    T_sum=0;
  }
  client.loop();
}

  • 要修改的內容都已經寫在原始碼裡了,也可以使用 DHT22/SHTC3 等溫度感測器
  • 人在杭州,身處寢室。這裡的資料也已經上傳到阿里雲上了(支援曲線和表格形式)

四、小結

  • 物聯網前景很好,等我數電模電還有嵌入式開發學學好,就深入吧,今年會去參加一些電子設計競賽
  • 對我在做的比較感興趣的朋友可以點點贊同,點點關注不迷路喔~ovo
  • 再做一個預告:用python爬取知乎熱榜。
    • 因為發現知乎熱榜都沒有地方有記錄,我上次想統計一個月內的最火事件,都統計不出來,決定自己做一個。應該要挺久的