OrangePi One 全志H3和树莓派运行balenaOS
使用balena云平台和balenaEngine容器引擎(兼容Docker的容器引擎)部署在OrangePi或是树莓派等armv7hf设备中,使用Node.js和Python等常见语言进行开发,并进行简单的GPIO口操作。
我还有个OrangePi One,使用树莓派架设Minecraft服务器端,说来甚是尴尬,想把那个开发板半价卖给人家,还倒贴C10卡,都不见得要,我只能一直放着。我本来是想写一篇博文,二次编译下最新系统的,厂商官网的Debian太老了,但是已经有Armbian编译的版本了,下面也提到了为什么不写了,虽然不写了,想着还是拿出来用用吧,最起码可以水文了。
Armbian的支持列表
我发现Orange Pi One虽然官网的Linux版本老旧,但是居然在Armbian的支持列表中,那不就是直接相当于官方编译的最新版本了吗,最近又没啥特殊需求,那还重复造啥轮子呢。
你可以有开发代号Buster和Bionic的选择,分别是Debian和Ubuntu的发行版。
有了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设备管理程序在自己的容器中运行,即使您的应用程序崩溃,我们也可以继续运行并提取新代码。
balenaOS支持的硬件设备
前面提到了几乎是Armbian支持的balenaOS都会尽力适配的。我这块OrangePi One就不在官网支持名单里面,但是是社区支持的。
英特尔的NUC都是支持的。
树莓派全家都支持,只是最近新出的4,还没适配。
OrangePi One(全志H3 ARM的Cortex-A7四核)不在支持内,但是有处理器相同的Plus2(全志H3 ARM的Cortex-A7四核)。Zero的话处理器是全志H2 ARM的Cortex-A7四核。
我使用的OrangePi One可以看Plus2的文档,相当于其他的来说,在处理器上面是差不多的,都是全志H3。balena-allwinner
通过balenaCloud创建一个项目得到镜像
你当然可以从上面直接下载了,但是哪里有直接从平台上面生成后下载来的方便?这才是一个现代的管理平台该做的事。
创建一个应用,选择设备。
选择Development (dev) 还是Production (prod)版本,我选择的Development。
再选择网络连接方式,因为OrangePi One没有自带Wifi模组,只有100兆的以太网,视具体情况而定。
使用自己家的balenaEtcher,跨平台镜像写入工具-balenaEtcher
选择Development (dev) 还是Production (prod)?
推荐你上官方的Architecture Overview上看。如果你想继续玩,那就dev。
开发版是没有密码的。会以
上电开机
我使用OrangePi One遇到的问题和,Orange Pi One boot but no display,中提到的一样,屏幕在U-boot的时候有显示,加载内核后就没有显示了。如果使用HDMI转VGA转换线,U-boot的时候都没有显示,不知道是我的操作问题还是都遇到的问题。
这种东西使用还是不使用屏幕问题还不太大,当然,要开发交互式的程序就有问题了。我使用OrangePi Plus2 的镜像就有屏幕显示,只是无法联网,可能是驱动问题,Plus2使用的是千兆有线网卡。
simple-server-node
官方提供了一个叫做simple-server-node的案例,实际就是个只有Html的DEMO,来都来了,我们也来跑跑。这里的操作就是git,只是官方提示你,这不是代码托管库,意思是可能会掉?(我瞎说的)我就截图了,就不说了。
文件目录就是:username/.ssh/id_rsa.pub
。
git remote add balena <USERNAME>@git.balena-cloud.com:<USERNAME>/<APPNAME>.git
应用的git地址可以从此处快速复制。
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.
出现了独角兽图案就是成功了。
在git上,可能也需要代^&理。
git config --global http.proxy +http代理的IP和端口
git config --global --unset http.proxygit config --global --unset https.proxy
balenaCloud平台配置
即使你不运行前面的simple-server-node案例,你在平台面板也是可以看到设备信息的。
设备的默认名字生成得很有趣,我的两个设备分别叫quiet-sea和cold-smoke。
因为官方使用的是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;
}
设备初次上电的时候会下载,安装。
不管你使用的南派武功还是北派武功,总之现在设备是Online了。
安装balena CLI
这里需要安装balena-CLI,安装帮助看Balena CLI Documentation,balena 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.
你可以选择走Web授权。
很有意思的图标设计。
使用balena scan
,扫描局域网内的设备,记得使用管理员权限。
直接访问局域网内IP可以看到如下网页:
该网页在如下目录中:
\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
,开启本地模式。
这里有个疑问,如果设备没有连接到平台,自然是无法控制设备的,设备的API也是请求不上的,Local Mode也不能设置,如何全程无网络来控制呢?在balenaForums中有提及,但是我简单试了下,还是无效。
如果需要使用balena push命令,务必此处需要改为本地模式。
不然请求IP:48484/ping的时候会出错,下图为正常的时候。
如果前面的配置都OK了,此处使用了balena push ip地址
,同样是跑刚才的simple-server-node案例会出现:
使用balena SSH直接连接
SSH access
因为是使用的开发版,所以22222的SSH端口处于打开状态,可以使用如下命令进行连接:
ssh root@<DEVICE_IP> -p22222
当然,你也可以使用Putty等工具连接。
如果你使用SSH不便,那也可以使用传统的TTL,这要看你的板子具体情况,资料也很多,OrangePi One的话RJ45接口旁边就是TTL的插针,靠近处理器的第一根就是GND,至于RX和TX就自己实验一下了,问题不是很大。
使用GPIO
我们可以先使用sysfs控制GPIO接口,就和平常做的差不多。
需要进行计算GPIO和标号,这类资料当然到处都是,如果你不清楚,就可以尝试使用sysfs来手动控制。
也可以看资料OrangePi通过sysfs控制GPIO接口,写的很详细。
使用cat /sys/kernel/debug/gpio
命令查看现目前系统的GPIO情况。
我们使用PA1
,所以端口为11
。
拉高或拉低电平,可以使用小灯,或者万用表,拉高时,另一脚接到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.js,Servo 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连接平台的情况,如果你是从平台上生成的,那么不止这么点。
编译自己的镜像
有需求还是可以看看。
Building your Own
自行搭建openBalena
openBalena是开源的平台,现在还处于测试阶段,不过可以自行搭建,官方已经给出了非常详细的步骤了。
OpenBalena Getting Started Guide
弃坑
balenaOS我觉得是一个很好的东西,一个完善的,经过优化的Docker管理平台(我是这样理解的),当然也有其他的类似平台,但是因为我们特殊的一些网络情况,我们使用连接服务非常的不便,我几乎没有看见国内的一些测评,介绍啥的。我也是一时兴起,搭建了试了一下。我觉得问题还是网络和树莓派等arm平台性能是真的差,安装往往等待半个小时以上,还可能重复多次,实在是百无聊赖。不知道中文名字叫啥,按音译是巴利纳吧。
都可以使用Node.js了,网络请求服务器也不是多大问题了。至于在树莓派或者OrangePi等设备上面运行Node.js,Python等,那根本不是什么稀奇的事,真的是多如牛毛。
这就是为什么文章到这里就结尾了,我本来想的就是在GPIO之前就结尾了,但是我又觉得各位水友说你弄了这些东西,就跑了个网页,GPIO你都不去挖下坑。
如果你是对Docker感兴趣,那么你可以用虚拟机正儿八经倒腾,armv7hf确实是性能太差。如果你对传感器感兴趣,那还是不要使用树莓派了。本来应该是一篇技术性的文章,到了后面又成水文了。
题外话-最好的Linux发行版
题外话-改造供电接口
真正你要说OrangePi在社区上面的支持或者第三方的支持不如树莓派,那我肯定是不会承认的,都差不多,就是OrangePi One自带的供电接口太麻烦了,是个小圆形的DC供电口。DC输入,MicroUSB (OTG)不能用作电源输入。我没有购买原厂的供电线,我自己有个电源接口和这个相同,但是有点公差,直径可能差了1mm左右,要费很大的力气才能插进去,那个电源是5V3A,所以使用上面还是没有任何问题的,就是麻烦。
推荐底板和Micro USB的小板之间先使用704硅橡胶贴合,效果更佳。请勿使用热熔胶等贴合剂。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。