在本课程中将讨论 Nerves。 Nerves 专案是在嵌入式软件开发中使用 Elixir 的框架。正如 Nerves 网站所说,它允许 “使用 Elixir 制作和部署高性能嵌入式软件”。本课程将与其他 Elixir School 课程略有不同。Nerves 较难入门,因为它需要一些进阶的系统设定和额外的硬件,因此可能不适合初学者。
要使用 Nerves 编写嵌入式程式码,需要一个 支援的目标设备,一个支援所选硬件记忆卡使用的读卡机,以及能通过网络存取该设备的有线网络连接。
然而,我们建议使用树莓派(Raspberry Pi),因为它装载具有可控制的 LED 。且建议有个连接到目标设备的萤幕,因为这样可以简化使用 IEx 除错。
Nerves 专案本身有一个很好的 入门指南,但对于一些使用者来说,其细节的数量可能难以消化。相反地,本教学将尝试以 “更少文字,更多程式码” 来展现。
首先,需要一个环境设定。可以在 Nerves wiki 的 安装 部分找到该指南。请确保具有指南中所提到 OTP 和 Elixir 的相同版本。不使用正确的版本会导致安装进行时出现问题。在本文撰写时,任何 Elixir (使用 Erlang/OTP 21 编译) 都应该可以使用。
在设定完成后,应该准备好来建立第一个 Nerves 专案了!
我们的目标是做到嵌入式开发的 “Hello world”:通过呼用简单的 HTTP API 来控制闪烁的 LED。
要产生一个新专案,请执行 mix nerves.new network_led 并在提示是否提取和安装依赖时回答 Y。
专案已经产生完成,并准备好写入到测试设备!现在来试试吧!
对于 Raspberry Pi 3,可以设定 MIX_TARGET=rpi3,但可以根据目标硬件来更改此设定以符合你的硬件 (请参阅 Nerves 文件 中的列表)
注:确保在执行 mix deps.get 之前设定指定目标平台的环境变数,因为它将为指定平台下载相应的系统映像和工具链。
现在可以继续写入驱动程式。将记忆卡放入读卡机,如果在前面步骤中正确设定了所有内容,在执行 mix firmware.burn 并确认要使用的设备之后,应该会得到以下提示:
如果确定这是你想要烧录的卡 - 选择 Y 记忆卡会在些许时间中就烧录完成:
现在是时候将记忆卡放入装置中并验证它是否有效。
如果连接了一个萤幕 - 在插入此记忆卡的设备启动后,应该会看到一个 Linux 启动序列。
下一步是设定网络。 Nerves 生态系提供各种套件,而 nerves_network 是当要通过有线以太网埠将装置连线到网络所需要的。
要设定静态网络,需要将以下几行加入到 config/config.exs:
请注意,此配置是用于有线连线。如果要使用无线连线 - 请查看 Nerves 网络文件。
注意到,需要在此处使用本机网络参数 - 在我的网络中有一个未分配的IP 192.168.88.2,所以会使用它。但是,在你的情境中,它可能会有所不同。
在修改后,需要通过 mix firmware.burn 重新烧录修改版本后的固件,然后使用新烧录的卡启动装置。
当开启装置电源时,可以使用 ping 查看它是否在线上。
此输出表示现在可以从网络连线到该装置。
到目前为止,我们一直在烧录 SD 卡并将它们物理装载到硬件中。虽然这很好,但通过网络推送更新将更为直接。nerves_firmware_ssh 套件正是为此而生的。预设情况下,它已存在于专案中,设定为自动侦测并会在目录中搜寻 SSH 密钥。
要使用网络固件更新功能,需要通过 mix firmware.gen.script 生成上传用 script。该指令将生成一个新的 upload.sh script,可以执行该 script 来更新固件。
如果在上一步之后网络正常运作,就可以开始使用了。
要更新设定,最简单的方法是使用 mix firmware && ./upload.sh 192.168.88.2:第一个指令建立更新的固件,第二个指令通过网络推送它并重新启动设备。完成后可以停止并将 SD 卡插入和拔出设备!
提示:ssh 192.168.88.2 在应用程序的上下文中提供设备上的 IEx 壳层。
在这种情况下,需要执行 ssh-keygen 并重新烧录韧体以使用网络更新功能。
对于其他设备,可以查看 nerves_examples 专案与之对应的部分。
请注意,Nerves 在应用程序中有两个不同的 supervision tree - 一个用于主机,一个用于实际设备。
现在可以从命令提示字元控制 LED!
现在,剩下唯一缺少的部分是通过网络界面控制 LED。
甚至可以将 Phoenix 支援的使用者界面打包进 Nerves 应用程序中,不过, 需要进行一些调整。