文章程式碼顯示

2018年12月19日 星期三

NodeMCU 教學 - 16:WeMos D1 mini (NodeMCU) 發送 Line 訊息

先前在 NodeMCU 教學 - 03:WeMos D1 mini (NodeMCU) 與 Line 的連結 已經有實作過使用  ESP8266 系列的版子發送 Line 訊息了

但當初有藉由 IFTTT 作為中間的媒介,也就是說我們發送訊息需要先傳送到 IFTTT ,再讓他轉傳到 Line 上面,如此一來較不即時也比較不彈性

事實上 Line 是可以藉由發送 Https 之 POST request 的方式直接發送訊息的

網路上常見的 NodeMCU 範例都是用 WifiClient 這個函式庫

而這個函式庫是不能用來發送 Https 的,僅可以發送 Http

以下程式碼為實作 NodeMCU 直接由 LineToken 發送訊息到 Line 上面

首先你還是需要先至 LineNotify 申請一個群組的 Token ,才能讓 Line Notify 這個 BOT 幫你發送訊息

如何申請 Line Notify 的群組 Token ? 很簡單!!

先到這裡登陸你的 Line 帳號

接著點選個人頁面,如下圖



接著點選發行權杖,並選擇你要發送的群組


打開手機版的 Line ,並把 Line Notify 機器人邀請進入該群組



到桌面開啟一個新的資料夾(名稱隨意,最好是英文的, Ex : LineNotifyPractice )
到這裡下載 Library 後,解壓縮後放進去,然後壓縮檔就可以刪了



接著打開一個空白的 Arduino 文件,並使用以下程式碼 (程式碼中已交代的很清楚該如何修改了)

#include "ESP8266WiFi.h"
#include "WiFiClientSecure.h"

void wifiConnect(const char* SSID,const char* PASSWORD);
void sendMessage(const char* token, const char* message);

const char* SSID = "改為你家的 Wifi 帳號";
const char* PASSWORD = " WiFi 密碼";
String Linetoken = " 你在 Line Notify 得到的群組 token(權杖) ";

void setup() {
  Serial.begin(115200);
  wifiConnect(SSID, PASSWORD);  
}

void loop() {
  int number = 55688;
  String MESSAGE = "測試字串" + '\n' + String(number);
  sendMessage(Linetoken, MESSAGE);
  delay(5000);
}

void wifiConnect(const char* SSID,const char* PASSWORD){  
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Attempt to connect to Wifi network:
  Serial.print("Connecting Wifi: ");
  Serial.println(SSID);
  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);
}

void sendMessage(String token, String message) {  
  
   WiFiClientSecure client;
   String host = "notify-api.line.me";

   if (client.connect(host,443)) {
     Serial.print("Host : "); Serial.println(host); Serial.println();
     Serial.print("message="); Serial.println(message);
     int LEN = message.length();
     Serial.print("message.length()="); Serial.println(LEN);

     /* Post url */
     String url = "/api/notify";
     client.println("POST " + url + " HTTP/1.1");

     /* Headers */
     client.print("Host: "); client.println(host);  /* Header (Host) */
     client.println("Connection: close");
     client.println("User-Agent: ESP8266/1.0"); //optional
     client.print("Authorization: Bearer "); client.println(token);
     client.println("Content-Type: application/x-www-form-urlencoded");
     client.print("Content-Length: "); client.println( String((LEN+8)) ); 
     client.println(); //end of the headers

     /* Body */    
     client.print("message="); client.println(message);
     client.println();
      
     delay(50);
     String response = "";
     response = client.readString();
     Serial.println(response);
   }
   else{
     Serial.println("connected fail");
   }    
 }




將改好的程式碼儲存到剛剛桌面的資料夾中 ( LineNotifyPractice )

最後拿出你的 NodeMCU 燒錄進去即可 ( 或 WeMos D1 等 ESP8266 系列的開發版 )


我的 Youtube 頻道一定要訂閱
我將定期推出程式語言的新手教學影片


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引