819|0

6179

帖子

4

TA的资源

版主

楼主
 

【 正点原子瑞芯微RV1126测评】7 mqtt客户端编程 [复制链接]

 
本帖最后由 damiaa 于 2024-3-25 20:46 编辑
              【 正点原子瑞芯微RV1126测评】7 mqtt客户端编程
 
 
 

一、下载mqtt源码,路径如下:


 

 

 

二、下载到电脑后通过共享文件夹放到ubuntu里面。

 

编译mqtt源代码包


gcc交叉编译器安装目录如下:



把下载的mqtt源码包拷贝到下面的文件夹并解压,奇怪加压处理的是1.3.13不管他能用就行。

 

在cmake目录里面新建一个文件arm-linux-setup.cmake并且写入下面内容
在paho.mqtt.c-1.3.13目录里面建一个build目录。操作如下


进入到 build 目录下,执行 cmake 进行构建:

cmake -DCMAKE_BUILD_TYPE=Release - DCMAKE_INSTALL_PREFIX=/home/ alientek/tools/paho.mqtt.c-1.3.13/install - DCMAKE_TOOLCHAIN_FILE=../cmake/arm-linux-setup.cmake -DPAHO_WITH_SSL=TRUE - DPAHO_BUILD_SAMPLES=TRUE ..

 

Build目录执行make







注意:MQTT 客户端库依赖于 openssl 库,通常在移植 MQTT 客户端库的时候,需要先移植 openssl、交叉编译 openssl 得到库文件以及头文件,因为开发板出厂系统中已经移植好了 openssl 库,并且使用ubuntu里面的交叉编译器在编译工程源码的时候会链接 openssl 库(sysroot 路径指定的)。

 

执行sudo make install



 

在install目录里面有如下库文件,从上面也可以看出来头文件在哪些目录,这些就是后面我们板子上运行mqtt和编译应用程序要用到的。

 

二、编译mqtt客户端程序


应用程序的Cmake目录里面建立一个文件指定好编译路径

 

编写cmakefile.lst文件
从上面编译的时候知道库文件和头文件目录如下,在cmakefile.lst中设置正确


 

mqtt测试程序

  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <string.h>
  • #include <unistd.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • #include "MQTTClient.h" //包含MQTT客户端库头文件
  • /* ########################宏定义##################### */
  • #define BROKER_ADDRESS "192.168.0.1031883"
  • #define CLIENTID "clientid123456" //客户端id
  • #define USERNAME "mqtttest" //用户名
  • #define PASSWORD "123456" //密码
  • #define WILL_TOPIC "dt_mqtt/will" //遗嘱主题
  • #define LED_TOPIC "dt_mqtt/led" //LED主题
  • #define TEMP_TOPIC "dt_mqtt/temperature" //温度主题
  • #define ADC_TOPIC "dt_mqtt/adc" //ADC主题
  • /* ################################################# */
  • static int msgarrvd(void *context, char *topicName, int topicLen,
  • MQTTClient_message *message)
  • {
  • if (!strcmp(topicName, LED_TOPIC)) { //校验消息的主题
  • if (!strcmp("2", message->payload)) //如果接收到的消息是"2"则设置LED为呼吸灯模式
  • system("echo heartbeat > /sys/class/leds/user-led/trigger");
  • if (!strcmp("1", message->payload)) { //如果是"1"则LED常量
  • system("echo none > /sys/class/leds/user-led/trigger");
  • system("echo 1 > /sys/class/leds/user-led/brightness");
  • }
  • else if (!strcmp("0", message->payload)) {//如果是"0"则LED熄灭
  • system("echo none > /sys/class/leds/user-led/trigger");
  • system("echo 0 > /sys/class/leds/user-led/brightness");
  • }
  • }
  • MQTTClient_freeMessage(&message);
  • MQTTClient_free(topicName);
  • return 1;
  • }
  • static void connlost(void *context, char *cause)
  • {
  • printf("\nConnection lost\n");
  • printf(" cause: %s\n", cause);
  • }
  • int main(int argc, char *argv[])
  • {
  • MQTTClient client;
  • MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
  • MQTTClient_willOptions will_opts = MQTTClient_willOptions_initializer;
  • MQTTClient_message pubmsg = MQTTClient_message_initializer;
  • int rc;
  • /* 创建mqtt客户端对象 */
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_create(&client, BROKER_ADDRESS, CLIENTID,
  • MQTTCLIENT_PERSISTENCE_NONE, NULL))) {
  • printf("Failed to create client, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto exit;
  • }
  • /* 设置回调 */
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_setCallbacks(client, NULL, connlost,
  • msgarrvd, NULL))) {
  • printf("Failed to set callbacks, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto destroy_exit;
  • }
  • /* 连接MQTT服务器 */
  • will_opts.topicName = WILL_TOPIC; //遗嘱主题
  • will_opts.message = "Unexpected disconnection"; //遗嘱消息
  • will_opts.retained = 1; //保留消息
  • will_opts.qos = 0; //QoS0
  • conn_opts.will = &will_opts;
  • conn_opts.keepAliveInterval = 30; //心跳包间隔时间
  • conn_opts.cleansession = 0; //cleanSession标志
  • conn_opts.username = USERNAME; //用户名
  • conn_opts.password = PASSWORD; //密码
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_connect(client, &conn_opts))) {
  • printf("Failed to connect, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto destroy_exit;
  • }
  • printf("MQTT服务器连接成功!\n");
  • /* 发布上线消息 */
  • pubmsg.payload = "Online"; //消息的内容
  • pubmsg.payloadlen = 6; //内容的长度
  • pubmsg.qos = 0; //QoS等级
  • pubmsg.retained = 1; //保留消息
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_publishMessage(client, WILL_TOPIC, &pubmsg, NULL))) {
  • printf("Failed to publish message, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto disconnect_exit;
  • }
  • /* 订阅主题 dt_mqtt/led */
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_subscribe(client, LED_TOPIC, 0))) {
  • printf("Failed to subscribe, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto disconnect_exit;
  • }
  • /* 向服务端发布芯片温度信息 */
  • for ( ; ; ) {
  • MQTTClient_message tempmsg = MQTTClient_message_initializer;
  • char temp_str[10] = {0};
  • char adc_str[10] = {0};
  • int fd;
  • /* 读取温度值 */
  • fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);
  • read(fd, temp_str, sizeof(temp_str));//读取temp属性文件即可获取温度
  • close(fd);
  • /* 读取ADC值 */
  • fd = open("/sys/bus/iio/devices/iio\:device0/in_voltage3_raw", O_RDONLY);
  • read(fd, adc_str, sizeof(adc_str));//读取temp属性文件即可获取温度
  • close(fd);
  • /* 发布温度信息 */
  • tempmsg.payload = temp_str; //消息的内容
  • tempmsg.payloadlen = strlen(temp_str); //内容的长度
  • tempmsg.qos = 0; //QoS等级
  • tempmsg.retained = 1; //保留消息
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_publishMessage(client, TEMP_TOPIC, &tempmsg, NULL))) {
  • printf("Failed to publish message, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto unsubscribe_exit;
  • }
  • /* 发布ADC信息 */
  • tempmsg.payload = adcc_str; //消息的内容
  • tempmsg.payloadlen = strlen(adc_str); //内容的长度
  • tempmsg.qos = 0; //QoS等级
  • tempmsg.retained = 1; //保留消息
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_publishMessage(client, ADC_TOPIC, &tempmsg, NULL))) {
  • printf("Failed to publish message, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • goto unsubscribe_exit;
  • }
  • sleep(30); //每隔30秒 更新一次数据
  • }
  • unsubscribe_exit:
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_unsubscribe(client, LED_TOPIC))) {
  • printf("Failed to unsubscribe, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • }
  • disconnect_exit:
  • if (MQTTCLIENT_SUCCESS !=
  • (rc = MQTTClient_disconnect(client, 10000))) {
  • printf("Failed to disconnect, return code %d\n", rc);
  • rc = EXIT_FAILURE;
  • }
  • destroy_exit:
  • MQTTClient_destroy(&client);
  • exit:
  • return rc;
  • }


建立build空目录
Build目录里面执行
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/arm-linux-setup.cmake - DCMAKE_BUILD_TYPE=Release ..


 

执行make


这就是我们编译的客户端程序

 

四、编译的mqtt库拷贝到板子
将编译得到的库文件拷贝到开发板 Linux 系统/usr/lib 目录下,将编译得到的客户端程序mattclient拷贝到板子统/home/testmqtt下,如下所示:


修改执行属性,为实验准备。

 

五、实验准备


电脑安装mqtt的服务器。
准备好网线连接主板,并查看电脑的ip 看他们是不是同一网段,拼一下看通不通,安装好mqtt工具mqtt.fx-1.71在电脑里。

 

六、实验测试

主板运行mqttclient程序,电脑里mqtt.fx-1.71设置好ip和用户名,密码。面查看并看互动结果如下:
说明通了。注意:电脑上的mqtt.fx-1.71设置的clientid和板子不要一样。也就是一个网络里面clientid不能 重复!!!否则会有一个下线。
到此,通信就算是成功了。
好实验先到这里,谢谢大家。
查看本帖全部内容,请登录或者注册
点赞 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播 | AI之眼——安森美图像传感器 报名中
直播时间:2025年4月25日(周五)上午10:00-11:30
直播主题:AI之眼——安森美图像传感器
报名观看直播、直播间提问、填写问卷均有机会获得精美礼品!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 1

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表