6.5 PiZero 側のコードを読む
Raspberry Pi Zero側コード
- ターミナルウィンドの右側のファイルマネージャで
main-remote_gpio_led.jsを選び、[表示] からソースコードを開いてみましょう。
import { requestGPIOAccess } from "node-web-gpio";
import nodeWebSocketLib from "websocket"; // https://www.npmjs.com/package/websocket
import { RelayServer } from "./RelayServer.js";
let channel;
let gpioPort0;
function controlLED(messge) {
console.log(messge.data);
switch (messge.data) {
case "LED ON":
gpioPort0.write(1);
console.log("ON");
channel.send("LEDをオンにしました");
break;
case "LED OFF":
gpioPort0.write(0);
console.log("OFF");
channel.send("LEDをオフにしました");
break;
}
}
// GPIOポート0の初期化
const gpioAccess = await requestGPIOAccess();
const mbGpioPorts = gpioAccess.ports;
gpioPort0 = mbGpioPorts.get(26);
await gpioPort0.export("out");
// webSocketリレーの初期化
const relay = RelayServer(
"chirimentest",
"chirimenSocket",
nodeWebSocketLib,
"https://chirimen.org",
);
channel = await relay.subscribe("chirimenLED");
console.log("web socketリレーサービスに接続しました");
channel.onmessage = controlLED;
LEDを点けたり消したりする指示は、Raspberry Pi Zero自身が思いつくわけではありません。指示はネットワークの向こう、PC側から届きます。冒頭の import を見ると、これまで通りWebGPIOライブラリを読み込んだあとに、見慣れない2行が続いているのはそのためです。
import nodeWebSocketLib from "websocket";
import { RelayServer } from "./RelayServer.js";
ブラウザにはWebSocketの機能が標準で組み込まれていますが、Node.jsにはありません。そのためrelayServer.jsライブラリに加えて、webSocket自体のライブラリも読み込んでおく必要があります。
あとの流れは単純です。relayServer.jsを使って接続を初期化し、メッセージが届くたびに呼ばれる関数を受信処理(コールバック関数)として登録します。届いた文字列をもとにGPIO出力を操作するのは最後の一手間で、"LED ON" なら点灯、"LED OFF" なら消灯です。それ以外の文字列が届いても、コードは何もしません。
コードの詳細解説はこちらを参照してください。