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フィールドの内容