神经+凤凰 002+利用asdf安装Node
首先
这是在Raspberry Pi上搭建Nerves+Phoenix环境。
上次的Nerves+Phoenix 001
本次将从可能遇到的环境配置问题开始,一直到在Nerves上运行时的密钥设置都进行说明。
请查看本文,以解决上次无法运行的问题。
可以参考
asdf虚拟机. 网
GitHub asdf-node.js
hexdocs.pm/phoenix 和 github.com nerves-project 的 phoenix-web-interfaces
环境
-
- macOS
-
- IEx 1.9.1 (compiled with Erlang/OTP 22)
-
- nerves_bootstrap-1.7.1
- phoenix 1.4.16
书的内容表
-
- asdfでnodeをインストール
-
- phoenixを最新化
-
- 下準備
-
- プロジェクトの作成
-
- プロジェクトの依存関係を整理
-
- ネットワーク(vintage_net)の設定
-
- 鍵を設定
-
- ローカルでPhoenix確認
-
- RaspberryPi3B+Nerves+Phoenixを確認
- まとめ
在asdf中安装node。
#お告げの通りにインストール
$ brew install \
coreutils automake autoconf openssl \
libyaml readline libxslt libtool unixodbc \
unzip curl
$ brew install gpg
$ asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs.git
#ここでエラーになるかも
$ bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
Authenticity of checksum file can not be assured! Please be sure to check the README of asdf-nodejs in case you did not yet import the needed PGP keys. If you already did that then that is the point to become SUSPICIOUS! There must be a reason why this is failing. If you are installing an older NodeJS version you might need to import OpenPGP keys of previous release managers. Exiting.
#エラーになったので「import-release-team-keyring」を修正
vi ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
#コメントアウト
#SERVERS="ha.pool.sks-keyservers.net
# p80.pool.sks-keyservers.net:80 \
# ipv4.pool.sks-keyservers.net \
# keyserver.ubuntu.com
# keyserver.ubuntu.com:80 \
# pgp.mit.edu
# pgp.mit.edu:80"
#add
SERVERS="ipv4.pool.sks-keyservers.net \
pgp.mit.edu"
#node.jsをインストール(ver.推奨版)
$ asdf install nodejs 12.16.1
#bash再実行
asdf global nodejs 12.16.1
准备开始
将Phoenix和Nerves更新到最新版本
#phoenixを最新化
$ mix local.phx
phx_new 1.4.16
#phoenixのインストールからの方はこちら
$ mix archive.install hex phx_new 1.4.16
#nervesを最新に(bootstrapのバージョンが古いと怒られるので)
$ mix local.nerves
* creating **/.asdf/installs/elixir/1.9.1-otp-22/.mix/archives/nerves_bootstrap-1.7.1
# bootstrapのinstallが必要な場合は
mix archive.install hex nerves_bootstrap
创建项目
目录结构如下所示:
ExiNix
├ deviceio
└ phxif
#親ディレクトリを作成
mkdir ExiNix
cd ExiNix
#RaspberryPi3をターゲット
set -x MIX_TARGET rpi3
#Nervesプロジェクトを作成
mix nerves.new deviceio --nerves-pack
#phoenixプロジェクトを作成(--no-webpack オプションは付けない)
mix phx.new phxif --no-ecto
#とりあえずローカルで動くか確認
$ cd phxif
$ mix phx.server
用浏览器访问本地主机的localhost:4000
整理项目的依赖关系
本次我们将使用雨披项目结构。
# ...
defp deps do
[
# Add
{:phxif, path: "../phxif"},
# ...
]
end
# ・・・
# Add 以下を追記
import_config "../../phxif/config/config.exs"
import_config "../../phxif/config/prod.exs"
config :phxif, PhxifWeb.Endpoint,
# Nerves root filesystem is read-only, so disable the code reloader
code_reloader: false,
http: [port: 80],
# Use compile-time Mix config instead of runtime environment variables
load_from_system_env: false,
# Start the server since we're running in a release instead of through `mix`
server: true,
url: [host: "nerves.local", port: 80]
网络(vintage_net)的设置
config :vintage_net,
#JPに変更
regulatory_domain: "JP",
config: [
{"usb0", %{type: VintageNetDirect}},
{"eth0",
%{
type: VintageNetEthernet,
ipv4: %{
method: :static,
address: "192.168.***.***",
prefix_length: 24,
}
}
},
{"wlan0",
%{
type: VintageNetWiFi,
vintage_net_wifi: %{networks: [%{key_mgmt: :wpa_psk, ssid: "SSIDを記載", psk: "パスワード"}]},
ipv4: %{method: :dhcp}
}
}
]
设定密钥
从外部导入CSRF令牌
#・・・
# Add 「get_csrf_token: 0,」を追加
import Phoenix.Controller, only: [get_csrf_token: 0,get_flash: 1, get_flash: 2, view_module: 1]
#・・・
生成和设置密钥
$ cd phxif
$ mix deps.get
#64byte以上じゃないと実行時にエラーになったので長さを指定しない。
$ mix phx.gen.secret
***秘密鍵***
#・・・
#本番環境用の設定
#鍵を設定
secret_key_base = "***秘密鍵***"
# System.get_env("SECRET_KEY_BASE") ||
# raise """
# environment variable SECRET_KEY_BASE is missing.
# You can generate one by calling: mix phx.gen.secret
# """
#・・・
#・・・
#ローカル実行時の設定
# Configures the endpoint
config :phxif, PhxifWeb.Endpoint,
url: [host: "localhost"],
#鍵を設定
secret_key_base: "***秘密鍵***",
render_errors: [view: PhxifWeb.ErrorView, accepts: ~w(html json)],
pubsub: [name: Phxif.PubSub, adapter: Phoenix.PubSub.PG2],
live_view: [signing_salt: "g5JOni5o"]
#・・・
备注:无需更改,因为phxif/config/prod.exs将被deviceio/config/config.exs覆盖。
本地确认Phoenix
$ cd phxif
$ mix phx.server
用浏览器访问localhost:4000
确认Raspberry Pi 3B+Nerves+Phoenix。
$ cd deviceio
$ mix.deps.get
$ mix.firmware
$ mix.firmware.burn
通过浏览器访问nerves.local(设定的静态IP)。
总结
在神经元上运行凤凰的最简配置
如果将项目结构配置为poncho,那么Phoenix将更加独立且易于开发。
在博文中,我可以轻松地(应该可以)使用CSRF防护进行简单实现。
<%# <form method="POST" action="/abc/hoge"> %>
为了方便快速地在开发时进行反映,事先准备一个upload.sh文件。
# upload.shを作っておく
$ mix firmware.gen.script
#変更をネットワーク越しに反映
$ ./upload.sh 192.168.***.***
下一步是使用Phoenix在设备端显示IO。