Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 420|回复: 0

4.01-物联网篇(自建MQTT)-安装MQTT服务器,ESP8266连接MQTT服务器...

[复制链接]

56

主题

56

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2020-10-27 22:37:58 | 显示全部楼层 |阅读模式





前言
物联网是个很广泛的范畴
其实说白了就是   物 -- 网络
其中涉及的知识其实是数不胜数,太广泛了...
但是呢!基本上离不开的就是远程通信控制
为了实现设备和手机/上位机/网页之间通信
而且要做到一对多或者多对一进行通信
那么必须有个中间件
这个中间件作为数据的转发站
那么使用最为普遍的有两个
1. WebSocket
2.MQTT
其实这两个家伙都是在 TCP的基础上再进行的封装
其实就是TCP通信
不过WebSocket是这样来的
TCP -- http -- WebSocket

而MQTT就是个TCP服务器
TCP -- MQTT

如果想深入了解MQTT,请看看下面的文章链接

安装MQTT软件
我给大家准备好了安装在Windows上的安装包
819239-20200325014012452-1296941837.png


请参考这篇文章安装到自己的本地电脑
注意:文章上是安装到了我的云端电脑上
大家测试安装到自己本地电脑上就可以

这是我安装的
我就用控制台模式启动,然后测试

819239-20200325015042053-1196721926.png



819239-20200325015212616-1204050435.png



819239-20200325015223960-1420712348.png





测试MQTT软件是否可以通信
1.查看本机IP地址
819239-20200325021420915-1383369290.png



2.打开调试助手测试
819239-20200325021505208-2001792499.png
只要能自己发自己收,就可以了


819239-20200325021719305-180214131.png




让8266连接MQTT
注:我是用的这个工程里面的文件
819239-20200325023314794-662608798.png



这是官方提供的,不过有个错误
819239-20200325023624286-1280200088.png




大家看没看我写的  
ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT
在订阅时如果订阅失败返回的标识不变,只是消息等级会是0x80
故:官方那样做即使订阅时失败的,还是会认为是成功!
819239-20200325023849302-167893883.png



修改如下:

819239-20200325024220452-1855651868.png





1.把 "包"里面的文件按照下面拷贝
819239-20200325022431651-1119902982.png



819239-20200325022344393-1665035806.png




2.添加头文件,定义一个mqtt结构体变量
819239-20200325023156825-1878672480.png





driver/mqtt.h"

MQTT_Client mqttClient;




3.编写连接,还有设置一些回调函数

819239-20200325024335568-1389146182.png




819239-20200325024623600-1246849215.png




MQTT_InitConnection(&mqttClient, "192.168.191.1", 1883, 0);//MQTT服务器IP地址,端口号,是否SSL
    MQTT_InitClient(&mqttClient, "client_id", "yang", "11223344", 3, 1);//ClientID,用户名,密码,心跳包时间,清除连接信息
    MQTT_InitLWT(&mqttClient, "/lwt", "offline", 0, 0);//遗嘱
    MQTT_OnConnected(&mqttClient, mqttConnectedCb);//设置连接回调
    MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb);//设置断开回调
    MQTT_OnPublished(&mqttClient, mqttPublishedCb);//设置发送完消息回调
    MQTT_OnData(&mqttClient, mqttDataCb);//接收数据回调



//连接上MQTT
void mqttConnectedCb(uint32_t *args){
    MQTT_Client* client = (MQTT_Client*)args;
    os_printf("MQTT: Connected\r\n");
    MQTT_Subscribe(client, "111111", 0);//订阅主题:111111
}


//连接断开
void mqttDisconnectedCb(uint32_t *args){
    MQTT_Client* client = (MQTT_Client*)args;
    os_printf("MQTT: Disconnected\r\n");
}
//发送完消息
void mqttPublishedCb(uint32_t *args){
    MQTT_Client* client = (MQTT_Client*)args;
    os_printf("MQTT: Published\r\n");
}
//接收到数据
void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
    char *topicBuf = (char*)os_zalloc(topic_len+1),
            *dataBuf = (char*)os_zalloc(data_len+1);//用来缓存主题和消息


    MQTT_Client* client = (MQTT_Client*)args;
    os_memcpy(topicBuf, topic, topic_len);
    topicBuf[topic_len] = 0;
    os_memcpy(dataBuf, data, data_len);
    dataBuf[data_len] = 0;
    MQTT_Publish(client, "222222", dataBuf, data_len, 0, 0);//转发接收的消息:发布的主题222222
    os_printf("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);//打印接收的消息
    os_free(topicBuf);
    os_free(dataBuf);
}



4.让模块连接上路由器以后,在执行连接MQTT程序
819239-20200325024815336-1875849939.png




void wifiConnectCb(uint8_t status)
{
    if(status == STATION_GOT_IP){
        MQTT_Connect(&mqttClient);
    } else {
        MQTT_Disconnect(&mqttClient);
    }
}



测试
819239-20200325025416026-1320281949.png




扩展
如果用户想知道官方是具体是怎么封装的MQTT
请用户先看我这两篇文章以后再去了解官方是怎么做的



copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2020-11-30 22:15 , Processed in 0.086154 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表