IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言实现MQTT协议(二)头文件介绍 -> 正文阅读

[C++知识库]C语言实现MQTT协议(二)头文件介绍

前提

这里我只是根据我实际用的功能来实现MQTT协议,并没有把MQTT全部实现。接下来我会介绍我是怎么实现MQTT协议的,希望能给你帮助。

思路

首先介绍一下大致思路。
在头文件中定义

  • MQTT的结构体
    这个结构体来保存一些缓冲区的指针,报文的类型,结果代码,错误代码等等。

  • 各种报文的结构体
    因为每个报文都不同,不同的位,格式有差异,所以我们需要根据每种报文定义结构体。

  • 枚举各个报文的值
    比如枚举出各个报文,用来区分报文。

用宏定义定义一些需要修改的值。

  • 超时等待时间
    比如客户端连接服务端,客户端需要等待服务端相应,但是客户端不能一直等待下去,所以我们需要定义一个超时等待时间。

  • 与服务端连接保活时间
    这个时间在不同的情景下是有差异,所以需要单独拎出来。

  • 缓冲区的大小
    根据需要传输的数据最大大小来设置缓冲区的大小

接下来从头文件开始介绍。

报文类型的枚举

在头文件中将MQTT协议中所以控制报文枚举出来。
注意下枚举的值必须要与MQTT协议中的值一一对应。

/* 报文类型枚举 */
typedef enum
{
    MQTT_CONNECT 	= 0x10U,    //连接
    MQTT_CONNACK 	= 0x20U,    //连接响应
    MQTT_PUBLISH 	= 0x30U,    //发布消息
    MQTT_PUBACK  	= 0x40U,	//发布消息响应 QoS = 1
    MQTT_PUBREC  	= 0x50U,	//发布消息响应 QoS = 2
    MQTT_PUBREL  	= 0x60U,
    MQTT_PUBCOMP 	= 0x70U,
    MQTT_SUBSCRIBE 	= 0x82U,	//订阅
    MQTT_SUBACK 	= 0x90U,	//订阅响应
    MQTT_UNSUBSCRIBE = 0xA2U,	//取消订阅
    MQTT_UNSUBACK 	= 0xB0U,	//取消订阅响应
    MQTT_PINGREQ 	= 0xC0U,	//保活
    MQTT_PINGRESP 	= 0xD0U,	//保活响应
    MQTT_DISCONNECT = 0xE0U		//断开连接
}MessageType_t;

定义了一个新的枚举类型MessageType_t

数据类型的枚举

因为传输的数据有字符和实数,所以我们需要区分。
为什么实数的枚举值是-1,而字符的枚举值是1,我将在之后讲解。

/* 数据类型枚举 */
typedef enum
{
    NUM = -1,	//数据是实数
    CHAR = 1,   //数据是字符
}DataType_t;

定义了一个新的枚举类型DataType_t

宏定义

正如上文提到的,定义了一些需要根据情景来修改的数值。

/* 最大超时等待时间 单位毫秒 */
#define MQTT_MAX_TIMES_OUT (1000U)
/* 连接保活时间 单位秒 */
#define MQTT_KEEP_ALIVE 	(300U)
/* 缓冲区的大小 单位字节 */
#define MQTT_BUFF_SIZE 		(200U)

MQTT结构体

/* MQTT结构体 */
typedef struct
{
    MessageType_t messageType;     	//报文的类型
    char *sendBuff;                	//指向数据发送缓冲区的指针
    char *sendBuffPointNow;        	//指向数据发送缓冲区当前位置的指针
    char resultCode;               	//结果返回代码
    unsigned int remainLength;    	//解码获得的剩余长度
    void *returnData;               //指向服务端返回的报文结构体的指针
}MQTT_t;

说明一些需要注意的地方。

  • 存储了报文的类型MessageType_t的变量messageType
  • 存储指向数据发送缓冲区的指针sendBuff,该数据发送缓冲区的大小是用宏定义MQTT_BUFF_SIZE定义的。
  • 指向数据发送缓冲区当前位置的指针sendBuffPointNow,解释一下就是当我们往数据发送缓冲区写入X个字节后,该指针就会增长X个字节。
  • 结果返回代码resultCode,一些报文是需要根据服务端响应的数据来判断状态的,比如CONNECT报文,当我们连接服务端的时候,需要服务端返回CONNACK报文,来指示客户端是否连接成功。其中resultCode的初始值也用了一个宏定义定义
    #define MQTT_RESULT_CODE_INIT (0x0F)
  • 指向服务端返回的报文结构体的指针returnData,举个例子,客户端连接服务端,服务端会返回一个CONNEACK报文,同时我们也定义一个与CONNACK对应的结构体sreturnData就是指向这个结构体s

各种报文的结构体

没啥可介绍,把报文中需要设置的位、需要发送的数据等等提取出来就可以。
这里我只贴上几个重要的结构体的定义。

/* 连接服务端结构体 */
typedef struct
{
    unsigned char connectFlag;		//连接标志
    unsigned short keepAliveTime;	//保活时间
    const char *clientID;			//客户端ID
    const char *userName;			//用户名
    const char *password;			//密码
}MQTTConnectStruct_t;
/* 发布消息结构体 */
typedef struct
{
    char RETAIN;
    char QoS;
    char DUP;
    unsigned short messageID;	//报文标识符
    const char *topic;			//主题
    const char *payload;		//有效载荷
}MQTTPublishStruct_t;
/* 订阅主题结构体 */
typedef struct
{
    unsigned short messageID;	//报文标识符(客户端标识符)
    char QoS;
    const char *payload;		//有效载荷
}MQTTSubscribeStruct_t;

C语言实现MQTT协议(一)协议讲解

C语言实现MQTT协议(二)头文件介绍

C语言实现MQTT协议(三)源代码介绍及连接阿里云

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 15:59:31  更:2022-04-06 15:59:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:11:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码