第八篇 交叉编译华为云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, 着重于电商架构的研发优化,全新定义商城的架构体系&…

在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使用已经非常方便了,如果不想自己编译…

红黑树浅浅学习

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

初识SQL注入

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

深入浅出hdfs-hadoop基本介绍

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

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

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

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

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

【正点原子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领…

springboot 整合 ElasticSearch 方法 (一)

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

展厅设计更好的方法

一、与公司形象契合 在展厅规划时必定要留意公司的LOGO、主色调,以及企业文明。在展现时使用丰满的展厅规划传达出企业的理念。而在功用设置上,应当考虑内涵功用,从展厅作业人员的视点动身,为展厅作业人员提供杰出的环境&#xff…

【Java】---反射:Class、Filed、Constructor、Method

【Java】—反射 文章目录 【Java】---反射一、反射1.1 概念1.2 操作步骤 二、Class类2.1 概念2.2 方法2.2.1 getName()2.2.2 getSimpleName()2.2.3 getPackage()2.2.4 getSuperclass()2.2.5 getInterfaces() 三、Field类3.1 概念3.2 方法3.2.1 setAccessible(Boolean b)3.2.2 s…

关于图像分割项目的可视化脚本

1. 前言 之前实现了目标检测和图像分类任务的可视化脚本,本章将最后一个分割任务的可视化脚本实现 效果展示如下: 代码会在当前目录保存展示好的图片,从左到右依次为,原图、mask图、mask覆盖在原图的掩膜图 关于目标检测的可视化…

【二】从零到1设计一个丧葬行业小程序

1、准备工作 1-1、服务器准备 腾讯云轻量级服务器 4核2G 地址: http://1.14.34.13/ 购买域名 www.pengyangyan.work (备案中) 图片服务器:七牛云 1-2、环境配置 服务器 docker容器部署 https://blog.csdn.net/pengyangyan/article/d…

app如何实现悬浮框滚动到那个模块定位到那。

如图&#xff1a; 使用uniapp内置方法 onPageScroll 获取到滚动了多少。 其实拿到屏幕滚动多少就很简单了&#xff0c;下面是思路。 tap栏切换效果代码就不贴了。直接贴如何到那个模块定位到哪&#xff0c;和点击定位到当前模块。 <view v-if"show" class&qu…

HarmonyOS鸿蒙应用开发( 四、重磅组件List列表组件使用详解)

List列表组件&#xff0c;是一个非常常用的组件。可以说在一个应用中&#xff0c;它的身影无处不在。它包含一系列相同宽度的列表项&#xff0c;适合连续、多行呈现同类数据&#xff0c;如商品列表、图片列表和和文本列表等。ArkUI 框架采用 List 容器组件创建列表&#xff08;…

某国有企业后备人才培养机制建设

某电力勘测设计院始建于1958年&#xff0c;是中国电力建设集团有限公司旗下的大型电力工程咨询公司。伴随着中国电力事业的发展&#xff0c;已发展为具备甲级电力工程规划、咨询、勘测、设计、总承包、环境及安全管理评价、地质灾害勘察、评估与治理、光电建筑一体化及发电专项…