MQTT客户端应用编程及接口分析

30 篇文章 2 订阅

MQTT客户端应用编程及接口分析

MQTT协议简介

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。

客户端服务端安装

1.安装

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppasudo 
sudo apt-get install mosquitto mosquitto-clients
  1. 测试
mosquitto_sub -h test.mosquitto.org -t "#" -v

如果发现大量的消息滚动刷屏,说明该客户端链接成功

客户端开发包

SDK包下载地址:
eclipse/paho.mqtt.c

编译及生产lib和头文件
cmake -DMAKE_INSTALL_PREFIX=./output
make && make install
在这里插入图片描述

API接口介绍

接口类型头文件备注
Paho MQTT C Client Library MQTTClient.h非现程安全
Paho Asynchronous MQTT C Client LibraryMQTTAsync.h线程安全
数据结构
typedef void* MQTTClient;
typedef void* MQTTAsync;
MQTTClient 库接口
  1. MQTTClient_create() : MQTTClient.h
int MQTTClient_create(MQTTClient *handle,
                      const char *serverURI,
                      const char *clientId,
                      int         persistence_type,
                      void *      persistence_context 
)

此函数创建一个 MQTT 客户端,以便连接到指定的服务器并使用指定的持久性存储(参考 MQTTClient_persistence 函数)。另外,与创建函数对应的是销毁函数 MQTTClient_destroy()。

  1. MQTTClient_connect() : MQTTClient.h
int MQTTClient_connect(MQTTClient handle,
                       MQTTClient_connectOptions *options
)

此函数尝试使用指定的选项将以前创建的客户端(调用 MQTTClient_create() 函数)连接到 MQTT 服务器。如果要启用异步消息和状态通知,调用该函数之前必须先调用 MQTTClient_setCallbacks() 函数。

  1. MQTTClient_destroy() : MQTTClient.h
void MQTTClient_destroy(MQTTClient *handle)

此函数用于释放分配给 MQTT 客户端的内存(调用 MQTTClient_create() 函数)。当不再需要客户端时,应该调用它。

4.MQTTClient_disconnect() : MQTTClient.h

int MQTTClient_disconnect(MQTTClient handle, int timeout)

此函数尝试断开客户端与 MQTT 服务器的连接。为了让客户端有时间完成对调用此函数时正在传递的消息的处理,需要指定一个超时期限。当超时期限过期时,即使仍有未完成的消息确认,客户端也会断开连接。下一次客户端连接到同一服务器时,任何未完成的 QoS 1 或 2 消息将根据前一个连接和新连接的清理设置重试(参考 MQTTClient_connectOptions.cleansession 和 MQTTClient_connect())。

  1. MQTTClient_free() : MQTTClient.h
void MQTTClient_free(void *ptr)

此函数释放 MQTT C Client 库分配的内存,特别是主题名称。当 client 库和应用程序使用不同版本的 C 编译器编译时,在 Windows 上需要这样做。因此,在释放任何 MQTT C Client 分配的内存时,始终使用此函数是一个很好的策略。

  1. MQTTClient_freeMessage() : MQTTClient.h
void MQTTClient_freeMessage(MQTTClient_message ** msg)

此函数释放分配给 MQTT 消息的内存,包括分配给消息有效负载的附加内存。当完全处理消息时,客户端应用程序调用此函数。重要提示:此函数不释放分配给消息主题字符串的内存。客户端应用程序负责使用 MQTTClient_free() 库函数释放此内存。

  1. MQTTClient_isConnected() : MQTTClient.h
int MQTTClient_isConnected(MQTTClient handle)

此函数允许客户端应用程序测试某个 client 与 MQTT 服务器连接情况,已连接返回 true,否则返回 false。

  1. MQTTClient_publish() : MQTTClient.h
int MQTTClient_publish(MQTTClient                handle,
                       const char *              topicName,
                       int                       payloadlen,
                       const void *              payload,
                       int                       qos,
                       int                       retained,
                       MQTTClient_deliveryToken *dt
)

此函数试图将消息发布到给定主题(另请参见 MQTTClient_publishMessage 函数)。当此函数成功返回时,将发出 MQTTClient_deliveryToken。如果客户端应用程序需要测试 QoS1 和 QoS2 消息的成功传递,可以异步或同步地完成(参考 异步与同步客户端应用程序、 MQTTClient_waitForCompletion 和 MQTTClient_deliveryComplete 函数)。

  1. MQTTClient_publishMessage() : MQTTClient.h
int MQTTClient_publishMessage(MQTTClient                handle,
                              const char *              topicName,
                              MQTTClient_message *      msg,
                              MQTTClient_deliveryToken *dt
)

此函数试图将消息发布到给定主题(另请参见 MQTTClient_publish 函数)。当此函数成功返回时,将发出一个 MQTTClient_deliveryToken 令牌。如果客户端应用程序需要测试 QoS1 和 QoS2 消息的成功传递,可以异步或同步地完成(参考 异步与同步客户端应用程序、 MQTTClient_waitForCompletion 和 MQTTClient_deliveryComplete 函数)。

  1. MQTTClient_receive() : MQTTClient.h
int MQTTClient_receive(MQTTClient            handle,
                       char **               topicName,
                       int *                 topicLen,
                       MQTTClient_message ** message,
                       unsigned long         timeout
)

此函数执行传入消息的同步接收。只有当客户端应用程序没有设置回调方法以支持消息的异步接收时,才应该使用它(请参见 异步与同步客户端应用程序 以及 MQTTClient_setCallbacks 函数)。使用此函数可以编写单线程客户端订阅者应用程序。当调用时,此函数将阻塞,直到下一条消息到达或指定的超时过期为止(另请参见 MQTTClient_yield 函数)。

重要提示:应用程序在处理完成后必须释放分配给主题和消息的内存(请参见 MQTTClient_freeMessage 函数)。

  1. MQTTClient_setCallbacks() : MQTTClient.h
int MQTTClient_setCallbacks(MQTTClient                    handle,
                            void *                        context,
                            MQTTClient_connectionLost *   cl,
                            MQTTClient_messageArrived *   ma,
                            MQTTClient_deliveryComplete * dc
)

此函数设置特定客户端的回调函数。如果客户端应用程序不使用特定的回调,请将相关参数设置为 NULL。调用 MQTTClient_setCallbacks() 将客户端置于多线程模式。任何必要的消息确认和状态通信都在后台处理,不需要客户端应用程序的任何干预。更多信息请参见 异步与同步客户端应用程序。

注意:在调用此函数时,MQTT 客户端必须断开连接。

  1. MQTTClient_setDisconnected() : MQTTClient.h
int MQTTClient_setDisconnected(MQTTClient handle,
                               void *     context,
                               MQTTClient_disconnected *co 
)

设置客户端的 MQTTClient_disconnected() 回调函数。如果从服务器接收到断开连接的数据包,将调用这个函数。该函数只对 MQTT V5 及以上版本有效。

  1. MQTTClient_setPublished() : MQTTClient.h
int MQTTClient_setPublished(MQTTClient             handle,
                            void *                 context,
                            MQTTClient_published * co
)
MQTTAsync 库接口
  • MQTTAsync_connect() : MQTTAsync.h
  • MQTTAsync_create() : MQTTAsync.h
  • MQTTAsync_createWithOptions() : MQTTAsync.h
  • MQTTAsync_destroy() : MQTTAsync.h
  • MQTTAsync_disconnect() : MQTTAsync.h
  • MQTTAsync_free() : MQTTAsync.h
  • MQTTAsync_freeMessage() : MQTTAsync.h
  • MQTTAsync_getPendingTokens() : MQTTAsync.h
  • MQTTAsync_getVersionInfo() : MQTTAsync.h
  • MQTTAsync_global_init() : MQTTAsync.h
  • MQTTAsync_isComplete() : MQTTAsync.h
  • MQTTAsync_isConnected() : MQTTAsync.h
  • MQTTAsync_malloc() : MQTTAsync.h
  • MQTTAsync_reconnect() : MQTTAsync.h
  • MQTTAsync_send() : MQTTAsync.h
  • MQTTAsync_sendMessage() : MQTTAsync.h
  • MQTTAsync_setAfterPersistenceRead() : MQTTAsync.h
  • MQTTAsync_setBeforePersistenceWrite() : MQTTAsync.h
  • MQTTAsync_setCallbacks() : MQTTAsync.h
  • MQTTAsync_setConnected() : MQTTAsync.h
  • MQTTAsync_setConnectionLostCallback() : MQTTAsync.h
  • MQTTAsync_setDeliveryCompleteCallback() : MQTTAsync.h
  • MQTTAsync_setDisconnected() : MQTTAsync.h
  • MQTTAsync_setMessageArrivedCallback() : MQTTAsync.h
  • MQTTAsync_setTraceCallback() : MQTTAsync.h
  • MQTTAsync_setTraceLevel() : MQTTAsync.h
  • MQTTAsync_setUpdateConnectOptions() : MQTTAsync.h
  • MQTTAsync_strerror() : MQTTAsync.h
  • MQTTAsync_subscribe() : MQTTAsync.h
  • MQTTAsync_subscribeMany() : MQTTAsync.h
  • MQTTAsync_unsubscribe() : MQTTAsync.h
  • MQTTAsync_unsubscribeMany() : MQTTAsync.h
  • MQTTAsync_waitForCompletion() : MQTTAsync.h
  • MQTTProperties_add() : MQTTProperties.h
  • MQTTProperties_copy() : MQTTProperties.h
  • MQTTProperties_free() : MQTTProperties.h
  • MQTTProperties_getNumericValue() : MQTTProperties.h
  • MQTTProperties_getNumericValueAt() : MQTTProperties.h
  • MQTTProperties_getProperty() : MQTTProperties.h
  • MQTTProperties_getPropertyAt() : MQTTProperties.h
  • MQTTProperties_hasProperty() : MQTTProperties.h
  • MQTTProperties_len() : MQTTProperties.h
  • MQTTProperties_propertyCount() : MQTTProperties.h
  • MQTTProperties_read() : MQTTProperties.h
  • MQTTProperties_write() : MQTTProperties.h
  • MQTTProperty_getType() : MQTTProperties.h
  • MQTTPropertyName() : MQTTProperties.h
  • MQTTReasonCode_toString() : MQTTReasonCodes.h

###代码使用案例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTAsync.h"

#if !defined(_WIN32)
#include <unistd.h>
#else
#include <windows.h>
#endif

#if defined(_WRS_KERNEL)
#include <OsWrapper.h>
#endif

#define ADDRESS     "tcp://mqtt.eclipseprojects.io:1883"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "MQTT Examples"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L

int finished = 0;

void connlost(void *context, char *cause)
{
	MQTTAsync client = (MQTTAsync)context;
	MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
	int rc;

	printf("\nConnection lost\n");
	printf("     cause: %s\n", cause);

	printf("Reconnecting\n");
	conn_opts.keepAliveInterval = 20;
	conn_opts.cleansession = 1;
	if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to start connect, return code %d\n", rc);
 		finished = 1;
	}
}

void onDisconnectFailure(void* context, MQTTAsync_failureData* response)
{
	printf("Disconnect failed\n");
	finished = 1;
}

void onDisconnect(void* context, MQTTAsync_successData* response)
{
	printf("Successful disconnection\n");
	finished = 1;
}

void onSendFailure(void* context, MQTTAsync_failureData* response)
{
	MQTTAsync client = (MQTTAsync)context;
	MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer;
	int rc;

	printf("Message send failed token %d error code %d\n", response->token, response->code);
	opts.onSuccess = onDisconnect;
	opts.onFailure = onDisconnectFailure;
	opts.context = client;
	if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to start disconnect, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}
}

void onSend(void* context, MQTTAsync_successData* response)
{
	MQTTAsync client = (MQTTAsync)context;
	MQTTAsync_disconnectOptions opts = MQTTAsync_disconnectOptions_initializer;
	int rc;

	printf("Message with token value %d delivery confirmed\n", response->token);
	opts.onSuccess = onDisconnect;
	opts.onFailure = onDisconnectFailure;
	opts.context = client;
	if ((rc = MQTTAsync_disconnect(client, &opts)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to start disconnect, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}
}


void onConnectFailure(void* context, MQTTAsync_failureData* response)
{
	printf("Connect failed, rc %d\n", response ? response->code : 0);
	finished = 1;
}


void onConnect(void* context, MQTTAsync_successData* response)
{
	MQTTAsync client = (MQTTAsync)context;
	MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
	MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
	int rc;

	printf("Successful connection\n");
	opts.onSuccess = onSend;
	opts.onFailure = onSendFailure;
	opts.context = client;
	pubmsg.payload = PAYLOAD;
	pubmsg.payloadlen = (int)strlen(PAYLOAD);
	pubmsg.qos = QOS;
	pubmsg.retained = 0;
	if ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to start sendMessage, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}
}

int messageArrived(void* context, char* topicName, int topicLen, MQTTAsync_message* m)
{
	/* not expecting any messages */
	return 1;
}

int main(int argc, char* argv[])
{
	MQTTAsync client;
	MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
	int rc;

	if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to create client object, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}

	if ((rc = MQTTAsync_setCallbacks(client, NULL, connlost, messageArrived, NULL)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to set callback, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}

	conn_opts.keepAliveInterval = 20;
	conn_opts.cleansession = 1;
	conn_opts.onSuccess = onConnect;
	conn_opts.onFailure = onConnectFailure;
	conn_opts.context = client;
	if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
	{
		printf("Failed to start connect, return code %d\n", rc);
		exit(EXIT_FAILURE);
	}

	printf("Waiting for publication of %s\n"
         "on topic %s for client with ClientID: %s\n",
         PAYLOAD, TOPIC, CLIENTID);
	while (!finished)
		#if defined(_WIN32)
			Sleep(100);
		#else
			usleep(10000L);
		#endif

	MQTTAsync_destroy(&client);
 	return rc;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: MQTTClient-C是一个基于C语言开发的MQTT客户端库。MQTT是一种轻量级的消息传输协议,被广泛应用物联网等场景中。MQTTClient-C可以方便地实现MQTT客户端的开发,提供了一套简洁易用的接口。 首先,使用MQTTClient-C可以快速实现MQTT客户端的开发,无需从头开始设计和实现MQTT协议的通讯细节。库中封装了MQTT协议的各种细节,包括连接、订阅、发布等操作,开发者只需调用相应的接口即可完成。 其次,MQTTClient-C提供了多种不同层次的应用编程接口,可满足不同开发需求。开发者可以根据自身需求选择合适的API进行开发,使得代码更加简洁易读。 此外,MQTTClient-C还提供了丰富的可配置选项,可以根据实际需求灵活配置客户端参数。比如可以设置重连间隔、心跳频率、最大重试次数等,以适应各种网络环境和设备限制。 最后,MQTTClient-C具备良好的可移植性和跨平台性。它可以在不同的操作系统和硬件平台上运行,包括嵌入式设备和服务器等。这使得开发者能够更加灵活地选择合适的平台进行开发和部署。 综上所述,应用MQTTClient-C可以方便地实现MQTT客户端的开发,并且具备灵活的可配置性和跨平台性,是一种非常实用的工具。无论是在物联网领域还是其他场景中,MQTTClient-C都可以帮助开发者快速搭建稳定可靠的MQTT系统。 ### 回答2: MQTTClient-C是一个用于C语言的MQTT客户端库,用于与MQTT代理服务器进行通信。该库提供了一组API,使开发者能够轻松地建立与MQTT服务器的连接,发布和订阅消息。 使用MQTTClient-C,可以实现以下功能: 1. 建立与MQTT服务器的连接:使用MQTTClient-C,可以通过提供MQTT服务器的地址和端口号来建立与服务器的连接。 2. 发布消息:通过调用MQTTClient-C提供的API,可以向MQTT服务器发布消息。可以指定消息的主题,质量、消息内容等参数。 3. 订阅消息:使用MQTTClient-C,可以通过提供订阅的主题来订阅特定的消息。可以指定消息的质量等级。 4. 处理消息回调:MQTTClient-C允许开发者为接收到的消息注册回调函数。当接收到订阅的消息时,会调用注册的回调函数进行处理。 5. 支持SSL连接:MQTTClient-C支持通过SSL加密来建立与MQTT服务器的安全连接。 6. 消息持久化:MQTTClient-C支持消息持久化,即当未成功发送的消息被储存在本地,直到成功发送为止。 7. 支持遗嘱消息:MQTTClient-C支持发布遗嘱消息,即当客户端异常断开连接时,会自动发布指定的遗嘱消息。 总结来说,MQTTClient-C是一个功能强大的MQTT客户端库,适用于C语言开发者。它提供了一组API,使开发者能够轻松建立与MQTT服务器的连接,发布和订阅消息,并支持SSL连接和消息持久化等功能,有助于开发者构建可靠和安全的MQTT应用程序。 ### 回答3: MQTTClient-C 是一种用于在C语言环境下进行MQTT通信的开源客户端库。它基于MQTT协议实现了与MQTT代理服务器进行数据交互的功能。 MQTTClient-C 提供了一套简单易用的API,使开发人员能够快速地在C语言项目中实现MQTT通信功能。使用MQTTClient-C,我们可以轻松地订阅主题、发布消息以及处理订阅消息的回调。 MQTTClient-C 的特点包括: 1. 轻量级:MQTTClient-C 代码库非常小巧,可以轻松地嵌入到各种资源有限的嵌入式系统中,适用于各种物联网设备。 2. 跨平台:MQTTClient-C 支持各种主流操作系统,如Windows、Linux、FreeRTOS等,可以在不同平台上无缝地进行移植和集成。 3. 稳定可靠:MQTTClient-C 实现了MQTT 3.1.1版本的协议,支持QoS级别0、1和2,可以确保消息的可靠传输及交付。 4. 灵活可扩展:MQTTClient-C 提供了多样化的配置选项,可以根据需要进行灵活的参数设置,从而满足不同场景的需求。 使用MQTTClient-C,我们可以快速地实现物联网设备与服务器之间的即时通信和数据交换。例如,我们可以将传感器数据通过MQTTClient-C发布到MQTT代理服务器上,并通过订阅机制实现实时数据的传输和处理。同时,我们也可以通过MQTTClient-C订阅特定主题,实时接收服务器发送的指令或控制信息。 总而言之,MQTTClient-C 是一个功能强大且易于使用的C语言MQTT客户端库,使我们能够快速地开发出高效可靠的物联网应用程序。无论是开发嵌入式设备还是服务器端应用MQTTClient-C 都是一个非常有价值的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

疯狂的蕉尼基

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

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

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

打赏作者

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

抵扣说明:

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

余额充值