| 
 
 
 
 前言
 物联网是个很广泛的范畴 其实说白了就是   物 -- 网络 其中涉及的知识其实是数不胜数,太广泛了... 但是呢!基本上离不开的就是远程通信控制 为了实现设备和手机/上位机/网页之间通信 而且要做到一对多或者多对一进行通信 那么必须有个中间件 这个中间件作为数据的转发站 那么使用最为普遍的有两个 1. WebSocket 2.MQTT 其实这两个家伙都是在 TCP的基础上再进行的封装 其实就是TCP通信 不过WebSocket是这样来的 TCP -- http -- WebSocket 
 而MQTT就是个TCP服务器 TCP -- MQTT 
 如果想深入了解MQTT,请看看下面的文章链接 安装MQTT软件
 我给大家准备好了安装在Windows上的安装包 
 
 请参考这篇文章安装到自己的本地电脑 注意:文章上是安装到了我的云端电脑上 大家测试安装到自己本地电脑上就可以 这是我安装的
 我就用控制台模式启动,然后测试 
 
 
 
 
 
 
   
 
 
 
 
  测试MQTT软件是否可以通信 1.查看本机IP地址 
 
 
 2.打开调试助手测试 只要能自己发自己收,就可以了 
 
 
 
 
 让8266连接MQTT
 注:我是用的这个工程里面的文件 
 
 
 这是官方提供的,不过有个错误 
 
 
 
 大家看没看我写的  ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT 
 在订阅时如果订阅失败返回的标识不变,只是消息等级会是0x80 故:官方那样做即使订阅时失败的,还是会认为是成功! 
 
 
 修改如下: 
 
 
 
 
 
 1.把 "包"里面的文件按照下面拷贝 
 
 
 
 
 
 
 2.添加头文件,定义一个mqtt结构体变量 
 
 
 
 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 请用户先看我这两篇文章以后再去了解官方是怎么做的 
 
 
 |