pahomqtt_c++ demo qt环境编译

本文深入探讨了MQTT协议的实现细节,包括如何使用C++进行MQTT客户端的编程,通过实例展示了不同服务质量级别的消息发布与接收流程,涵盖了TCP连接、MQTT连接、订阅、发布、取消订阅等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define MQTTCLIENT_QOS2 1

#include <memory.h>

#include "MQTTClient.h"

#define DEFAULT_STACK_SIZE -1

#include "linux.cpp"

int arrivedcount = 0;



void messageArrived(MQTT::MessageData& md)
{
    MQTT::Message &message = md.message;

    printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n", 
		++arrivedcount, message.qos, message.retained, message.dup, message.id);
    printf("Payload %.*s\n", (int)message.payloadlen, (char*)message.payload);
}


int main(int argc, char* argv[])
{   
    IPStack ipstack = IPStack();  //new一个连接对象
    float version = 0.3;
    const char* topic = "mbed-sample";   //订阅的主题

    MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);  //new一个mqtt连接对象
    
    const char* hostname = "iot.eclipse.org";          //域名
    int port = 1883;                                   //端口号
    printf("Connecting to %s:%d\n", hostname, port);
    int rc = ipstack.connect(hostname, port);          //建立tcp连接到iot.eclipse.org服务器
	if (rc != 0)
	    printf("rc from TCP connect is %d\n", rc);
 
	printf("MQTT connecting\n");
                                                                      //详见 MQTTPacket_connectData 定义
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer; //初始化一个mqtt消息结构体,并且写入固定头
    data.MQTTVersion = 3;                                             //定义mqtt版本
    data.clientID.cstring = (char*)"mbed-icraggs";                    //定义客户端标识符
   //data.username.cstring;                                           //定义用户名
   //data.password.cstring;                                           //定义密码
    data.keepAliveInterval = 10;                                      //定义时间间隔内
    data.cleansession = 1;                                            //定义会话清除标识

    rc = client.connect(data);                       //建立mqtt连接
    if (rc != 0)
	    printf("rc from MQTT connect is %d\n", rc);
	printf("MQTT connected\n");
    
    rc = client.subscribe(topic, MQTT::QOS2, messageArrived);  //订阅主题 , 服务质量 , 以及传入接收函数指针
    if (rc != 0)
        printf("rc from MQTT subscribe is %d\n", rc);

    MQTT::Message message;                //初始化mqtt信息变量message

    // QoS 0
    char buf[100];
    sprintf(buf, "Hello World!  QoS 0 message from app version %f", version);
    message.qos = MQTT::QOS0;             //定义服务质量
    message.retained = false;             //是否任何新的订阅者都会收到这条消息
    message.dup = false;                  //是否是重发的消息 发送者若在一段时间内接收不到PUBACK消息,发送者需要打开DUB标记为1,然后重新发送PUBLISH消息
    message.payload = (void*)buf;         //消息内容
    message.payloadlen = strlen(buf)+1;   //消息内容长度
    rc = client.publish(topic, message);  //发布消息
	if (rc != 0)
		printf("Error %d from sending QoS 0 message\n", rc);
    else while (arrivedcount == 0)        //等待订阅消息接收
        client.yield(100);                //延时?
        
    // QoS 1
	printf("Now QoS 1\n");
    sprintf(buf, "Hello World!  QoS 1 message from app version %f", version);
    message.qos = MQTT::QOS1;
    message.payloadlen = strlen(buf)+1;
    rc = client.publish(topic, message);
	if (rc != 0)
		printf("Error %d from sending QoS 1 message\n", rc);
    else while (arrivedcount == 1)
        client.yield(100);
        
    // QoS 2
    sprintf(buf, "Hello World!  QoS 2 message from app version %f", version);
    message.qos = MQTT::QOS2;
    message.payloadlen = strlen(buf)+1;
    rc = client.publish(topic, message);
	if (rc != 0)
		printf("Error %d from sending QoS 2 message\n", rc);
    while (arrivedcount == 2)
        client.yield(100);
    
    rc = client.unsubscribe(topic);  //取消订阅
    if (rc != 0)
        printf("rc from unsubscribe was %d\n", rc);
    
    rc = client.disconnect();        //断开mqtt
    if (rc != 0)
        printf("rc from disconnect was %d\n", rc);
    
    ipstack.disconnect();            //断开tcp
    
    printf("Finishing with %d messages received\n", arrivedcount);
    
    return 0;
}

 

源码:

链接:https://pan.baidu.com/s/12ebMkdV9qYSpH6G0Tpyecg 
提取码:609w 
复制这段内容后打开百度网盘手机App,操作更方便哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

交叉编译之王 hahaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值