4970|2

244

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【正点原子i.MX93开发板】5-移植mqtt,上传数据到云端 [复制链接]

本帖最后由 qiao--- 于 2024-7-25 14:11 编辑

正点原子的这块i.MX93开发板具有两块千兆网口,本期测评将测评这块开发板的网络传输的能力。移植mqtt库到开发板上,最后上传到云端方便数据的记录和查看。

本期测评将分为下面的几个步骤:

  1. 交叉编译mqtt库
  2. 编写mqtt测试程序
  3. 测试并观察结果

 1.交叉编译mqtt库

我这次使用的mqtt库是paho.mqtt.c,这个库还需要依赖ssl库,因此在交叉编译paho.mqtt.c之前还需要交叉编译ssl库。

先给出两个库的下载连接:

paho.mqtt.c-1.3.13 :https://github.com/eclipse/paho.mqtt.c/archive/refs/tags/v1.3.13.tar.gz

openssl-OpenSSL_1_1_1g:https://codeload.github.com/openssl/openssl/tar.gz/refs/tags/OpenSSL_1_1_1g

将这两个库下载好后拷贝到我们的交叉编译服务器上,并解压。

 

先交叉编译openssl,可以输入下面的命令

tar zxf openssl-OpenSSL_1_1_1g.tar.gz
cd openssl-OpenSSL_1_1_1g/
./config no-asm shared no-async --prefix=`pwd`/ssl_result  --cross-compile-prefix=aarch64-none-linux-gnu-
sed -i 's/-m64//' Makefile
make && make install

 

最后会生成下面的文件

 

紧接着编译paho.mqtt.c,使用下面的命令

tar zxf paho.mqtt.c-1.3.13.tar.gz
mkdir paho.mqtt.c_result/bin -p
mkdir paho.mqtt.c_result/include -p
mkdir paho.mqtt.c_result/lib -p
mkdir paho.mqtt.c_result/share/man/man1 -p
cd paho.mqtt.c-1.3.13/
make  CC=aarch64-none-linux-gnu-gcc CFLAGS:="-I `pwd`/../ssl_result/include" LDFLAGS:="-L `pwd`/../ssl_result/lib"
make install

最后会生成下面的文件

 

到这里库就编译完成了。库的目录结构如下:

 

2.编写mqtt测试程序

我这里是上传自己的捏造的数据。首先需要定义自己的连接参数,如下图所示。

 

然后编写,连接到iot的函数,代码如下所示。

其次是编写上传Topic的函数。

  

最后在主函数中编写调用逻辑,我这里就是连接上了之后,就每隔5S上传一次数据。

 

总的代码如下所示。

#include "MQTTClient.h" //包含 MQTT 客户端库头文件

#define CLIENTID "" //客户端 id
#define USERNAME "" //用户名
#define PASSWORD "" //密码
#define BROKER_ADDRESS ""
#define HOSTNAME ""
#define HOSTPORT ""
#define TOPIC ""

MQTTClient client ;
MQTTClient_connectOptions conn_opts ;
MQTTClient_willOptions will_opts ;
MQTTClient_message pubmsg ;

int msgarrvd(void *context, char *topicName, int topicLen,MQTTClient_message *message)
{
    return 1;
}
void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf(" cause: %s\n", cause);
}

void connect_mqtt()
{
    conn_opts = MQTTClient_connectOptions_initializer;
    will_opts = MQTTClient_willOptions_initializer;
    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;
        return;
    }
    /* 设置回调 */
    if (MQTTCLIENT_SUCCESS !=
    (rc = MQTTClient_setCallbacks(client, NULL, connlost,
    msgarrvd, NULL))) {
        printf("Failed to set callbacks, return code %d\n", rc);
        rc = EXIT_FAILURE;
        return;
    }
    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;
    return;
    }
    printf("MQTT 服务器连接成功!\n");
    return;
}
int count = 0;
int MQTT_Publish(){
    int rc;
    count++;
    MQTTClient_message tempmsg = MQTTClient_message_initializer;
    sprintf(payload, "{\"services\": [{\"service_id\":\"ZD\",\"properties\": {\"TEMP\": %f,\"HUMI\": %f}}]}", count,count+1); // 格式化要发布的数据
    tempmsg.payload = payload; //消息的内容
    tempmsg.payloadlen = strlen(payload); //内容的长度
    tempmsg.qos = 0; //QoS 等级
    tempmsg.retained = 1; //保留消息
    if (MQTTCLIENT_SUCCESS !=
    (rc = MQTTClient_publishMessage(client, TOPIC, &tempmsg, NULL))) {
        printf("Failed to publish message, return code %d\n", rc);
        rc = EXIT_FAILURE;
        return  rc;
    }
    return  0;
}

int main(){
     connect_mqtt();
    while (1)
    {
        MQTT_Publish();
        msleep(5000); // 每隔5s
    }
    
    return  0;
}

我这里编写了一个 CMakeLists.txt,用cmake来管理项目,里面的代码如下所示:

 

cmake_minimum_required(VERSION 3.10)
project(mqtt)

# 设置目标平台和交叉编译器
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm64)
set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-none-linux-gnu-g++)

link_directories(${PROJECT_SOURCE_DIR}/paho.mqtt.c_result/lib)

# 指定包含目录
include_directories(${PROJECT_SOURCE_DIR}/paho.mqtt.c_result/include)

# 添加源文件
set(SRC_LIST main.c)

# 创建可执行文件
add_executable(main ${SRC_LIST})

# 链接
target_link_libraries(main paho-mqtt3c)

最后交叉编译一下我们项目,就可以了。

mkdir build
cd build
cmake ..
make

 

3.测试并观察结果

我们将我们的项目拷贝到我们板子上,然后运行他。

首先要保证自己的网络没问题,我这里使用是网口,可以ping一下baidu看看网络连接情况。

 

我的板子连接情况如下所示。

 

进入板子的终端运行程序,效果如下。

 

华为云有设备连接显示在线。

 

同时也有数据不断的上传上来。

 

我的代码逻辑是湿度比温度高一,上传的准确无误。

总结:本期测评测评了正点原子i.MX93开发板的物联网的能力,该开发板能够准确的上传数据到华为云,网络连接的稳定性很好。

mqtt.7z (602.85 KB, 下载次数: 2)

最新回复

大佬的文章,一如既住那么优秀,感谢分享mqtt的知识分享!   详情 回复 发表于 2024-7-25 16:20
点赞 关注

回复
举报

6987

帖子

11

TA的资源

版主

沙发
 

大佬的文章,一如既住那么优秀,感谢分享mqtt的知识分享!

点评

感谢贴友捧场  详情 回复 发表于 2024-7-31 10:57
 
 

回复

244

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2024-7-25 16:20 大佬的文章,一如既住那么优秀,感谢分享mqtt的知识分享!

感谢贴友捧场

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表