• 501-STM32+Air724UG基本控制篇(自建物联网平台)-移植使用-移植单片机MQTT底层包到自己的工程项目


    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLAir724UGA/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    这节详细说明一下如何把工程里面的MQTT包移植到用户自己的工程.

    注意:首先确定自己已经实现了使用TCP连接服务器!

    该底层包适用于所有的单片机,和所有的网络模块.

    该教程以STM32工程为例子说明移植过程.

    文件夹说明

    1.移植使用的是下面两个文件夹里面的文件

    我准备了一个空模板程序,然后在这个模板上演示移植过程.

    2.MQTT文件夹

    mqtt_msg 文件作为最底层的最直接的MQTT协议处理文件.

    mqtt.c 文件 是我在mqtt_msg的基础上又封装了一层

    这一层增加了数据缓存管理,缓存管理采用环形队列实现,所有的数据都储存在缓存里面

    另一方面还有处理消息等级1,2的消息,心跳包自动发送等.

    有了这一层的封装,用户只需简单的配置即可实现稳定可靠的MQTT通信.

    3.mem文件夹

    mem文件夹里面是我写的缓存管理程序

    开始移植 

    1.把文件添加到工程,设置下.h路径

    2.编译一下工程,打开这个错误

    3.替换自己的TCP发送函数

    4.把 mqtt_time_data(&mymqtt); 放到1ms定时器中断中.

    5.初始化和注册MQTT几个函数,订阅,发布等函数

    6.连接TCP服务器,发送连接MQTT协议

    把上面的协议发给MQTT服务器以后,MQTT服务器会返回数据

    需要把返回的数据交给 int  mqtt_connect_ack(unsigned char *buff) 函数处理

    如果该函数返回 0 说明连接上了MQTT服务器,然后调用 mymqtt.connectCb();执行连接回调函数

    7.加上需要不停轮训的函数和处理MQTT消息的函数

    8.按照上面的步骤已经移植完成(述说下执行流程)

    1.首先控制模块以TCP方式连接服务器,连接上以后发送MQTT连接协议

    2.判断服务器返回的数据,如果连接上MQTT服务器,调用连接成功回调函数

    并在连接成功回调函数中订阅主题.

    3.订阅主题的协议都打包进了缓存,从缓存提取并发送出去.

    注:后面发布消息,发送心跳包数据也是全部打包进了缓存!

    4.MQTT服务器返回数据以后,解析处理MQTT返回的数据

     

    5.如果接收到普通的通信消息,将会调用接收数据回调函数

    6.发布消息

    只要判断成功连接了MQTT,发送消息的函数可以写到任意地方 .

    注意事项

    1.在mqtt.h里面 有一个 mqtt_send_buff_len 500

    该变量控制着发送协议的最大长度,用户需要根据自己的情况修改该值.

    为防止提取缓存时导致内存溢出,我编写底层的时候设置了默认超过该值的打包协议将被丢弃.

    2.发布消息成功函数只有在消息等级1和消息等级2的时候才会进入

    消息等级1和消息等级2服务器只要应答便会进入此函数.说明服务器确实接收到了数据.

    3.假设自己的网络模块并非透传模式

    假设使用的串口2和模块进行的通信

    1.发送数据,假设发送66个数据
    1.1 首先发送 AT+CIPSEND=66     66:为要发送的数据个数
    1.2 等待模块返回 >
    1.3 发送要发送的数据给模块
    1.4 模块返回 Recv 66 bytes  
    1.5 模块发送完成返回 SEND OK
    2.接收数据
    2.1 接收数据格式: +IPD,XXXX:真实数据    XXXX 为接收的数据个数
     

    修改 mqtt_send_function里面的发送过程

    如果接收到 > 清零接收超时

    如果 接收到 SEND OK 清零发送超时

     

    接收的数据直接提取有效数据,然后交于 mqtt_read_function函数处理

    4.如果内存允许,建议采用下面的方式处理接收数据

    5.如果客户发现自己当前的版本和细节介绍的有出入

    请用户直接把此节的文件移植替换当前使用的文件

    随着时间的推移,我可能会发现并修改完善许多细节

    我会尽量做到版本兼容!

    如若有不兼容的地方,我将在文件说明中做详细说明.

  • 相关阅读:
    guid与Base64编码互相转换
    xml序列化与反序列化工具
    Win10 15063 开始运行不保存历史记录原因和解决方法
    win10 localhost 解析为 ipv6地址 ::1 的解决办法
    在VisualStudio中应该使用什么字体
    S7-200系列PLC与WINCC以太网通信CP243i的实例
    超棒的 15 款 Bootstrap UI 编辑器
    NuGet学习笔记(转)
    SQLServer公历转农历函数(1900年-2049年)
    WPF 的datagrid 列名中没有显示下划线是怎么回事?
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14615489.html
Copyright © 2020-2023  润新知