// mqtt_client.cpp : 实现文件
//
#include "stdafx.h"
#include "MqttCilent.h"
#include "mqtt_client.h"
// Cmqtt_client
IMPLEMENT_DYNAMIC(Cmqtt_client, CWnd)
Cmqtt_client::Cmqtt_client()
{
}
Cmqtt_client::~Cmqtt_client()
{
}
BEGIN_MESSAGE_MAP(Cmqtt_client, CWnd)
END_MESSAGE_MAP()
// Cmqtt_client 消息处理程序
/*******************************************************************************
源码是MFC(C++)在记事本内改过来的,因为离职后家里只有这个版本程序,
没有了stm32源码,可能删减\修改得有点问题
*******************************************************************************/
/**
* @brief 连接服务器的帧数据
* @param ClientID:设备ID
* @param will:遗嘱,用于掉线时mqtt协议通知服务器
* @param Username:服务器账号 mqtt服务器和数据库一样是可以设置账号密码的
* @param Password:服务器密码 如果没有账号密码,则随便传入一个参数,服务器没有设置密码就不会检测
* @retval
* @example
* 客户端连接服务器首先使用此函数组帧
**/
int Cmqtt_client::ConnectMqtt(char *ClientID,char *will, char *Username, char *Password)
{
int ClientIDLen = strlen(ClientID);
int WillLen = strlen(will);
int UsernameLen = strlen(Username);
int PasswordLen = strlen(Password);
int DataLen = 0;
int Index = 2;
int i = 0;
// DataLen = 12 + 2 + 2 + 2 + ClientIDLen + WillLen + UsernameLen + PasswordLen;
mqtt.MqttSendData[0] = 0x10; //MQTT Message Type CONNECT
//剩余长度(不包括固定头部)
mqtt.MqttSendData[Index++] = 0; // Protocol Name Length MSB
mqtt.MqttSendData[Index++] = 4; // Protocol Name Length LSB
mqtt.MqttSendData[Index++] = 'M'; // ASCII Code for M
mqtt.MqttSendData[Index++] = 'Q'; // ASCII Code for Q
mqtt.MqttSendData[Index++] = 'T'; // ASCII Code for T
mqtt.MqttSendData[Index++] = 'T'; // ASCII Code for T
mqtt.MqttSendData[Index++] = 4; // MQTT Protocol version = 4
mqtt.MqttSendData[Index++] = 0xc2; // conn flags
mqtt.MqttSendData[Index++] = 0; // Keep-alive Time Length MSB
mqtt.MqttSendData[Index++] = 60; // Keep-alive Time Length LSB 60S心跳包
mqtt.MqttSendData[Index++] = (0xff00 & ClientIDLen) >> 8;// Client ID length MSB
mqtt.MqttSendData[Index++] = 0xff & ClientIDLen; // Client ID length LSB
for (i = 0; i < ClientIDLen; i++)
{
mqtt.MqttSendData[Index + i] = ClientID[i];
}
Index = Index + ClientIDLen;
//遗嘱
if (WillLen > 0)
{
mqtt.MqttSendData[Index++] = (0xff00 & WillLen) >> 8;
mqtt.MqttSendData[Index++] = 0xff & WillLen;
for (i = 0; i < WillLen; i++)
{
mqtt.MqttSendData[Index + i] = will[i];
}
Index = Index + WillLen;
mqtt.MqttSendData[Index++] =0;
mqtt.MqttSendData[Index++] = 0;
}
if (UsernameLen > 0)
{
mqtt.MqttSendData[Index++] = (0xff00 & UsernameLen) >> 8;//username length MSB
mqtt.MqttSendData[Index++] = 0xff & UsernameLen; //username length LSB
for (i = 0; i < UsernameLen; i++)
{
mqtt.MqttSendData[Index + i] = Username[i];
}
Index = Index + UsernameLen;
}
else
{
Index = Index + 2;
}
if (PasswordLen > 0)
{
mqtt.MqttSendData[Index++] = (0xff00 & PasswordLen) >> 8;//password length MSB
mqtt.MqttSendData[Index++] = 0xff & PasswordLen; //password length LSB
for (i = 0; i < PasswordLen; i++)
{
mqtt.MqttSendData[Index + i] = Password[i];
}
Index = Index + PasswordLen;
}
else
{
Index = Index + 2;
}
mqtt.MqttSendData[1] = Index-2;
return Index;
}
/**
* @brief MQTT订阅/取消订阅数据打包函数
* @param SendData
* @param topic 主题
* @param qos 消息等级 个人觉得qos=0就行,否则可能出现一个指令收到多次,没有试过不清楚
* @param whether 订阅=true/取消=false 请求包
* @retval
* @example
**/
int Cmqtt_client::MqttSubscribeTopic( int topiclen,char *topic, char qos, char whether)
{
int i = 0, index = 0;
if (whether)
mqtt.MqttSendData[index++] = 0x82; //0x82 //消息类型和标志 SUBSCRIBE 订阅
else
mqtt.MqttSendData[index++] = 0xA2; //0xA2 取消订阅
mqtt.MqttSendData[index++] = topiclen + 5; //剩余长度(不包括固定头部)
mqtt.MqttSendData[index++] = 0; //消息标识符,高位
mqtt.MqttSendData[index++] = 0x01; //消息标识符,低位
mqtt.MqttSendData[index++] = (0xff00 & topiclen) >> 8; //主题长度(高位在前,低位在后)
mqtt.MqttSendData[index++] = 0xff & topiclen; //主题长度
for (i = 0; i < topiclen; i++)
{
mqtt.MqttSendData[index + i] = topic[i];
}
index = index + topiclen;
if (whether)
{
mqtt.MqttSendData[index] = qos;//QoS级别
index++;
}
return index;
}
/**
* @brief MQTT发布数据打包函数
* @param mqtt_message
* @param topic 主题
* @param qos 消息等级
* @retval
* @example
**/
int Cmqtt_client::MqttPublishData(int topic_length,char * topic, int message_length ,char * message, char qos)
{
int i, index = 0;
static int id = 0;
mqtt.MqttSendData[index++] = 0x32; // MQTT Message Type PUBLISH
if (qos)
mqtt.MqttSendData[index++] = 2 + topic_length + 2 + message_length;//数据长度
else
mqtt.MqttSendData[index++] = 2 + topic_length + message_length; // Remaining length
mqtt.MqttSendData[index++] = (0xff00 & topic_length) >> 8;//主题长度
mqtt.MqttSendData[index++] = 0xff & topic_length;
for (i = 0; i < topic_length; i++)
{
mqtt.MqttSendData[index + i] = topic[i];//拷贝主题
}
index += topic_length;
if (qos)
{
mqtt.MqttSendData[index++] = (0xff00 & id) >> 8;
mqtt.MqttSendData[index++] = 0xff & id;
id++;
}
for (i = 0; i < message_length; i++)
{
mqtt.MqttSendData[index + i] = message[i];//拷贝数据
}
index += message_length;
return index;
}
没有合适的资源?快使用搜索试试~ 我知道了~
MQTT 组帧 连接 发布 订阅
共2个文件
h:1个
cpp:1个
需积分: 11 3 下载量 179 浏览量
2022-03-16
15:35:39
上传
评论
收藏 3KB ZIP 举报
温馨提示
MQTT 组帧 连接 发布 订阅
资源详情
资源评论
资源推荐
收起资源包目录
MQTT函数.zip (2个子文件)
MQTT函数
mqtt_client.cpp 6KB
mqtt_client.h 1KB
共 2 条
- 1
在道路上奔跑
- 粉丝: 13
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0