FIFO用データフォーマット¶
intdash Edge Agent 2とデバイスコネクターの間で使われるFIFO用データフォーマットについて説明します。
重要
intdash Edge Agent 2とデバイスコネクターの間で使われるFIFO用データフォーマットには2種類あります。
iscp-v2-compat: iSCP v2のペイロードフォーマットに沿ったフォーマット
logger-msg: 旧intdash Edge Agentで使用されていたフォーマット(非推奨)
本章で説明するのはiscp-v2-compatフォーマットです。
旧フォーマットlogger-msgについては、 旧intdash Edge Agentのデベロッパーガイド を参照してください。
iscp-v2-compatの全体像¶
iscp-v2-compatフォーマットは以下のとおりです。
0 31
+---------------+---------------+---------------+---------------+
| Timestamp (seconds) |
+---------------+---------------+---------------+---------------+
| Timestamp (nano seconds) |
+---------------+---------------+---------------+---------------+
| Data Type Length | Data Name Length |
+---------------+---------------+---------------+---------------+
| Payload Length |
+---------------+---------------+---------------+---------------+
| Data Type
+-----------//--+
| Data Name
+-----------//--+
| Payload
+-----------//--+
フィールド名 |
バイト長 |
エンディアン |
符号 |
値範囲 |
説明 |
---|---|---|---|---|---|
Timestamp (seconds) |
4 |
LE |
U |
0 ~ 4294967295 |
このデータのタイムスタンプ(秒)。アップストリームの場合とダウンストリームの場合で意味が異なります。 Timestampフィールドの意味 を参照してください。 |
Timestamp (nano seconds) |
4 |
LE |
U |
0 ~ 999999999 |
このデータのタイムスタンプ(ナノ秒)。アップストリームの場合とダウンストリームの場合で意味が異なります。 Timestampフィールドの意味 を参照してください。 |
Data Type Length |
2 |
LE |
U |
0 ~ 65535 |
Data Type フィールドのバイト長 |
Data Name Length |
2 |
LE |
U |
0 ~ 65535 |
Data Name フィールドのバイト長 |
Payload Length |
4 |
LE |
U |
0 ~ 4294967295 |
Payload フィールドのバイト長 |
Data Type |
可変 |
- |
- |
- |
iSCPv2のデータ型の文字列 |
Data Name |
可変 |
- |
- |
- |
iSCPv2のデータ名称(もしくはデータ名称の末尾)の文字列。アップストリームの場合とダウンストリームの場合で意味が異なります。 Data Nameフィールドの意味 を参照してください。 |
Payload |
可変 |
- |
- |
- |
iSCPv2拡張仕様のペイロード |
Timestampフィールドの意味¶
Timestampフィールドの意味は、アップストリームの場合とダウンストリーム場合で異なります。
アップストリームの場合¶
POSIXのclock_gettime()の引数にCLOCK_MONOTONIC(またはCLOCK_MONOTONIC_RAW)を指定して取得した時間を設定します。
注釈
intdash Edge Agent 2のデフォルト設定では、CLOCK_MONOTONICが使用されます。 CLOCK_MONOTONIC_RAWを使用する場合は、Agentコマンドでの計測を実行時に以下のように環境変数を設定してください。
AGENT_CLOCK_ID=CLOCK_MONOTONIC_RAW intdash-ageentctl run
CLOCK_MONOTONICの取得方法の例
C¶
#include <time.h>
#include <stdio.h>
int main(int argc, const char* argv[])
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
printf("%ld%09ld ns\n", ts.tv_sec, ts.tv_nsec);
return 0;
}
C++11¶
#include <stdio.h>
#include <chrono>
int main(int argc, const char* argv[])
{
auto steady_ts = std::chrono::steady_clock::now();
printf("%lld ns\n",
static_cast<long long>(std::chrono::duration_cast<std::chrono::nanoseconds>(steady_ts.time_since_epoch()).count()));
return 0;
}
Go¶
package main
import "fmt"
/*
#include <time.h>
static unsigned long long get_nsecs(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (unsigned long long)ts.tv_sec * 1000000000UL + ts.tv_nsec;
}
*/
import "C"
func main() {
monotonic := uint64(C.get_nsecs())
fmt.Println(monotonic, "ns")
}
Python¶
#!/usr/bin/env python3
import time
if __name__ == '__main__':
now = int(time.clock_gettime(time.CLOCK_MONOTONIC) * 1_000_000_000)
print("%d ns" % (now))
Rust¶
use libc;
fn main() {
let mut ts = libc::timespec {
tv_sec: 0,
tv_nsec: 0,
};
unsafe {
libc::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts);
};
println!(
"{} ns",
(ts.tv_sec as u64) * 1000000000 + (ts.tv_nsec as u64)
);
}
ダウンストリームの場合¶
ダウンストリームの際のFIFOデータに含まれるTimestampフィールドには、計測の基準時刻に経過時間を足すことで得られたタイムスタンプが格納されます。
このとき、基準時刻としては、アップストリームを行うエッジがサーバーに送信した基準時刻(エッジのリアルタイムクロックによるもの、NTPによるものなど複数の基準時刻)のうち、最も高い優先度を持つものが使用されます。計測の途中で優先度が高い基準時刻が得られると、基準時刻はそれに置き換わり、それ以降のタイムスタンプは新しい基準時刻を基に計算されます。
複数のエッジ(ここではエッジA、エッジBとします)からのデータを1つのintdash Edge Agent 2でダウンストリームする場合、エッジAからのデータポイントのTimestampフィールドはエッジAが送信した基準時刻を基にしたタイムスタンプ、エッジBからのデータポイントのTimestampフィールドはエッジBが送信した基準時刻を基にしたタイムスタンプです。
Data Nameフィールドの意味¶
Data Nameフィールドの意味は、アップストリームの場合とダウンストリーム場合で異なります。
アップストリームの場合¶
アップストリームの場合のData Nameフィールドは、iSCPのデータ名称の後半部分に相当します(前半部分はintdash Edge Agent 2の設定項目 data_name_prefix
によって決定されます)。
データ型ごとの設定値については 付与されるデータID を参照してください。
v1/123/00000001
------ --------
| |
| `- アップストリーム時のData Nameフィールドの内容
`--intdash Edge Agent 2のdata_name_prefix
ダウンストリームの場合¶
ダウンストリームの場合のData Nameフィールドの内容は、iSCPのデータ名称です。
アップストリームを行うintdash Edge Agent 2における「 data_name_prefix
+ Data Nameフィールド」に相当します。
v1/123/00000001
---------------
|
`- ダウンストリーム時のData Nameフィールドの内容