MQTT和ESP8266通讯

admin 2023年5月30日19:07:31MQTT和ESP8266通讯已关闭评论29 views字数 5368阅读17分53秒阅读模式

一、MQTT协议

MQTT 协议的全称是 Message Queuing Telemetry Transport,翻译为消息队列传输探测,它是 ISO 标准下的一种基于发布 - 订阅模式的消息协议,它是基于 TCP/IP 协议簇的,它是为了改善网络设备硬件的性能和网络的性能来设计的。MQTT 一般多用于 IoT 即物联网上,广泛应用于工业级别的应用场景,比如汽车、制造、石油、天然气等。

这种订阅类的协议很新颖,客户端只需要订阅服务器的消息即可;无需重复的去请求接口获取信息,在物联网方面的应用比较常见;然后我就翻出了我的ESP8266和温度传感器(DHT11);

image-20230301201933642

image-20230301201933642

二、实战

1、环境搭建

一如既往的使用arduino作为开发的,通过官网[Software | Arduino](https://www.arduino.cc/en/software下载按照后即可得到一个编译器;安装好对于的驱动和在arduino中设置开发板后即可进行开发步骤;

计算机管理->设备过管理器中可以看到esp8266的端口号

image-20230301205646092

image-20230301205646092

在arduino中开发板设置中选择相应的开发板,我选择的是“NodeMCU 1.0”(NodeMCU-12E和NodeMCU-12F没有太大的区别)

image-20230301205920015

image-20230301205920015

并在端口处设置好刚才在设备管理器中看到的端口号

image-20230301210101854

image-20230301210101854

接下来就可以开始愉快的开发过程了;

2、代码开发

首先上网是关键,所以先让他连上网

c#

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
#include<stdio.h> #include <ESP8266WiFi.h> const char* ssid = "WiFi-12-1"; const char* password = "********"; void setup() { Serial.begin(9600); //设置ESP8266工作模式 WiFi.mode(WIFI_STA); // 连接WiFi Wifi(); } void loop() { } // ESP8266连接wifi void Wifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Successfully connected to WIFI"); Serial.println(""); }

联网成功后提示:

测试mqtt通讯,我这里使用的是公共的服务器:免费的公共 MQTT 服务器 | EMQ (emqx.com)

测试使用可以,但别使用在真实的生产中;

c#

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
#include<stdio.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> const char* ssid = "WiFi-12-1"; const char* password = "18084486541"; const char* mqttServer = "broker-cn.emqx.io"; int tim = 0; int timax = 60; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); void setup() { Serial.begin(9600); //设置ESP8266工作模式 WiFi.mode(WIFI_STA); // 连接WiFi Wifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); // 连接MQTT服务器 connectMQTTServer(); mqttClient.setCallback(callback);// 设置回调 } void loop() { if (mqttClient.connected()) { mqttClient.loop(); // 保持客户端心跳 } else { connectMQTTServer(); // 则尝试重新连接服务器 } } // 连接MQTT服务器 void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = "C3ting-" + WiFi.macAddress(); if (mqttClient.connect(clientId.c_str())) { //设置mqtt主题的id //连接成功后就订阅主题 mqttClient.subscribe("c3ting");//订阅主题 Serial.print("订阅主题成功!!"); } else { Serial.println(mqttClient.state()); delay(3000); } } //MQTT回调函数 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { char receivedChar = (char)payload[i]; Serial.print(receivedChar); // 打印mqtt接收到消息 } Serial.println(); } // ESP8266连接wifi void Wifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Successfully connected to WIFI"); Serial.println(""); }

使用MQTT测试工具测试:

image-20230301215839322

image-20230301215839322

接下来就是把获取温度传感器的数据上传到MQTT服务器上:

传感器与ESP8266的连线为:

传感器: esp8266:

+(电源)————3v

-(电源)————G

out(信号)————3V

即可

c#

  • 001
  • 002
  • 003
  • 004
  • 005
  • 006
  • 007
  • 008
  • 009
  • 010
  • 011
  • 012
  • 013
  • 014
  • 015
  • 016
  • 017
  • 018
  • 019
  • 020
  • 021
  • 022
  • 023
  • 024
  • 025
  • 026
  • 027
  • 028
  • 029
  • 030
  • 031
  • 032
  • 033
  • 034
  • 035
  • 036
  • 037
  • 038
  • 039
  • 040
  • 041
  • 042
  • 043
  • 044
  • 045
  • 046
  • 047
  • 048
  • 049
  • 050
  • 051
  • 052
  • 053
  • 054
  • 055
  • 056
  • 057
  • 058
  • 059
  • 060
  • 061
  • 062
  • 063
  • 064
  • 065
  • 066
  • 067
  • 068
  • 069
  • 070
  • 071
  • 072
  • 073
  • 074
  • 075
  • 076
  • 077
  • 078
  • 079
  • 080
  • 081
  • 082
  • 083
  • 084
  • 085
  • 086
  • 087
  • 088
  • 089
  • 090
  • 091
  • 092
  • 093
  • 094
  • 095
  • 096
  • 097
  • 098
  • 099
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
#include<stdio.h> #include <ESP8266WiFi.h> #include <ArduinoJson.h> #include <PubSubClient.h> #include <dht11.h> dht11 DHT11; #define DHT11PIN 2 const char* ssid = "WiFi-12-1"; const char* password = "18084486541"; const char* mqttServer = "broker-cn.emqx.io"; int tim = 0; int timax = 60; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); double Fahrenheit(double celsius) { return 1.8 * celsius + 32; //摄氏温度度转化为华氏温度 } double Kelvin(double celsius) { return celsius + 273.15; //摄氏温度转化为开氏温度 } void setup() { Serial.begin(9600); //设置ESP8266工作模式 WiFi.mode(WIFI_STA); // 连接WiFi Wifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); // 连接MQTT服务器 connectMQTTServer(); mqttClient.setCallback(callback);// 设置回调 } void loop() { if (mqttClient.connected()) { mqttClient.loop(); // 保持客户端心跳 } else { connectMQTTServer(); // 则尝试重新连接服务器 } DHT11.read(DHT11PIN); //更新传感器所有信息 tim++; if(tim>=timax){ float temp = DHT11.humidity; float hum = DHT11.temperature; // json serialize DynamicJsonDocument data(256); data["temp"] = temp; data["hum"] = hum; // publish temperature and humidity char json_string[256]; serializeJson(data, json_string); sendMessage(json_string); tim=0; } delay(1000); } // 连接MQTT服务器 void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = "C3ting-" + WiFi.macAddress(); if (mqttClient.connect(clientId.c_str())) { //设置mqtt主题的id //连接成功后就订阅主题 mqttClient.subscribe("c3ting");//订阅主题 Serial.print("订阅主题成功!!"); } else { Serial.println(mqttClient.state()); delay(3000); } } //MQTT回调函数 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i=0;i<length;i++) { char receivedChar = (char)payload[i]; Serial.print(receivedChar); // 打印mqtt接收到消息 } Serial.println(); } //MQTT发送函数 void sendMessage(char* pubMessage){ if(mqttClient.publish("c3ting/send", pubMessage)){ Serial.println("Publish Topic:c3ting"); Serial.println("Publish message:");Serial.println(pubMessage); } else { Serial.println("Message Publish Failed."); } } // ESP8266连接wifi void Wifi(){ WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("Successfully connected to WIFI"); Serial.println(""); }

上传测试连接情况:

image-20230301221507616

image-20230301221507616

至此就差不多了;

MQTT的应用还是很多的的,也可以作为一个IM通讯服务器来使用。在推送信息等方面的应用还是比较好的,生态链也是很完整的,在js,java,python等语言上都支持这个协议;

这篇文章只是我的一个记录吧,在物联网板块中,我还只是小白,还在不断的学习中,如果有错误的地方还望多多包涵。

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月30日19:07:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  MQTT和ESP8266通讯 https://cn-sec.com/archives/1760705.html