为 Raspberry Pi 交叉编译 EdgeX

写在前面

EdgeX 是 Linux 软件基金会旗下的一个开源的,应用在边缘计算设备上的,针对 IoT 设备的软件系统。它使用 Go 语言实现,基于微服务框架。

它的标准运行环境是基于 Docker,官方文档上有提供了基于 Raspberry Pi Docker 的运行环境。

本文从另外一个角度,实现 Raspberry Pi 上运行 EdgeX:

  1. 不依赖 Docker,直接在 Raspberry Pi 上运行 EdgeX 服务。
  2. 在 MacOS 上交叉编译,能够运行在 Raspberry Pi 上的 EdgeX 应用程序。
  3. 不需要重新安装 Raspberry Pi 操作系统,直接使用 Raspbery Pi 官方操作系统。

原理

交叉编译运行在 Raspberry Pi 上的纯 Go 源码非常简单,直接设置 GOOS=linux GOARCH=arm go build 即可。编译 EdgeX 的挑战在于,EdgeX 不是纯 Go 语言,它使用了 CGO,更具体地说,EdgeX 使用 C/C++ 实现 libzmq 来实现消息队列,这给交叉编译带来了额外的困难。

一个可行的解决方法是:

  1. 使用 Docker 搭建交叉编译环境
  2. 在 Docker 里安装 Raspberry Pi 交叉编译工具,Raspbery Pi 官方有提供交叉编译工具下载
  3. 在 Docker 里安装 Raspberry Pi 交叉编译需要的根文件系统
  4. 在 Docker 里安装 C/C++ 编译工具链
  5. 在 Docker 里安装 Go 语言编译工具
  6. 在 Docker 里安装 EdgeX 依赖的库 libzmq

步骤

幸运的是,我们不需要从头完成上述步骤。上述步骤中 1,2,3,4 已经有人在 GitHub 上提供一个 Docker Image,它的名字叫 docker-raspberry-pi-cross-compiler

更幸运的是,读者朋友们也不需要手动完成上述 5,6 两个步骤,因为笔者已经在 docker-raspberry-pi-cross-compiler 的基础上,制作好了 Docker Image,可以直接编译。它的名字叫 edgex-raspberry-pi-cross-compile

有了这些工具,编译 EdgeX 就简单了:

  1. 安装 Docker Desktop
  2. 运行 docker pull kamidox/edgex-raspberry-pi-cross-compile 下载交叉编译 Docker Image
  3. 运行下述命令安装 rpxc 脚本
docker run kamidox/edgex-raspberry-pi-cross-compile > ~/bin/rpxc
chmod +x ~/bin/rpxc

编译环境准备就绪,下载 EdgeX 源码进行编译:

  1. 下载 edgex-go 或其他的 EdgeX Device Service
  2. 修改 Makefile,加入以下内容,这里指定了在 Docker 里交叉编译时,使用的交叉编译工具链目录
export CC=/rpxc/bin/arm-linux-gnueabihf-gcc
export CGO_LDFLAGS=--sysroot=/rpxc/sysroot
export CGO_CFLAGS=--sysroot=/rpxc/sysroot
export CGO_CPPFLAGS=--sysroot=/rpxc/sysroot
export CGO_CXXFLAGS=--sysroot=/rpxc/sysroot
export GOOS=linux
export GOARCH=arm

最后,运行编译命令进行编译即可:

cd path/to/your/edgex-go
rpxc --image "kamidox/edgex-raspberry-pi-cross-compile" make build

编译完成后,把相关的目标文件以及配置文件直接拷贝到 Raspbery Pi,运行即可:

cd path/to/your/edgex-go
scp -r cmd pi@192.168.10.114:/home/pi

其中 Pi 的 IP 地址需要根据你的环境相应地修改。完成后,即可 ssh 登录 Raspbery Pi 运行 EdgeX 服务了。笔者制作了一个简易的启动脚本,用来启动相应的 EdgeX 服务,你可以根据实际情况增减服务。

pi@raspberrypi:~/edgex $ cat start_edgex.sh
#!/bin/sh

export EDGEX_SECURITY_SECRET_STORE=false

ROOT=`pwd`
cd $ROOT/cmd/core-metadata && ./core-metadata &
cd $ROOT/cmd/core-data && ./core-data &
cd $ROOT/cmd/core-command && ./core-command &
cd $ROOT/cmd/support-notifications && ./support-notifications &
cd $ROOT/cmd/support-scheduler && ./support-scheduler &
cd $ROOT/cmd/sys-mgmt-agent && ./sys-mgmt-agent &
cd $ROOT/cmd/sys-mgmt-executor && ./sys-mgmt-executor &
cd $ROOT/cmd/edgex-ui-server && ./edgex-ui-server &
cd $ROOT/cmd/device-simple && ./device-simple &

(完)


Post by Joey Huang under edge on 2021-08-05(Thursday) 23:20. Tags: edgex, raspberry pi, cross compile,


Powered by Pelican and Zurb Foundation. Theme by Kenton Hamaluik.