RV1126B移植mosquitto并且写C语言调用

整体的思路

  1. 下载并编译libuuid-1.0.3 mosquitto openssl
  2. 将编译后的mosquitto相关文件拷贝到板子里
  3. 交叉编译C语言控制代码
  4. 执行运行指令

我是在公司的服务器上搭建的RV1126B编译环境,前期的环境配置很重要,要使用1126的编译器,mosquitto我选的版本是1.5.1,不是最新版本

创建一个自己的文件夹demo 把libuuid-1.0.3 mosquitto openssl放进去

c 复制代码
在demo中配置
临时设置编译 指定交叉编译器
export PATH=$PATH:/home/deepano/share/dyf/kuwa0312/RV1126B/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin

export CC=aarch64-none-linux-gnu-gcc
export CXX=aarch64-none-linux-gnu-g++
export AR=aarch64-none-linux-gnu-ar
export RANLIB=aarch64-none-linux-gnu-ranlib

编译libuuid

c 复制代码
#进入libuuid文件夹后
./Configure linux-armv4 no-asm shared --prefix=/home/deepano/share/zsf/mosquitto-arm/openssl

#prefix是指定安装的位置
然后执行make 和 make install

编译openssl

c 复制代码
./Configure linux-armv4 no-asm shared --prefix=/home/deepano/share/zsf/mosquitto-arm/openssl

然后执行make 和 make install
如果出现
make编译出现arm-linux-gnueabihf-gcc: error: unrecognized command line option '-m64'

执行sed -i 's/-m64//g' Makefile

编译mosquitto

c 复制代码
export CFLAGS="-I/home/deepano/share/zsf/mosquitto-arm/openssl/include -I/home/deepano/share/zsf/mosquitto-arm/libuuid-1.0.3/include"
export LDFLAGS="-L/home/deepano/share/zsf/mosquitto-arm/openssl/lib -L/home/deepano/share/zsf/mosquitto-arm/libuuid-1.0.3/lib -luuid -lssl -lcrypto"

上面两个步骤是指定编译后的openssl 和libuuid库文件 头文件
 安装到指定目录
make install DESTDIR=/home/deepano/share/zsf/mosquitto-arm/mosquitto

然后执行make 和 make install

如何以上的操作步骤都没有问题你应该会得到以下文件

下面的操作步骤比较重要了

  1. 将mosquitto/etc/mosquitto/mosquitto.conf.example 文件拷贝到开发板/etc/下 命名为mosquitto.conf
  2. 将mosquitto/usr/local/bin下三个文件拷贝到 开发板/bin/下
  3. 将mosquitto/usr/local/lib 下文件拷贝到 开发板/lib下
  4. 将mosquitto/usr/local/sbin下文件拷贝到 开发板/bin/下
  5. 将libuuid-1.0.3/lib下文件拷贝到 开发板/lib下
  6. 将openssl/lib下文件拷贝到 开发板/lib下

开发板上运行 mosquitto_sub 看看是否运行正常,如果运行正常 那么说明环境没有问题了,下面开始编写C代码

c 复制代码
/*
 * MQTT 发布者示例 - 适用于 RV1126B
 * 编译时需要链接 libmosquitto
 */

#include <mosquitto.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

/* 连接回调:当客户端收到 CONNACK 时调用 */
void on_connect(struct mosquitto *mosq, void *obj, int reason_code)
{
    printf("连接结果: %s\n", mosquitto_connack_string(reason_code));
    if (reason_code != 0) {
        mosquitto_disconnect(mosq);
    }
}

/* 发布回调:确认消息已发送 */
void on_publish(struct mosquitto *mosq, void *obj, int mid)
{
    printf("消息已发布,mid: %d\n", mid);
}

/* 模拟读取传感器数据 */
int get_temperature(void)
{
    sleep(1);  // 模拟传感器采样频率
    return rand() % 100;
}

/* 发布传感器数据 */
void publish_sensor_data(struct mosquitto *mosq)
{
    char payload[20];
    int temp;
    int rc;

    temp = get_temperature();
    snprintf(payload, sizeof(payload), "{\"temperature\":%d}", temp);

    rc = mosquitto_publish(mosq, NULL, "/example/temperature", 
                           strlen(payload), payload, 1, false);
    if (rc != MOSQ_ERR_SUCCESS) {
        fprintf(stderr, "发布失败: %s\n", mosquitto_strerror(rc));
    }
}

int main(int argc, char *argv[])
{
    struct mosquitto *mosq;
    int rc;

    if (argc < 2) {
        fprintf(stderr, "用法: %s <broker_ip>\n", argv[0]);
        return 1;
    }

    char *broker = argv[1];

    /* 初始化 libmosquitto */
    mosquitto_lib_init();

    /* 创建客户端实例 */
    mosq = mosquitto_new(NULL, true, NULL);
    if (mosq == NULL) {
        fprintf(stderr, "创建客户端失败\n");
        return 1;
    }

    /* 设置回调函数 */
    mosquitto_connect_callback_set(mosq, on_connect);
    mosquitto_publish_callback_set(mosq, on_publish);

    /* 连接到 broker */
    rc = mosquitto_connect(mosq, broker, 1883, 60);
    if (rc != MOSQ_ERR_SUCCESS) {
        fprintf(stderr, "连接失败: %s\n", mosquitto_strerror(rc));
        mosquitto_destroy(mosq);
        return 1;
    }

    /* 启动网络循环(后台线程) */
    rc = mosquitto_loop_start(mosq);
    if (rc != MOSQ_ERR_SUCCESS) {
        fprintf(stderr, "启动循环失败: %s\n", mosquitto_strerror(rc));
        mosquitto_destroy(mosq);
        return 1;
    }

    /* 主循环:定期发布数据 */
    while (1) {
        publish_sensor_data(mosq);
    }

    mosquitto_lib_cleanup();
    return 0;
}

C代码的交叉编译要注意

在你的代码目录下配置好环境

c 复制代码
export CFLAGS="-I/home/deepano/share/zsf/mosquitto-arm/mosquitto/usr/local/include"
export LDFLAGS="-L/home/deepano/share/zsf/mosquitto-arm/libuuid-1.0.3/lib -L/home/deepano/share/zsf/mosquitto-arm/mosquitto/usr/local/lib -L/home/deepano/share/zsf/mosquitto-arm/openssl/lib"

$CC -o mqtt_publisher mqtt_publisher.c $CFLAGS $LDFLAGS -lmosquitto -lssl -lcrypto -luuid

然后就放到开发板上运行了

附件是我编译好的文件 可以直接使用

相关推荐
爱编码的小八嘎几秒前
C语言完美演绎6-9
c语言
weixin_6495556712 分钟前
C语言程序设计第四版(何钦铭、颜晖)第十一章指针进阶之奇数值结点链表
c语言·开发语言·链表
书到用时方恨少!27 分钟前
Python os 模块使用指南:系统交互的瑞士军刀
开发语言·python
我是大猴子28 分钟前
事务失效的几种情况以及是为什么(详解)
java·开发语言
呜喵王阿尔萨斯37 分钟前
argc & argv
c语言·c++
爱编码的小八嘎1 小时前
C语言完美演绎6-1
c语言
她叫我大水龙1 小时前
MSYS2的C/C++,python2,python3编译环境安装脚本
c语言·c++
武藤一雄1 小时前
C#:nameof 运算符全指南
开发语言·microsoft·c#·.net·.netcore
带娃的IT创业者1 小时前
WeClaw_40_系统监控与日志体系:多层次日志架构与Trace追踪
java·开发语言·python·架构·系统监控·日志系统·链路追踪
Y001112361 小时前
JDBC原理
java·开发语言·数据库·jdbc