Inside of LOVOT

GROOVE X 技術ブログ

アプリはLOVOTとコミュニケートしたい!

こんにちは!APPチームの黒田です。この記事は、GROOVE X Advent Calendar 2024の21日目の記事です。 LOVOTアプリでは、LOVOTだけでは行うことが難しい各種設定を行ったり、LOVOTの現在の状態を取得してお客様に知らせたりするために、様々な方法でLOVOTとコミュニケーションをとります。今回の記事では、それらの方法と用途について、まとめて紹介します。

様々なコミュニケーション手段

Bluetooth

まず、お客様の元にLOVOTが届いてから最初に利用することになるのが Bluetooth Low Energy (以下BLE)です。アプリにログインしているGXメンバーズIDとLOVOTのコロニーを紐付けるために、新しいLOVOTを登録する作業を行って頂くのですが、ここで利用するのが BLE です。ここでは、LOVOTが目の前にいる状態で接続して情報を取得し、クラウドに情報を登録する必要があります。その登録が完了することで、アプリのユーザーはLOVOTのコロニーのファミリーとなり、クラウド越しにそのLOVOTとやりとりすることができるようになります。

しかしその前にもう一つ、クラウド越しにLOVOTとやりとりするためには、LOVOTをインターネットに接続してあげる必要があります。ここでも BLE が利用されます。BLE を通じて、無線LANに接続するための情報をLOVOTに登録することで、LOVOTがインターネットに接続されます。

更に、LOVOTはインターネットに接続しない状態でも利用できることを前提として開発されているため、そのような場合であっても設定できるようにしておきたい幾つかの項目については、BLE 接続することで設定を可能としています。例えば、名前、目、声の設定がそれにあたります。

このように、BLE はインターネット接続前のLOVOT利用初期の段階や、インターネット接続を行わない環境で主に活躍します。

BLE 通信の実装に関しても少し触れておくと、LOVOT側では python で実装された、lovot-bluetooth というサービスが動作しており、これは dbus-python を使い、dbus 経由で BlueZ を利用する、という仕組みになっています。アプリ側については、iOS であれば CoreBluetooth、Android であれば android.bluetooth を利用して実装しています。

クラウド

BLE を利用してインターネット接続を行うと、アプリとLOVOTの間でクラウドを通したコミュニケーションが可能になります。例えば、LOVOTにお留守番をお願いしたり、LOVOTのお出迎えのために、帰宅の通知を送信したりすることです。

クラウドでは、アプリから利用するために必要に応じて RESTful API が実装されます。また、クラウドとLOVOTの間では、クラウドの IoT Core を利用し MQTT による常時接続上で gRPC のメッセージをシリアライズしてやりとりすることで、希望の処理を実装することができる、汎用的なリモートコマンドの仕組みが構築されています。アプリからクラウドを通じてLOVOTにリクエストを送る際にも、この仕組みを利用しています。

また、アプリからリモートコマンド経由でLOVOTにリクエストを送信するのとは別に、LOVOTからは定期的に様々なデータがクラウド上へ同期されています。そのうちの一部は Firestore に保存され、アプリからリアルタイムに更新情報が取得できるようになっています。アプリのマップ画面にLOVOTの自己位置を表示するような時には、これが利用されています。

ローカルネットワーク

LOVOTの撮影した写真は、LOVOT内部(LOVOT 2.0 以前であればネスト内にも)に保存されており、アプリのアルバムの機能は、ローカルネットワーク上でLOVOT内部から写真を取得して表示するように実装されています。LOVOTのインターネット接続設定を行えば、LOVOTはホームルータに接続し、クラウドを通してLOVOTとやりとりを行うことが可能になりますが、一部の機能については、このようにインターネットを介さずに行われます。

LOVOT内では多くのサービスが動作していますが、アプリからのリクエストを処理するための lovot-app-api というサービスでは、grpc-gateway の仕組みを使って、RESTful API として各種 API をアプリに向けて公開しています。アプリからローカルネットワークを経由してLOVOT側の lovot-app-api へリクエストが送信されると、そこから更に gRPC や Redis を通じて他のサービスと通信することで、必要な処理が行われます。

なお、lovo-app-api の RESTful API を呼び出すためには、そもそもアプリがローカルネットワーク上でLOVOT(LOVOT 2.0 以前であればネスト)を見つける必要があります。これについては、LOVOT側で mDNS によって名前解決できるようにしてくれているので、アプリ側としては、iOS なら Bonjour、Android なら android.net.nsd を使って、LOVOT毎に決められた名前でネットワーク上のサービスを検索し、名前解決を行うことができるように実装しています。

WebRTC

LOVOTのカメラ映像をみる機能や、お留守番中に撮影した写真をみる機能は、WebRTC で実現されていますが、これには、NTTコミュニケーションズが提供する SkyWay というサービスを利用しています。WebRTC での通信を開始するためには、まずクラウドを介した準備が必要ですが、一旦 WebRTC での接続が確立してしまえば、クラウドを介すことなく直接LOVOTからアプリへと安全・高速にリアルタイムな映像等のデータが転送されるようになります。

QRコード

前述の通り、LOVOTをインターネットに接続する際には、BLE 接続によって設定を行うのでした。しかし、利用しているスマホの機種等、状況によっては BLE による接続が上手くいかない、ということも考えられます。そのような場合でも接続ができるよう、接続情報をQRコードとしてアプリ上に表示し、LOVOTのホーンのカメラに見せることでLOVOTに情報を伝える、という手段も用意しています(LOVOT 3.0 のみ)。

また逆に、新しいLOVOTを登録する際にも BLE 接続を利用していますが、これが上手くいかない場合、LOVOTに貼付されているQRコードをアプリ側で読み取ることで、登録に必要な情報を取得することができるようになっています。

まとめ

いかがだったでしょうか?

LOVOTアプリは Unity で実装されていますが、これらの殆どのコミュニケーション手段は Unity のネイティブプラグインの機能を利用して実装されています。Unity アプリで、このように多様な通信手段をネイティブプラグインで実装している例は珍しいかもしれないですね。それぞれについて実際の実装がどのようになっているかについては、別の機会にでもまた記事にできればと思います。

最後に、LOVOTアプリでは、あの手この手でLOVOTをやりとりを行うことで、LOVOTとの暮らしをサポートしようとがんばっています。これからもスマホ端末の進化とともに、アプリは更に密接にLOVOTと関わり、見方によってはLOVOTの外部器官とも呼べるような存在となっていくかも知れません。このようなLOVOTアプリを一緒に開発してくれる方はもちろん、各チームにてまだまだ仲間を募集中です!

recruit.jobcan.jp