第八篇 交叉编译华为云Iot SDK到Orangepi3B

本篇主要内容:

      • 一、交叉编译华为云Iot SDK依赖
        • 1.宿主机安装交叉编译工具链
        • (1)选择下载交叉编译工具链
        • (2)解压、添加环境变量、重启
        • 2.交叉编译依赖库
        • (0) 准备工作
        • (1) 交叉编译openssl
        • (2) 交叉编译paho
        • (3) 交叉编译zlib
        • (4) 交叉编译华为安全函数库
        • (★5)交叉编译libssh
        • (★6)交叉编译libnopoll
      • 二、移植SDK测试用例到OrangePi 3B运行
        • (1)配置交叉编译华为云Iot SDK
        • (2)在华为云上创建"设备接入ioTDA"服务
        • (3)在Orangepi 3B上运行测试用例
      • 三、在cmake项目中使用SDK
        • (1)将SDK交叉编译成动态库
        • (2)在cmake中引入SDK动态库


一、交叉编译华为云Iot SDK依赖

🔖开发板: Orangepi 3B

🔖目标操作系统: Orangepi3b_1.0.0_ubuntu_jammy_desktop_xfce_linux6.6.0-rc5

🔖编译平台: ubuntu22.04_x86_64虚拟机

🔖交叉编译器: gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
(注意:这里要清楚开发板和编译平台/宿主机各自的操作系统架构,下面才能正确选择交叉编译器)

🔖说明: 这里参考了官方提供的文档,可能由于版本更迭,按照文档的步骤有报错,而且文档没有提供可参考的交叉编译的使用说明,出错的解决方法网上也比较少,个人感觉不太友好。在文档中,分别编译了openssl库、paho库、zlib库、华为安全函数boundscheck库、libssh库、libnopoll库。下面是交叉编译这6个库移植到OrangePi3B的步骤,其中带★的库可以省略跳过,如果需求只是连接到iot平台,上报数据、发布命令,实现远程控制的基本功能的话,只需要移植不带★的库即可,在官方论坛有看到仅编译openssl和paho即可,经过测试不适用,还需要zlib和boundscheck,可能sdk新旧版本的不同。

1.宿主机安装交叉编译工具链
(1)选择下载交叉编译工具链

交叉编译工具链官方下载地址(国外)
​交叉编译工具链清华开源镜像站下载地址(国内)

在这里插入图片描述

(2)解压、添加环境变量、重启
sudo tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /mnt
sudo vi /etc/environment  
# 添加路径:/mnt/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin

在这里插入图片描述

sudo reboot		#重启永久生效,也可以使用命令source /etc/environment,仅在当前会话生效

输入aarch按tab键能补全aarch64-none-linux-gnu-就可以了,也可以使用aarch64-none-linux-gnu-gcc -v查看版本

2.交叉编译依赖库
(0) 准备工作
sudo mkdir ~/mqtt_sdk && cd mqtt_sdk	# 在根目录下新建目录,存放以下编译过程库的源码和过程文件
sudo git clone https://github.com/huaweicloud/huaweicloud-iot-device-sdk-c.git  # 下载SDK源码

下面开始交叉编译sdk所需要的库,所有的库源码都下载到~/mqtt_sdk下

(1) 交叉编译openssl
sudo wget https://www.openssl.org/source/openssl-3.2.0.tar.gz	# 下载源码
sudo tar -zxvf openssl-3.2.0.tar.gz && sudo rm openssl-3.2.0.tar.gz && cd openssl-3.2.0/ # 解压
sudo ./config no-asm --prefix=$(pwd)/_install --cross-compile-prefix=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-  
#配置,没有生成Makefile需要检查这一步,注意 要使用绝对路径,no-asm表示不使用汇编代码
# 接着我们vi打开生成的Makefile,搜索-m64有的可能是-m32,将这些链接选项都删掉,下面编译才不会报错

在这里插入图片描述

sudo make depend && sudo make -j20	#添加依赖并开始编译
sudo make install -j20	# 安装

编译完成后已经在顶层目录生成交叉编译的库文件,个人感觉也可以不用安装,直接拷贝这些文件。安装完成后,在源码目录下的_install/openssl/lib64生成的库文件,我们可以通过file libssl.so.3查看是否是交叉编译生成的目标平台文件

在这里插入图片描述

# 最后,直接把_install/目录下我们需要的库文件和头文件拷贝到SDK源码里
sudo cp _install/lib64/lib* ../huaweicloud-iot-device-sdk-c/lib/	# 库文件
sudo cp -r _install/include/openssl/ ../huaweicloud-iot-device-sdk-c/include/	# 头文件
(2) 交叉编译paho
sudo git clone https://github.com/eclipse/paho.mqtt.c.git	# 获取源码

编译paho库需要使用到openssl库以及头文件,这里需要在Makefile中先指定好

cd paho.mqtt.c/ && sudo vi Makefile #打开Makefile,搜索DOXYGEN_COMMAND这个字段,在下面加入链接openssl的路径,再指定编译器
LDFLAGS += -L/home/$(shell logname)/mqtt_sdk/openssl-3.2.0/_install/lib64 -lrt
CFLAGS += -I/home/$(shell logname)/mqtt_sdk/openssl-3.2.0/_install/includeCC ::= /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc	# 如图所示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

sudo make clean && sudo make -j20	# 开始编译,这里没有配置安装路径就不安装了
#编译完成后,可以在build/output/目录下看到生成的库和头文件,和前面一样,我们直接拷贝到桌面lib目录;
sudo cp build/output/libpaho-mqtt3* ../huaweicloud-iot-device-sdk-c/lib/	#拷贝库文件
sudo cp src/*.h ../huaweicloud-iot-device-sdk-c/include/base/  #头文件需要拷贝的sdk目录下include/base
(3) 交叉编译zlib
sudo wget https://github.com/madler/zlib/archive/v1.2.11.zip	# 下载源码
sudo unzip v1.2.11.zip	&& sudo rm v1.2.11.zip && cd zlib-1.2.11/	# 解压源码并删除压缩包
sudo CC=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc ./configure --prefix=$(pwd)/_install --libdir=$(pwd)/_install/lib --includedir=$(pwd)/_install/include	#配置交叉编译工具、安装路径等
sudo make -j20 && sudo make install	# 编译、安装
sudo cp _install/lib/libz.* ../huaweicloud-iot-device-sdk-c/lib/    # 拷贝库
sudo cp -r _install/include/ ../huaweicloud-iot-device-sdk-c/include/zlib    # 拷贝头文件
(4) 交叉编译华为安全函数库
sudo git clone https://gitee.com/openeuler/libboundscheck.git && cd libboundscheck/  # 获取源码
# vi打开Makefile,直接将CC?=gcc改成下面这样,sudo make在lib目录下生成libboundscheck.so即可
CC::=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc 
sudo make -j20	#编译
sudo cp lib/libboundscheck.so ../huaweicloud-iot-device-sdk-c/lib/       # 拷贝库文件

到这里就完成sdk依赖库的编译(对于只需要设备接入、上报数据和下发命令就足够了),以下是官方文档提到其它依赖库交叉编译


(★5)交叉编译libssh
sudo wget https://www.libssh.org/files/0.10/libssh-0.10.6.tar.xz	# 下载源码
sudo tar -xvf libssh-0.10.6.tar.xz && sudo rm libssh-0.10.6.tar.xz && cd libssh-0.10.6/	# 解压

libssh使用cmake构建项目,这里我们直接打开源码顶层目录的CMakeList.txt,在前面增加以下内容即可

# 指定交叉编译器
set(CROSS_COMPILE /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-)
set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)
set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++)# 指定INSTALL、README提到的几个选项
set(ZLIB_LIBRARY /home/zzk/mqtt_sdk/zlib-1.2.11/_install/lib)
set(ZLIB_INCLUDE_DIR /home/zzk/mqtt_sdk/zlib-1.2.11/_install/include)
set(OPENSSL_ROOT_DIR /home/zzk/mqtt_sdk/openssl-3.2.0)# 指定最后链接ld库的选项
link_libraries("-L /home/zzk/mqtt_sdk/openssl-3.2.0/_install/lib64 -lcrypto")
link_libraries("-L /home/zzk/mqtt_sdk/zlib-1.2.11/_install/lib -lz")

在这里插入图片描述

sudo mkdir build && cd build	# 新建build目录用于构建项目,源码中INSTALL和README有讲到
sudo cmake ..
sudo make -j20	# 编译,完成后再build/lib生成libssh.so.4.9.6;这里如果按照官方手册install就安装到了系统
sudo cp lib/libssh.so* ../../huaweicloud-iot-device-sdk-c/lib/  #拷贝库文件
sudo cp -r include/libssh/ ../../huaweicloud-iot-device-sdk-c/include/  #拷贝 头文件
(★6)交叉编译libnopoll

这个库的INSTALL和README只有一个官网地址,报错解决方法很难找。如果在编译过程中,遇到./nopoll_decl.h:539:1: error: empty enum is invalid.优先排查openssl链接路径,再考虑openssl编译过程是否正确

sudo wget http://www.aspl.es/nopoll/downloads/nopoll-0.4.8.b429.tar.gz	# 下载源码
sudo tar -xvf nopoll-0.4.8.b429.tar.gz && sudo rm nopoll-0.4.8.b429.tar.gz  # 解压
cd nopoll-0.4.8.b429/ 
sudo ./configure --prefix=$(pwd)/_install --host=aarch64-none-linux-gnu CC=/mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc CFLAGS=-I/home/zzk/mqtt_sdk/openssl-3.2.0/_install/include LDFLAGS=-L/home/zzk/mqtt_sdk/openssl-3.2.0/_install/lib64 LIBS="-lssl -lcrypto"	# 缺少LIBS会编译报错
sudo make -j20
# 在顶层目录_install下生成include和lib,同上,拷贝到SDK
sudo cp  _install/lib/libnopoll.* ../huaweicloud-iot-device-sdk-c/lib/
sudo cp _install/include/nopoll/*.h ../huaweicloud-iot-device-sdk-c/include/nopoll/

二、移植SDK测试用例到OrangePi 3B运行

(1)配置交叉编译华为云Iot SDK
cd huaweicloud-iot-device-sdk-c/	#切换到sdk目录
sudo vi Makefile	#打开顶层目录的Makefile

打开SDK顶层的Makefile,第一行就是编译器路径,修改为交叉编译工具链,如下

在这里插入图片描述

暂时还不编译,我们到华为云创建iot服务,再修改sdk目录下src/device_demo/device_demo.c,连接到平台进行测试
注意:目前sdk默认使用的是mqtt3.1.1,本版本也支持mqtt5.0,不过需要在顶层目录找到/include/util/mqttv5_util.h,搜索找到#define MQTTV5,并把注释取消;在Makefile中找到MQTTV5 := 1,把注释删掉即可完成编译。

在这里插入图片描述

在这里插入图片描述

(2)在华为云上创建"设备接入ioTDA"服务

大致步骤:开通服务->控制台创建产品->创建设备(详细步骤可见SDK源码中的README),之后会得到如下的MQTT连接参数(三元组)

在这里插入图片描述

sudo vi src/device_demo/device_demo.c	# 打开这个程序,填入连接参数

在这里插入图片描述

注意:按照sdk文档,理论上到这里编译出的示例程序在开发板运行是不会出错的,实际上运行效果却是连接不上服务器,程序也不会异常退出,一直卡在---- start test -----,这是比较坑的地方,如果遇到了这种异常,优先排查nopoll和openssl库的编译过程,因为在宿主机上编译,如果链接路径和头文件路径没有指定清楚,可能会被系统自带的x86 openssl库影响

sudo make -j20	# 编译程序,得到如下的可执行程序MQTT_Demo
file MQTT_Demo		# 查看该程序运行的平台
readelf -d MQTT_Demo | grep NEEDED		# 查看该程序运行时需要链接的库

除了可执行程序MQTT_Demo外,还需要将这些动态库拷贝到开发板,为了方便这里就直接拷贝sdk里的lib/目录

在这里插入图片描述

(3)在Orangepi 3B上运行测试用例

根据上面的信息,将可执行程序和链接库(包括其软链接)一起打包,上传到目标主机OrangePi 3B

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/lib/		#导入链接库环境变量
./MQTT_Demo	#运行,成功结果如下:

在这里插入图片描述

在这里插入图片描述

三、在cmake项目中使用SDK

到这里,我们已经完成SDK及其依赖库的交叉编译,为了将SDK集成到我们的项目中,这里可以将SDK交叉编译成动态库,我们可以在cmake或者Makefile中引入该动态库和相关头文件,就可以更方便地使用SDK了,并且像CLion、VScode等IDE也有代码提示,方便代码编写

(1)将SDK交叉编译成动态库
sudo vi Makefile	#打开顶层目录的Makefile,修改如下
sudo make clean		#清理
sudo make -j20		#重新编译

🔖 接着在顶层目录生成动态库libHWMQTT.so ,将动态库(及其依赖库)拷贝到项目中的lib目录,头文件拷贝到include目录,最后在CMakeList.txt或者是Makefile中去引入即可。
在这里插入图片描述
在这里插入图片描述

(2)在cmake中引入SDK动态库

🔖 CMakeList.txt(实际环境不唯一,仅供参考):

cmake_minimum_required(VERSION 3.22.1)# 交叉编译器
set(CROSS_COMPILE /mnt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-)
set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)
project(smartHome_v2.0_rebuild C)# 包含SDK头文件
set(SDK_INCLUDE_PATH ${CMAKE_SOURCE_DIR}/include)
include_directories(${SDK_INCLUDE_PATH})
include_directories(${SDK_INCLUDE_PATH}/protocol)
include_directories(${SDK_INCLUDE_PATH}/util)
include_directories(${SDK_INCLUDE_PATH}/base)
include_directories(${SDK_INCLUDE_PATH}/agentlite)
include_directories(${SDK_INCLUDE_PATH}/service)
# SDK依赖库链接路径
set(SDK_LIBS_PATH ${CMAKE_SOURCE_DIR}/lib)
link_libraries("-L ${SDK_LIBS_PATH} -lHWMQTT")
link_libraries("-L ${SDK_LIBS_PATH} -lpaho-mqtt3as")
link_libraries("-L ${SDK_LIBS_PATH} -lssl")
link_libraries("-L ${SDK_LIBS_PATH} -lcrypto")
link_libraries("-L ${SDK_LIBS_PATH} -lboundscheck")
link_libraries("-L ${SDK_LIBS_PATH} -lz")# 包含系统头文件和系统库
include_directories(/usr/include/cjson)
include_directories(/usr/include)
include_directories(/usr/local/include)# 本项目头文件
include_directories(src/device)# 源文件
set(OBJS src/light.c src/voice_ctl.c src/main.c  src/device/device.c)
set(CMAKE_C_STANDARD 11)
add_executable(main ${OBJS})

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【多商户开源-BSD- Fecmall 电商平台】

关于Fecmall Fecmall 关于,Fecmall介绍 Fecbbc开源BSD多商户系统,真正开源,商用免费授权的多商户系统 Fecmall系统简介: 全称为Fancy ECommerce Shop, 着重于电商架构的研发优化,全新定义商城的架构体系&…

Vue3 Cli5按需导入ElementPlus

1、安装环境 node:16.20.0 vue:3.2.36 vue/cli:5.0.0 element-plus:2.2.25 element-plus/icons-vue:2.0.10 unplugin-auto-import:0.16.1 // 当前环境用这个包,不然会提示各种错误 unplugin-vu…

《微信小程序开发从入门到实战》学习九十一

7.1 视图容器组件 7.1.2 scroll-view组件 scroll-view组件时是滚动的视图容器,可在竖直方向或水平方向上滚动,展示超出屏幕高度或宽度的内容。 使用竖直方向滚动时,需要通过wxss的height样式给scroll-view设置一个固定高度,超出…

在Spring Boot中使用ZXing开源库生成带有Logo的二维码

在上一篇文章的基础上,我们将进一步扩展功能,实现在生成的二维码中嵌入Logo图片。这样的二维码更具个性化和识别度。让我们逐步完成这个功能。 第一步:引入Logo图片 首先,准备一张用作Logo的图片,并确保它的大小适中…

HIS项目介绍、项目环境准备、版本控制介绍、Git基础、Git指针、Git分支、Git标签

案例1:项目环境准备 环境准备说明: 本阶段共使用虚拟机6台,操作系统使用RockyLinux8.6 环境准备要求: 最小化安装即可配置好主机名和IP地址搭建好yum源关闭防火墙和SELinux!!! 项目主机列表 主机名IP地址规格角色服务Progra…

上位机图像处理和嵌入式模块部署(windows opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 opencv可以运行在多个平台上面,当然windows平台也不意外。目前来说,opencv使用已经非常方便了,如果不想自己编译…

红黑树浅浅学习

红黑树浅浅学习 红黑树概念红黑树平衡性调整 红黑树概念 二叉树:二叉树是每个节点最多有两个子树的树结构。二叉查找树:又称“二叉搜索树”,左孩子比父节点小,右孩子比父节点大,还有一个特性就是”中序遍历“可以让结…

element-ui 打包流程源码解析——babel 相关

目录 1,babel-cli2,babel-core3,.babelrc3.1,presets3.2,plugins其他相关 该文章是为了更好的理解:element-ui 打包流程源码解析(上) 第2.5节 npm run build:utils 打包命令 "…

初识SQL注入

目录 注入攻击 SQL注入 手工注入 Information_schema数据库 自动注入 介绍一下这款工具:sqlmap 半自动注入 前面给大家通过学习练习的方式将XSS攻击的几种形式和一些简单的靶场和例题的演示,从本篇开始我将和小伙伴们通过边复习、边练习的方式来进…

Android 访问存储卡的三种主要的目录

Android 访问存储卡(即外部存储)通常涉及以下三种主要的目录: 1. 外部存储公共目录 (Public External Storage) 这些目录对所有应用都是可见的,并且不需要任何特殊权限来读取媒体文件。但是从Android 10(API 级别 29…

深入浅出hdfs-hadoop基本介绍

一、Hadoop基本介绍 hadoop最开始是起源于Apache Nutch项目,这个是由Doug Cutting开发的开源网络搜索引擎,这个项目刚开始的目标是为了更好的做搜索引擎,后来Google 发表了三篇未来持续影响大数据领域的三架马车论文: Google Fil…

猫用空气净化器哪些好?五款宠物空气净化推荐!

如今,养宠物的家庭越来越多了!家里因此变得更加温馨,但同时也会带来一些问题,比如异味和空气中的毛发可能会对健康造成困扰。 为了避免家中弥漫着异味,特别是来自宠物便便的味道,一款能够处理家里异味的宠…

第17章 项目干系人管理

文章目录 项目干系人管理包括识别能够影响项目或会受项目影响的人员、团体或组织,分析干系人对项目的期望和影响,制定管理策略有效调动干系人参与项目决策和执行。 17.1管理基础 17.1.1管理的重要性 每个项目都有干系人,他们会受到项目积极或…

PHP+SOCKET 服务端多进程处理多客户端请求 demo

服务端 $socket socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_bind($socket,0,95012) or die( server bind fail: . socket_strerror(socket_last_error())); socket_listen($socket,5);$child 0; //初始化子进程数 while(true){$client socket_accept($socket);$pi…

【大数据】YARN调度器及调度策略

YARN调度器 YARN负责作业资源调度,在集群中找到满足业务的资源,帮助作业启动任务,管理作业的生命周期。 ​ YARN技术架构 ​ 目前,Hadoop作业调度器主要有三种:先进先出调度器(First In First Out&…

electron-updater使用整理

参考文章: 手撸 Electron 自动更新,再繁琐也要搞懂它 - 掘金 (juejin.cn)Electron 自动更新,绕过 latest.yml 使用自定义接口 - 掘金 (juejin.cn)electron-updater实现热更新完整流程 - 掘金 (juejin.cn) 一、 配置 1. 安装electron-updat…

【正点原子STM32】搭建开发环境(安装MDK和器件支持包、DAP仿真器和ST LINK仿真器、CH340串口驱动)

一、常用开发工具简介 MDKDAP 二、安装MDK 1、MDK简介2、如何获取MDK3、安装MDK和器件支持包 三、安装仿真器驱动 DAP仿真器免驱ST LINK仿真器驱动安装方法 ST LINK驱动及教程 四、安装CH340 USB虚拟串口驱动 1、安装CH340 USB虚拟串口驱动2、为什么要安装CH340 USB虚拟…

Google ASPIRE框架:赋予大型语言模型(LLMs)自我评估的新动力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

大数据学习之Flink、比较不同框架的容错机制

第一章、Flink的容错机制 第二章、Flink核心组件和工作原理 第三章、Flink的恢复策略 第四章、Flink容错机制的注意事项 第五章、Flink的容错机制与其他框架的容错机制相比较 目录 第五章、Flink的容错机制与其他框架的容错机制相比较 Ⅰ、Flink的容错机制与其他框架的容…

springboot 整合 ElasticSearch 方法 (一)

下载 ES 相当于安装 MySQL, 可以在官网上下载 (链接在后面). 要注意安装的 ES 的版本要和项目中用的 Springboot 的版本对应. 比如我用的 Springboot 版本是 2.6, 所以ES要下载7.15 版本的. 官网链接: https://www.elastic.co/cn/downloads/elasticsearch 点右边这个查看更多…