# StreamZet xSpan SDK 0.2.1

Documentation revision: 2026-09-23

https://streamzet.com/docs?lang=ja

## xSpan 概要

機器の接続と製品へのリモートサポート組み込みを案内します。xSpan SDK 0.2.1のインストールと連携手順です。

### 目的に応じた開始方法

- [まずリーダーでテストする](https://streamzet.com/docs/xspan/quickstart?lang=ja)
- [C/C++製品に組み込む](https://streamzet.com/docs/xspan/integration?lang=ja)
- [配布パッケージとチェックサムを確認する](https://streamzet.com/docs/xspan/packages?lang=ja)

インストールテストにはビルド済みエンジンを使用します。製品にはCアダプターと同じエンジンを同梱します。どちらも機器固有の永続状態を使用するため、同じ状態で同時に起動しないでください。

### xSpanの機能

| 機能 | 現在の対応範囲 |
| --- | --- |
| Auto enrollment | 初回登録後、アカウントの機器一覧に自動表示されます。ネットワーク接続が必要です。 |
| リモートターミナル | ブラウザーの対話型shターミナルです。インストールされたエージェントのOS権限で実行します。 |
| Fleet一括コマンド | 対象のオンラインリーダーを複数またはすべて選択し、機器ごとに状態、標準出力、標準エラー、終了コードを確認できます。 |
| RFIDダッシュボード | 機器ごとにダッシュボードを有効化すると、既存のOEMダッシュボードを開けます。OEMのログインが別途必要です。 |

### 互換性と検証環境

| 項目 | 検証済み環境 |
| --- | --- |
| Reader | Impinj xSpan R660 |
| CPU / ABI | ARMv5TE · soft-float · static musl engine |
| Linux / OEM libc | 2.6.39.4 / glibc 2.19 |
| Octane firmware | 6.2.2.240 |
| OEM application | RFID Overhead 360° 2.22.11.30 |
| SDK / documentation | 0.2.1 / 2026-09-22 |

> R660実機1台で登録、ターミナル、Fleetコマンド、SDKライフサイクル、Webダッシュボードを検証しました。他機種・ファームウェア、完全な再起動、複数実機の負荷試験は別途必要です。

## クイックスタート：リーダーでテスト

信頼できるPCで機器専用ディレクトリを準備し、xSpan 1台にインストールして接続を確認します。

### 1. 前提条件

- 検証環境に一致するxSpan R660と、許可されたSSHまたはOEMの工場プロビジョニング手段。
- 評価用ZIP、別途提供される登録キーファイル、StreamZet操作用アカウント。
- 準備用PCにはPython 3が必要です。リーダーは正確な時刻、DNS、外向きTCP 443接続が必要ですが、Pythonは不要です。

> 以下のパスとREADER_HOSTは例です。reader-001は1台専用にしてください。この初回手順で既存インストールの状態を上書きしないでください。

### 2. 展開と検証

```sh
shasum -a 256 -c streamzet-xspan-evaluation-0.2.1-20260922.zip.sha256
unzip streamzet-xspan-evaluation-0.2.1-20260922.zip -d xspan-evaluation
cd xspan-evaluation
shasum -a 256 -c SHA256SUMS
```

Linuxではshasumの代わりにsha256sum -cを使用できます。チェックサムファイルはZIPと一緒に受け取ってください。

### 3. 1台分を準備

```sh
umask 077
mkdir -p ./provisioning
python3 device/prepare-device.py \
  --registration-key /secure/JCI-production-key.txt \
  --output ./provisioning/reader-001 \
  --name 'xSpan R660 001'
```

新しいディレクトリにはエンジン、CAバンドル、起動・停止スクリプト、登録キー、固有の64バイトのエントロピーシードが入ります。既存の出力ディレクトリは拒否されます。初回起動でUUIDと秘密情報を含むstate/identityが作成されます。

### 4. 転送と起動

検証済みSSHまたは承認された工場プロビジョニングを使用してください。この例では対象機器に/mnt/spp/streamzet-jciが存在しないことを前提とします。設置先はOEMの永続ストレージ方針に合わせてください。

```sh
# On the provisioning computer
scp -pr ./provisioning/reader-001 root@READER_HOST:/mnt/spp/streamzet-jci

# In the reader's authorized shell
cd /mnt/spp/streamzet-jci
chmod 700 . state streamzet-embedded start.sh stop.sh
chmod 600 registration.key cacert.pem device-name state/entropy.seed
./start.sh
```

> パスワードや登録キーの値をコマンドライン引数に渡さないでください。登録済み機器のstateディレクトリを別の機器へ複製しないでください。

### 5. 接続の確認

1. StreamZetにログインし、指定したリーダーが機器一覧でオンラインになっていることを確認します。
2. ターミナルで以下の読み取り専用コマンドを実行し、出力が実機の情報と一致することを確認します。
3. Fleet → Linux → sh · xSpan / embeddedでこのテストリーダーだけを選び、同じコマンドを実行して結果と終了コードを確認します。

```sh
printf 'STREAMZET_TEST_OK\n'
uname -m
uptime
```

エージェントは約30秒ごとにFleetキューを確認します。登録は非同期です。プロセス起動成功だけではオンライン状態を確認できません。

- [自動起動と運用を設定する](https://streamzet.com/docs/xspan/operations?lang=ja)
- [リーダーが表示されない場合](https://streamzet.com/docs/xspan/troubleshooting?lang=ja)

## C/C++連携

製品のライフサイクルにリモートサポートを組み込みます。既存のglibcアプリにはPOSIXプロセスアダプターを使用します。

### 連携構成

```text
OEM application (your ETK / libc)
  └─ streamzet_product.c  [start / poll / stop]
       └─ streamzet-embedded  [static ARMv5 engine]
            └─ outbound TLS :443 → StreamZet
                 └─ enrollment · terminal · Fleet · dashboard
```

小さなCアダプターをOEMアプリにコンパイルし、検証済みの静的エンジンを同梱します。TLSとCランタイムは別プロセスです。エンジンは通信・登録・再接続を担当し、ホストは子プロセスを起動・監視・停止します。

### 必要なファイル

| ファイル | 用途 |
| --- | --- |
| sdk/product/streamzet_product.h | 公開C/C++インターフェース |
| sdk/product/streamzet_product.c | OEM ETKでコンパイルするPOSIXアダプター |
| sdk/product/example.c | 起動、監視、停止、子プロセス回収の例 |
| device/streamzet-embedded | 検証済みの静的ARMv5エンジン |
| device/cacert.pem | サーバー認証用CAバンドル |
| registration.key + state/ | 機器ごとに準備して保持するファイル |

### 製品のツールチェーンでビルド

```sh
# Set CC to the matching OEM ETK C compiler.
"$CC" -std=c99 -D_POSIX_C_SOURCE=200809L \
  -Isdk/product sdk/product/example.c sdk/product/streamzet_product.c \
  -o streamzet-product-example
```

C++の場合、streamzet_product.cをCとしてコンパイルし、そのオブジェクトをリンクしてヘッダーを読み込みます。生成した例を準備済みリーダーにコピーして以下を実行します。同じ状態を使う前に、start.shで起動したエンジンを停止し、終了を確認してください。

```sh
./streamzet-product-example \
  /mnt/spp/streamzet-jci/streamzet-embedded \
  /mnt/spp/streamzet-jci/registration.key \
  /mnt/spp/streamzet-jci/cacert.pem \
  /mnt/spp/streamzet-jci/state \
  'xSpan R660 001'
```

### ホストのライフサイクル例

```c
#include "streamzet_product.h"

static stz_product support = {0};

int start_remote_support(void) {
    const stz_product_config config = {
        .engine_path = "/mnt/spp/streamzet-jci/streamzet-embedded",
        .registration_file = "/mnt/spp/streamzet-jci/registration.key",
        .ca_file = "/mnt/spp/streamzet-jci/cacert.pem",
        .state_directory = "/mnt/spp/streamzet-jci/state",
        .device_name = "xSpan R660 001"
    };
    return stz_product_start(&support, &config);
}

/* Call periodically from the same host thread. */
int poll_remote_support(int *wait_status) {
    return stz_product_poll(&support, wait_status);
}

/* Request stop, then keep polling until the child is reaped. */
int stop_remote_support(void) {
    return stz_product_stop(&support);
}
```

- startの戻り値0は子プロセス生成の成功を示します。オンライン状態はStreamZetで確認してください。
- 同じハンドルへの呼び出しは直列化します。他のSIGCHLDハンドラーでこの子プロセスを回収しないでください。
- 無関係なホストのファイル記述子にはclose-on-execを設定します。子プロセスは標準出力・標準エラーを継承します。
- ネットワーク再接続は自動です。プロセス終了はpollで検知し、OEMの再起動方針を適用します。
- SDKモードとstart.shを同時に実行しないでください。停止要求後はpollで回収してからハンドルを再利用します。

- [フィールド、戻り値、エラー](https://streamzet.com/docs/xspan/api?lang=ja)

### 低レベル静的ライブラリ

sdk/muslにはlibstreamzet-embedded.a、TLSアーカイブ、ヘッダーが含まれます。新規musl ARMv5アプリではstz_create → ワーカースレッドでstz_run → stz_stop → join → stz_destroyの順に使用し、エントロピー・永続ID・単一TLSランタイムの契約を守ります。

> 既存のglibcアプリへそのまま組み込めるライブラリではありません。プロセス内連携には適合するETK、ABI、スレッド、TLSの検証が必要です。初回の製品連携にはプロセスアダプターを使用してください。

## C APIリファレンス

streamzet_product.hの公開契約です。エンジンのライフサイクルを制御します。

### stz_product_config

| フィールド | 型と要件 |
| --- | --- |
| engine_path | const char* · エンジンの絶対パス |
| registration_file | const char* · 所有者のみが読める登録キーファイルの絶対パス（0600）。 |
| ca_file | const char* · CA PEMの絶対パス |
| state_directory | const char* · 機器固有の永続ディレクトリの絶対パス（0700）。 |
| device_name | const char* · 空でないUTF-8名、最大128バイト |

パスは1,024バイト未満です。文字列ポインターはstartが返るまで有効にしてください。準備ツールは名前の制御文字を拒否します。stz_productは{0}で初期化し、所有権の共有目的でコピーしないでください。

| フィールド / API | 型 / 既定値 | 契約 |
| --- | --- | --- |
| stz_product.pid | pid_t · 0 | 所有する子PID。ハンドルを{0}で初期化。pollは終了・エラー時にリセットします。直接代入・所有権コピー・他での回収は禁止。 |

### stz_product_start

```c
int stz_product_start(stz_product *product,
                      const stz_product_config *config);
```

| 戻り値 | 意味 |
| --- | --- |
| 0 | 子プロセスを生成しました。登録とネットワーク接続は非同期で進みます。 |
| EINVAL | 無効な引数、相対パス、長すぎるパス、または機器名 |
| EALREADY | このハンドルは実行中の子プロセスを所有しています |
| ECHILD | 前の子プロセスを確認・回収できませんでした |
| ENOENT / EACCES / other errno | posix_spawnまたは準備処理の失敗。戻り値をerrnoコードとして解釈します。 |

生成後にファイル内容やネットワーク設定のエラーでエンジンが終了する場合があります。起動成功後もpollを続けてください。

### stz_product_poll

```c
int stz_product_poll(stz_product *product, int *wait_status);
```

| 戻り値 | 意味 |
| --- | --- |
| 1 | 子プロセスは実行中です。呼び出しはブロックしません。 |
| 0 | 停止済み、または終了して回収済みです。ハンドルのPIDは0に戻ります。 |
| -1 | NULLハンドルまたはwaitpidエラー |

wait_statusはNULLでも構いません。子プロセスを回収した場合はsys/wait.hのWIFEXITED/WEXITSTATUSまたはWIFSIGNALED/WTERMSIGで状態を確認します。停止済みハンドルでは新しい状態を書き込みません。

### stz_product_stop

```c
int stz_product_stop(stz_product *product);
```

実行中ならSIGTERMを要求します。成功または停止済みは0、NULLハンドルはEINVAL、子状態のエラーはECHILD、シグナル送信失敗はerrnoを返します。終了は待ちません。pollで子プロセスを回収してください。

### スレッドと状態の所有権

単一スレッドまたは外部ロックで同じハンドルへの呼び出しを直列化します。アダプターはキーの値ではなくファイルパスを渡し、シェルで引数を評価しません。エンジンのファイルロックが同じ状態ディレクトリの同時使用を拒否します。

### 詳細：stz_config

> 同梱muslアーカイブは別途検証したmuslホスト用の詳細インターフェースです。既存glibc OEMアプリへの直接リンクは未検証で、初回連携にはプロセスアダプターを使用します。stz_createは文字列をコピーします。ゼロ初期化のみでは有効な設定になりません。

| フィールド / API | 型 / 既定値 | 契約 |
| --- | --- | --- |
| relay_host | const char* · required | ホスト名文字（英数字/.-）1～253バイト、先頭・末尾の点不可。スキーム・ポート・パスなし。HTTPS/WSS 443を使用。 |
| device_token | const char* · required | 正確に64桁の16進機器秘密値。登録キー・操作トークンではありません。 |
| ca_file | const char* · required | 1024バイト未満の絶対PEMパス。create時に有効なCAが必要。TLS証明書・ホスト名を常に検証。 |
| allow_terminal | int · 0 | 0は対話シェル禁止、非0はホストOSユーザー権限で許可。 |
| allow_commands | int · 0 | 0はFleetコマンド禁止、非0は制限付き実行を許可。 |
| device_id | const char* · NULL | 本番：ハイフン付き小文字UUID 36文字。NULLはテナント登録ではなく旧previewモード。 |
| registration_key | const char* · NULL | 本番登録専用。登録後はNULL・空可。それ以外はsz_live_接頭辞、128バイト以下、英数字/_/-。 |
| device_name | const char* · required in production | device_id設定時、空でなく128バイト以下。previewでは無視。 |
| os_version | const char* · NULL | 本番：128バイト以下。NULLはLinux embedded。previewでは無視。 |

### 詳細ライフサイクルと初期化

| フィールド / API | 型 / 既定値 | 契約 |
| --- | --- | --- |
| stz_create(config) | stz_client* / NULL | 設定コピー・エントロピー/TLS初期化。不正設定・割当・エントロピー・CA・TLS失敗はNULL。run前に登録しません。 |
| stz_run(client) | int · blocking | ホストワーカースレッドでブロック。停止まで再接続。正常停止0、NULL・実行中は-1。ハンドルごとに1実行、プロセス内TLSクライアント・ランタイム1個が検証範囲。 |
| stz_stop(client) | void | 非ブロッキングで起床。NULL可、シグナルハンドラー安全。runをjoin後にdestroy。停止済みハンドルを新規実行へ再利用せず、新しく生成。 |
| stz_destroy(client) | void | runのjoin後のみ。資源解放・コピーした秘密値を消去。NULL可。destroy後の同時アクセス禁止。 |
| stz_prepare_entropy(path) | int | CLI初期化ヘルパー。所有0700フォルダー内の絶対seedパス1024バイト未満。所有・単一リンク通常ファイル0600、正確に64バイト。TLS・新ID前にローテーション・fsync。成功0、失敗-1。seed複製不可。 |
| stz_identity_lock(directory) | int fd / -1 | 既存の絶対パス・所有・非公開フォルダー。ロックFDまたは-1。run中は保持し、停止後に呼出側がFDを閉じます。 |
| stz_identity_load(directory, identity) | int | ロック取得・エントロピー準備後に呼びます。ID読込・生成。成功0、失敗-1。identityは呼出側所有のstz_identity*。 |
| stz_identity.device_id | char[37] | 小文字UUID 36文字とNUL。永続的公開ID。 |
| stz_identity.secret | char[65] | 16進64文字とNUL。機器秘密値。ログ・外部公開不可。 |

## 運用とFleet

自動起動、リモート接続、機器ごとのダッシュボード、IDを維持する更新を設定します。

### 起動時の自動実行

単体インストールでは検証済みR660の/cust/startにStreamZet start.sh呼び出しを追加します。OEMの行を保持し、原本をバックアップしてください。SDKモードでは製品がstz_product_startを呼ぶため、別途start.sh起動フックは不要です。

```sh
# Standalone mode: add once to the OEM-approved startup hook
/mnt/spp/streamzet-jci/start.sh
```

> 稼働中のリーダーで/cust/start全体を再実行しないでください。RFIDアプリが重複起動する場合があります。OEM CAP・ファームウェア更新でフックが置換される可能性があります。製品パッケージへ含め、再起動試験を行ってください。

### 複数リーダーへの一括コマンド

1. FleetでLinuxとsh · xSpan / embeddedを選択します。
2. 個別または「すべて選択」でリーダーを選びます。現在のアカウントが操作できる対象オンライン機器が選択されます。
3. コマンドを実行し、機器ごとのpending、running、completed、failed、expiredと出力を確認します。

```sh
printf 'FLEET_CHECK_OK\n'
uname -m
uptime
```

> 一括送信は同時実行を保証しません。キュー確認と通信状況により開始時刻が変わります。切断で結果が不明なコマンドは自動再実行されません。再試行前に結果を確認してください。

### RFIDダッシュボードを開く

機器一覧またはターミナルの「xSpanダッシュボードを開く」から、既存OEM画面を新しいタブで開きます。OEM管理者アカウントでログインしてください。ターミナルと同時に使用できます。

> 新しいリーダーではターミナル登録後にダッシュボードを有効化する必要があります。StreamZet機器UUIDを担当者へ渡すと、有効化後にボタンが表示されます。IP変更などでHTTPS証明書が変わっても、追加の対応なしで接続を続けられます。

Web接続の有効期間は30分です。「ダッシュボードを閉じる」で即時終了できます。長時間放置したタブは再接続が必要な場合があります。URLの共有だけでは別のブラウザーにアクセス権は付与されません。

### 実行制限

| 項目 | 制限 |
| --- | --- |
| ターミナル | リーダーごとに1接続、1セッション最大30分 |
| 同時コマンド数 | リーダーごとに最大2件 |
| コマンド長 | 4,096 UTF-8 bytes |
| コマンドタイムアウト | 100～120,000 ms。現在のFleet UIは30,000 msを使用します |
| 出力 | 標準出力と標準エラーの合計65,536バイト。切り詰めは通知されます |
| キュー確認間隔 | 約30秒 |

### 更新と削除

1. 新しい成果物のチェックサムを検証し、現在のエンジンと起動設定をバックアップします。
2. StreamZetだけを停止し、終了を確認します。停止するとリモートターミナルも閉じるため、交換にはOEMの配布手段を使用します。
3. エンジンと必要なCA・スクリプトのみ交換します。state/、registration.key、機器名、所有者は保持します。
4. 再起動し、同じUUIDでオンラインに戻ることを確認します。必要に応じてバックアップした実行ファイルに戻します。

連携を削除するにはStreamZetを停止し、専用起動フックだけを削除します。再インストール予定ならID状態を保持してください。廃棄時は管理者がサーバー側の機器認証情報を失効させ、ローカルの秘密情報を安全に削除します。

## ネットワークと認証

ネットワーク要件、認証情報の役割、操作権限。

### ネットワーク要件

| 接続 | 要件 |
| --- | --- |
| リーダー → リレー | streamzet-embedded.plitsoft.workers.dev · TCP 443 · HTTPS/WSS |
| 操作用ブラウザー | streamzet.com · streamzet-embedded.plitsoft.workers.dev · *.supabase.co · HTTPS/WSS |
| OEM Webダッシュボード | xspan.streamzet.com · HTTPS |
| リーダー内部 | ダッシュボード通信はループバックのTLS 9000へ接続します。外部からのポート転送は不要です。 |

リーダーが外向きTLS接続を開始するため、NAT配下で動作します。DNS、正確な時刻、WebSocket対応の外向き通信が必要です。CAとホスト名の検証を維持してください。

### 認証情報の役割

| 認証情報 | 用途 |
| --- | --- |
| 登録キー | 新しいリーダーの登録用です。操作側のターミナル・Fleet権限は付与しません。 |
| 機器固有の秘密情報 | state/identityに保存され、各リーダーの接続に使用されます。 |
| 操作アカウントのログイン | 所有権の確認後、ターミナル、コマンド、ダッシュボードへのアクセスを許可します。 |
| OEMログイン | 既存RFIDダッシュボード用の独立したBasic認証です。 |

> 登録キー、パスワード、機器状態を公開文書・ソース管理・SDK ZIP・ログに含めないでください。準備ディレクトリは0700、秘密ファイルは0600とし、機器間で複製しないでください。

### 権限と認証の境界

シェルはエージェントのOS権限で実行します。検証対象リーダーのOEM環境はrootで動作します。配布時のUIDとアクセス範囲はOEM側で選定・検証してください。

RFID UIはStreamZetコンソールとは別オリジンです。使い捨て起動チケットとHttpOnlyセッションCookieで保護され、操作側のBearerトークンはリーダーへ転送されません。ダッシュボードの通信は機器固有の秘密鍵で認証されたリーダー自身の接続だけを通り、リーダーのHTTPS証明書が変わるとサーバーに記録されます。

## トラブルシューティングと受け入れ試験

症状別の診断手順とパートナーの受け入れ確認。

### 症状から診断

| 症状 | 確認事項 |
| --- | --- |
| リーダーが表示されない | 時刻、DNS、外向き443、登録キーの権限、アカウント上限を確認します。名前だけでなくUUIDで識別してください。 |
| Private state directory is unavailable or already in use | 状態パス、所有者、0700権限を確認します。単体版とSDKが同時に動作していないか確認してください。 |
| Private enrollment configuration, entropy or identity failed | キー・シード・IDファイルの所有者、0600権限、内容を確認します。他のリーダーの状態で代用しないでください。 |
| Invalid configuration, CA bundle or entropy source | 同梱CAバンドル、シード、エンジン設定を確認します。証明書検証は無効にしないでください。 |
| 起動成功後にエンジンが終了する | pollの終了状態と標準エラーを確認します。startはプロセス生成だけを確認します。 |
| コマンドが保留中 | オンライン状態、所有アカウント、約30秒のキュー間隔を確認します。 |
| ターミナルが使用中 | 既存セッションを通常の手順で終了します。他の操作者のセッションを奪わないでください。 |
| ダッシュボードボタンがない | オンライン状態を確認し、担当者にダッシュボードの有効化を確認してください。 |
| ダッシュボードが401・期限切れ | StreamZetのボタンから新しい接続を作成します。OEM認証画面にはOEM認証情報を使用してください。 |
| ダッシュボード接続エラー | リーダーのOEM 9000ポートのサービスが動作しているか確認し、StreamZetから開き直してください。 |

### フォアグラウンド診断

start.shは出力を破棄します。診断する場合はStreamZetを停止して終了を確認し、許可されたリーダーのシェルで以下を実行して標準エラーを確認します。Ctrl+Cで停止し、通常の起動方法へ戻してください。

```sh
cd /mnt/spp/streamzet-jci
./streamzet-embedded --production \
  streamzet-embedded.plitsoft.workers.dev \
  /mnt/spp/streamzet-jci/registration.key \
  /mnt/spp/streamzet-jci/cacert.pem \
  /mnt/spp/streamzet-jci/state 'xSpan R660 001'
```

### パートナーの受け入れ確認

- 初回起動で登録され、操作アカウントにリーダーが表示されますか？
- 実機でターミナル出力とFleetの成功・失敗結果を確認しましたか？
- アプリ・エンジン再起動後もUUIDが保持され、通信障害後に再接続できますか？
- OEMアプリ内でSDKのstart、poll、正常停止、子プロセス回収が動作しますか？
- 承認された保守時間帯に、完全な再起動とCAP・ファームウェア更新後の起動を確認しましたか？
- CPU、メモリー、RFID負荷、複数実機での一括実行を検証しましたか？
- ダッシュボードの有効化、ログイン、ライブイベント、ターミナルとの同時使用を確認しましたか？

問い合わせ時はSDK版、機種・ファームウェア、UUID、タイムゾーン付き時刻、再現手順、秘密情報を除いた終了状態・ログを提供してください。キー、パスワード、state/identityは送らないでください。

- [技術サポートへ連絡](mailto:plitsoft@plitsoft.com)

## パッケージと配布

評価用または製品連携用パッケージを選び、受け取ったファイルを検証します。

### バージョン0.2.1・配布日2026-09-22

| パッケージ | 内容 |
| --- | --- |
| streamzet-xspan-evaluation-0.2.1-20260922.zip | ARMv5エンジン、CAバンドル、機器別準備ツール、起動・停止スクリプト、文書、ライセンス。コンパイルせずにテストできます。 |
| streamzet-jci-xspan-sdk-0.2.1-20260922.zip | 評価用ファイルに加え、C/C++プロセスアダプター、例、muslアーカイブ、ソース、固定依存関係、ビルド手順。 |
| *.zip.sha256 / SHA256SUMS | ZIPと内部ファイルのSHA256チェックサム。以下のリリース情報と照合してください。 |

> バイナリとSDKパッケージは担当者から個別に提供します。この公開文書に操作アカウント、登録キー、機器の秘密情報は含まれません。以下のチェックサムで受け取った成果物を検証してください。

### 別途提供する認証情報

- StreamZet操作アカウント：機器一覧、リモートアクセス、Fleet。
- 登録キーファイル：prepare-device.pyで機器ごとに使用します。SDKソースへ直接記述しないでください。
- OEMダッシュボードの認証情報と、新しいリーダーの有効化を担当する連絡先。

xSpanアダプターは他の連携用のJCI-sdk-config.jsonを読みません。登録キーファイル、CAバンドル、永続状態パスを使用して稼働中のリレーへ接続します。

### オフライン文書

- [韓国語ガイドをダウンロード（.md）](https://streamzet.com/docs-assets/xspan/integration-ko.md)
- [英語ガイドをダウンロード（.md）](https://streamzet.com/docs-assets/xspan/integration-en.md)
- [日本語ガイドをダウンロード（.md）](https://streamzet.com/docs-assets/xspan/integration-ja.md)

両ZIPのdocs/にこれらのガイドを含めます。正確なAPI契約はSDKのstreamzet_product.hで定義しています。

## リリースと検証

エンジンのバージョンと文書・パッケージの改訂を分けて管理します。

### 2026-09-22・文書とサンプル改訂

0.2.1エンジンのバイナリは変更していません。全SDKリファレンスを英語・韓国語・日本語化し、製品例がエンジンの異常終了コードを返すよう修正しました。

### 完了済み検証と残りの確認

| 検証 | 範囲 |
| --- | --- |
| R660実機 | 登録、ターミナル、Fleetの成功・失敗・タイムアウト・出力制限、SDKライフサイクル、同一UUIDでの再接続 |
| 実ブラウザー | OEM画面遷移、再読み込み、SSEイベント、ターミナル併用、未認証アクセスの拒否 |
| 自動試験 | ARM926エミュレーション、ゲートウェイの競合・アクセス制御、Web型・ビルド検証、1,101台の模擬ページング |
| パートナー側で必要な試験 | OEM ETKビルド、他ファームウェア、完全な再起動、本番RFID負荷、複数実機 |
