当前位置:   article > 正文

Linux环境下使用Eclipse Paho C 实现(MQTT Client)异步方式发布Message_paho c库

paho c库

目录

概述

1 认识Eclipse Paho C

1.1 paho.mqtt.c简介

1.2 下载和安装paho.mqtt.c

2 异步发布和订阅消息

2.1 编写异步发布消息功能

2.1.1 初始化MQTT参数

2.1.2 初始化函数

2.1.2 发布消息函数

2.1.3 完整代码

2.2 编译代码和测试

3 验证MQTT Client功能

3.1 EMQX服务器上查看MQTT Client

3.2 MQTT.fx订阅MQTTAsync


概述

本文主要介绍在linux环境(ubuntu)环境下,下载和安装Eclipse Paho C MQTT 软件包,还编写一个范例实现异步发布Message的功能,并使用基于EMQX的服务验证其功能,还使用MQTT.fx订阅消息,以验证发布消息功能的可靠性。

1 认识Eclipse Paho C

1.1 paho.mqtt.c简介

paho.mqtt.c是一个使用C语言编写的MQTT客户端库,用于连接和与MQTT代理进行通信。它是Eclipse Paho项目的一部分,旨在为C开发人员提供一个易于使用、可靠和高性能的MQTT解决方案。

这个库允许开发人员创建MQTT客户端,该客户端可以连接到远程MQTT代理,并实现与代理之间的消息发布、订阅和管理等功能。paho.mqtt.c库提供了一套简单而直观的API,使开发人员能够轻松地使用MQTT协议进行通信。

paho.mqtt.c库支持多种MQTT协议版本,包括MQTTv3.1和MQTTv3.1.1。它提供了多种操作和配置选项,以适应不同的需求和场景。该库还提供了一些高级功能,例如支持SSL/TLS加密、持久化会话、消息保持和遗嘱消息等。

paho.mqtt.c库在多个平台上都可以使用,包括Windows、Linux、macOS和嵌入式系统等。它具有良好的可移植性和可扩展性,可以方便地与其他C语言项目集成。

总之,paho.mqtt.c是一个强大而灵活的MQTT客户端库,适用于使用C语言开发MQTT应用程序的开发人员。它简化了与MQTT代理的通信过程,并提供了丰富的功能和选项,使开发人员能够快速构建高性能的MQTT应用程序。

1.2 下载和安装paho.mqtt.c

登录mqtt官网,点击Software,可以看见如下页面,选择Eclipse Paho C进入下载页面

https://mqtt.org/

点击链接后,会跳转到下载页面,在该页面下载paho.mqtt.c

笔者选择使用命令直接安装该软件包,具体操作步骤如下:

Step -1: 下载软件包执行命令:

git clone https://github.com/eclipse/paho.mqtt.c.git

step-2: 进入paho.mqtt.c目录,执行make

  1. cd paho.mqtt.c
  2. make

系统会自动编译代码,等待编译结果。

编译完成后,会自动生成build文件,这时可以安装

step-3 : 执行如下命令就可以安装软件

sudo make install

2 异步发布和订阅消息

2.1 编写异步发布消息功能

2.1.1 初始化MQTT参数

参数功能介绍:

参数名称参数值描述
ADDRESStcp://192.168.1.11:1883mqtt broker的IP地址
CLIENTIDmqtt_ubuntu_asys设备ID
TOPICMQTTAsync发布的Topic
PAYLOAD12.56Topic下的payload
QOS1服务质量等级=1
TIMEOUT10000L等待超时时间(us)
USERNAMEmqtt_ubuntu_user终端认证username
PASSWORD123456终端认证username对应的password

在代码中,其需要填写的位置如下:

2.1.2 初始化函数

初始化MQTT终端需要完成以下3个步骤:

step-1: 创建MQTT Client

step-2: 配置回调函数

step-3: 连接服务器

具体实现代码如下:

代码85行:创建MQTT Client,需要传入服务器IP和Client ID信息

代码93行:配置callback函数,函数原型,见源码

代码100行: 心跳包时间间隔设置为60s

代码101行: 清除会话 标记设置为1,不接受离线消息

代码102行: 配置设备终端用户

代码103行: 配置设备终端用户password

2.1.2 发布消息函数

要实现发布消息功能,需要将payload及其相关参数填到MQTTClient_message定义的数据结构中,下面介绍整个public message 函数的功能。

代码59行: 装载payload

代码60行:payload的字符长度

代码61行:消息服务等级参数

代码62行:配置为不保留消息

代码64行:使用MQTTClient_publishMessage函数发布消息

代码74行:比较返回来token的值,如果数据发送成功,token值会自动加1

2.1.3 完整代码

创建test_01_Asynchronous.c,编写如下代码:

  1. /***************************************************************
  2. Copyright 2024-2029. All rights reserved.
  3. 文件名 : test_01_Asynchronous.c
  4. 作者 : tangmingfei2013@126.com
  5. 版本 : V1.0
  6. 描述 : mqtt异步发布和订阅消息
  7. 日志 : 初版V1.0 2024/03/13
  8. ***************************************************************/
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "MQTTClient.h"
  13. #include <unistd.h>
  14. #define ADDRESS "tcp://192.168.1.11:1883"
  15. #define CLIENTID "mqtt_ubuntu_asys"
  16. #define TOPIC "MQTTAsync"
  17. #define PAYLOAD "12.56"
  18. #define QOS 1
  19. #define TIMEOUT 10000L
  20. #define USERNAME "mqtt_ubuntu_user"
  21. #define PASSWORD "123456"
  22. static MQTTClient client;
  23. static MQTTClient_deliveryToken deliveredtoken;
  24. static MQTTClient_message pubmsg = MQTTClient_message_initializer;
  25. static MQTTClient_deliveryToken token;
  26. static MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
  27. void delivered(void *context, MQTTClient_deliveryToken dt)
  28. {
  29. printf("Message with token value %d delivery confirmed\n", dt);
  30. deliveredtoken = dt;
  31. }
  32. int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
  33. {
  34. printf("Message arrived\n");
  35. printf(" topic: %s\n", topicName);
  36. printf(" message: %.*s\n", message->payloadlen, (char*)message->payload);
  37. MQTTClient_freeMessage(&message);
  38. MQTTClient_free(topicName);
  39. return 1;
  40. }
  41. void connlost(void *context, char *cause)
  42. {
  43. printf("\nConnection lost\n");
  44. printf(" cause: %s\n", cause);
  45. }
  46. void public_mqttMsg()
  47. {
  48. int rc;
  49. pubmsg.payload = PAYLOAD;
  50. pubmsg.payloadlen = (int)strlen(PAYLOAD);
  51. pubmsg.qos = QOS;
  52. pubmsg.retained = 1;
  53. deliveredtoken = 0;
  54. if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS)
  55. {
  56. printf("Failed to publish message, return code %d\n", rc);
  57. rc = EXIT_FAILURE;
  58. }
  59. else
  60. {
  61. printf("Waiting for publication of %s\n"
  62. "on topic %s for client with ClientID: %s\n",
  63. PAYLOAD, TOPIC, CLIENTID);
  64. while (deliveredtoken != token)
  65. {
  66. usleep(10000000L);
  67. }
  68. }
  69. }
  70. int main(int argc, char* argv[])
  71. {
  72. int rc;
  73. if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
  74. MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS)
  75. {
  76. printf("Failed to create client, return code %d\n", rc);
  77. rc = EXIT_FAILURE;
  78. goto exit;
  79. }
  80. if ((rc = MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered)) != MQTTCLIENT_SUCCESS)
  81. {
  82. printf("Failed to set callbacks, return code %d\n", rc);
  83. rc = EXIT_FAILURE;
  84. goto destroy_exit;
  85. }
  86. conn_opts.keepAliveInterval = 60;
  87. conn_opts.cleansession = 0;
  88. conn_opts.username = USERNAME; //用户名
  89. conn_opts.password = PASSWORD; //密码
  90. if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
  91. {
  92. printf("Failed to connect, return code %d\n", rc);
  93. rc = EXIT_FAILURE;
  94. goto destroy_exit;
  95. }
  96. while(1)
  97. {
  98. public_mqttMsg();
  99. }
  100. if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS)
  101. {
  102. printf("Failed to disconnect, return code %d\n", rc);
  103. rc = EXIT_FAILURE;
  104. }
  105. destroy_exit:
  106. MQTTClient_destroy(&client);
  107. exit:
  108. return rc;
  109. }

2.2 编译代码和测试

使用如下命令编译代码

 gcc test_01_Asynchronous.c -lpaho-mqtt3a

执行.out文件后,可以看见,MQTT Client发布消息成功了,服务器端收到消息后,token值会自动加1

3 验证MQTT Client功能

3.1 EMQX服务器上查看MQTT Client

在ubuntu上运行MQTT Client后,EMQX服务器会显示MQTT Client的运行状态,登录EMQX服务器可以看见

为了测试方便,置retained = 1,这样EMQX服务器会保留Client发布的payload,便于在服务器上查看client发布的数据。

在EMQX服务器上,打开保留消息面板,查看MQTTAsync主题的payload,其和发布的值一致。

3.2 MQTT.fx订阅MQTTAsync

要使用MQTT.fx MQTT Client工具订阅MQTTAsync,首先保证MQTT.fx能正常连接至EMQX服务器

连接成功后,可以在MQTT.fx 上订阅MQTTAsync,订阅成功后,MQTT.fx subscribe面板会打印MQTTAsync的log

同时,在EMQX服务器上的订阅管理面板上可以看见:MQTT.fx 订阅Topic 为MQTTAsync的消息

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/485784
推荐阅读
相关标签
  

闽ICP备14008679号