概念
- 有些MQTT服务端需要客户端在连接时提供用户名和密码
- username(用户名)和password(密码)是可选的CONNECT信息
- 有些公用MQTT服务端也利用此信息来识别客户端属于哪一个用户,从而对客户端进行管理
- 比如用户可以拥有私人主题,这些主题只有该用户可以发布和订阅
关键代码
1 |
mqttClient.connect(clientId.c_str(), mqttUserName, mqttPassword) |
示例
1 2 3 4 5 6 7 8 9 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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <Ticker.h> // 设置wifi接入信息(请根据您的WiFi信息进行修改) const char* ssid = ""guiMin""; const char* password = ""00000000""; const char* mqttServer = ""test.ranye-iot.net""; // MQTT服务端连接用户名密码 const char* mqttUserName = ""test-user""; const char* mqttPassword = ""ranye-iot""; Ticker ticker; WiFiClient wifiClient; PubSubClient mqttClient(wifiClient); int count; // Ticker计数用变量 void setup() { Serial.begin(9600); // Ticker定时对象 ticker.attach(1, tickerCount); //设置ESP8266工作模式为无线终端模式 WiFi.mode(WIFI_STA); // 连接WiFi connectWifi(); // 设置MQTT服务器和端口号 mqttClient.setServer(mqttServer, 1883); // 连接MQTT服务器 connectMQTTServer(); } void loop() { // 如果开发板未能成功连接服务器,则尝试连接服务器 if (!mqttClient.connected()) { connectMQTTServer(); } mqttClient.loop(); // 每隔3秒钟发布一次信息 if (count >= 3){ pubMQTTmsg(); count = 0; } } void tickerCount(){ count++; } void connectMQTTServer(){ // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名) String clientId = ""esp8266-"" + WiFi.macAddress(); // 连接MQTT服务器。此处使用了程序首部定义的用户名和密码来实现MQTT服务端认证 if (mqttClient.connect(clientId.c_str(), mqttUserName, mqttPassword)) { Serial.println(""MQTT Server Connected.""); Serial.print(""Server Address: ""); Serial.println(mqttServer); Serial.print(""ClientId: ""); Serial.println(clientId); } else { Serial.print(""MQTT Server Connect Failed. Client State:""); Serial.println(mqttClient.state()); delay(3000); } } // 发布信息 void pubMQTTmsg(){ static int value; // 建立发布主题。主题名称以weiShaDian/Pub-为前缀,后面添加设备的MAC地址。 // 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同, String topicString = ""weiShaDian/Pub-"" + WiFi.macAddress(); char publishTopic[topicString.length() + 1]; strcpy(publishTopic, topicString.c_str()); // 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。 String messageString = ""Hello World "" + String(value++); char publishMsg[messageString.length() + 1]; strcpy(publishMsg, messageString.c_str()); // 实现ESP8266向主题发布信息 if(mqttClient.publish(publishTopic, publishMsg)){ Serial.println(""Publish Topic:"");Serial.println(publishTopic); Serial.println(""Publish message:"");Serial.println(publishMsg); } else { Serial.println(""Message Publish Failed.""); } } // ESP8266连接wifi void connectWifi(){ WiFi.begin(ssid, password); //等待WiFi连接,成功连接后输出成功信息 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("".""); } Serial.println(""""); Serial.println(""WiFi Connected!""); Serial.println(""""); } |
近期评论