1. MSM-PF端末との通信
本節ではMSM-PF端末との通信に関する仕様を説明します。
1.1. 接続構成
下図のようにMSM-PF端末とMSM-PFクラウドサービス間は、管理情報用とデータ交換用の2つの MQTTS接続を行います。また、ファイルダウンロード時にはHTTPSが使用されます。
1.2. 認証
MSM-PF端末には個体毎のIDとクライアント証明書が発行され、MSM-PF端末内に保持しています。MSM-PFクラウドサービスとの通信には MQTTSとHTTPSがありますが、どちらの場合にもクライアント証明書を使ったクライアント認証が行われます。
1.3. 端末管理情報
MSM-PFクラウドサービスは、センサー設定ファイルやファームウェアを MSM-PF端末へ配信します。これは、MSM-PF端末が以下のステップを実行することで実現されています。
端末管理情報を取得する
端末管理情報に含まれるセンサー設定ファイルやファームウェアの入手先URLから、ファイルをダウンロードする
端末管理情報はMSM-PF端末からMSM-PFクラウドサービスへ各種動作状態を通知することにも使用します。
端末管理情報は以下の構造の JSONです。
キー |
型 |
説明 |
---|---|---|
sensor_settings |
オブジェクト |
センサー設定ファイルの情報 |
sensor_settings.url |
文字列 |
センサー設定ファイルをダウンロードするための URL |
fw |
オブジェクト |
配信中のファームウェアの情報 |
fw.fpga |
オブジェクト |
FPGAコンフィグレーションデータ |
fw.fpga.version |
文字列 |
バージョン |
fw.fpga.url |
文字列 |
ファイル配布URL |
fw.fpga.md5 |
文字列 |
ファイルのMD5ハッシュ値 |
fw.edge |
オブジェクト |
エッジ処理プログラム |
fw.edge.version |
文字列 |
バージョン |
fw.edge.url |
文字列 |
ファイル配布URL |
fw.edge.md5 |
文字列 |
ファイルのMD5ハッシュ値 |
キー |
型 |
説明 |
---|---|---|
current_fw |
オブジェクト |
MSM-PF端末の動作状態 |
current_fw.fpga |
オブジェクト |
FPGAコンフィグレーション |
current_fw.fpga.version |
文字列 |
動作中のバージョン |
current_fw.edge |
オブジェクト |
エッジ処理プログラム |
current_fw.edge.version |
文字列 |
動作中のバージョン |
current_fw.status |
オブジェクト |
動作状態 |
current_fw.status.status_code |
文字列 |
動作状態コード |
current_fw.status.description |
文字列 |
動作状態の説明 |
端末管理情報の交換には、管理情報用のMQTTS接続で AWS IoT Coreのデバイスシャドウ機能を使用します。具体的には、デバイスシャドウのうちの名前なしデバイスシャドウのstate.reportedプロパティに端末管理情報を格納します。
デバイスシャドウの取得方法や更新方法は、AWS IoT Coreのドキュメントを参照してください。
1.4. ファイルダウンロード
端末管理情報で得られたセンサー設定ファイルやファームウェアファイルのURLに対し、MSM-PF端末はHTTPS GETを行って、ファイルを取得します。ステータスコード302により、他のURLへのリダイレクトが返される場合があります。
1.5. センサーデータのアップロード
MSM-PF端末が収集したセンサーデータは、タイムスタンプとセンサー毎の値が並ぶ表の形に表現できます。センサー毎にサンプリング間隔は異なる場合がありますので、表のセルすべてにセンサー値が入っているとは限らないことに注意が必要です。
この表の行は、あるタイムスタンプ時に取得したセンサー値の集まりです。以下の説明では、この表の行を「サンプル点」と呼びます。
タイムスタンプ |
センサー1 |
センサー2 |
センサー3 |
センサー4 |
---|---|---|---|---|
2022-09-14T02:31:01.123456Z |
100 |
20 |
0 |
874 |
2022-09-14T02:31:01.623460Z |
101 |
20 |
790 |
|
2022-09-14T02:31:02.123459Z |
99 |
131 |
826 |
|
2022-09-14T02:31:02.623457Z |
102 |
881 |
||
2022-09-14T02:31:02.623457Z |
97 |
21 |
62 |
830 |
MSM-PF端末は、データ交換用の MQTTS接続を使用してセンサーデータをアップロードします。MQTTメッセージの最大サイズは 4MBです。
センサーデータには 2つの形式があり、形式により使用する MQTTトピックが異なります。MQTTトピック中の %cは MSM-PF端末のIDに置き換えてください。
センサーデータの形式 |
MQTTトピック |
MQTT QoS |
---|---|---|
sensordata形式 |
things/%c/sensordata |
0 または 1 |
sensorjson形式 |
things/%c/sensorjson |
0 または 1 |
どちらのメッセージ形式の場合も、1つのメッセージの中に複数のサンプル点を含むことができます。メッセージ内のサンプル点は、タイムスタンプは昇順に並んでいなければならず、また同じタイムスタンプが複数回含まれていてはなりません。同様に送信されるメッセージの間でも、含まれるサンプル点のタイムスタンプは昇順に並んでいなければならず、また同じタイムスタンプが複数回含まれていてはなりません。
1.5.1. sensordata形式
タイムスタンプは UTCの1970年1月1日0時0分0秒からの経過時間で表現します。粒度はマイクロ秒で、経過時間を秒単位で表したときの整数部分と、1秒に満たない部分をマイクロ秒単位の整数とした、2つの数値の組み合わせで表現します。
1つのサンプル点は以下の形式で表現します。
キー |
型 |
説明 |
---|---|---|
timestamp sec |
文字列 |
タイムスタンプの秒部分を文字列にしたもの |
timestamp usec |
文字列 |
タイムスタンプのマイクロ秒部分を文字列にしたもの |
sensor values |
文字列 |
サンプル点内のセンサー値をカンマでつないだ文字列 |
MSM-PFクラウドへ送信するメッセージは、以下の表の sensordata形式のJSONとします。
キー |
型 |
説明 |
---|---|---|
terminalId |
文字列 |
MSM-PF端末のID |
dateset number |
文字列 |
dataset配列の要素数を文字列にしたもの |
dataset |
配列 |
各サンプル点のオブジェクトの配列 |
以下にsensordata形式のメッセージ例を記載します。インデントや改行を含んでいますが、これは説明を見やすくするためのものであり、送信メッセージには不要です。
{
"terminalId": "MSMPF-33",
"dataset number": "2",
"dataset": [
{
"timestamp sec": "1663150180",
"timestamp usec": "358",
"sensor values": "1,0,12,,,,,,,,,,,40030,309,21"
}, {
"timestamp sec": "1663150180",
"timestamp usec": "100359",
"sensor values": "20,1,,,,3,4,,,,,,,40030,,19"
}
]
}
1.5.2. sensorjson形式
sensorjson形式は、sensordata形式ではできない柔軟な構成を表現することができます。
sensordata形式はカラムとセンサーの対応付けを固定できることが前提となります。例えば複数の MSM-PF端末やセンサーデバイスを集約するゲートウェイを使う構成では、集約対象のMSM-PF端末やセンサーデバイスの追加や削除が発生します。この場合、カラムとセンサーの対応付けが変化するため、sensordata形式では表現できません。sensorjson形式ではセンサーデータ内にセンサー名等の情報を含めることができますので、センサーの追加や削除にも柔軟に対応することができます。
sensorjson形式で、1つのサンプル点を表現する構造例を以下に示します。
_timestampは UTCの1970年1月1日0時0分0秒からの経過時間(ミリ秒単位)で、少数部を使ってマイクロ秒の粒度を表現します。
キー |
型 |
説明 |
---|---|---|
device |
文字列 |
センサーデバイスの名称 |
id |
文字列 |
センサーデバイスのID |
sensor |
文字列 |
センサーデバイス中のセンサー名 |
timestamp |
数値 |
センサーデバイスが起動してからの経過時間(ミリ秒) |
_timestamp |
数値 |
タイムスタンプ |
(センサーに依存したキー) |
任意 |
センサー値、ラベル、単位等 |
sensorjson形式は、サンプル点のオブジェクトを1つ以上並べた配列のJSONです。
以下にsensorjson形式のメッセージ例を記載します。インデントや改行を含んでいますが、これは説明を見やすくするためのものであり、送信メッセージには不要です。
[
{
"device": "preMSM",
"id": "2D7E",
"sensor": "BME680",
"timestamp": 5636.84,
"_timestamp": 1663150180636.84,
"temp": {
"val": 31.13
},
"humid": {
"val": 63.44
},
"press": {
"val": 1017.54
},
"gas": {
"val": 123.98
}
},
{
"device": "preMSM",
"id": "2D7E",
"sensor": "MCP4725",
"timestamp": 5849.84,
"_timestamp": 1663150180849.84,
"DAC0": {
"val": 1.65
}
}
]
1.6. 制御メッセージ通信
制御メッセージ通信には、センサーデータのアップロードに使うデータ交換用MQTTS接続を共用します。上り制御メッセージと下り制御メッセージには、以下のMQTTトピックを使用します。MQTTトピック中の%cはMSM-PF端末のIDに置き換えてください。
制御メッセージの方向 |
MQTTトピック |
MQTT QoS |
---|---|---|
上り制御メッセージ |
things/%c/ctl-upstream |
0 |
下り制御メッセージ |
things/%c/ctl-downstream |
0 |
制御メッセージはJSONのオブジェクトです。必須プロパティはtimestampで、UTCの1970年1月1日0時0分0秒からの経過時間(ミリ秒単位の数値)を送信側が設定します。
timestamp以外のプロパティは規定されていません。制御メッセージの内容、それによる挙動は、MSM-PF端末上のアプリケーションとダッシュボードの間で決定します。