• ESA2GJK1DH1K基础篇: 移植MQTT底层包到自己的项目(V0.1)


    前言

    这节代码将在这一节的基础上实现

    拷贝MQTT文件夹到当前工程

     

    当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容

    添加文件到里面

     

     

    注意::::

    实际源码拷贝位置

    为了便于移植到各个模块上使用,我再次封装了一下

    添加了 ConfigMqtt文件

    添加头文件到 include.h

    设置一下头文件路径

    注意,如果不是用的我的工程底板,会报错一个地方

    该函数是用来处理MQTT的数据.官方源码解析的固定写法.

     这个Usart1ReadBuff 是缓存串口1数据的数组

     

     注:我的模块是使用单片机串口和它通信

    单片机程序会配置模块作为透传模式

    单片机串口发送的数据传给模块,模块自动发给服务器

    模块从服务器接收的数据直接通过串口传给单片机

    如果大家使用的模块不是把数据直接传到了Usart1ReadBuff

    可以定义一个新的数组

     

    这节就使用这个定义的数组操作下链接MQTT实现通信

    因为这样的话,大家无论使用的什么模块都可以参考

    控制模块TCP连接上MQTT

    自行根据自己的模块设置模块连接TCP    (MQTT服务器软件)

                case 0://关闭移动场景,彻底关闭TCP/IP 连接
                    SendConfigFunction("AT+CIPSHUT
    ",NULL,"SHUT OK",NULL,FunctionParseCompare,CompareValue);break;
                case 1://读取SIM状态正常
                    SendConfigFunction("AT+CPIN?
    ",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
                case 2://GPRS注册状态            
                    SendConfigFunction("AT+CGREG?
    ",NULL,"+CGREG: 0,1",NULL,FunctionParseCompare,CompareValue);break;
                case 3://是否附着了GPRS  
                    SendConfigFunction("AT+CGATT?
    ",NULL,"+CGATT: 1",NULL,FunctionParseCompare,CompareValue);break;            
                case 4://设置为单链接
                    SendConfigFunction("AT+CIPMUX=0
    ",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;            
                case 5://透传模式 
                    SendConfigFunction("AT+CIPMODE=1
    ",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
                case 6://设置APN
                    SendConfigFunction("AT+CSTT
    ",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
                case 7://激活移动场景
                    SendConfigFunction("AT+CIICR
    ",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
                case 8://连接TCP 服务器
                    SendConfigFunction("AT+CIPSTART="TCP","47.92.31.46",1883
    ",NULL,"CONNECT",NULL,FunctionParseCompare,CompareValue);break;

     

    无论如何你必须先用TCP连接上TCP服务器(MQTT软件)

     

     

    现在发送连接MQTT协议

    一,调用MqttConnectMqtt函数,我注释已经写的很明白了哈...

    二,打包连接数据,然后发给TCP服务器(我刚才说了,我串口发送的数据GPRS会自动转发给TCP服务器)

      大家根据自己的修改,找到自己TCP发送数据的地方,把数据发出去

      

    三,判断是否连接上了

    MqttConnectMqttAck

      

    连接上以后,订阅主题

      一,订阅一个主题

       

      注:实际订阅的时候可用一个数组存储订阅的主题

      假设是 char SubTopic[20]="wwwww"

      

    二,订阅两个主题

     

    判断是否成功订阅了主题

    一,调用 MqttSubscribeAck函数判断

      

    二,然后呢咱发送一条消息

     

     

     注:以后发布消息

    可直接

    MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//组合发送的消息,消息:"online",消息个数6个
    UsartOutStr(MqttSendData,MainLen);//发送MQTT协议数据(根据自己的TCP发送函数更改)

    如果想改变消息等级为1

    MqttPublishTopicStruct.qos = 1;

    MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//组合发送的消息,消息:"online",消息个数6个
    UsartOutStr(MqttSendData,MainLen);//发送MQTT协议数据(根据自己的TCP发送函数更改)

     现在呢我测试下,

    注意哈,实际上没有什么难的,

    第一:先连接TCP

    第二: 调用连接MQTT的封包函数,封装好连接的数据,然后把数据用TCP发出去

    第三: 判断服务器返回的是不是连接成功

    第四: 连接以后就可以订阅主题了,其实什么时候都可以订阅,随意

    第五 根据服务器返回的数据,判断下是不是订阅成功了

    注:这节代码不一定会测试通过,这节代码只是为了说明怎么让大家的模块连接MQTT的流程而已

     

    解析接收的MQTT数据 

    把接收的数据返回回去

     

     

    最后一个心跳包

    你设置的心跳包多少时间,你就多少时间发送一次心跳包!

     

    结语

    你脑海里面永远记得,先连接TCP 服务器

    必须把TCP服务器返回的数据写到那个数组里面

    然后就是连接,判断,订阅判断,发送数据,解析数据啦.最后定时发个心跳包.仅此而已

    各种平台的MQTT封包解包

    https://docs.emqx.io/sdk_tools?category=MQTT_Clients

    注意:注意:注意:注意:注意:注意:

    我给大家提供的都是网络模块串口透传的代码(8266,Air202,SIM800),后面我会提供个W5500的,不过是用另一块板子

    这节有些唠叨....

    大家一定要看我的下一篇,

    大家一定要看我的下一篇,

    大家一定要看我的下一篇,

    要想做的稳定,没有这么简单,我这节只是说说流程.

    大家一定要看我的下一篇,

    大家一定要看我的下一篇,

    大家一定要看我的下一篇,

  • 相关阅读:
    Java并发(三):重排序
    Java并发(六):volatile的实现原理
    Java并发(五):synchronized实现原理
    Java并发(一):多线程干货总结
    JDK源码学习笔记——String
    Java并发(二):Java内存模型
    JVM命令-java服务器故障排查
    vue之数据请求方式
    vue之菜单添加选择,知识:数据双向绑定、循环渲染、事件点击以及按键的点击
    Vue【第3章】:Vue常用指令二:事件和方法
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11766867.html
Copyright © 2020-2023  润新知