LoginSignup
12
5

More than 3 years have passed since last update.

Nervesを使ってRaspberry pi2からTwitterの投稿を行う

Last updated at Posted at 2019-12-01

(この記事は、「#NervesJP Advent Calendar 2019」の2日目です)
昨日はtakasehideki先生の「ElixirでIoT#4.1:Nerves開発環境の準備(2019年12月版)」です!こちらもぜひぜひ!

What is Nerves ?

使うもの

  • MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
  • Raspberry Pi2

IMG_20191125_204302.jpg

つくったもの

Elixirのインストール

  • Host(今回の記事ではMacBook Pro)にインストールします
  • macOS Catalina(10.15.1)にasdfでElixirをインストールする
    • こちらなどを参考にしてください
    • Elixirをインストールするとき、1.9.4-otp-22 みたいなotpつきのやつを指定するほうがいいとおもいます
    • 指定なしの場合は、のちのmix firmwareかなにかでエラーがでた気がします(わすれました)
  • Elixirをインストールできたら、公式に従って以下を行います
$ mix local.hex
$ mix local.rebar
$ mix archive.install hex nerves_bootstrap

まずは nerves_examples で練習

1. microSDカードにfirmware.burnするまで

  • Raspberry Pi2でNervesを動かしてネットワークに接続してみます
  • 以下、Host(今回の記事ではMacBook Pro)での作業です
  • MIX_TARGETTargetsでお持ちのガジェットを指定してください
    • 私はRaspberry Pi2しかもっていないのでこれでしか試せていません
  • NERVES_NETWORK_SSIDNERVES_NETWORK_PSKの値は適切な値をセットしてください
  • これを読んでいるような人はたいていもっているとおもうのですが、~/.sshに秘密鍵と公開鍵のペアがおいてある必要があります
    • デフォルトは以下の3種類のうちいずれかを期待しているようです
      • id_rsa / id_rsa.pub
      • id_ecdsa / id_ecdsa.pub
      • id_ed25519 / id_ed25519.pub
    • ソースコードはここなので、ファイル名が違うとかあればここを書き換えればうまくいくとおもいます
      • 私は、~/.ssh/id_rsa~/.ssh/id_rsa.pub がありましたので特に変更はしていないです
$ git clone https://github.com/nerves-project/nerves_examples.git
$ cd nerves_examples/hello_network/
$ export MIX_TARGET=rpi2
$ export NERVES_NETWORK_SSID=ssid
$ export NERVES_NETWORK_PSK=secret
$ mix deps.get
$ mix firmware
  • microSDカードをHost(今回の記事ではMacBook Pro)に挿入!
$ mix firmware.burn
  • microSDカードを自動検出してくれるのですが、「本当にburnしていいの?」って、ここはじめてだと緊張します
  • 慣れるとYをすぐおします
  • Macのパスワード聞かれるので、本当に大丈夫なことを確認して、burnしてください
    • microSDカードのデータ容量くらいで、エイッとやっています
    • 正しい確認方法ありましたら、コメントください:bow:

2. できあがったmicroSDカードをRaspberry Pi2に差し込んで電源ON

  • ディスプレイとキーボードを接続しておくといいかもしれません
  • iexが起動しています
  • 適当にエンターでもおして
  • HelloNetwork.test_dnsを実行してみてください
  • :ok が返ってくれば、Nerves on Raspberry Pi2はインターネットにつながっています
  • 私は特に失敗などありませんでした
  • もしうまくつながらない場合は、RPi3B/B+ wired and wireless Ethernet connections あたりが解決のヒントになるのではないかとおもいます(カンです)
  • Nerves on Raspberry Pi2のIPアドレスをどうにかして調べてください
    • 私は192.168.1.1にアクセスして、ルーターの管理画面みたいなやつにいって、「DHCPv4サーバ払い出し状況」みたいなやつから特定しました
      • @TAKASEhideki 先生から、Raspberry Pi2とTV(ディスプレイ)、キーボードをつないでおいて、iexに ifconfigコマンドを打ち込む方法を教えてもらいました
  • Host(今回の記事ではMacBook Pro)からNerves on Raspberry Pi2にssh接続しましょう!
    • 例: ssh 192.168.1.10
  • ここまで順調にいきましたら、続いて自分のプロダクトを作ってみましょう

おまけ

  • どうでもよい話ですが、Host(今回の記事ではMacBook Pro)からNerves on Raspberry Pi2にssh接続ができることをNervesを始めた当初は知りませんでした
  • TVとRaspberry Pi2をつないで、日本語配列のキーボードで記号をうつときに、パズルのようにしてキーを探していました:sweat_smile:
  • Nervesをはじめた当初はこんな感じで、@zacky1972 先生のcpu_infoのデバッグに参加していました IMG_20191106_212136.jpg
  • 文字起こしとかしてました:sweat:
  • 解決したときはこちらに名前を載せてもらいました!
    • hdとかそれまで私は知らなかった関数の存在を知ることができてよかったです
    • いい思い出です

アプリの作成

1. ひながたの作成

$ mix nerves.new hello_nerves

2. WiFi接続

config/target.exs
config :nerves_network,
  regulatory_domain: "JP"

key_mgmt = System.get_env("NERVES_NETWORK_KEY_MGMT") || "WPA-PSK"

config :nerves_network, :default,
  wlan0: [
    networks: [
      [
        ssid: System.get_env("NERVES_NETWORK_SSID"),
        psk: System.get_env("NERVES_NETWORK_PSK"),
        key_mgmt: String.to_atom(key_mgmt)
      ]
    ]
  ]
$ export MIX_TARGET=rpi2
$ export NERVES_NETWORK_SSID=ssid
$ export NERVES_NETWORK_PSK=secret
$ mix deps.get
$ mix firmware
$ mix firmware.burn
  • 練習のところでやったように、Host(今回の記事ではMacBook Pro)からNerves on Raspberry Pi2にssh接続できることを確かめましょう

3. 天気予報取得、Twitter投稿のためのソースコード変更

lib/weather/forecast.ex
defmodule Weather.Forecast do
  def run do
    city = cities() |> Enum.random()

    description =
      "http://weather.livedoor.com/forecast/webservice/json/v1?city=#{city}"
      |> HTTPoison.get!()
      |> Map.get(:body)
      |> Poison.decode!()
      |> Map.get("description")
      |> Map.get("text")
      |> String.split()
      |> Enum.reduce_while("", fn s, acc ->
        if String.length(acc <> "#{s}\n") < 140 - String.length(i_use_nerves()),
          do: {:cont, acc <> "#{s}\n"},
          else: {:halt, acc}
      end)

    if String.length(description) == 0, do: exit("oh no")

    description |> Kernel.<>(i_use_nerves())
  end

  defp i_use_nerves do
    if Application.get_env(:hello_nerves, :target) != :host do
      "I use Nerves. I like it!"
    else
      ""
    end
  end
  • その後、なんどかリファクタをして現在の姿はこちら です
  • 大筋はかわっていません

4. イメージの作成、microSDカードへの書き込み

  • Twitterの認証情報の取得方法はわすれました:sunglasses:
  • いつ取得したのかすら忘れましたがもっていたものを使いました
$ export MIX_TARGET=rpi2
$ export NERVES_NETWORK_SSID=ssid
$ export NERVES_NETWORK_PSK=secret
$ export TWITTER_CONSUMER_KEY=xxx
$ export TWITTER_CONSUMER_SECRET=yyy
$ export TWITTER_ACCESS_TOKEN=zzz
$ export TWITTER_ACCESS_TOKEN_SECRET=aaa
$ mix deps.get
$ mix firmware
$ mix firmware.burn

5. Nerves on Raspberry Pi2の起動

  • こんがりやきあがったmicroSDカードをRaspberry Pi2に挿し込んで電源を投入しましょう
  • Host(今回の記事ではMacBook Pro)からNerves on Raspberry Pi2にssh接続して、HelloNerves.updateを実行してみましょう
Interactive Elixir (1.9.4) - press Ctrl+C to exit (type h() ENTER for help)
Toolshed imported. Run h(Toolshed) for more info
RingLogger is collecting log messages from Elixir and Linux. To see the
messages, either attach the current IEx session to the logger:

  RingLogger.attach

or print the next messages in the log:

  RingLogger.next

iex(1)> HelloNerves.update
%ExTwitter.Model.Tweet{
  in_reply_to_user_id: nil,
  truncated: false,
  withheld_in_countries: nil,
  quoted_status_id_str: nil,
  favorite_count: 0,
  scopes: nil,
  lang: "ja",
  favorited: false,
  geo: nil,

スクリーンショット 2019-11-15 2.54.07.png

まとめ

  • Nervesだからと身構える必要はなく、ふつうのElixirプログラムを書けばうごきます
    • 私の郷里の言葉では、「いごきます」
  • Getting Startedは英語が不得手な私でも読みやすいです
  • cron的なこと:robot:ができていないので、手動でiexから実行しています
    • 課題といえば課題ですが
    • 朝、早起きする意味でこのままでもいいかも:relaxed:

最後に

次回

次回も引き続き私が担当しまして、「Nervesでcron的なことをする」です!こちらも是非どうぞ~

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5