Super Sylphide 進捗状況(49) -- Sylphide通信プロトコル
ご無沙汰しています。オートパイロットシステム Super Sylphide、およびその後継機のTiny Featherでは、無線を使って地上からモニタおよび指令を行うことができますが、独自規格ながら通信データのプロトコルを定めて運用してきました。このたび @henshiru 氏がメインで開発していたSuper Sylphide用地上モニタソフトのMaeve(メイヴ)がオープンソース化(MIT Licenseだと思う)されたことを受けて、このプロトコルの話を少し書こうと思います。
世の中には色々なプロトコルがあるので、既存の規格にあわせることも考えたのですが、なかなかお手ごろなシンプルなものがありません。僕が欲しいと思ったのは、流れてくるデータを意味単位に切り分けられること、簡単なエラー検出、この2つがあればいいと思いました。エラー訂正など、より機能を充実させるためにはTCP/IP方式で、このプロトコルをさらに上位プロトコルで包んであげればよいという思想も背景にあります。
結局、独自規格として以下に定めるSylphideプロトコル(固定長と可変長の2タイプ)を定めました。
0/32bytes 固定長プロトコル
インデックス | 内容 |
0 | 0xF7 (ヘッダ, 8bits) |
1 | 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='0') |
2, 3 | シーケンス番号(2bytes) |
(4 - 35) | ペイロード(32 bytes) |
(36, 37) or (4, 5 : ペイロードなしの場合) | CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(3か35)まで) |
N bytes 可変長プロトコル
インデックス | 内容 |
0 | 0xF7 (ヘッダ, 8bits) |
1 | 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='1') |
2, 3 | シーケンス番号(2bytes) |
4, 5 | ペイロードサイズ |
(6 - (6 + (N - 1))) | ペイロード(N bytes) |
(6 + N, 6 + (N + 1)) | CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(6 + (N - 1))まで) |
転送効率やエラー検出能力について詳細に検証したことはないのですが、これまで使ってきて大きな問題は発生していません。ちよっとした補足としては、ヘッダ(0xF7, 0xEX)については、ペイロードを調べて出現確率が最も低い組み合わせを算出しました。
現在、このプロトコルのパーサとしてC++版、およびJava版があります。拡張は簡単にできるよう、それぞれstd::[i/o]streamとJava.io.Filter[Input/Output]Streamに準拠させてました。なおJava版は、ある目的のために最近作ったもので、近いうちに成果物をださればよいなと考えています。
※次の進捗記事は、通信プロトコルのペイロードにあたる部分について書きました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。