これは #NervesJP Advent Calendar 2025 の23日目です。
はじめに
このところ Pub/Sub のプラットフォーム Zenoh に注目しております。Zenoh の Elixir API である Zenohex の超入門も書いてみました1 。これは Nerves で使う場合も難しくなくそのまま導入できます。
上でご紹介した導入の方法は Zenoh を client というモードで使うもので、全部のノードが同一LAN内にある場合にはこれだけで使えます。これが間にNAPTが入ってるWiFiルータ越しにとか、インターネットを使って広域分散でとか、ちょっとネットワークが複雑になるともうひとひねり必要になります。これに対応するためのモードには peer モードとか router モードがあって、これを使うには zenohd という deamon (unix process) を用意します。
zenohd は作るのもいごかすのもそんなに難しくないです。何かと Elixir するときには Nerves でいごかしてしまう自分に取っては Nerves で zenohd がいごけば何かと楽ちんです。そこで今回 Nerves にも組み込んでみたのでご紹介します…
…と記事を書こうとしたんですが、いごかねぇ。どうにもいごかねぇ。τゎぃぇ、記事を落としたままにするのも忍びないので、目次の残骸は残しておいて、冬休みの宿題にします。
zenohd を使わない場合
Zenoh client として Nerves を使う場合は zenohd がなくても良いです。
mix.exs ファイルに依存関係を書いて mix deps.get して、あとは Elixir プログラミングをお楽しみください。
defp deps do
[
+ {:zenohex, "~> 0.7.1"}
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
zenohd を使わずにネットワークを複雑にする
ネットワークが複雑になる場合、ルータを越えたりするための技がいくつかあります。その一つに zenohd を使うという手があります。ただし zenohd は全部のノードに存在する必要はないです。のであえて Nerves に実装しなくても、同一LAN内に Nerves ではない Elixir マシンがあって、それが zenohd を喋るのでも構いません。むしろこの方が設計としては普通かもです。
Nerves に zenohd を入れる
- zenohd のバイナリを用意する
- gnu/musl
- download/cargo
- それらしいディレクトリにそれを置く
- rootfs overlay
- priv
- 起動の方法を考える
- 手動
- rc.local
- muontrap