1 MQTT服務器硬件模塊html
2 MQTT服務器電腦搭建git
2.1本身搭建web
2.2租阿里雲服務器json
2 MQTT服務器手機控制端服務器
1 硬件 網絡
2 服務器app
十、 Esp8266進階之路第二篇: [小實戰下篇]Windows系統搭建8266的本地Mqtt服務器,局域網點亮一盞LED燈。dom
十一、 Esp8266進階之路第三篇: 8266接入阿里智能,點亮一盞LED燈,期待天貓精靈語音控制的不約而至!編輯器
十二、 Esp8266進階之路第四篇: 圖文並茂學習阿里雲主機搭建8266MQTT服務器,實現移動網絡遠程控制函數
1三、 Esp8266進階之路第五篇: 動手作個8266畢設小案例,smartConfig + MQTT協議輕鬆實現遠程控制一盞LED。
3 手機
3.2手機端具體開發--------(一)基於阿里雲的MQTT遠程控制(Android 鏈接MQTT服務器,ESP8266鏈接MQTT服務器實現遠程通訊控制----簡單的鏈接通訊)
先要安裝Arduino IDE For ESP8266
Arduino IDE For ESP8266是根據Arduino修改的專門燒寫ESP8266開發板的IDE。在裝好Arduino IDE後:
打開Arduino 文件->首選項,在 附加開發管理網站 中填入
菜單「項目」-「加載庫」-「管理庫」,搜索安裝「PubSubClient」
菜單「項目」-「加載庫」-「管理庫」,搜索安裝「PubSubClient」
PubSubClient有一些示例能夠打開mqtt_esp8266看下
1. WeMos D1 mini發佈消息:光照強度傳感器測得環境光照強度發佈到服務器,手機訂閱該Topic接收光強信息
#include <ESP8266WiFi.h> #include <PubSubClient.h> int pinLED = D2; const char* ssid = "********";//鏈接的路由器的名字 const char* password = "********";//鏈接的路由器的密碼 const char* mqtt_server = "********";//服務器的地址 const int port=****;//服務器端口號 WiFiClient espClient; PubSubClient client(espClient); int light=255; void setup_wifi() {//自動連WIFI接入網絡 delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("..."); } } void callback(char* topic, byte* payload, unsigned int length) {//用於接收數據 int l=0; int p=1; for (int i = length-1; i >=0; i--) { l+=(int)((char)payload[i]-'0')*p; p*=10; } light=l; Serial.println(l);//換行 } void reconnect() {//等待,直到鏈接上服務器 while (!client.connected()) {//若是沒有鏈接上 if (client.connect("biloba")+random(999999999)) {//接入時的用戶名,儘可能取一個很不經常使用的用戶名 client.subscribe("LED");//接收外來的數據時的intopic } else { Serial.print("failed, rc=");//鏈接失敗 Serial.print(client.state());//從新鏈接 Serial.println(" try again in 5 seconds");//延時5秒後從新鏈接 delay(5000); } } } void setup() {//初始化程序,只運行一遍 Serial.begin(9600);//設置串口波特率(與燒寫用波特率不是一個概念) setup_wifi();//自動連WIFI接入網絡 client.setServer(mqtt_server, port);//端口號 client.setCallback(callback); //用於接收服務器接收的數據 } void loop() {//主循環 reconnect();//確保連上服務器,不然一直等待。 client.loop();//MUC接收數據的主循環函數。 analogWrite(pinLED,light); }
先使用ESP8266WiFi庫的方法鏈接一個wifi,鏈接成功後loop中獲取光強並轉換爲json格式,發佈到light的Topic主題下,能夠打開服務器web管理頁面,能夠在Topic找到它
2.WeMos D1 mini接收消息:鏈接一個led燈,用手機APP控制燈的亮度,不接受其信息
接收LED Topic的信息,接收到轉換爲int設置爲燈的亮度,這樣就實現遠程app控燈。打開myMqtt的publish,輸入Topic爲LED,Message爲燈的亮度(0-1024),能夠實時控制燈(47.93.19.134)
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <math.h> const char* ssid = "dongdong";//鏈接的路由器的名字 const char* password = "dongdong";//鏈接的路由器的密碼 const char* mqtt_server = "47.93.19.134";//遠程服務器的地址 const int port=1883;//服務器端口號 WiFiClient espClient; PubSubClient client(espClient); char pub_topic[]="LEDback"; char rec_topic[]="LEDpwm"; int pinLED = 2; // 2號-D4 led int l=0; // 接收數據 int light=255; // 燈的亮度 char msg[100];// 發送話題 long lastMsg = 0;// 定時器,決定發送話題的時間 /* 1鏈接WIFI 自動連WIFI接入網絡*/ void setup_wifi() { delay(10); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("..."); } } /* 2鏈接服務器 等待,直到鏈接上服務器*/ void reconnect() {//等待,直到鏈接上服務器 while (!client.connected()) {//若是沒有鏈接上 if (client.connect("Esp_LED")+random(999999999)) {//接入時的用戶名,儘可能取一個很不經常使用的用戶名 client.subscribe(rec_topic);//接收外來的數據時的intopic client.publish(pub_topic,"hello world from dongdong"); } else { Serial.print("failed, rc=");//鏈接失敗 Serial.print(client.state());//從新鏈接 Serial.println(" try again in 5 seconds");//延時5秒後從新鏈接 delay(5000); } } } /* 3 接收數據處理, 服務器回掉函數*/ void callback(char* topic, byte* payload, unsigned int length) {//用於接收數據 //3.1 判斷數據爲 開啓指定LED if ((char)payload[0] == '1') { digitalWrite(4, HIGH); } else { digitalWrite(4, LOW); } // 3.2 數據轉化int 數值 控制燈的亮度 l=0; int p=1; for (int i = length-1; i >=0; i--) { l+=(int)((char)payload[i]-'0')*p; p*=10; } light=l; Serial.println(light);//換行 } //4 初始化函數 void setup() {//初始化程序,只運行一遍 Serial.begin(9600);//設置串口波特率(與燒寫用波特率不是一個概念) setup_wifi();//自動連WIFI接入網絡 client.setServer(mqtt_server, port);//端口號 client.setCallback(callback); //用於接收服務器接收的數據 } // 5 循環主函數 void loop() {//主循環 // 5.1 初始化鏈接 reconnect();//確保連上服務器,不然一直等待。 // 5.2 訂閱話題等待 client.loop();//MUC接收數據的主循環函數。 // 5.3 發佈話題 2S long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; sprintf(msg,"%ld",l); client.publish(pub_topic,msg);} //5.4 邏輯處理區域 analogWrite(pinLED,light);// 調節燈的亮度 }
接着試着用手機app訂閱接收傳感器發的消息(具體Android端如何實現下篇文章會講到),在google play中下載一個myMqtt的APP,不方便的能夠在這裏下http://pan.baidu.com/s/1slE0cw9
打開APP,在setting中設置你服務器ip,端口等保存,若是頂部顯示綠色代表鏈接成功,在Subscribe中訂閱light主題,返回到Dashboard就能實時收到消息