一、开发环境

虚拟机:Ubuntu16.04
gcc版本:5.4.0
arm-linux-gnueabihf-gcc版本:8.2.1

二、下载IoTDA CSDK

1、新建文件夹huawei_iotda,用来存放相关文件:

mkdir huawei_iotda 

2、进入huawei_iotda:

cd huawei_iotda

3、克隆华为云物联网设备侧CSDK代码:

git clone https://github.com/huaweicloud/huaweicloud-iot-device-sdk-c.git

SDK依赖openssl、paho、zlib库,因此接下来先编译相关动态链接库。

三、编译openssl库

1、从openssl官网 https://www.openssl.org/source 下载最新版本的openssl(如openssl-1.1.1l.tar.gz),上传到linux编译机上(笔者的目录为/home/lyy/work/huawei_iotda),并解压文件:

tar -vxzf openssl-1.1.1l.tar.gz

2、新建openssl,用于存放openssl生成的相关文件:

mkdir openssl

3、进入openssl源码目录:

cd openssl-1.1.1l

4、运行 setarch i386 ./config no-asm shared --prefix=/home/lyy/work/huawei_iotda/openssl --cross-compile-prefix=arm-linux-gnueabihf-命令配置openssl并生成Makefile;
5、修改Makefile。Makefile中使用" -m32",如果不去掉的话在后面的编译过程中将产生错误,所以需要找到" -m32"将其删除。搜索所有 “-m32”,然后删除掉,保存并退出:

vi Makefile
:/-m32

6、编译出库。 在openssl源码目录下,运行make depend命令添加依赖:

make depend

运行make命令开始编译:

make

再运行如下命令进行安装:

make install

在配置的openssl安装目录下/home/lyy/work/huawei_iotda/openssl找到lib目录,有生成的库文件:
libcrypto.so.1.1、libssl.so.1.1和软链接libcrypto.so、libssl.so,请将这些文件拷贝到SDK的lib文件夹下(同时将/home/lyy/work/huawei_iotda/openssl/include底下的openssl文件夹拷贝到SDK的include目录下)。

四、编译paho库

1、访问github下载地址https://github.com/eclipse/paho.mqtt.c, 下载paho.mqtt.c源码:

git clone  https://github.com/eclipse/paho.mqtt.c

2、进入paho源码目录;

cd paho.mqtt.c

3、修改编译工具链、添加头文件目录和动态链接库

CC = arm-linux-gnueabihf-gcc

CFLAGS += -I/home/lyy/work/huawei_iotda/openssl/include
LDFLAGS += -L/home/lyy/work/huawei_iotda/openssl/lib/ -lrt -lssl -lcrypto

在这里插入图片描述

4、编译,执行清空命令:

make clean

执行编译命令:

make

5、编译完成后,可以在build/output目录下看到编译成功的库。
6、拷贝paho库文件 当前SDK仅用到了libpaho-mqtt3as,请将文件libpaho-mqtt3as.so和libpaho-mqtt3as.so.1拷贝到SDK的lib文件夹下(同时将paho源码目录下src文件夹里的头文件(MQTTAsync.h/MQTTClient.h/MQTTClientPersistence.h/MQTTProperties.h/MQTTReasonCodes.h/MQTTSubscribeOpts.h/MQTTExportDeclarations.h)拷贝到SDK的include/base目录下)。

五、编译zlib库

1、下载zlib源码https://github.com/madler/zlib/archive/v1.2.11.zip 通过如下命令解压缩:

unzip zlib-1.2.11.zip

2、进入源码目录下:

cd zlib-1.2.11

3、配置生成makefile文件

./configure

4、修改Makefile文件

vi Makefile

CC = gcc改为 CC = arm-linux-gnueabihf-gcc
其他地方的gcc 改为 $(CC),改完后保存并退出。
5、执行makefile文件

make

拷贝so库文件 将源码目录下生成的libz.so、libz.so.1、libz.so.1.2.11拷贝到sdk的lib文件夹下。

六、编译华为IoTDA CSDK

1、进入到解压的文件夹下:

cd huaweicloud-iot-device-sdk-c

2、修改配置信息: 需要修改src/device_demo/device_demo.c文件中的如下参数:
servierIp_:平台南向IP,可在控制台的应用管理中查看。
username_:MQTT协议需要填写username,iot平台默认设备ID为username,设备ID是设备注册时返回的值。
password_:设备密钥,设备注册时返回的值。
3、修改Makefile,将CC = gcc改为 CC = arm-linux-gnueabihf-gcc
执行make命令进行编译(如果是32位的操作系统,请删除掉Makefile中的"-m64"):

make

4、编译完成后,查看MQTT_Demo.o文件格式
file MQTT_Demo.o
在这里插入图片描述
可以看出MQTT_Demo.o是32位小端ARM架构的可执行文件;

七、下载验证

1、将MQTT_Demo.o和lib拷贝到嵌入式设备端,将lib重命名为iotda_lib,并导出库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/customer/iotda_lib
2、运行测试程序MQTT_Demo.o

./ MQTT_Demo.o

在这里插入图片描述
提示缺少 libanl.so.1文件!
3、在linux编译机arm-linux-gnueabi-gcc工具链安装目录下找到该动态连接库,将整个动态链接库拷贝到嵌入式设备端,导出lib库目录:
在这里插入图片描述

cp -a /mnt/gcc_lib/ ./
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/customer/gcc_lib

重新运行MQTT_Demo.o
在这里插入图片描述
可以看到,arm linux设备端已经可以连接到华为云服务器了。至此,移植CSDK接入华为mqtt IoTDA已经完成并测试通过了。

如果是要移植到linux PC 上可以参考官方ReadMe文档https://github.com/huaweicloud/huaweicloud-iot-device-sdk-c/blob/master/README_CN.md。移植方式大体是相同的,只是编译工具使用gcc而已。

Logo

更多推荐