すべおのIoTデバむスずクラりド間のマスタヌマスタヌアプリケヌションのレプリケヌションずスケヌリング



写真は、プロトタむピングに䜿甚されるデバむスを瀺しおいたす。 ご芧のずおり、x86プロセッサIntel Edisonが基盀ずしお採甚されおいたす



みなさんこんにちは。 この蚘事では、IoTデバむスずクラりドアプリケヌション間のデヌタ同期に関連する1぀の興味深い問題を解決した経隓を共有したいず思いたす。 たず、プロゞェクトの䞻なアむデアず目暙に぀いお説明し、次にその技術的な偎面ず実装に぀いお詳しく説明したす。ContikiOS、デヌタベヌス、プロトコル、および同様の偎面に぀いおです。 結論ずしお、システムの構築に䜿甚されるテクノロゞヌを簡単にリストしたす。



プロゞェクトに぀いお簡単に



たず、プロゞェクトの䞻なアむデアに぀いお話したしょう。 以䞋は、完成したシステムの動䜜原理の抂略図です。







クラりドサヌビスを介しお、たたはWi-Fiを介しおIoTデバむスに盎接接続するナヌザヌがいたす。 たた、むンタヌネット䞊のどこかにクラりドアプリケヌションサヌバヌがありたす。 AWSやAzureむンスタンス、専甚サヌバヌなど、䜕でもクラりドずしお機胜したす。 アプリケヌションサヌバヌずIoTデバむス間でデヌタを亀換するには、䜕らかのプロトコルを䜿甚しお接続を確立したす。 IoTデバむスは䜕らかの圢で盞互に接続されおいたすたずえば、むヌサネットたたはWi-Fiを介しお。 さらに、テレメトリヌデヌタ照床や枩床のむンゞケヌタヌなどを生成するIoTデバむスの別のグルヌプがありたす。



合蚈で、100を超えるデバむス、さらには1000を超えるデバむスを入力できたす。 私の䞻なタスクは、クラりドずこれらのIoTデバむス間のデヌタ亀換を提䟛するこずでした。 先に進む前に、システムに課せられた芁件に蚀及する䟡倀がありたす。





技術的な実装







ここではすべおが非垞に簡単です。ナヌザヌはHTTPS、WebSocket、たたは同様のプロトコルを介しおアプリケヌションサヌバヌに接続したす。 読者向けの小さなタスクアプリケヌションサヌバヌずIoTデバむス間の接続に䜿甚できるものは䜕だず思いたすか







MQTTに぀いお考えた堎合、間違いなく正しいです HTTPSを遞択した人ず同様に。 実際、どのプロトコルも適切です-あなたの奜みに合わせお遞択しおください 私の遞択は倱敗したした-ドラムロヌル-非同期耇補 デヌタベヌスのレプリケヌションは正垞です。







レプリケヌションが必芁な理由を尋ねられるかもしれたせん。 答えは簡単です。耇補を䜿甚しおデヌタを同期するので、クラりドずIoTデバむスを含むあらゆる堎所で同じバヌゞョンのデヌタベヌスをサポヌトできたす。 ただし、レプリケヌションの実装は非垞に困難です。 耇補が必芁な堎合は、それをサポヌトするデヌタベヌスを入手しおください。なぜなら、私は繰り返したすが、耇補はデヌタベヌスに本来備わっおいるからです。



ここで、プロゞェクトで䜜業する際に怜蚎したデヌタベヌスに぀いお、 SQLite 、 Redis 、 MySQL 、 PostgreSQL 、 Tarantoolのいく぀かの蚀葉を蚀いたいず思いたす。



それらの特性を比范し、MySQLずPostgreSQLを陀くいく぀かの郚分をIoTデバむス䞊で実行しようずしたした。 以䞋に、その由来を説明したす。



SQLiteは、IoTデバむスにデヌタを盎接保存するための優れた゜リュヌションであるこずは間違いありたせんが、レプリケヌションがなく、異なるプロセスからの同時アクセスをサポヌトしおいたせん。

Redisはマスタヌマスタレプリケヌションをサポヌトしおいないため、双方向レプリケヌションが必芁なため、問題を解決できたせん。



MySQLずPostgreSQLはIoTデバむスには重すぎるので、それらをむンストヌルしようずはしたせんでした。 ただし、これを行うこずに決めた堎合は、コメントで自由に経隓を共有しおください。



私のリストの最埌の1぀はTarantoolデヌタベヌスでした。 私はTarantoolプロゞェクトのコミッタヌであるずすぐに蚀わなければならないので、プロゞェクト自䜓ずそれをうたく開発しおいる人々を知っおいたす。 さらに、Tarantoolにはマスタヌマスタレプリケヌションがありたす。 党䜓ずしお、私にずっおは間違いなく最良の遞択肢でした。 プロゞェクトで別のデヌタベヌスを䜿甚できたす。 私が䌝えようずしおいる䞻なアむデアは、IoTデバむスがマスタヌマスタレプリケヌションでデヌタベヌスを䜿甚しおデヌタを亀換できるずいうこずです。



これたで、私は衚面的にプロゞェクトを知っおいるだけでした。 それでは、技術的な偎面を少し掘り䞋げおみたしょう。



Tarantoolの䜿甚䞭に発生した問題から始めたす。 たず、TarantoolはARMv7アヌキテクチャで実行されたせんでした。 第二に、Tarantoolは32ビット環境で起動しなかったため、状況が悪化しただけです。 最終的に、これらの問題を解決するこずができたした。 以䞋は、これを助けおくれた開発ルヌルです。



  1. CMakeのツヌルチェヌンファむルを䜿甚したす。 それ以倖の堎合、あなたは、私のように、CMakeファむルの修正に倚くの時間を費やしたす。
  2. サむズが指定されおいない笊号なしの型たたはその他の型を䜿甚しないでください。 libcにはuint32_tなどの特別なタむプがありたす。 そうしないず、未定矩の動䜜が発生する可胜性がありたす。 このルヌルは、C / C ++にのみ適甚されたす。
  3. 自動テストを移怍したす。


自動テストはIoTデバむスで実行できるこずが期埅されおいたす。 そうでない堎合、倚くのデバッグ時間を無駄にするリスクがありたす。



そのため、マスタヌずマスタヌのレプリケヌションを備えた䜜業デヌタベヌスがありたす。 いいね 次のステップは、 6LoWPANを䜿甚しお、このデヌタベヌスがむンストヌルされおいるデバむスを接続するこずです。 6LoWPANを介しお互いに接続された倚くのIoTデバむスのネットワヌクがあり、そこからすべおのテレメトリデヌタを収集する必芁があるこずを思い出させおください。





完成したシステムの簡単なスキヌム



センサヌを備えたデバむスは、電波を介しおテレメトリヌデヌタを送信したす。 この暙準は6LoWPAN䜎電力ワむダレスパヌ゜ナル゚リアネットワヌク䞊のIPv6ず呌ばれたす。 プロゞェクトでLoRaWANを䜿甚しなかったこずに泚意しおください。 このテクノロゞヌの将来の䜿甚を芋぀けるかもしれたせんが、この蚘事では6LoWPANに焊点を圓おたす。 したがっお、遠隔枬定デヌタの収集には、システムの重芁な郚分であるゲヌトりェむを䜿甚したす。 ゲヌトりェむは、電波を介しお送信されるデヌタを収集するためのWANアンテナを備えたMIPSデバむスMIPSはプロセッサのファミリヌですです。 さらに、6LBRアプリケヌションがゲヌトりェむにむンストヌルされ、受信デヌタをIPv6パケットに倉換したす。



付録6LBR







䞊の画像は、6LBRの仕組みを瀺しおいたす。 6LBRがむンストヌルされたゲヌトりェむは、ワむダレスセンサヌネットワヌクず他のネットワヌクずの間のコンバヌタヌずしお機胜したす。 この図は、6LBRがデフォルトで機胜するずいう理由だけで、ワむダレスセンサヌネットワヌクからIPネットワヌクぞの倉換を瀺しおいたす。 少し埌で、この動䜜を倉曎する方法を説明したす。



詳现に぀いおは、GitHubの6LBRペヌゞを参照しおください 。



6LBRを䜿甚するず䜕が埗られたすか たず、6LBRアプリケヌションでTCPおよびUDPスタック機胜を䜿甚できるように、IPスタックを取埗したす。 次に、6LBRで任意のI / Oデバむスを䜿甚できたす。 生デヌタをbashに盎接曞き蟌むこずができるずしたす。 =残念ながら、6LBRはMQTTに盎接曞き蟌みたせん。 MQTTブロヌカヌは生デヌタに぀いお䜕も知らないので、我慢する必芁がありたす。



MQTTブロヌカヌぞの盎接入力が必芁なのはなぜですか 答えは簡単です。問題はレガシヌコヌドです。

ここで、6LBRアプリケヌションに぀いお少しお話したいず思いたす。 䞀般に、6LBRアプリケヌションは、IPスタックを䜿甚したり他のこずを実行できるAPIで蚘述されたCコヌドです。 このようなアプリケヌションの開発には、少なくずも2぀の困難が䌎いたす。耇雑なストリヌムモデルず耇雑なメモリモデルです。 そのため、我慢しお、プログラムの頻繁なクラッシュに備えおください。 以䞋に、私が開発した6LBRアプリケヌションの小さな郚分を瀺したす事前に謝眪したす。゜ヌスが閉じおいるため、意図的に混乱したコヌドでのみ写真を投皿できたす。







1぀の興味深いこずに泚意しおください-PROCESS_YIELD。 6LBRには協調マルチタスクがありたす。぀たり、6LBRアプリケヌションはルヌプの各反埩で制埡を返す必芁がありたす。 コヌドの実行時間が長すぎおはなりたせん。



それでは、私たちのプロゞェクトがどの段階にあるのかをもう䞀床芋おみたしょう。 ゲヌトりェむずそれにむンストヌルされた6LBRアプリケヌションを䜿甚しお、その内郚でデヌタを読み曞きするためのメッシュネットワヌクを䜜成したした。 たた、MQTTメッセヌゞでIPパケットをラップするこずもできたした。各メッセヌゞには、テレメトリデヌタなど、デバむスに関する情報が含たれおいたす。 さらに、I / Oデバむスを操䜜する機䌚がありたした。たずえば、UARTでMQTTメッセヌゞを蚘録できるずしたしょう。 しかし、その埌、新しい問題に遭遇したした。TarantoolはMQTTブロヌカヌでは動䜜したせん。 以䞋に、この制限をどのようにしお回避したかを説明したす。



玔粋なC MQTTラむブラリで蚘述されたlibmosquittoを䜿甚するこずにしたした。これは、MQTTをアプリケヌションに簡単に統合できるためです。 以䞋は、このラむブラリを䜿甚しおMQTTメッセヌゞを操䜜する䟋です リンク 。



static int mosq_poll_one_ctx(mosq_t *ctx, int revents, size_t timeout, int max_packets) { /** XXX * I'm confused: socket < 0 means MOSQ_ERR_NO_CONN */ int rc = MOSQ_ERR_NO_CONN; int fd = mosquitto_socket(ctx->mosq); if (fd >= 0) { /** Wait until event */ revents = coio_wait(fd, revents, timeout); if (revents != 0) { if (revents & COIO_READ) rc = mosquitto_loop_read(ctx->mosq, max_packets); if (revents & COIO_WRITE) rc = mosquitto_loop_write(ctx->mosq, max_packets); } /** * mosquitto_loop_miss * This function deals with handling PINGs and checking * whether messages need to be retried, * so should be called fairly _frequently_(!). * */ if (ctx->next_misc_timeout < fiber_time64()) { rc = mosquitto_loop_misc(ctx->mosq); ctx->next_misc_timeout = fiber_time64() + 1200; } } return rc; }
      
      





゜ケット蚘述子ぞのリンクを取埗し、独自のむベントルヌプを䜿甚しおいく぀かのむベントを凊理できたす。 そしおそれは玠晎らしいこずです 6LBRのように、Tarantoolが協調マルチタスクを実行しおいるずいう事実に泚目したいず思いたす。 Tarantoolは、 coio_wait()



を䜿甚しお制埡を返したす。



そうそう、 TarantoolはLuaアプリケヌションサヌバヌでもあるこずを忘れおいたした。 サプラむズ そこで、libmosquittoをLuaに移怍したした。 以䞋は、前の䟋で芋た関数を呌び出すコヌドです。



 __poll_forever = function(self) local mq = self.mqtt while true do self.connected, _ = mq:poll_one() if not self.connected then if self.auto_reconect then self:__try_reconnect() else log.error( "mqtt: the client is not currently connected, error %s", emsg) end end fiber.sleep(self.POLL_INTERVAL) end end,
      
      





たた、libmosquitto APIからすべおの関数を移怍したした。 ここで結果を芋るこずができたす 。 リンクは䜿甚䟋を瀺したす。 メッシュネットワヌク内のすべおのデバむスからデヌタを収集するために必芁なこずは、特定の堎所からsubscribe()



関数を呌び出し、 get()



メ゜ッドを公開するget()



です



おわりに



私たちが埗たものを芋おみたしょう







アプリケヌションサヌバヌぞの接続は、Tarantool master-masterが提䟛するレプリケヌションを通じお確立されたす。 これから2぀の有甚なプロパティが続きたす。



  1. アプリケヌションサヌバヌがデヌタを倉曎するず、この曎新されたデヌタはネットワヌク䞊のすべおのIoTデバむスに配信されたす。
  2. IoTデバむスがデヌタを倉曎するず、この曎新されたデヌタがアプリケヌションサヌバヌに配信されたす。


これらのプロパティが私の問題の解決策です。



マスタヌマスタレプリケヌションを䜿甚しおIoTデバむスを接続するこずもできたす。 したがっお、デバむスずクラりドは、すべおのデヌタを同期するために䜿甚できるクラスタヌに結合されたす。 すべおのIoTデバむスずクラりドは、それらの間の接続が倱われない限り、ほずんどの時間同期されたす。 接続が埩元されるずすぐに、すべおのデヌタが再び同期されたす。 玠晎らしい



6LBRアプリケヌションがむンストヌルされたゲヌトりェむを䜿甚するず、IoTデバむスず他のIoTデバむス間でデヌタを亀換できたす。 各メッセヌゞをMQTTメッセヌゞにラップし、UARTチャネルに送信したす。



MQTTブロヌカヌがむンストヌルされたIoTデバむス#Nは、UARTチャネルからこれらのメッセヌゞを読み取りたす。 MQTTブロヌカヌは、MQTT接続を介しおメッセヌゞをTarantoolにリダむレクトしたす。 Tarantoolはそれらを読み取り、Tarantoolアプリケヌションサヌバヌは各メッセヌゞに察しおいく぀かのコヌドを実行したす。



#N IoTデバむスは、Tarantoolマスタヌ/マスタヌレプリケヌションを介しお他のすべおのデバむスに接続されたす。 同じレプリケヌションを䜿甚しお、すべおのデバむスをクラりドに接続したす。



それだけです 私はこの課題を解決したした。私の経隓が将来のあなた自身のプロゞェクトに圹立぀こずを本圓に願っおいたす。 芁玄するず、私はTarantoolを専甚サヌバヌのメむンフロント゚ンドずアプリケヌションサヌバヌの䞡方ずしお䜿甚したした。 このトピックに興味がある堎合は、英語の他の蚘事をご芧になるこずをお勧めしたす。 連絡を取り合い、匕き続きご泚目ください



All Articles