本文将介绍如何使用 Raspberry Pi 运行 Docker 来运行 Go 语言的旅程,并让编写第一个真实世界的应用程序,这些只需要一个下午的时间,一个客户端连接我的显示服务器。 跟着我一步一步走:
Blinkt!是一个 Raspberry Pi 的小插件。
它与 Raspberry Pi 的 40 针的接头兼容。
它的外形小巧,在 GPIO 接头之上,提供了八个可单独寻址的 RGB LED。
最酷的是:这些 LED 不会干扰 Pi 声音输出。
制造商 @Pimoroni 在 GitHub上 提供了一个 Python库 的搭建细节。
Go 是由 Google 创建的流行编程语言。这是一个编译型的,静态类型的语言,其目标的易用性和易采用。Go 程序可以在 Raspberry Pi 上编译和运行,以下是其特点:
Blinkt!的库已经被 @AlexEllisUK 移植到了 Go,所以你可以直接在项目中使用它们!
我知道一些编程语言,但是我从来没有尝试过。那么,我们带着我们的树莓派开始吧!
由于我不想用一堆文件和依赖项填充我的基础映像,所以我使用 Docker 安全地在独立的容器中尝试和测试。
curl -sSL get.docker.com | sh
usermod -aG docker pi
我 Clone 了这个示例:
git clone https://github.com/alexellis/blinkt_go_examples.git
“process” 文件夹下有一个示例 Dockerfile,我用它作为起点,并构建了 Docker 镜像。
cd progress
docker build -t actuino/blinkt-go-dev-armhf:1 .
注1
:我使用 -t
参数标记镜像,所以稍后我可以用 docker push
命令来提交它。现在,你可以直接获取这个图像,而不需要构建它:docker pull actuino / blinkt-go-dev-armhf:1
,不需要 git clone
命令,也不需要 docker build
!
注2
:我测试了Blinkt!在 Pi Zero 中。它是一个漂亮的玩具,但不是最好的 CPU 处理能力。由于构建花费了太多时间,我只需构建并从 4核的 Orange Pi Zero(大约需要10分钟)中将镜像提交,然后从 Pi Zero 中拉下来镜像。
上图是 Orange Pi Zero 和带有 Blinkt 的 Raspberry Pi Zero!
docker run -it --privileged actuino/blinkt-go-dev-armhf:1
它的第一次尝试是:在 Blinkt 上点起一盏红灯。
现在,我能做更多吗?
让我们尝试修改 app.go 代码,这是几分钟后我做的:
只是,我是从容器本身编辑 app.go 代码。
为此,我必须运行一个 shell 而不是默认的 process
应用程序。 这很容易:
docker run -it --privileged actuino/blinkt-go-dev-armhf:1 /bin/bash
apt-get install nano
nano app.go
最后代码如下所示:
package main
import . "github.com/alexellis/blinkt_go"
func main() {
brightness := 0.5
blinkt := NewBlinkt(brightness)
blinkt.SetClearOnExit(true)
blinkt.Setup()
Delay(100)
r := 0
g := 150
b := 0
for {
for pixel := 0; pixel < 8; pixel++ {
blinkt.Clear()
blinkt.SetPixel(pixel, r, g, b)
if pixel > 0 {
blinkt.SetPixel(pixel-1, 0,25,0)
}
if pixel > 1 {
blinkt.SetPixel(pixel-2, 0,10,0)
}
if pixel == 0 || pixel == 7 { blinkt.SetPixel(pixel, 100,50,0) }
blinkt.Show()
Delay(100)
}
for pixel := 6; pixel > 0; pixel-- {
blinkt.Clear()
blinkt.SetPixel(pixel, r, g, b)
if pixel < 7 {
blinkt.SetPixel(pixel+1, 0,25,0)
}
if pixel < 6 {
blinkt.SetPixel(pixel+2,0,25,0)
}
if pixel == 0 || pixel == 7 { blinkt.SetPixel(pixel, 100,50,0) }
blinkt.Show()
Delay(100)
}
}
blinkt.Clear()
blinkt.Show()
}
(我知道它不漂亮,高效也不破土,我只是修改了几行,并添加了一些条件来测试)
它工作吗? 是!!!
我学了Go吗? 不太确定。 只是第一次接触,这很好。
但是我还有一个想法。还记得我们做的 Minecraft 实验,还有我们的 “Unicorn” 显示器,有客户端和服务器?
> 如何从一个虚拟的 Minecraft 世界内更新一个物理的 LED 显示屏
Unicorn Connected Display 使用 8x8 或 4x8 LED 阵列。为什么不把它扩展到 Blinkt 的 1x8 呢?
我感到非常乐观。 事实上,我所需要的只是一个 WebSocket 客户端,一些复制粘贴的代码,也许是一个堆栈溢出标签,一切都会好起来的。 真? 这么简单吗?
我们的 Unicorn 服务器(Node.js)依赖于 Socket.io WebSocket 库。 Google 搜索显示了几个有趣的库。我用显示服务器测试了两个很好的库。
注意:Unicorn 服务器也有一个树莓派的 Docker 镜像,docker run -d -p 80:80 actuino/unicorn-server-armhf:1
,所以很容易运行和测试 Pi(e)。
在 Go 项目中导入新库时,不需要自行获取代码:只需在代码中添加库的名称,然后运行 go get -v -d
并获取代码本身。
然后只需要简单的执行 go build
(可能需要几分钟),你最终得到一个从你的文件夹命名的可执行文件,你可以运行或发货(ship)。
一旦我得到了一个有效的客户端原型 - 感谢这些例子 - 这只是一个混搭显示和客户端代码的问题。
好消息!我设计的 Unicorn Protocol 使用简单的 Json 数据有效载荷,Json 对于 Go 很容易解析,真好!
是的,我不得不使用堆栈溢出,并做了一些复制/粘贴。
最后的代码在 Github 上可用:Star和克隆代码,然后自己尝试一下,这里是一步一步的自述文件。
花了一个下午的时间来安装,测试和玩 Go 以及 Raspberry Pi,并开始第一个(非平凡的)程序的工作。
任务完成没有摩擦,我会再次玩 Go。
我们现在有一个连接到显示服务器的轻量级连接 RGB 显示器,并可以从任何来源实时更新:它接受 WebSocket 或 HTTP Post,几乎任何东西都可以试驾显示器,包括移动应用程序、网页、IOT 传感器...
以下是我们想到的一些实际应用:
更多,请继续关注并告诉我们您的想法!
观光\评论区