【IoT】ホームモニタリングシステムをESP8266で構築する(サーバー編)

Arduino

ESP8266でホームモニタリングシステム構築

こんにちは、くろべこです。

巷では室内の環境データを取得してモニタリングやクラウドに保存するようなIoTシステムは今どき普通になってきていますよね?しかし、実際に導入しようとするとサーバーとの契約やクライアント(子機)の購入/レンタル。システムの保守・維持管理など結構お金がかかってくると思います。

そこで今回はESP8266を使用した室内環境のモニタリングシステムの製作(サーバー編)をしてみたいと思います。私が提案するシステムのコンセプトは以下の通りです。

システムのコンセプト

  • 安価で構築できる
  • クライアント(子機)を自由に増やせる
  • クラウドにデータ上げたりやデータ保存が出来たりなど拡張性がある

 

具体的な内容はソケット通信を用いてサーバーとクライアントを作成します。なので、ESP8266は最低2個必要となりますね。

サーバー側はクライアント側からの情報を待ち受けて、データを収集します。クライアント側は一定周期でサーバーにアクセスしてデータをサーバー側に送信する感じです。

【システム概要】

  1. サーバーはクライアントからのデータ受信を待ち受け
  2. クライアントは室内データを取得&サーバーへ送信
  3. サーバーはクライアントから受け取ったデータをOLEDに表示

イメージ的には以下のような感じです。

ちなみに、今回はソケット通信の取り決めとしては【TCP】を使用します。なので、クライアントとサーバーの通信は1対1で行われます。


サーバーのプログラムを構築する

まずは、サーバー側のプログラムを作りましょう。

【サーバーが持つ機能】

  • 静的IPの設定
  • ソケット通信用ポート設定
  • 家庭内WiFiへの接続(STAモード)
  • データ受信コード
  • 受信データ処理コード
  • ACK用データ送信コード
  • 受信データ表示用コード

ざっくり機能としてはこんな感じです。では、実際にプログラムを見てみましょう。

プログラム内で使用している関数について紹介します。

<<String IPConvert(uint32_t ip)>>

この関数では、接続先のクライアントIPアドレスをOLEDに表示させるためにIPアドレスを文字列に変換する関数になります。クライアントのIPアドレスはclient.remoteIP()でゲットするのですが、arudinoのIPAddressクラスは1バイト区切りの8進数で定義されています。なので、文字列に直すために1バイトずつ抽出して文字列変換し、文字列を結合させてあげています。

<<OledDisp(String ip, String st1, String st2, String st3, String st4)>>

この関数は文字列をOLEDに表示させるものです。今回使用しているOLEDは1.3インチのSH1106のチップを使用した物を使用しています。引数は4つ設定していまして、st1,st2は1ページ目、st3,st4は2ページ目に表示させるようにしています。

<<split(String data, char delimiter, String *dst)>>

この関数は受信データの分割を行う関数になります。受信データは文字列の区切り(デリミタ)としてカンマ”,”を使用しています。関数内でデリミタを確認しつつ文字列を分割しています。

<<SocketLed(String led)>>

この関数では、接続クライアントのIPアドレスを確認してクライアントに対応するLEDを光らせています。当初は==で書いていたのですが上手くいきませんでした。なので、indexOfを使って、文字列のどこかに該当のIPAddressが入っていたら条件分岐するようにしています。

以上が関数の説明でした。

次にsetup()で行っていることをフローで説明します。

  1. pinModeの設定
  2. WiFi接続
  3. サーバー開始(クライアントからの接続待ちにする)
  4. OLED初期化

最後に、メインループの説明ですね。

  1. クライアントの接続確認
  2. データ受信(タイムアウトも設定)
  3. 受信に対するACK送信
  4. OLED表示
  5. 接続close

このループを回しているだけです。クライアント側は次回解説しますが、現状3つのクライアントを接続していまして、コネクション切断後、再接続時間10秒を設けて1クライアントごとTCP通信を行っています。

ちなみに、TCPソケット通信で同時に複数のクライアントと接続できるんですかね?ポートを分けてあげればイメージ的に出来そうなのですがArduinoでできるのかな??知っている人がいれば教えてください。

長々と書きましたがサーバー側の設定は以上です。参考に、クライアントと接続している実際の動画載せて終わりたいと思います。

 

 

コメント

タイトルとURLをコピーしました