Respberry Pi 3 Model B 一个
HDMI 转 DVI显示输出数据线一根
USB 电源一个
16G SD卡一张
SD 卡读卡器
第一步, 创建外层项目和子项目
# 创建伞状项目 mix new hello_phoenix --umbrella # 创建子项目 cd hello_phoenix/apps # 创建固件子项目 mix nerves.new fw --target rpi3 # 前端显示界面项目 mix phoenix.new ui --no-ecto --no-brunch
修改固件配置文件, 把 Application 添加到启动列表中
# hello_phoenix/apps/fw/mix.exs
def application do
[mod: {Fw, []},
applications: [:logger, :ui, :nerves_interim_wifi]]
end
启动网络
# hello_phoenix/apps/fw/lib/fw.ex
defmodule Fw do
use Application
@interface :eth0
# @opts [mode: "static", ip: "10.0.10.3", mask: "16", subnet: "255.255.0.0"]
@opts [mode: "dhcp"]
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
supervisor(Phoenix.PubSub.PG2, [Nerves.PubSub, [poolsize: 1]]),
worker(Task, [fn -> start_network end], restart: :transient)
]
opts = [strategy: :one_for_one, name: Fw.Supervisor]
Supervisor.start_link(children, opts)
end
def start_network do
Nerves.Networking.setup @interface, @opts
opts = Application.get_env(:fw, :wlan0)
Nerves.InterimWiFi.setup "wlan0", opts
end
end
修改配置文件 hello_phoenix/apps/fw/config/config.exs , 注意把监听地址从 localhost ,修改为 0.0.0.0 , 以便让局域网中的其他机器能够访问.
use Mix.Config
# Phoenix 端点
config :ui, Ui.Endpoint,
http: [port: 80],
url: [host: "0.0.0.0", port: 80],
secret_key_base: "9w9MI64d1L8mjw+tzTmS3qgJTJqYNGJ1dNfn4S/Zm6BbKAmo2vAyVW7CgfI3CpII",
root: Path.dirname(__DIR__),
server: true,
render_errors: [accepts: ~w(html json)],
pubsub: [name: Ui.PubSub,
adapter: Phoenix.PubSub.PG2]
# 日志
config :logger, :console,
level: :debug,
format: "$date $time $metadata[$level] $message/n",
handle_sasl_reports: true,
handle_otp_reports: true,
utc_log: true
# 网络配置
config :fw, :eth0,
opts: [mode: "dhcp"]
config :fw, :wlan0,
ssid: "gx888888",
key_mgmt: :"WPA-PSK",
psk: "gx888888"
编译(可能会有翻墙的需要)
➜ hello_wifi git:(master) ✗ MIX_ENV=prod NERVES_TARGET=rpi3 mix compile ==> nerves_system Compiling 14 files (.ex) Generated nerves_system app ==> nerves_system_br Generated nerves_system_br app ==> nerves_toolchain Compiling 2 files (.ex) Generated nerves_toolchain app ==> nerves_toolchain_arm_unknown_linux_gnueabihf Compiling 1 file (.ex) Generated nerves_toolchain_arm_unknown_linux_gnueabihf app [nerves_toolchain][compile] [nerves_toolchain][http] Downloading Toolchain
依赖配置
注意, 现在需要使用 0.7 的系统, 0.6.1 的系统WIFI驱动是有问题的, 为此, 我们需要修改 hello_phoenix/apps/fw/mix.exs 配置文件的 deps 和 system 为如下:
def deps do
[
{:nerves, "~> 0.3.0"},
{:nerves_interim_wifi, github: "nerves-project/nerves_interim_wifi"},
{:ui, in_umbrella: true}]
end
def system(target) do
[
# {:"nerves_system_#{target}", ">= 0.0.0"}
{:"nerves_system_#{target}", github: "nerves-project/nerves_system_rpi3"}
]
end
把 :ui 和 :nerves_interim_wifi 添加到启动列表中
def application do
[mod: {Fw, []},
applications: [:logger, :ui, :nerves_interim_wifi]]
end
修改 hello_phoenix/app/fw/mix.exs 中的依赖路径和构建路径
def project do
[app: :fw,
version: "0.0.1",
target: @target,
archives: [nerves_bootstrap: "~> 0.1.4"],
deps_path: "../../deps/#{@target}",
build_path: "../../_build/#{@target}",
lockfile: "../../mix.lock",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
aliases: aliases,
deps: deps ++ system(@target)]
end
UI 测试, 往设备烧之前可以先在主机系统上测试一下, 没问题后再制作固件并烧到Pi上.
cd hello_phoenix/app/ui iex -S mix phoenix.server
制作固件, 固件的制作需要切换到 hello_phoenix/app/fw 去执行, 切记不要在伞状项目 hello_phoenix 的根目录运行.
cd hello_phoenix/app/fw mix deps.get mix firmware mix firmware.burn
在Mac上, mix firmware.burn 会提示你确认烧录的目标(别烧错了, 特别是插入了多个SD卡的时候), 并需要输入系统登录密码.
下面是几个要注意的方面
一. 环境变量
为了避免每个项目都重复下载系统镜像包, 在命令行中执行
export NERVES_SYSTEM_CACHE=local
或添加到 ~/.profile , ~/.bashrc (BASH), ~/zshrc (ZSH)中.
二. Erlang 版本 需要安装 OTP 19
简化了嵌入式系统的开发, 把嵌入式开发带入到普通程序员群体. 如果你使用的是官方支持的开饭, 甚至不需要了解底层的任何东西, 只要了解Elixir就可以了, 对物联网应用开发有极大的促进作用.
https://github.com/developerw...
可以Clone下来仔细看Git日志, 详细说明了如何从从头开始配置一个新的Nerves项目.