使用balena云平台和balenaEngine容器引擎(兼容Docker的容器引擎)部署在OrangePi或是树莓派等armv7hf设备中,使用Node.js和Python等常见语言进行开发,并进行简单的GPIO口操作。

我还有个OrangePi One,使用树莓派架设Minecraft服务器端,说来甚是尴尬,想把那个开发板半价卖给人家,还倒贴C10卡,都不见得要,我只能一直放着。我本来是想写一篇博文,二次编译下最新系统的,厂商官网的Debian太老了,但是已经有Armbian编译的版本了,下面也提到了为什么不写了,虽然不写了,想着还是拿出来用用吧,最起码可以水文了。

6157842.png

Armbian的支持列表

我发现Orange Pi One虽然官网的Linux版本老旧,但是居然在Armbian的支持列表中,那不就是直接相当于官方编译的最新版本了吗,最近又没啥特殊需求,那还重复造啥轮子呢。

20190720190550.png

你可以有开发代号Buster和Bionic的选择,分别是Debian和Ubuntu的发行版。

20190720190558.png

有了Armbian的支持,几乎Linux类似的衍生版都是支持的。

PS: Armbian does support the board already, so maybe that could be useful.

什么是balenaOS?

What is balena?
Balena是一套完整的工具,用于构建,部署和管理连接的Linux设备。
基本上可以当作是优化过的Docker管理平台,可以在适当体系结构上运行的任何Docker环境

balena生态系统中的设备运行balenaOS,这是一款基于Yocto
Linux的主机操作系统,它与balenaEngine一起打包,balenaEngine是我们轻量级,兼容Docker的容器引擎。
主机操作系统负责启动设备主管,设备上的balena代理以及容器化服务。在每个服务的容器中,您可以指定基本操作系统,该操作系统可以来自与您的设备体系结构兼容的任何现有Docker基础映像。
基本OS与主机OS共享内核,但是可选择独立工作。如果您选择,您的容器可以配置为以特权运行,直接访问硬件,甚至将模块注入内核。
balena设备管理程序在自己的容器中运行,即使您的应用程序崩溃,我们也可以继续运行并提取新代码。

20190721191417.png

20190721191403.png

balenaOS支持的硬件设备

前面提到了几乎是Armbian支持的balenaOS都会尽力适配的。我这块OrangePi One就不在官网支持名单里面,但是是社区支持的。
英特尔的NUC都是支持的。
20190720170914.png

树莓派全家都支持,只是最近新出的4,还没适配。

20190720170854.png

OrangePi One(全志H3 ARM的Cortex-A7四核)不在支持内,但是有处理器相同的Plus2(全志H3 ARM的Cortex-A7四核)。Zero的话处理器是全志H2 ARM的Cortex-A7四核。

20190720173843.png

我使用的OrangePi One可以看Plus2的文档,相当于其他的来说,在处理器上面是差不多的,都是全志H3。balena-allwinner

20190720170921.png

通过balenaCloud创建一个项目得到镜像

你当然可以从上面直接下载了,但是哪里有直接从平台上面生成后下载来的方便?这才是一个现代的管理平台该做的事。

20190720201822.png

创建一个应用,选择设备。

20190720201717.png

20190720201742.png

20190720201832.png

选择Development (dev) 还是Production (prod)版本,我选择的Development。
再选择网络连接方式,因为OrangePi One没有自带Wifi模组,只有100兆的以太网,视具体情况而定。

20190720201849.png

使用自己家的balenaEtcher,跨平台镜像写入工具-balenaEtcher

20190720172748.png

选择Development (dev) 还是Production (prod)?

推荐你上官方的Architecture Overview上看。如果你想继续玩,那就dev。

20190720183640.png

开发版是没有密码的。会以<hostname>.local的形式广播。Docker的端口2377会开放等等之类的。

上电开机

我使用OrangePi One遇到的问题和,Orange Pi One boot but no display,中提到的一样,屏幕在U-boot的时候有显示,加载内核后就没有显示了。如果使用HDMI转VGA转换线,U-boot的时候都没有显示,不知道是我的操作问题还是都遇到的问题。
这种东西使用还是不使用屏幕问题还不太大,当然,要开发交互式的程序就有问题了。我使用OrangePi Plus2 的镜像就有屏幕显示,只是无法联网,可能是驱动问题,Plus2使用的是千兆有线网卡。

20190721152840.png

simple-server-node

官方提供了一个叫做simple-server-node的案例,实际就是个只有Html的DEMO,来都来了,我们也来跑跑。这里的操作就是git,只是官方提示你,这不是代码托管库,意思是可能会掉?(我瞎说的)我就截图了,就不说了。

20190720220424.png

20190720220250.png

20190720215804.png

文件目录就是:username/.ssh/id_rsa.pub

20190720220758.png

git remote add balena <USERNAME>@git.balena-cloud.com:<USERNAME>/<APPNAME>.git

应用的git地址可以从此处快速复制。

20190720215906.png

20190720215934.png

Note: On your very first push, git may ask you if you would like to
add this host to your list of allowed hosts. If the ECDSA key
fingerprint matches
SHA256:NfwmqnKId5cx1RWpebbEuuM87bCJbdyhzRnqFES9Nnw, you are pushing to
the right place. Type 'yes' to continue.

20190720220431.png

20190720220450.png

出现了独角兽图案就是成功了。

20190720220541.png

在git上,可能也需要代^&理。

git config --global http.proxy +http代理的IP和端口
git config --global --unset http.proxygit config --global --unset https.proxy

balenaCloud平台配置

即使你不运行前面的simple-server-node案例,你在平台面板也是可以看到设备信息的。

20190720205727.png

设备的默认名字生成得很有趣,我的两个设备分别叫quiet-seacold-smoke

20190720225220.png

因为官方使用的是Amazon云,所以我们会遇到众所周知的网络问题,请自行使用魔法解决。

官方提供了redsocks的方式进行代*理,但是我简单试了下貌似不行,有兴趣可以再去尝试下,这是最轻便的解决办法了。
Connecting Behind a Proxy
新建一个redsocks.conf,放到/mnt/boot/system-proxy/中,可以使用下文提到的SSH直接进行连接,并用WinSCP等工具修改。

base {
log_debug = off;
log_info = on;
log = "syslog:local7";
daemon = off;
redirector = iptables;
}

redsocks {
type = socks5;
ip = <SERVER IP>;
port = 8123;
local_ip = 127.0.0.1;
local_port = 12345;
}

设备初次上电的时候会下载,安装。

20190721025130.png

不管你使用的南派武功还是北派武功,总之现在设备是Online了。

20190721113835.png

20190721113856.png

安装balena CLI

这里需要安装balena-CLI,安装帮助看Balena CLI Documentationbalena CLI Installation Instructions,有Widnwos使用的版本。
如果你是Windows和Mac用户就没什么难度,唯一就是Linux用户,要么使用npm安装,要么解压缩压缩包,手动设置环境变量,。

coming soon for Linux users too

NPM安装记得加上--unsafe-perm参数,真是头疼。

Additional information may be available by setting a DEBUG=1
environment variable: "set DEBUG=1" on a Windows command prompt, or
"export DEBUG=1" on Linux or macOS.

20190720223248.png

你可以选择走Web授权。

20190720223233.png

很有意思的图标设计。

20190720223238.png

使用balena scan,扫描局域网内的设备,记得使用管理员权限。

20190720223334.png

直接访问局域网内IP可以看到如下网页:

20190720223849.png

该网页在如下目录中:

\simple-server-node\views\index.html

在本地进行开发

在官方文档Develop locally中提到了本地模式,对于我们这种网络不便的,最好不过了。如果不使用本地模式,所有的具体操作都是通过服务器分发的,代码也要Push上去,再发下来,网络不好就很悲剧。

Local mode must be enabled through the dashboard. To use local mode on
a development device, click on the small Actions dropdown at the top
right of the device page and select Enable Local Mode.

开启Local Mode,开启本地模式。

20190720230818.png

这里有个疑问,如果设备没有连接到平台,自然是无法控制设备的,设备的API也是请求不上的,Local Mode也不能设置,如何全程无网络来控制呢?在balenaForums中有提及,但是我简单试了下,还是无效。

如果需要使用balena push命令,务必此处需要改为本地模式。

20190721120800.png

不然请求IP:48484/ping的时候会出错,下图为正常的时候。

20190721120831.png

如果前面的配置都OK了,此处使用了balena push ip地址,同样是跑刚才的simple-server-node案例会出现:

20190721122334.png

20190721152614.png

使用balena SSH直接连接

SSH access
因为是使用的开发版,所以22222的SSH端口处于打开状态,可以使用如下命令进行连接:

ssh root@<DEVICE_IP> -p22222

当然,你也可以使用Putty等工具连接。

如果你使用SSH不便,那也可以使用传统的TTL,这要看你的板子具体情况,资料也很多,OrangePi One的话RJ45接口旁边就是TTL的插针,靠近处理器的第一根就是GND,至于RX和TX就自己实验一下了,问题不是很大。

20190721200354.png

使用GPIO

我们可以先使用sysfs控制GPIO接口,就和平常做的差不多。
需要进行计算GPIO和标号,这类资料当然到处都是,如果你不清楚,就可以尝试使用sysfs来手动控制。

也可以看资料OrangePi通过sysfs控制GPIO接口,写的很详细。

20190721150644.png

使用cat /sys/kernel/debug/gpio命令查看现目前系统的GPIO情况。

20190721144453.png

我们使用PA1,所以端口为11

20190721155216.png

拉高或拉低电平,可以使用小灯,或者万用表,拉高时,另一脚接到GND上,会看到3.3V。

echo high >  /sys/class/gpio/gpio1/direction
echo low >  /sys/class/gpio/gpio1/direction

如果你并不是OrangePi或者树莓派。你可以查看官方的文档hardware_gpio
支持:

  • Raspberry Pi
  • Beaglebone
  • Intel Edison

在案例上的话,暂时有三个案例,Basic GPIO Control in Node.jsServo motor control in Node.js
Basic GPIO Control in Python
有兴趣的话可以去尝试一下,Basic GPIO Control in Node.js因为一些怪异的问题没有成功,我使用的是Servo motor control in Node.js,是基于的pi-blaster

piblaster.setPwm(17, 1 ); # 100% brightness
piblaster.setPwm(22, 0.2 ); # 20% brightness
piblaster.setPwm(23, 0 ); # off

可以看下代码里面是如何定义接口的。

// Create default known_pins with raspberry pi list of pins
// to compare against the param received.
static uint8_t known_pins[MAX_CHANNELS] = {
    4,      // P1-7
    17,     // P1-11
    18,     // P1-12
    27,     // P1-13
    21,     // P1-40
    22,     // P1-15
    23,     // P1-16
    24,     // P1-18
    25,     // P1-22
};

// Create a list of reserved GPIO pins
// http://elinux.org/RPi_Low-level_peripherals
static uint8_t banned_pins[MAX_CHANNELS] = {
    6,          // On Model B, it is in use for the Ethernet function
    28,        // board ID and are connected to resistors R3 to R10 (only on Rev1.0 boards).
    29,        // board ID and are connected to resistors R3 to R10 (only on Rev1.0 boards).
    30,        // board ID and are connected to resistors R3 to R10 (only on Rev1.0 boards).
    31,        // board ID and are connected to resistors R3 to R10 (only on Rev1.0 boards).
//        40,        // used by analogue audio
//        45,        // used by analogue audio
    46,        // HDMI hotplug detect
    47,        // 47 to 53 are used by the SD card interface.
    48,        // 47 to 53 are used by the SD card interface.
    49,        // 47 to 53 are used by the SD card interface.
    50,        // 47 to 53 are used by the SD card interface.
    51,        // 47 to 53 are used by the SD card interface.
    52,        // 47 to 53 are used by the SD card interface.
    53,        // 47 to 53 are used by the SD card interface.
};

config.json

关于config.json配置文件可以看github上面的说明。下图是不使用API连接平台的情况,如果你是从平台上生成的,那么不止这么点。

20190720183330.png

20190721201732.png

编译自己的镜像

有需求还是可以看看。
Building your Own

自行搭建openBalena

openBalena是开源的平台,现在还处于测试阶段,不过可以自行搭建,官方已经给出了非常详细的步骤了。
OpenBalena Getting Started Guide

弃坑

balenaOS我觉得是一个很好的东西,一个完善的,经过优化的Docker管理平台(我是这样理解的),当然也有其他的类似平台,但是因为我们特殊的一些网络情况,我们使用连接服务非常的不便,我几乎没有看见国内的一些测评,介绍啥的。我也是一时兴起,搭建了试了一下。我觉得问题还是网络和树莓派等arm平台性能是真的差,安装往往等待半个小时以上,还可能重复多次,实在是百无聊赖。不知道中文名字叫啥,按音译是巴利纳吧。

20190721174703.png

都可以使用Node.js了,网络请求服务器也不是多大问题了。至于在树莓派或者OrangePi等设备上面运行Node.js,Python等,那根本不是什么稀奇的事,真的是多如牛毛。
这就是为什么文章到这里就结尾了,我本来想的就是在GPIO之前就结尾了,但是我又觉得各位水友说你弄了这些东西,就跑了个网页,GPIO你都不去挖下坑。

如果你是对Docker感兴趣,那么你可以用虚拟机正儿八经倒腾,armv7hf确实是性能太差。如果你对传感器感兴趣,那还是不要使用树莓派了。本来应该是一篇技术性的文章,到了后面又成水文了。

题外话-最好的Linux发行版

20190720221652.png

20190720222302.png

题外话-改造供电接口

真正你要说OrangePi在社区上面的支持或者第三方的支持不如树莓派,那我肯定是不会承认的,都差不多,就是OrangePi One自带的供电接口太麻烦了,是个小圆形的DC供电口。DC输入,MicroUSB (OTG)不能用作电源输入。我没有购买原厂的供电线,我自己有个电源接口和这个相同,但是有点公差,直径可能差了1mm左右,要费很大的力气才能插进去,那个电源是5V3A,所以使用上面还是没有任何问题的,就是麻烦。

20190720173358.png

20190720173412.png

推荐底板和Micro USB的小板之间先使用704硅橡胶贴合,效果更佳。请勿使用热熔胶等贴合剂。