這是關於MQTT的第三篇文章,也是最后一篇關於MQTT的介紹和如何在ESP8266使用的文章,不過本篇文章只是簡單的一個串口收發MQTT消息的小Demo,后面如果我們在實際的小項目中用到關於MQTT相關的內容,將不再做介紹,大家如果還沒有看過前兩篇文章的可以戳下面卡片看一下。
文章都是利用業余時間所寫,如果有錯誤可以指出我及時改正。
廢話不多說,我們這里直接開始,這里我簡單寫了一個控制LED燈的小Demo方便大家更好的觀看效果,為了好區分,我這里一共有3個主題,每個主題對應不同的操作:
- /imliubo/mqtt/recv -> ESP8266訂閱的主題,主要接收電腦端,或者手機端的消息
- /imliubo/mqtt/send -> 電腦端或手機端訂閱的主題,接收ESP8266發送的消息
- /imliubo/mqtt/blueLED -> 控制LED的主題,發”on“-> 開,發”off “-> 滅
其中ESP8266發送消息是接收到手機或者電腦端消息后才發送,每條消息都有一個序列號,控制LED燈亮滅是必須用”/imliubo/mqtt/blueLED“這個主題,在其他主題下發送”on“或”off“沒有用,我們先看一下主要代碼:
1 void mqttConnectedCb(uint32_t *args) 2 { 3 MQTT_Client* client = (MQTT_Client*)args; 4 INFO("MQTT: Connected\r\n"); 5 MQTT_Subscribe(client, "/imliubo/mqtt/recv", 0);//訂閱主題 6 MQTT_Subscribe(client, "/imliubo/mqtt/blueLED", 0);//訂閱主題 7 8 MQTT_Publish(client, "/imliubo/mqtt/send", "This message is ESP8266 send!", sizeof("This message is ESP8266 send!"), 0, 0); 9 //推送消息 10 } 11 12 void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) 13 { 14 char *topicBuf = (char*)os_zalloc(topic_len+1), 15 *dataBuf = (char*)os_zalloc(data_len+1); 16 17 MQTT_Client* client = (MQTT_Client*)args; 18 19 os_memcpy(topicBuf, topic, topic_len); 20 topicBuf[topic_len] = 0; 21 22 os_memcpy(dataBuf, data, data_len); 23 dataBuf[data_len] = 0; 24 25 INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf); 26 27 if(!strcmp(topicBuf,"/imliubo/mqtt/blueLED")){//判斷主題是否是控制LED燈的主題 28 if(!strcmp(dataBuf,"on")){//判斷開關命令 29 GPIO_OUTPUT_SET(GPIO_ID_PIN(14),1);//亮 30 }else if(!strcmp(dataBuf,"off")){ 31 GPIO_OUTPUT_SET(GPIO_ID_PIN(14),0);//滅 32 } 33 } 34 35 os_sprintf(send_data,"This message is ESP8266 send! >%d<",send_count); 36 MQTT_Publish(client, "/imliubo/mqtt/send",send_data , sizeof(send_data), 0, 0);//推送消息,send_count每次自增1 37 send_count ++; 38 39 os_free(topicBuf); 40 os_free(dataBuf); 41 }
這是主要代碼,其實沒多少東西,相信大家一看就懂,大家編譯代碼之前記得要先修改一下app->include->mqtt_config.h文件,如下:
1 #define CFG_HOLDER 0x00FF55A5 //一個標志位,如果下面的配置有更改可以將此標志位加1或者減1再編譯下載 2 3 #define MQTT_HOST "192.168.0.106" //MQTT消息服務器IP地址,我這里是在局域網內本機測試的,不懂的可以看前一篇文章 4 #define MQTT_PORT 1883 //默認端口號 5 #define MQTT_CLIENT_ID "imliubo-esp8266" // ID,隨意設置一個,也可不填 6 #define MQTT_USER "admin" //用戶名,如果服務器開啟了用戶名密碼鑒權登錄,請修改 7 #define MQTT_PASS "admin" //密碼,我這里是隨便設置的,因為沒有開啟密碼登錄 8 #define STA_SSID "CMCC-Master" // your AP/router SSID to config your device networking 9 #define STA_PASS "zxcvbnmlk" // your AP/router password
這就是我們需要修改的地方,其他的我們可以先不用管,下面視頻是實際測試視頻,由於我現在主要開發平台也遷移到了Linux上,順便也給大家演示一下如果在Ubuntu下編譯和上傳程序:
呃呃呃,錄好的視頻太大就傳到了B站,但是審核兩天多了一直還在等待審核,有點讓人頭大。。。。。。
后面審核通過了會修改本篇文章,各位看官先不要着急,不過前兩個視頻還是可以看的,前面文章沒有看過的,可以先看一下~
另外本節代碼已經更新在了我的倉庫,大家可以下載先自己測試一下,其實我是在視頻中演示了如何測試,但是現在遲遲審核不通過,再等等吧~
歡迎大家去我的倉庫點個star,有問題可以提交issues,我看到后會第一時間回復。
視頻已經審核通過,各位看官可以戳上面卡片觀看了~本篇文章對應的是P3喲~
mua!(*╯3╰) mua!(*╯3╰)
QQ交流群:592587184