本帖最后由 qiao--- 于 2024-7-25 14:11 编辑
正点原子的这块i.MX93开发板具有两块千兆网口,本期测评将测评这块开发板的网络传输的能力。移植mqtt库到开发板上,最后上传到云端方便数据的记录和查看。
本期测评将分为下面的几个步骤:
- 交叉编译mqtt库
- 编写mqtt测试程序
- 测试并观察结果
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开发板的物联网的能力,该开发板能够准确的上传数据到华为云,网络连接的稳定性很好。