神经+凤凰 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

nerves.local_.png

整理项目的依赖关系

本次我们将使用雨披项目结构。


# ...
  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

nerves.local_.png

确认Raspberry Pi 3B+Nerves+Phoenix。

$ cd deviceio
$ mix.deps.get
$ mix.firmware
$ mix.firmware.burn

通过浏览器访问nerves.local(设定的静态IP)。

nerves.local_.png

总结

在神经元上运行凤凰的最简配置

如果将项目结构配置为poncho,那么Phoenix将更加独立且易于开发。

在博文中,我可以轻松地(应该可以)使用CSRF防护进行简单实现。

<%# <form method="POST" action="/abc/hoge"> %>

为了方便快速地在开发时进行反映,事先准备一个upload.sh文件。

# upload.shを作っておく
$ mix firmware.gen.script

#変更をネットワーク越しに反映
$ ./upload.sh 192.168.***.***

下一步是使用Phoenix在设备端显示IO。

广告
将在 10 秒后关闭
bannerAds