無線通信での接続向上に関する設計ノウハウについて
目次
はじめに
会社時代~現在の顧問としての仕事にわたり、様々な無線通信機器の接続向上に関する問題に取り組む経験を積んできました。
この記事では、無線通信での接続向上に関する設計ノウハウの一端をお伝えしたいと思います。
1)端末は一番初めに基地局を見つけるところで処理に負担が掛かる
無線通信でも有線通信でも、通信と言えば1対1の通信若しくは1対多の通信が多いと思います。
今回はまず1対1の通信の場合を考えてみましょう。そのモデルの場合、良くあるケースは 端末 と基地局 になるかと思います。
端末同士の通信のケースもありますが、以下の説明では 端末と基地局というケースで説明したいと思います。
一般に端末、基地局が通信を行なう場合、基地局のほうがビーコンという信号を定期的に送信して、端末がそれを受け取るという処理をします。
(BLEの場合はビーコンを送信するのが端末側という特殊なシーケンスになりますが)
端末の立場からすると、通信の取っかかりとして、基地局からのビーコンを見つけるという処理を行なうことになり、その処理自体に負担が掛かる場合があります。
詳細はもっと複雑な場合が多いですが、ここではまず端末は基地局のビーコンを見つけるときに処理に負担が掛かる場合があるので要注意ということを覚えておいていただくと良いかと思います。
2)無線シーケンスは接続処理が一番複雑で、そこで不具合が出る場合が多い
この図はあくまでも一つのモデルとして描いたシーケンス図です。細かいメッセージ名はともかくとして、端末と基地局で通信中という状態まで行き着くまでには、端末と基地局の間でたくさんのやり取りが行なわれているイメージはお分かりになるかと思います。
そしてたくさんのやり取りが全て通らないと通信中にはならないということになります。
通信中になったら、端末と基地局とのやり取りは実は安定します。
例えるのであれば、通信中に至るまでが飛行機で言えば離陸、通信中が安定飛行、通信終了が着陸と言うことになります。飛行機でも事故が起きやすいのは離陸と着陸であることは良く知られています。
通信においても全く同じで、接続するときと終了するとき、特に接続するときが一番端末と基地局の間のやり取りが多いので、接続がうまくいかないことがトリガとなって、端末や基地局が動かなくなる=フリーズする と言う問題が過去から現在に至るまで沢山起きています。
無線通信はエラーが起こりうるということを前提としてシーケンスを作るべきです
無線通信において、無線の状態によるエラーというのは起こりえるものだとう前提で、シーケンスを作るべきです。
Wi-FiやBLEなどはそのシーケンスが決まっていますのであまり自分たちで手を加えることは難しいのですが、それでもアプリケーションレベルで色々と工夫することはできるものです。その工夫のヒントになるようなことをこれからお伝えしますね。
端末と基地局の通信という前提条件で、端末の立場にたってお伝えします(基地局側も同じように考えられます)
・端末が何らかのメッセージを基地局に送った後、基地局からACKと呼ばれる返事が一定時間内に返ってこないときはメッセージを再送する。
メッセージを再送することを”リトライ”といいます。
・何度かリトライしても基地局からACKが送られてこないときは、その無線チャンネルをいったんは終了させて繋ぎ直した方が良いです。
・基地局からACKが送られないようなシーケンスの場合は、端末はメッセージを何連送かするのがポイントです。
・全体として接続のシーケンスはできるだけシンプルにすることを心がけましょう。
端末~基地局の無線シーケンスだけでなく、端末および基地局の中のタスク間シーケンスで問題が生じる場合が多いです
端末~基地局の無線シーケンスにおいては前述の通り、その無線方式の標準規格において、再送手順や異常の時の切断手順などが決められている場合が多く、問題は起きにくいです。
一方端末または基地局の中のマイクロプロセッサで開発しているソフトウエア(ファームウエア)で定義されている複数のタスク間のシーケンスで問題が生じる場合が多いです。
具体的には、無線通信エラーなどが生じたときに、複数のタスク間のシーケンスにおいて、タスクの状態不一致などが起きて、それが原因で無線通信が全く出来なくなる状態に陥る場合が非常に多いです。
端末および基地局の中に複数マイクロプロセッサが有る場合は、さらに注意が必要です
端末および基地局の中にはマイクロプロセッサが複数あって、プロセッサ間での通信のやり取りをする場合が多いです。そうしたプロセッサ(CPUとも呼びます)間通信のシーケンス、プロトコルは設計において定義している場合が多いです。
そのシーケンス、プロトコルにおいて不具合があると、全く通信が出来なくなる=フリーズするとかリセットが起きるといった問題が生じる場合が有ります。
実際の失敗例を以下に記します。
どうすれば、端末内プロセッサ間での不具合や 一つのプロセッサ内複数タスク間の状態不一致などを防げるか?
こういった問題が無いように設計するのが本来あるべき姿です。
そして設計そのものだけでなく、設計したあとのレビューやテストにおいて、ここに掲げたようなことが起こりえないかを十分レビューしたりテストすることが極めて重要です。
フェールセーフを沢山入れるのは有効
タスク間での状態ズレが起きないような設計を行なうことが基本です。
それでも所謂デッドロック状態が起きてしまうことが万が一あることを想定して、フェールセーフを沢山入れるのは有効です。
ただし、フェールセーフは最後の手段であり、設計完成度向上により、システムがフリーズしない、動かなくなるようなことがないような設計にすることが重要です。
まとめ:無線通信エラーを少なくするシステムを開発するコツ
実際には個々のシステム、商品においてFTA(フォルトツリー解析)をするべきだが、まず以下の原則を知っておくことは重要です。
①システムが動く中で、通信に関しては、突如エラーが生じたりします。そのエラー処理をきちんと設計しておかないと、ソフトウエアに不具合を生じる恐れがあります。
②装置間のシーケンスにおいて、何らかのデータを送信したり制御コマンドを送った時にACKを待つのが普通ですが、
ACKを待つまでの時間が異常に長かったり、待ち方がクローズになったりしているとシステムに影響を与えます。
③ACKが来ないときには再送するのが普通ですが、再送の回数もきちんと規定しないと永遠にそれを繰り返すことになりがちなので注意しましょう。
④上記③を行った後でもうまくデータが通らないときは、いったん無線通信を切って接続からやり直した方が良いです。
⑤どのみち無線通信は距離が離れれば通信NGとあるのは自明なので、そうなってもシステムの不具合は生じないような設計が必要です。
関連記事
⇓
前の記事へ