我们将在本课中介绍 Nerves, Nerves 项目是在嵌入式软件开发中使用 Elixir 的框架。 正如 Nerves 官网所说,它允许您“使用 Elixir 制作和部署防弹嵌入式软件”。 本课将与其他 Elixir School课程略有不同。 Nerves 学习起来有点困难,因为它需要一些先进的系统设置和额外的硬件,因此可能不适合初学者。

要使用 Nerves 编写嵌入式代码,您需要一个目标设备,一个带有您所选硬件支持的存储卡的读卡器,以及可以通过网络访问此设备。

同时也建议将目标设备连接到一个屏幕,因为这样可以简化使用 IEx 的调试。

Nerves 项目本身有一个很好的入门指南,但文档里面大量的细节对于一些用户来说可能有点压力。 相反地,本教程将尝试呈现“少说话,放码过来”。

首先,您需要安装环境。 您可以在 Nerves wiki 的 安装 部分找到该指南。 请确保您同时也已经具备指南中提到的 OTP 和 Elixir 的相同版本。 不使用正确的版本会导致安装时出现问题。 在撰写本文时,任何 Elixir 版本(使用 Erlang/OTP 21编译)都应该可以工作。

环境安装完成后,您应当已经准备好构建您的第一个 Nerves 项目了!

要创建一个新项目,请运行 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 network documentation.

请注意,您需要根据所在的局域网的具体情况设置这里的参数,在我的网络中有一个未分配的 IP 192.168.88.2,所以使用了这个 IP。 但是在您的网络环境中,这些参数可能会有所不同。

更改后,我们需要运行 mix firmware.burn 重新烧录固件的更改版本,然后使用新卡启动设备。

当您打开设备电源后,可以使用 ping 命令查看它是否在线。

到目前为止,我们一直在烧录 SD 卡并将它们通过物理方式加载到我们的硬件中。 虽然这很好,但通过网络推送我们的更新更为直接。 nerves_firmware_ssh 包正是做这个事的。 默认情况下,它已存在于您的项目中,并配置为自动检测并在目录中查找 SSH 密钥。

要使用网络固件更新功能,您需要通过 mix firmware.gen.script 生成上传脚本。 该命令将生成一个新的 upload.sh 脚本,我们可以运行该脚本来更新固件。

如果在上一步之后网络正常运行,您就可以开始使用了。

要更新您的设置,最简单的方法是使用 mix firmware && ./upload.sh 192.168.88.2:第一个命令创建更新的固件,第二个命令通过网络推送它并重新启动设备。 您最终可以停止将 SD 卡插入和拔出设备!

提示:ssh 192.168.88.2 在应用程序的上下文中为您提供设备上的 IEx shell。

故障排除:如果您的主文件夹中没有现有的 ssh 密钥,则会出现错误 No SSH public keys found in ~/.ssh. 在这种情况下,您需要运行 ssh-keygen 并重新烧录固件以使用网络更新功能.

对于其他设备,您可以查看nerves_examples 项目的相应部分.

请注意,Nerves 在应用程序中有两个不同的监督树 - 一个用于主机,一个用于实际设备。

现在,剩下的唯一缺失的部分是通过网络界面控制 LED。

您甚至可以将 Phoenix 支持的用户界面打包到您的 Nerves 应用程序中,但是,这需要进行一些调整。