Firebaseを使用したモノのインターネットのプロトタイピング:少ないリソースでより多くのことを行う方法

IoTとは、デバイス、つまり「モノ」をインターネットに接続し、これらのデバイスから収集したデータを分析して付加価値を引き出すことです。この記事では、IoTプロジェクトに取り組むときにFirebaseを活用する方法と、Firebaseが従来の方法よりもはるかに高速かつ簡単にIoTプロトタイプを開発するのにどのように役立つかを説明します。また、独自のIoTプロジェクトを開発し、Firebaseでホストします。

Firebaseリアルタイムデータベースの前

私のIoTプロジェクトのほとんどは、異なるエンドポイント間の何らかの通信方法を必要とします。これらのエンドポイントは、デバイスやサービスからアプリケーションまで、何でもかまいません。最終的には、さらに処理および分析するために、データをどこかに保存する必要があります。

デバイスがセンサーからの温度と湿度の値を測定し、ガス漏れがあるかどうかガスセンサーをチェックするIoTシステムを構築するとします。このデータは、データベースサービスに送信して保存します。次に、これらの値をフェッチしてダッシュボードに表示し、ガス漏れがある場合に通知を表示するWebアプリケーションが必要です。非常に単純ですよね…?

これを行う簡単で軽量な方法は、ハブとして機能するMQTTブローカーをセットアップし、デバイスから公開されたすべての受信メッセージをすべてのサブスクライブに再ルーティングすることです。この場合、クライアントはWebアプリケーションが好きです。

頭に浮かぶ質問は、Webアプリケーションがデータをどのように表示するかということです。つまり、ブローカーからのメッセージを直接表示するのでしょうか、それともデータベースサービスからすでに保存されているデータをフェッチするのでしょうか。

アプリに、ブローカーからのデータをリアルタイムで表示することとデータベースからデータを取得することの両方を実行させたいとします。この場合、これを達成するために2つの方法(実際には多くの異なる方法があります)を考えることができます:

最初の解決策:

このアーキテクチャを使用すると、デバイスは最初にデータをブローカーに公開し、次にデータベースWebサービスにHTTPリクエストを送信してデータを保存します。このソリューションでは、デバイスにMQTTクライアントとHTTPクライアントの2つのクライアントを実装する必要があります。

2番目の解決策:

これを行うもう1つの方法は、デバイスがデータをブローカーに送信または公開し、ブローカーが(予想どおり)このメッセージをWebアプリなどの接続されているすべてのサブスクライバーに再ルーティングすることです。ただし、今回は、このデータを受け入れてデータベースWebサービスに送信して保存するAPIエンジンを表す別のサブスクライバーが接続されています。

このソリューションでお気づきかもしれませんが、HTTPクライアントはデバイスから切り離され、バックエンドサービスとして実装されています。このようにして、デバイスプログラムを大幅に軽量化できます。これは、CPUやメモリなどのリソースが制限されている制約のあるIoTデバイスで開発する場合に留意する重要なことです。

それでも、このソリューションでは、永続層として機能するバックエンドサービスの開発に追加の作業が必要でした。

では、これを行うもっと簡単な方法はありますか?

Firebaseが救助に

上で見たように、物事は非常に簡単に少し複雑になる可能性があります。プロトタイプで作業するときにすぐに立ち上げて実行したい私のような人にとっては、余分な時間がかかる可能性があります。そのため、記事のこの部分では、Firebaseがどのようにあなたの生活を楽にし、IoTプロトタイプを開発する際に多くの時間を節約できるかを説明します。

Firebaseは、認証、ストレージ、クラウド機能からWebアプリケーションのホスティングまで、さまざまなクラウドサービスを提供しています。この記事では、リアルタイムデータベースとホスティングの2つのサービスを使用します。

Firebase Realtime Database から始めましょう。このサービス名を読むときに最初に頭に浮かぶのは、データベースとは何かはわかっていますが、ここでリアルタイムであるとはどういう意味ですか?

ウィキペディアによると:

リアルタイムデータベースは、リアルタイム処理を使用して、状態が絶えず変化するワークロードを処理するデータベースシステムです。これは、永続データを含む従来のデータベースとは異なり、ほとんど時間の影響を受けません

Firebase Realtime Databaseの場合、クライアントはデータベースサービスに接続され、WebSocketを介してオープンな双方向接続を維持します。次に、クライアントがデータをデータベースにプッシュすると、データがトリガーされ、(この場合)接続されているすべてのクライアントに、新しく保存されたデータを送信して、データが変更されたことを通知します。

この作業方法は、MQTTブローカーと、パブリッシャーからメッセージを受信して​​すべてのサブスクライバーに送信したときのMQTTブローカーの反応を思い出させる場合があります。今回の違いは、データベースであるデータ永続部分の追加です。したがって、ここに表示されているように、他のプロトコルを使用してメッセージを自分でルーティングする必要はありません。FirebaseRealtimeDatabaseがそれを処理し、通常のデータベース機能を実行します。すごいですね。

前述のIoTシステムに戻ると、デバイスをFirebase Realtime Databaseに接続して、データを定期的にデータベースにプッシュすることができます。システムの他の部分には、デバイスと同じサービスに接続され、データベースに変更があるたびに新しいデータを受信するWebアプリケーションがあります。

しかし、Webアプリケーションをホスティングするのはどうですか?

Firebaseは、独自のウェブサーバーを管理したり、デプロイやネットワーク構成を処理したりするのではなく、アプリをホストするために使用できるホスティングサービスを提供します。良い点は、無料(まだ制限付き)で非常に使いやすいことです。

さて、皆さんが待ち望んでいた部分です。このデモでは、この記事全体で説明した例を使用して、それを実現します。

覚えているかと思いますが、IoTシステムは 2つのエンドポイントで構成されています。最初のエンドポイントは IoTデバイスで、温度、湿度のデータとその有無を送信します。 Firebase RealtimeDatabaseへのガス漏れの有無。これにより、2番目のエンドポイントであるウェブアプリケーションと通信し、データを読み取って素敵なダッシュボードに表示し、ガス漏れがある場合は通知をポップアップ表示します。

このプロジェクトを 3つのステップに分割して、わかりやすくします。

1。 FirebaseRealtimeデータベースの設定

このステップについて特別なことは何もありません。 Firebaseコンソールに移動して、新しいプロジェクトを作成するだけです。プロジェクトの準備ができたら、データベースセクションに移動し、クラウドFirestoreデータベースではなくリアルタイムデータベースを作成してください。テストモードで開始を選択し、このデータベースをテストにのみ使用するため、続行します。およびプロトタイピングであり、本番ソリューション用ではありません(したがって、赤い警告は無視できます)。これで、データベースを使用する準備が整いました。

2。 IoTデバイスアプリケーションの開発

組み込みシステムの開発について話すとき、低レベルのプログラミング、アセンブリ、レジスタ、メモリ管理などの用語をよく耳にします。これらの用語と概念は、使用しているハードウェアの詳細に関連しており、それぞれ変更される可能性があります。

そのため、アイデアのプロトタイピングを行うときは、他の高級言語や他のコードの考え方を同時に扱うため、これらの詳細を深く掘り下げて詳細に調べる時間がありません。 。したがって、代わりに、デバイスのアーキテクチャと特性、およびそれらの使用方法について明確な全体的なアイデアを持っている必要があります。

幸いなことに、ハードウェアのすべての低レベル機能をプロトタイピングおよび抽象化するために特別に作成されたプラットフォームがあります。はい、有名な Arduino について話しています。

ここで、Arduinoについて話しているときは、ボードではなく、IDE、コンパイラ、ライブラリを備えた Arduino Framework を指していることに注意してください。

つまり、Arduinoを使用してボードをプログラムしますが、どのボードを要求しますか?さて、センサーとインターフェースして温度などの物理的値を測定できるボードが必要です。また、このデータをデータベースに送信するために、インターネットに接続できる必要があります。最後に、Arduinoフレームワークを使用してプログラムできる必要があります。

これらのタスクを実行できるさまざまなボードが市場に出回っています。それらのいくつかはArduinoボードであり、他はArduino互換ボードです。

このデモでは、有名な NodeMCU 、Arduino互換ボードを使用します。これは、上海を拠点とする中国のメーカーであるEspressifSystemsによって製造されたチップセットである ESP8266 SoCに基づいています。このボードは、単一のユニットをわずか3ドルで購入できるため、開発者にとって魅力的です。

私たちのギア

Arduinoプラットフォームは、コードをプログラミングしてボードにアップロードするためのIDEを提供しますが、intelliSense機能やデバッグ機能を提供しないため、開発者にとってはあまり使いやすいものではありません。そのため、ほとんどのIoTプロジェクトでは、 PlatformIOと呼ばれる環境を使用しています。

これはIoT開発のためのオープンソースエコシステムですが、何を推測しますか? Arduinoフレームワークをサポートしています。したがって、これを使用してArduinoコードを記述し、コンパイルして、ボードにアップロードすることができます。最後に、PlatformIOの優れた点は、 Atom または VScode 内で使用できる拡張機能として提供されるため、他の製品と一緒に使用できることです。 IDEの機能(AtomまたはVScode)。これらの2つのYouTubeビデオチュートリアルを見て、環境をセットアップして理解することを強くお勧めします。

十分な話—始めましょう:

NodeMCUのファームウェアの開発

https://github.com/kaizoku-oh/firebase-iot-demo

ファームウェアの開発に取り掛かる前に、電子機器のセットアップについて話しましょう。

前の例を思い出すと、IoTデバイスは温度と湿度の値を測定し、ガスセンサーをチェックしてから、データをクラウドに送信します。この場合、 NodeMCU DHT11 センサーモジュールから温度と湿度の値を読み取り、 MQ5 ガスセンサーをチェックしてから、Firebaseにデータを送信します。

上の配線図からわかるように、DHT11とMQ5は、それぞれ GND 3.3V データ信号の3本のワイヤーでボードに接続されています。 。両方のセンサーのデータピンをボード上の2つの Dx ピンに接続すれば、配線は完了です。

配線が完了したので、PlatformIOを使用してファームウェアのコーディングを開始できます。

しかし、コードを直接書く前に、少し立ち止まって、プログラムが何をすべきかを考えてみましょう。

したがって、デバイスが最初に行う必要があるのは、インターネットに接続することです。そのためには、 WiFiに接続する必要があります。オンラインになったら、 Firebaseとの接続を開く必要があります。その後、デバイスは温度、湿度の値を読み取り、センサーからのガスをチェックし、最後に公開します。データ

タスクの順序付きリストは次のとおりです:

(ここでは、ワールド タスク は、タスクではなくコードのブロックの機能を指すために使用されていることに注意してください。 FreeRTOSタスクのようなリアルタイムOSで。)

1。 WiFiに接続します
2。 Firebaseとの接続を開きます
3。センサー値の読み取り
3。値をFirebaseに公開する

最初のタスクから始めましょう:

この機能は、 SSID (AP名)を出力し、NodeMCUをAPモードではなくステーションモードに設定することから始まります。その後、APに接続するまでロードを続けます。 SSIDとパスワードは、後で説明するように、別のファイルで定義されている2つの定数です。

この関数は非常に単純です。2つのパラメータ FIREBASE_HOST FIREBASE_AUTHを取ります。これらも別のファイルで定義されている2つの定数です。

まず、 DHT センサーのタイプとピンに2つの定数を定義します。その後、これら2つの定数をDHTコンストラクターに渡してDHTオブジェクトを作成します。最後に、オブジェクトメソッド readHumidity() readTemperature()を使用して、それぞれ湿度と温度を読み取ります。

ここでは、Firebaseクラスの pushInt()メソッドを使用して整数をFirebaseにプッシュし、エラーが発生した場合はそれを出力します。

これでタスクは完了です。あとは、これらのタスクをきれいなarduinoスケッチにまとめるだけです。

次に示すように、PlatformIOで新しいプロジェクトを作成することから始めます。

次に、プロジェクトに必要なライブラリをインストールする必要があります。この場合、ライブラリをローカルにインストールすることに注意してください。つまり、ライブラリはこのプロジェクトでのみ使用できます。これは、ある日、別のプロジェクトで別のバージョンのライブラリを使用することにした場合のベストプラクティスです。

PlatformIOホームページ→ライブラリに移動し、firebaseを検索します。 FirebaseArduinoが表示されるので、それをクリックします。ただし、インストールボタンをクリックしないでください。代わりに、インストールの横にあるをクリックして、ライブラリをインストールするプロジェクトを選択してください。次に、最後に[インストール]をクリックします。 DHT ライブラリに対してこのプロセスを繰り返します。

このコードを main.cpp ファイルにコピーします:

WiFiとFirebaseの認証情報を含むファイルを覚えていますか?インクルードフォルダに移動し、新しいファイル Creds.h を作成して、このコードをそのフォルダにコピーします。 認証情報に従ってコードを変更することを忘れないでください。

そして、あなたは行き​​ます!ファームウェアを NodeMCU にアップロードすると、デバイスが Firebase Realtime Database にデータを送信できるようになります。

3。 Webアプリケーションの開発とホスティング

https://github.com/kaizoku-oh/firebase-iot-web

IoTデバイスの準備が整い、データをリアルタイムデータベースにプッシュしたので、システム内の他のエンドポイントであるWebアプリケーションに移動できます。 Firebaseからデータを受信し、ダッシュボードに表示します。

まずアプリをローカルで開発し、最終的にはデプロイします。

プロジェクトを設定することから始めます。

Firebase CLIのインストール:

Firebase CLI (コマンドラインインターフェース)には、 Node.js npm (ノードパッケージマネージャー)が必要です。インストールしたら、次のコマンドを実行して、npmを使用してFirebaseCLIのインストールに進みます。

ビデオに従って、プロジェクトのセットアップを完了することができます。

プロジェクトのセットアップが完了すると、ディレクトリは次のようになります。

ダッシュボードUIを構築することから始めます。これは index.html ファイルになります。ファイルを開き、次のように変更します。

これは、Bootstrap MaterialDesignを使用して設計されたシンプルな HTML ページです。 2枚のカード要素で構成されています。1つは湿度を表示するためのもので、もう1つは温度を表示するためのものです。

ここでのFirebaseの部分については、最初に、headタグ内のscriptタグにfirebaseの依存関係をインポートします。最後に、ページの読み込みが完了すると、 app.js が呼び出されます。

ダッシュボードUIの準備ができたので、 app.js に移動して、Firebase接続とビジネスロジックを実装できます。同じディレクトリに app.js という新しいファイルを作成し、次のコードをコピーします。

スクリプトは、構成オブジェクトを作成することから始まります。最善の方法は、FirebaseコンソールのFirebaseプロジェクトから直接コピーすることです。これを行うには、Firebaseコンソールに移動し、Firebaseプロジェクトの設定に移動します。次に、下にスクロールして、次に示すように< /> アイコンをクリックします。

コードの残りの部分はコメントで自明だと思います。

これでアプリの準備が整い、次のコマンドを使用してローカルでテストできます。

起動時に、アプリはデータベースから最後の温度と湿度の値を取得することに注意してください。すごい!アプリはローカルで動作していますが、これまではローカルホスト内でのみ動作しており、外部からアクセスすることはできません。これは、 FirebaseHostingを使用してウェブ上でホストするときが来たことを意味します。

しかし、デプロイする前に、最後にやらなければならないことが1つだけあります。 database.rules.json ファイルに移動し、読み取りと書き込みのルールを「 true 」に変更します。この方法は安全ではないため、本番環境にはお勧めしませんが、ここでのデモンストレーション目的には問題ありません。

これで、展開の準備が整いました:

どうぞ!ここまで進んだら、今ではライブWebアプリケーションをデプロイして稼働させているはずです。

すべてをまとめる

すべてをまとめてシステムをテストする時が来ました。 NodeMCU をPCに接続し、スケッチをまだアップロードしていない場合はアップロードします。

ウェブアプリとFirebaseデータベースを開き、デバイスから送信された値でリアルタイムに変化するのを確認します。

次に、シリアルモニターを開いて、デバイスからWebアプリにプッシュされたデータを確認します。ブラウザでコンソールを開いて、受信した値を確認できることに注意してください。ここでは、ボーレートが115200 bpsのGtkシリアルポート端末を使用していますが、統合された PlatformIO シリアルモニターまたはその他の任意のツールを使用できます。

トラブルシューティング

ESP8266 でアプリケーションを開発しているときに問題が発生しました(理解するのに時間がかかりました)。すべてが正しく構成されていても(WiFi接続、Firebaseホスト、シークレットキー)、ESP8266は Firebaseに接続できませんでした。これは内部の間違った指紋が原因でした。> FirebaseHttpClient.h Firebaseライブラリのファイル。あなたはそれをあなた自身の指紋と取り替える必要があります。 PlatformIO を使用してライブラリをローカルにインストールした場合、ファイルは次のパスにあります:

指紋を生成するには、このウェブサイトにアクセスし、https部分のないFirebaseホストリンクをコピーして、指紋サイトをクリックします(私の場合:
medium-iot-project.firebaseio.com ):

これによりサイトのフィンガープリントが生成されるため、 FirebaseHttpClient.h ファイル内の古い kFirebaseFingerprint [] 値の代わりにそれをコピーしてください。これで問題は解決するはずです。

結論

これまでに成功した場合は、おめでとうございます!

ここでは表面を引っかいただけです。モノのインターネットは実験と探索がすべてなので、ここで止まらず、コードの間違いを犯したりバグを見つけたりして学習を続けることをお勧めします。しかし、何よりも、学習の過程で楽しむことを忘れないでください。

参考資料