前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP8266 SDK开发: 物联网篇-ESP8266连接MQTT服务器实现通信控制

ESP8266 SDK开发: 物联网篇-ESP8266连接MQTT服务器实现通信控制

作者头像
杨奉武
发布2020-03-25 17:35:38
4.2K0
发布2020-03-25 17:35:38
举报
文章被收录于专栏:知识分享知识分享

前言

物联网是个很广泛的范畴

其实说白了就是   物 -- 网络

其中涉及的知识其实是数不胜数,太广泛了...

但是呢!基本上离不开的就是远程通信控制

为了实现设备和手机/上位机/网页之间通信

而且要做到一对多或者多对一进行通信

那么必须有个中间件

这个中间件作为数据的转发站

那么使用最为普遍的有两个

  1. WebSocket

2.MQTT

其实这两个家伙都是在 TCP的基础上再进行的封装

其实就是TCP通信

不过WebSocket是这样来的

TCP -- http -- WebSocket

而MQTT就是个TCP服务器

TCP -- MQTT

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

https://cloud.tencent.com/developer/article/1529814

安装MQTT软件

我给大家准备好了安装在Windows上的安装包

请参考这篇文章安装到自己的本地电脑

https://cloud.tencent.com/developer/article/1405208

注意:文章上是安装到了我的云端电脑上

大家测试安装到自己本地电脑上就可以

这是我安装的

我就用控制台模式启动,然后测试

测试MQTT软件是否可以通信

1.查看本机IP地址

2.打开调试助手测试

只要能自己发自己收,就可以了

让8266连接MQTT

注:我是用的这个工程里面的文件

这是官方提供的,不过有个错误

大家看没看我写的  

ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT

在订阅时如果订阅失败返回的标识不变,只是消息等级会是0x80

故:官方那样做即使订阅时失败的,还是会认为是成功!

修改如下:

1.把 "包"里面的文件按照下面拷贝

2.添加头文件,定义一个mqtt结构体变量

#include "driver/mqtt.h"


MQTT_Client mqttClient;

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

    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程序

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

测试

扩展

如果用户想知道官方是具体是怎么封装的MQTT

请用户先看我这两篇文章以后再去了解官方是怎么做的

https://cloud.tencent.com/developer/article/1602665

https://cloud.tencent.com/developer/article/1602669

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 安装MQTT软件
  • 这是我安装的
  • 测试MQTT软件是否可以通信
  • 让8266连接MQTT
  • ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT
    • 测试
      • 扩展
      相关产品与服务
      消息队列 TDMQ
      消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档