質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Q&A

解決済

2回答

3542閲覧

MQTTを使用した際のデータのシリアライズについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

0グッド

0クリップ

投稿2017/06/25 13:51

いつもお世話になります。

複数の機器間で多対多で通信を行うシステムの通信プロコルについて、どのようなものがいいのか思案しています。

機器構成について

具体的な機器構成および環境は以下の通りです。

  • 機器間はイーサネットで接続される
  • 機器は複数あり、各々の機器同士で通信を行う
  • 機器構成内に、通信を監視するサーバ的なものが1つ存在する
  • 機器のスペックは機器により異なり、低いものはメモリの制約上C言語で組込む必要がある

これらを考慮して、通信プロトコルにはMQTTを採用しようと考えています。
プロトコルはそれでいいとして、肝心の送受信するデータフォーマットはどのようなものが適切なのか悩んでいます。

送受信するデータについて

送受信するデータは、以下の通りです。

  • 送信側:自身の機器の状態が変化した際、自身の状態を送信する(Publish)
  • 受信側:送られてきた情報が自身にとって必要であれば、受信データを参照し、自身の動作意思決定に利用する(Subscribe)

自分としては、送受信するデータは、送信側でシリアライズして、受信側でデシリアライズするのがいいのかなと思っています。

本題

上記の機器構成および送受信するデータをシリアライズ/デシリアライズする場合、MQTTのデータフォーマットは一般的にどのように実現するのでしょうか。
自分なりに調べてみたところ、ProtocolBuffersというものが探していたものに近いのかと思いました。が、C言語での構築例が検索してもあまり引っかからず、一般的ではないのかなぁと思いました。
そもそも、低スペック機器でのMQTTの使用方法が根本的に違うのでしょうか。(例えば独自プロトコルを生成し、バイナリデータでやりとりするとか)

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

異言語間のシリアライズ用には下記2つが有名です。
ProtocolBuffers
MessagePack

C++用なら下記の前者2つが有名です。
boost::serialization
cereal
Theolizer(手前味噌です。失礼)

JavaやC#用はそれぞれ数種類あります。たくさんあるので省略。

でも、C言語用はみたことありません。
リフレクションもなく、テンプレートさえないC言語の標準機能で実現するには厳しすぎるせいと思います。

エンディアンの問題を回避できるようでしたら、<stdint.h>を使ってサイズを固定してmemcpy()ベースでやり取りすることも視野に入ると思います。

投稿2017/06/25 14:36

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/30 11:12

ありがとうございます。 やはり、C言語では難しいのすかね・・・。おっしゃる通り、memcpyでのやり取りも考えてみます。
mattn

2017/07/01 13:02

msgpack は C で書けたと思います。
guest

0

Protocol Buffer をお選びになるなら C でなく C++ になります。
なお、C++ になるならば gRPC を使われた方が良いかもしれません。gRPC に元々キューが存在します。

また MQTT を使う前提ならば JSON で良いかと思います。RPC over MQTT として扱いたいならば JSONRPC の形式が良いと思います。ただし JSON で扱う場合、システムで使うエンティティの量が増えたり正規化したい場合などには苦しくなる可能性があります。

投稿2017/06/25 14:28

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/30 11:05

ありがとうございます。 >JSON で扱う場合、システムで使うエンティティの量が増えたり正規化したい場合などには苦しくなる可能性があります。 とのことですが、その理由をご教授いただくことはできますでしょうか。
mattn

2017/06/30 12:41

gRPC の場合は proto ファイルという設計書の様なファイルからエンティティを出力するという方式を取ります。これにより例えばエンティティの一部の型を変更した際にビルドエラーになってくれてバグを見つける事が出来るのですが、JSON はどちらかというと各実装で作り上げられたエンティティをシリアライズして通信する事になるので、片方のエンティティのメンテが漏れたり色々な事が起きやすくなります。
退会済みユーザー

退会済みユーザー

2017/06/30 13:00

追加のご回答ありがとうございます。 なるほど、そういう問題があるのですね。 納得いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問