服務器 一 MQTT服務器硬件

目的:

實現手機4G網絡控制單片機,須要搭建服務器,手機或者各類控制端遠程控制。

本教程

1  MQTT服務器硬件模塊html

MQTT服務器電腦搭建git

   2.1本身搭建web

   2.2租阿里雲服務器json

MQTT服務器手機控制端服務器

參考教程

1 硬件 網絡

1.1MQTT--NodeMCU及MQTT接發消息體驗  https://www.jianshu.com/p/701f4d31029f

1.2 基於MQTT協議與ESP8266平臺的家庭環境監控實現  https://liangshuang.name/2017/08/07/mqtt/

2 服務器app

 

3 手機

3.1 服務器調試助手----myMqtt的APPhttp://pan.baidu.com/s/1slE0cw9  

3.2手機端具體開發--------(一)基於阿里雲的MQTT遠程控制(Android 鏈接MQTT服務器,ESP8266鏈接MQTT服務器實現遠程通訊控制----簡單的鏈接通訊)

 

三 單片機程序

3.1安裝編輯器

先要安裝Arduino IDE For ESP8266
Arduino IDE For ESP8266是根據Arduino修改的專門燒寫ESP8266開發板的IDE。在裝好Arduino IDE後:

打開Arduino 文件->首選項,在 附加開發管理網站 中填入

菜單「項目」-「加載庫」-「管理庫」,搜索安裝「PubSubClient」

,而後點擊肯定保存
  1. 重啓IDE後,打開 工具->開發板->開發板管理器;搜索ESP8266,選擇esp 8266 by ESP8266 Community安裝

  1. 下載完成後能夠在開發板選項中看到ESP8266 Module,以及WeMos D1 mini等可選開發板
  • 將WeMos D1 mini經過usb鏈接到電腦,在工具下選擇相應配置
  • 波特率越大燒錄程序速度越快但有可能出錯
    端口選擇WeMos D1 mini對應端口,若是沒看到端口,那是驅動沒有裝,裝驅動能夠看這裏http://www.arduino.cn/thread-1008-1-1.html
  1. 打開示例選擇ESP8266WiFi中的WiFiScan
  2.  

  3. 燒到板子上打開窗口監視器能夠看到掃描出來的附近熱點
 

 

3.2安裝庫文件

菜單「項目」-「加載庫」-「管理庫」,搜索安裝「PubSubClient」

 

PubSubClient有一些示例能夠打開mqtt_esp8266看下

 

 

3.3燒錄程序

MQTT接發消息體驗

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就能實時收到消息

相關文章
相關標籤/搜索