esp8266/32+Arduino+MQTT+通訊貓,案例
阿新 • • 發佈:2021-02-08
技術標籤:微控制器
**
吐槽一下,國內微控制器語言,比前端後端語言落後至少10年
我會python,用micropython非常快捷方便,但是文件,例程都很少,只有用Arduino,但是至今阿里雲iot,onenet,的MQTT都連線不上,搞了幾天,例程太少,token一直弄不明白,官方也不友好沒啥例程,可能只在乎c++使用者
**只有用通訊貓的服務,因為不用令牌
非常簡潔,最要是搞清楚原理,再慢慢擴充套件
參考:https://www.jianshu.com/p/7f54b92d7a7b
#include <ESP8266WiFi.h>
#include <PubSubClient.h> //自己安裝,可能要翻牆
const char* ssid = "wifi";
const char* password = "11111111";
const char* mqtt_server = "mq.tongxinmao.com"; // 使用HIVEMQ 的資訊中轉服務
const char* TOPIC = "/public/TEST/www"; // 訂閱資訊主題
const char* client_id = "不用"; // 標識當前裝置的客戶端編號
WiFiClient espClient; // 定義wifiClient例項
PubSubClient client(espClient); // 定義PubSubClient的例項
long lastMsg = 0; // 記錄上一次傳送資訊的時長
//啟動
void setup() {
pinMode (BUILTIN_LED, OUTPUT); // 定義板載LED燈為輸出方式
Serial.begin(115200);
setup_wifi(); //執行Wifi初始化,下文有具體描述
client.setServer(mqtt_server, 18830); //設定MQTT伺服器與使用的埠,1883是預設的MQTT埠
client.setCallback(callback); //設定回撥方式,當ESP8266收到訂閱訊息時會呼叫此方法
}
//連線wifi
void setup_wifi() {
delay(10);
// 板子通電後要啟動,稍微等待一下讓板子點亮
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi ok");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
//有訊息回撥
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++) {
Serial.print((char)payload[i]); // 列印主題內容
}
//Serial.print((char)payload[0]);//內容流第一個字
Serial.println();
if ((char)payload[0] == '1') { //判斷內容第一個字
digitalWrite(BUILTIN_LED, LOW); // 亮燈
}
if ((char)payload[0] == '2') {
digitalWrite(BUILTIN_LED, HIGH); // 熄燈
}
}
//訂閱mqtt
void reconnect() {
while (!client.connected()) {
Serial.print("lianjie MQTT ...");
// Attempt to connect
if (client.connect(client_id)) {
Serial.println("mqtt ok");
// 連線成功時訂閱主題
client.subscribe(TOPIC);
} else {
Serial.print("lianjie_no, rc=");
Serial.print(client.state());
Serial.println("stop 5 miao");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
//迴圈
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis(); //程式執行總時間,毫秒
if (now - lastMsg > 2000) { //總時間-上次記錄時間=間隔時間,心跳連線
lastMsg = now;
client.publish("/public/TEST/www", "ok");
}
}