服务器 一 MQTT服务器硬件

目的:

实现手机4G网络控制单片机,需要搭建服务器,手机或者各种控制端远程控制。

本教程

1  MQTT服务器硬件模块

2 MQTT服务器电脑搭建

   2.1自己搭建

   2.2租阿里云服务器

2 MQTT服务器手机控制端

参考教程

1 硬件 

1.1MQTT--NodeMCU及MQTT接发消息体验  https://www.jianshu.com/p/701f4d31029f

1.2 基于MQTT协议与ESP8266平台的家庭环境监控实现  https://liangshuang.name/2017/08/07/mqtt/

2 服务器

  • 9、 Esp8266进阶之路第一篇: [小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
  • 10、 Esp8266进阶之路第二篇: [小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。

  • 11、 Esp8266进阶之路第三篇: 8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!

  • 12、 Esp8266进阶之路第四篇: 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制

  • 13、 Esp8266进阶之路第五篇: 动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。

 

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”

  http://arduino.esp8266.com/stable/package_esp8266com_index.json
,然后点击确定保存
服务器 一 MQTT服务器硬件_第1张图片
  1. 重启IDE后,打开 工具->开发板->开发板管理器;搜索ESP8266,选择esp 8266 by ESP8266 Community安装

服务器 一 MQTT服务器硬件_第2张图片

  1. 下载完成后可以在开发板选项中看到ESP8266 Module,以及WeMos D1 mini等可选开发板
  • 将WeMos D1 mini通过usb连接到电脑,在工具下选择相应配置
  • 服务器 一 MQTT服务器硬件_第3张图片
  • 服务器 一 MQTT服务器硬件_第4张图片
  • 波特率越大烧录程序速度越快但有可能出错
    端口选择WeMos D1 mini对应端口,如果没看到端口,那是驱动没有装,装驱动可以看这里http://www.arduino.cn/thread-1008-1-1.html
  1. 打开示例选择ESP8266WiFi中的WiFiScan
  2. 服务器 一 MQTT服务器硬件_第5张图片

     

  3. 烧到板子上打开窗口监视器可以看到扫描出来的附近热点
  服务器 一 MQTT服务器硬件_第6张图片

 

3.2安装库文件

菜单“项目”-“加载库”-“管理库”,搜索安装“PubSubClient”

  服务器 一 MQTT服务器硬件_第7张图片

PubSubClient有一些示例可以打开mqtt_esp8266看下

 服务器 一 MQTT服务器硬件_第8张图片

 

3.3烧录程序

MQTT接发消息体验

1. WeMos D1 mini发布消息:光照强度传感器测得环境光照强度发布到服务器,手机订阅该Topic接收光强信息

 

#include 
#include 
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找到它

服务器 一 MQTT服务器硬件_第9张图片

 

 

 

2.WeMos D1 mini接收消息:连接一个led灯,用手机APP控制灯的亮度,不接受其信息

接收LED Topic的信息,接收到转换为int设置为灯的亮度,这样就实现远程app控灯。打开myMqtt的publish,输入Topic为LED,Message为灯的亮度(0-1024),可以实时控制灯(47.93.19.134)

 

#include 
#include 
#include 

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

服务器 一 MQTT服务器硬件_第10张图片

服务器 一 MQTT服务器硬件_第11张图片

打开APP,在setting中设置你服务器ip,端口等保存,如果顶部显示绿色表明连接成功,在Subscribe中订阅light主题,返回到Dashboard就能实时收到消息

服务器 一 MQTT服务器硬件_第12张图片

服务器 一 MQTT服务器硬件_第13张图片

 

 

 

转载于:https://www.cnblogs.com/kekeoutlook/p/8455885.html

你可能感兴趣的:(json,移动开发,嵌入式)