質問: いつもお世話になります。 複数の機器間で多対多で通信を行うシステムの通信プロコルについて、どのようなものがいいのか思案しています。 ### 機器構成について 具体的な機器構成および環境は以下の通りです。 * 機器間はイーサネットで接続される * 機器は複数あり、各々の機器同士で通信を行う * 機器構成内に、通信を監視するサーバ的なものが1つ存在する * 機器のスペックは機器により異なり、低いものはメモリの制約上C言語で組込む必要がある これらを考慮して、通信プロトコルには`MQTT`を採用しようと考えています。 プロトコルはそれでいいとして、肝心の送受信するデータフォーマットはどのようなものが適切なのか悩んでいます。 ### 送受信するデータについて 送受信するデータは、以下の通りです。 * 送信側:自身の機器の状態が変化した際、自身の状態を送信する(Publish) * 受信側:送られてきた情報が自身にとって必要であれば、受信データを参照し、自身の動作意思決定に利用する(Subscribe) 自分としては、送受信するデータは、送信側でシリアライズして、受信側でデシリアライズするのがいいのかなと思っています。 ### 本題 上記の機器構成および送受信するデータをシリアライズ/デシリアライズする場合、MQTTのデータフォーマットは一般的にどのように実現するのでしょうか。 自分なりに調べてみたところ、`ProtocolBuffers`というものが探していたものに近いのかと思いました。が、C言語での構築例が検索してもあまり引っかからず、一般的ではないのかなぁと思いました。 そもそも、低スペック機器でのMQTTの使用方法が根本的に違うのでしょうか。(例えば独自プロトコルを生成し、バイナリデータでやりとりするとか) よろしくお願いします。
回答: こんにちは。 異言語間のシリアライズ用には下記2つが有名です。 ProtocolBuffers MessagePack C++用なら下記の前者2つが有名です。 boost::serialization cereal Theolizer(手前味噌です。失礼) JavaやC#用はそれぞれ数種類あります。たくさんあるので省略。 でも、C言語用はみたことありません。 リフレクションもなく、テンプレートさえないC言語の標準機能で実現するには厳しすぎるせいと思います。 エンディアンの問題を回避できるようでしたら、を使ってサイズを固定してmemcpy()ベースでやり取りすることも視野に入ると思います。