【随手记】YOCTO下MQTT使用简记

张开发
2026/4/3 11:12:04 15 分钟阅读
【随手记】YOCTO下MQTT使用简记
本篇文章主要记录一下首次调试mqtt的过程全是实操流程YOCTO环境下安装mqtt先贴一下paho的bb文件安装SUMMARYIndustrial MQTT Client for Yocto LinuxLICENSEMITLIC_FILES_CHKSUMfile://${COREBASE}/meta/files/common-licenses/MIT;md50835ade698e0bcf8506eceed2064e710SRC_URIfile://mqtt_client.cS${WORKDIR}DEPENDSpaho-mqtt-cCFLAGS-Wall -Wextrado_compile(){${CC}${CFLAGS}${LDFLAGS}mqtt_client.c-omqtt_client -lpaho-mqtt3c-lpthread}do_install(){install-d${D}${bindir}install-m0755 mqtt_client${D}${bindir}/}本地kali环境下测试流程1、先安装docker#删除原有的docker源sudorm-f/etc/apt/sources.list.d/docker.list#添加正确的源echodeb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable|sudotee/etc/apt/sources.list.d/docker.list/dev/null#更新一下sudoaptcleansudoaptupdate#安装并启动sudoaptinstall-ydocker-ce docker-ce-cli containerd.iosudosystemctl startdockersudosystemctlenabledocker检测安装成功使用 docker --version 查看版本正常显示版本即代表安装成功2、安装EMQX这个是mqtt服务端后面用以测试我们的代码#下载离线安装包wgethttps://www.emqx.com/zh/downloads/broker/v5.8.0/emqx-5.8.0-debian12-amd64.deb#安装sudodpkg-iemqx-5.8.0-debian12-amd64.deb#启动sudosystemctl start emqxsudosystemctlenableemqx#查看状态 出现 active (running) 就是成功sudosystemctl status emqx同时也可以使用http://localhost:18083通过网页访问界面如下后续可以通过这个平台来测试代码可行性然后编写测试用例代码如下#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/sysinfo.h#includeMQTTClient.h//本地环境测试#defineADDRESStcp://localhost:1883#defineCLIENTIDkali_publisher#defineTOPICsystem/status/* ** 质量等级 ** 0 - 最多一次消息发送一次可能丢失不会重试。 ** 1 - 至少一次消息至少发送一次可能重复。 ** 2 - 只有一次消息确保只发送一次使用四步握手协议。客户端发布-broker回复接收确认-客户端回复释放-broker转发消息并向客户端回复确认 */#defineQOS1#defineTIMEOUT10000Ltypedefstruct{intbattery;longuptime_sec;longtraffic_rx;longtraffic_tx;}SystemStatus;//获取所有状态voidget_system_status(SystemStatus*status){// 获取电量FILE*fp_batfopen(/sys/class/power_supply/BAT0/capacity,r);if(fp_bat){fscanf(fp_bat,%d,status-battery);fclose(fp_bat);}else{status-battery-1;}// 获取开机时长structsysinfoinfo;sysinfo(info);status-uptime_secinfo.uptime;// 获取网卡流量FILE*fp_netfopen(/proc/net/dev,r);status-traffic_rx0;status-traffic_tx0;if(fp_net){charline[256];while(fgets(line,sizeof(line),fp_net)){if(strstr(line,eth0)){sscanf(line10,%ld %*s %*s %*s %*s %*s %*s %*s %ld,status-traffic_rx,status-traffic_tx);break;}}fclose(fp_net);}}intmain(){// 创建mqtt对象MQTTClient client;// MQTT 连接选项结构体MQTTClient_connectOptions conn_optsMQTTClient_connectOptions_initializer;// MQTT 消息结构体MQTTClient_message pubmsgMQTTClient_message_initializer;// 消息发布令牌MQTTClient_deliveryToken token;intrc;// 创建 MQTT 客户端MQTTClient_create(client,ADDRESS,CLIENTID,MQTTCLIENT_PERSISTENCE_NONE,NULL);conn_opts.cleansession1;// 连接brokerif((rcMQTTClient_connect(client,conn_opts))!MQTTCLIENT_SUCCESS){printf(连接失败错误码%d\n,rc);return-1;}printf(✅ MQTT 连接成功开始每5秒发布系统状态...\n\n);while(1){// 每次循环都重新获取最新数据SystemStatus sys_status;get_system_status(sys_status);// 拼接 JSON实际推荐使用cjson等库这里为了简单直接拼接字符串charpayload[512];sprintf(payload,{\battery\:%d,\uptime_sec\:%ld,\traffic_rx_bytes\:%ld,\traffic_tx_bytes\:%ld},sys_status.battery,sys_status.uptime_sec,sys_status.traffic_rx,sys_status.traffic_tx);// 发布消息pubmsg.payloadpayload;pubmsg.payloadlenstrlen(payload);pubmsg.qosQOS;pubmsg.retained1;MQTTClient_publishMessage(client,TOPIC,pubmsg,token);MQTTClient_waitForCompletion(client,token,TIMEOUT);// 打印printf( 5秒周期发布成功%s\n,payload);sleep(5);// 5秒后再次发布}// 这里放一下断链、销毁接口永远不会走到这里,如果需要优雅退出可以捕获信号并在信号处理函数中断开连接和销毁客户端//MQTTClient_disconnect(client, TIMEOUT);//MQTTClient_destroy(client);return0;}通过上述代码。你可以在mqttx上面接收到对应的消息如下

更多文章