[Eject]VPS上にNode.jsでチャットサーバを作って自宅のRaspberryPiにEjectさせる

私が今使っている自宅のインターネット環境ではプロバイダからDHCPでIPアドレスをもらい、固定IPは有料となっています。
また、ポート等も上位のネットワークで管理されており、内向きのパケットは基本的にすべてが破棄されます。
固定IP取得ポート開放はいくらか支払えば可能ですが、月2000円くらいかかったりするので、できれば無料でやりたいですよね。

そこで考えたのが、以前の[Twitter]←(UserStrem監視)←[RaspberryPi]→(制御)→[Eject]だったわけですが、これではTwitterに依存することになります。
できればTwitterなどを使わずに自由にEjectしたいです。(UIも自分で作ったり)

というわけで今回はVPS上にNode.jsでチャットサーバを立てることで実現してみました。

※Ejectネタです。(☝ ՞ਊ ՞)☝ウィーン

構想

VPSにNode.jsを立ててブラウザとRaspberryPiとの中継をしてもらう感じにします。

ブラウザ→(接続)→[Node.js チャットサーバ]←(接続)←RaspberyyPi(Javaクライアント)

こんな感じにして、ブラウザからメッセージを送信したらRaspberryPiに中継します。
RaspberryPi側はJavaでクライアントを作成し、メッセージを受信したらEjectを行わせます。
そしてEjectの成功・失敗をサーバに送信し、サーバはブラウザに向けてメッセージを中継します。
シンプルですね。

Node.jsを選んだ理由は、以前少しだけ使ったことがあったのと、Socket.ioが簡単に利用できるためチャットサーバをすぐ立てられると考えたからです。
やっていることはIRCなどを利用したbot攻撃などとあまり変わりませんね。(攻撃指令をIRCサーバで中継させて、botに攻撃を開始させるというアレ)
正直IRCでやってもいいと思いますが、ブラウザからやるならNode.jsで直接JSとSocket.ioで通信できたほうがいいので今回はIRCは使いませんでした。
(IRCサーバとの通信プログラムなんて書いたことなかったし)

Node.jsサーバを立てる

Node.jsからダウンロードするか、apt-getとかyumとかでも入ると思います。
次に適当な場所にディレクトリを作ります。

Socket.ioを使うので、npmでダウンロードします。
私は最新版のsocket.ioではうまく動作しなかったので、少し古いバージョンを指定しました。
このあたりを参考にさせていただきました。

これでNode.jsの環境は整いました。
あとはサーバーサイドのコードを書いていきます。
とはいえ、Node.jsはほとんど触ったことないので一からコードは書けるはずもありません。
なので、やっぱり他の方が書かれたソースコードを参考に書いていくことにします。
今回はここを参考にしました。(ほぼコピペです)

[app.js]

[index.html]

サーバを起動します。

これでブラウザからアクセスしてみてサーバーに出力があれば成功です。
このコードでは3000ポートを指定しています。

RaspberryPi側を実装する

前回と同じようにJavaで実装します。
このライブラリを使いましょう。
antで.jarにして、classpathで指定してあげて使います。
(この辺りの説明は面倒なので、各自ググってください)
以下のコードでは他にも色々ライブラリを使ってますが、今回重要なのはsocket.ioなので他のライブラリの説明は省略します。

こんなかんじで適当にプログラムを組みます。

JavaでNode.jsに接続し、Socket.ioでメッセージのやりとりを行います。
ブラウザからNode.jsにEjectのメッセージが送られると、Node.jsはJavaのクライアントに向けてEjectのメッセージを送信します。
Javaクライアントは自分宛てのメッセージを受信すると、前回作ったPHPのAPIを呼び出しEjectを実行します。
そしてJavaクライアントはEjectが成功したか失敗したかをブラウザに向けたメッセージを送信します。
ブラウザからのメッセージをNode.jsが中継する感じですね。

結果

VPSにNode.jsでチャットサーバを立てることでEjectメッセージの中継に成功。
Socket.IOは便利ですね、簡単にチャットサーバが立ちました。Ejectだけじゃなくて色々使えそうです。
ただ今回の例ではEjectメッセージが短い間隔で連続で飛ばされると、Javaのクライアントが落ちたりしました。
何が原因なのか分かりませんが、今回はとりあえず「できる」ということがわかったのでこれから色々試してみたいと思います。

今回はNode.jsだったので次はIRCで中継させてからのEjectでもやろうかなぁとか考えてます。

コメントを残す

Your email address will not be published / Required fields are marked *