目的:

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

本教程

1  MQTT服务器硬件模块

MQTT服务器电脑搭建

2.1自己搭建

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 服务器

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.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就能实时收到消息

 

服务器 一 MQTT服务器硬件的更多相关文章

  1. 服务器 三 MQTT服务器手机开发

    目的: 实现手机4G网络控制单片机,需要搭建服务器,手机或者各种控制端远程控制. 本教程 1  MQTT服务器硬件模块 2 MQTT服务器电脑搭建 2.1自己搭建 2.2租阿里云服务器 2 MQTT服 ...

  2. 搭建MQTT服务器

    MQTT协议简介 MQTT 是一个基于发布/订阅模式的消息传输协议.它具有轻量级.开放.简单,易于实现,通信带宽要求低等特点.这些特点使得它对机器与机器的通信(M2M)以及物联网应用(IoT)来说是很 ...

  3. Mqtt协议 服务器交互

    1.服务器发送消息 package demo1; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.c ...

  4. React Native 实现MQTT 推送调研 (1)

    一.推送几种实现方式: (1)通过SMS(Short Message Service,短信群发服务系统) 进行服务器端和客户端的交流通信.在Android平台上,可以通过拦截SMS消息并解析内容来了解 ...

  5. emqtt 试用(三)mqtt 知识

    一.概念 MQTT 协议客户端库: https://github.com/mqtt/mqtt.github.io/wiki/libraries 例如,mosquitto_sub/pub 命令行发布订阅 ...

  6. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

  7. Nginx服务器的使用与反向代理负载均衡

    目录 Nginx服务器 一:什么是Nginx? 什么是Nginx - Nginx与其他服努器的性能比较 二:如何在Linux中搭建Nginx服务器? 常见的错误 三:Nginx的反向代理和负载均衡 什 ...

  8. MQTT学习笔记

    因为工作需要,了解了一下MQTT.顺便记下来,现在还不会用. 一.概述 MQTT(Message Queuing Telemetyr Transport  消息队列遥测传输协议):基于发布/订阅(Pu ...

  9. MQTT 嵌入式端通讯协议解析(转)

    MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对 ...

随机推荐

  1. 安装jdk出现问题:Error opening registry key'software\Javasoft\Java Runti...

    重装系统后发现jdk没有了,重新安装了,装一个其实挺容易的,但是“java -version”回车的时候,“啪”,error: Error opening registry key'software\ ...

  2. Computer - 在VM7虚拟机中使用主机打印机

    在VM7虚拟机中使用主机打印机 在VMware Workstation 7中提供了一项新的功能:虚拟机可以直接使用主机的打印机.在以前的版本中,如果想在虚拟机中使用主机的打印机,一般是在主机创建“打印 ...

  3. Java Switch支持的类型问题

    常见支持类型为int,byte,short,char及枚举类型.以上是JDK1.6以前的版本.JDK1.7时,又增加了String. 参考资料:1.java switch支持的数据类型 2.java中 ...

  4. springboot中mybatis逆向工程与分页的应用

    最近在项目中应用到springboot与mybatis,在进行整合过程中遇到一些坑,在此将其整理出来,便于以后查阅与复习. 项目运行环境为:eclispe+jdk1.8+maven 一.搭建Sprin ...

  5. js 微信支付

    引入 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0. ...

  6. JS 词法作用域 p2

    关于js 还是写的简短些,利于个人理解: 先看一个例子: var a = 2; function fn(){ var a = 3; console.log(a); } fn(a); 说明:作用域查找会 ...

  7. 自定义jquery公用方法切换当前tab栏

    经常在项目中需要写到切换当前栏目的展示效果,定义公共方法 //切换当前选中 /** * 全局切换或滑动标签的函数.一般使用active作为当前激活标签的类名,如果已使用其它类名,请将类名作为二参传入 ...

  8. 盲刷bios

    本帖最后由 evayh 于 2011-12-17 13:09 编辑 先看看是否是insyde的bios,如果是的话,可以救回来 insyde BIOS在损坏时,会自动进入CRISIS MODE试图刷回 ...

  9. Flex布局的学习经验

    做为css布局的又一种新方式,Flex拥有极强的使用效果,相比原来的float,position对元素样式的操作更加简洁,本文是我的一点学习经验和心得吧,如有错误以及不足之处,请多多指点. 好进入正题 ...

  10. Css 基础知识(一)

    1.Css概念 CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表),Css是用来美化html标签的,相当于页面化妆. ◆样式表书写位置 2. 选择器 2.1.写法 选 ...