📲

クラウドでIoTデバイスを管理するためのアーキテクチャ解説

2024/01/29に公開

はじめに

FairyDevices(以降、当社)では、首掛け型ウェアラブルデバイスTHINKLETを開発しており、THINKLETをより便利に開発・利用するためのAPIサービスとしてCWS(Connected Worker Solution) APIというサービスを提供しています。
このAPIを利用すると、遠隔のTHINKLETのバッテリー残量や電波強度などの情報を取得したり、遠隔からデバイスの設定を変更したり、デバイスを使ってビデオ通話をしたりできます。

私たちが提供しているTHINKLETを用いた、遠隔作業支援サービスであるLINKLETの開発にも、CWS APIは活用されています。
本エントリでは、CWS APIがどのようなサービスで、どのような役目を持ち、どのように開発されているのかを簡単に紹介します。

自己紹介

プロダクト開発部の向井と申します。
Androidアプリエンジニアと、CWS APIサービスのチームリードをしています。
CWS APIサービスに関わる端末アプリの開発をしながら、CWS APIサービス全体の機能追加・改善を行う形で、横断的に業務しています。

CWS APIとLINKLETの紹介

CWS API

機能紹介

CWS APIは、THINKLETを遠隔から操作・管理するために開発しました。
主な機能として、デバイス向けAPI、デバイスからの情報収集があります。
デバイス向けAPIでは、ソフトウェアやファームウェアのアップデート・ネットワーク設定・任意のアプリ実行などの機能を遠隔から呼び出すことができます。
また、デバイス側からは適宜、APIからの呼び出し結果・バッテリーやネットワーク・位置情報などデバイス固有の情報を送信して、CWS APIで管理します。
これらの情報は、Webhookで利用者へフィードバックします。

THINKLETというデバイスを開発し、より便利に開発・利用するためのCWS APIを開発しましたが、THINKLETの価値を最大化するためには、システムの開発や知識が必要です。
そういった問題を解消するために、これらの機能を使うターンキーソリューションとして誕生したのがLINKLETです。

LINKLET

機能紹介

LINKLETはTHINKLETを用いた遠隔作業支援を実現するサービスです。ZoomやTeamsといった既存のビデオ会議サービスを利用しており、簡単に利用できることが特徴です。詳しくは製品紹介ページをご覧ください。

LINKLETの開発ではCWS APIを利用しました。そのためCWS APIの実用例の一つであるともいえます。
CWS APIが公開しているAPIの呼び出し・THINKLETからのフィードバックを受け取り、コンソールから遠隔にあるTHINKLETを利用できるようにしています。
また、LINKLETでは独自のアプリを開発しており、CWS APIを使用してTHINKLETへの配信を行っています。

CWS APIの説明

CWS APIについてもう少し掘り下げて説明します。

構成、使用しているサービス・言語

構成は概ね以下の通りです。
cws構成図

構成図には登場していませんが、他にも以下のAWSのサービスを使用しています。

  • SecretManager
  • CloudWatch
  • VPC
  • Route 53
  • Simple Notification Service
  • AWS Chatbot
  • Application Load Balancer
  • CloudFormation
  • CodePipeline

APIGatewayやIoTCoreを中心に発生したイベントの処理にはAWS Lambdaを使用し、サーバーレスに対応しています。runtimeにはPythonを用いています。
また、CWS APIを運用するためのツールも作成しており、Rustで実装しています。

工夫ポイント(IoTメッセージ)

CWS APIはTHINKLETをIoT機器に見立て、IoTCoreでメッセージのやりとりをします。
しかし、THINKLETはウェアラブルデバイスであり、一般的なWebアプリケーションとは異なり、常にオンラインであるとは限りません。装着したまま移動をして、電波状況が悪い場所に入る事もあります。
そのため、APIで要求した内容はAPIの応答段階でTHINKLETに到達する事を保証できません。利用者はAPIでの要求が、正しくデバイスへ伝達されてほしいものです。
そこで、THINKLETへの要求内容をRDSへ保存し、THINKLETが「この処理は無事終わった」と応えるまで、利用者がAPIで要求した内容を再送できる仕組みを設計しました。

工夫ポイント(WebRTCサーバーの冗長性)

CWS APIではWebRTCのサーバーを運用しておりますが、運用コストと可用性のバランスを取るのが難しいです。
双方向映像通信の特性上、単純なオートスケーリングが行えないため、接続数を監視して自動で運用台数の増減を行う工夫をしています。

強みと課題

デバイス向けの操作・デバイス情報管理を扱うにあたって、CWS APIがそれを引き受け、THINKLETを利用したシステムを構築しやすくしています。
また、この考え方や機能はTHINKLETに限った事ではなく、一般的なIoT機器にも当てはめる事が出来ると考えます。
これらを一から全て開発するのは大変であるため、そのためにCWS APIは存在します。

ある程度の利用・ユースケースに耐えうる状態にはなっていますが、運用面でまだまだ課題が残っていますし、機能も求められている部分もあります。
属人化している運用や、その運用コストはまだまだ大きいため、それらを最小化する事が直近の課題と感じています。
これらの課題に対して、一歩ずつ確実に良い物となるよう頑張っています。

終わりに

今回はCWS API全体の話をさせていただきましたが、アプリ側に近い話はDroidKaigi 2022で発表しましたので、そちらも見ていただけると嬉しいです。
今回、当社がどんなものを作っているのかの概要と、一部詳細な紹介をさせていただきました。これを機に、当社に興味を持ってもらえると幸いです。

フェアリーデバイセズ公式

Discussion