# GB/T 32960 ゲートウェイ

EMQX GB/T 32960 ゲートウェイは、GB/T 32960 と MQTT プロトコル間のメッセージングプロトコル変換を行うブリッジであり、クライアントがこれらのプロトコルを使って相互に通信できるようにします。この GB/T 32960 ゲートウェイは、クライアントとサーバーに対して軽量かつシンプルなメッセージングソリューションを提供し、さまざまなメッセージング環境でのメッセージ交換を可能にします。TCP および SSL タイプのリスナーをサポートしているため、GB/T 32960 ゲートウェイは柔軟で多用途なメッセージングシステム構築ツールです。

本ページでは、EMQX における GB/T 32960 ゲートウェイの設定方法と使用方法を紹介します。

## GB/T 32960 ゲートウェイの有効化

EMQX 5.4 以降、GB/T 32960 ゲートウェイはダッシュボード、REST API、および設定ファイル `base.hocon` を通じて設定および有効化が可能です。

::: tip

EMQX をクラスターで運用している場合、ダッシュボードや REST API で行った設定はクラスター全体に影響します。特定のノードのみ設定を変更したい場合は、[`base.hocon`](../configuration/configuration.md) で設定してください。

:::

ここでは、ダッシュボードおよび REST API を使った GB/T 32960 ゲートウェイの有効化方法を説明します。

EMQX ダッシュボードの左ナビゲーションメニューで **Management** -> **Gateways** をクリックします。**Gateways** ページにはサポートされているすべてのゲートウェイが一覧表示されます。**GB/T 32960** を探し、**Actions** 列の **Setup** をクリックすると、**Initialize GB/T 32960** ページに遷移します。

設定を簡略化するために、EMQX は **Gateways** ページのすべての必須フィールドにデフォルト値を用意しています。大幅なカスタマイズが不要な場合は、以下の3クリックで GB/T 32960 ゲートウェイを有効化できます。

1. **Basic Configuration** タブで **Next** をクリックし、すべてのデフォルト設定を受け入れます。
2. 続いて **Listeners** タブに遷移し、EMQX はポート `7325` で TCP リスナーを事前設定しています。再度 **Next** をクリックして設定を確定します。
3. 最後に **Enable** ボタンをクリックして GB/T 32960 ゲートウェイを有効化します。

ゲートウェイの有効化が完了すると、**Gateways** ページに戻り、GB/T 32960 ゲートウェイのステータスが **Enabled** と表示されていることを確認できます。

<img src="./assets/gbt32960-enabled.png" alt="GB/T 32960 ゲートウェイ有効化済み" style="zoom:50%;" />

上記の設定は REST API でも行えます。

**例:**

```bash
curl -X 'PUT' 'http://127.0.0.1:18083/api/v5/gateway/gbt32960' \
  -u <your-application-key>:<your-security-key> \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "gbt32960",
  "enable": true,
  "mountpoint": "gbt32960/${clientid}/",
  "retry_interval": "8s",
  "max_retry_times": 3,
  "message_queue_len": 10,
  "listeners": [
    {
      "type": "tcp",
      "name": "default",
      "bind": "7325",
      "max_conn_rate": 1000,
      "max_connections": 1024000
    }
  ]
}'
```

REST API の詳細は [REST API](../admin/api.md) を参照してください。

カスタマイズが必要で、リスナーの追加や認証ルールの設定を行いたい場合は、[GB/T 32960 ゲートウェイのカスタマイズ](#customize-your-gbt-32960-gateway) をお読みください。

## GB/T 32960 クライアントとの連携

EMQX の GB/T 32960 ゲートウェイが有効になると、GB/T 32960 プロトコルと MQTT 間の翻訳およびルーティングを行い、GB/T 32960 クライアントと MQTT を利用するシステム間の通信を可能にします。GB/T 32960 プロトコルと MQTT 仕様は大きく異なるため、GB/T 32960 コマンドを直接 MQTT メッセージにマッピングすることはできません。これを解決するために、両者間の通信を可能にする特定の変換ルールを設けています。

1. **コマンドの MQTT 変換**: GB/T 32960 クライアントが発行するすべてのコマンドは MQTT メッセージに変換されます。このメッセージのトピックは `${mountpoint}/upstream/${command}` の形式で、ペイロードはコマンドの詳細を含む JSON 形式です。
2. **GB/T 32960 クライアントへのコマンド送信**: ユーザーは `${mountpoint}/dnstream` トピックに JSON 形式のメッセージをパブリッシュすることで、GB/T 32960 クライアントにコマンドを送信できます。
3. **GB/T 32960 クライアントからの応答処理**: GB/T 32960 クライアントから受信した応答は、トピック `${mountpoint}/upstream/response` の MQTT メッセージに変換されます。

GB/T 32960 と MQTT 間の情報変換プロセスの詳細については、[データ交換ガイド](https://github.com/emqx/emqx/blob/release-54/apps/emqx_gateway_gbt32960/doc/Data_Exchange_Guide_EN.md) をご参照ください。

## GB/T 32960 ゲートウェイのカスタマイズ

デフォルト設定に加え、EMQX はさまざまな設定オプションを提供しており、特定のビジネス要件に合わせて柔軟に対応可能です。このセクションでは、**Gateways** ページで利用できる各種フィールドについて詳しく説明します。

### 基本設定

**Gateways** ページで **GB/T 32960** を見つけ、**Actions** 列の **Settings** をクリックします。**Settings** ペインでは、許容する最大ヘッダーサイズやヘッダー長、統計情報の有効化、ゲートウェイの MountPoint 文字列の設定が可能です。以下のスクリーンショット下の説明を参照してください。

![gbt32960-setting](./assets/gbt32960-setting.png)

- **MountPoint**: パブリッシュやサブスクライブ時にすべてのトピックの前に付加される文字列を設定します。これにより異なるプロトコル間でのメッセージルーティングの分離を実現できます。例: `stomp/`

- **Retry Interval**: 再送間隔（デフォルト: `8s`）

- **Max Retry Times**: 最大再送回数（デフォルト: `3`）

- **Message Queue Length**: 最大メッセージキュー長（デフォルト: `10`）

- **Idle Timeout**: GB/T 32960 フレームを待機する最大秒数。無通信状態が続くと接続を切断します。

- **Enable Statistics**: ゲートウェイの統計収集と報告を許可するかどうか（デフォルト: `true`、選択肢: `true`, `false`）

  **注意**: このトピックプレフィックスはゲートウェイが管理しており、クライアントはパブリッシュやサブスクライブ時に明示的に追加する必要はありません。

### リスナーの追加

ポート `7325` で名前が **default** の TCP リスナーがすでに設定されており、プール内で最大16のアクセプターを持ち、最大 1,024,000 の同時接続をサポートしています。より詳細な設定を行うには、**Listeners** タブをクリックして編集、削除、新規リスナーの追加が可能です。

::: tip

GB/T 32960 ゲートウェイは TCP と SSL タイプのリスナーのみをサポートしています。

:::

![gbt32960-listener](./assets/gbt32960-listener.png)

**Add Listener** をクリックすると **Add Listener** ページが開き、以下の設定が行えます。

**基本設定**

- **Name**: リスナーの一意識別子を設定します。
- **Type**: プロトコルタイプを選択します。GB/T 32960 では `tcp` または `ssl` が選べます。
- **Bind**: リスナーが接続を受け付けるポート番号を設定します。
- **MountPoint**（任意）: パブリッシュやサブスクライブ時にすべてのトピックの前に付加される文字列を設定し、異なるプロトコル間でのメッセージルーティング分離を実現します。

**リスナー設定**

- **Acceptor**: アクセプタープールのサイズを設定します（デフォルト: `16`）。
- **Max Connections**: リスナーが処理可能な最大同時接続数を設定します（デフォルト: `1024000`）。
- **Max Connection Rate**: リスナーが1秒あたりに受け入れる新規接続の最大レートを設定します（デフォルト: `1000`）。
- **Proxy Protocol**: EMQX がロードバランサーの背後にある場合に、プロトコル V1/V2 を有効にします。
- **Proxy Protocol Timeout**: プロキシプロトコルパッケージを待機する最大秒数。無通信状態が続くと接続を切断します（デフォルト: `3s`）。

**TCP 設定**

- **ActiveN**: ソケットの `{active, N}` オプションを設定します。これはソケットが積極的に処理できる受信パケット数を示します。詳細は [Erlang Documentation - setopts/2](https://erlang.org/doc/man/inet.html#setopts-2) を参照してください。
- **Buffer**: 受信および送信パケットを格納するバッファサイズを KB 単位で設定します。
- **TCP_NODELAY**: 接続に対して `TCP_NODELAY` フラグを有効にするかどうかを設定します。これはクライアントが前回のデータのアックを待たずに追加データを送信できるかどうかを制御します（デフォルト: `false`、選択肢: `true`, `false`）。
- **SO_REUSEADDR**: ローカルでのポート番号の再利用を許可するかどうかを設定します。
- **Send Timeout**: 送信タイムアウトの最大秒数を設定します。無通信状態が続くと接続を切断します（デフォルト: `15s`）。
- **Send Timeout**: 送信タイムアウト時に接続を切断するかどうかを設定します。

**SSL 設定**（SSL リスナーのみ）

TLS Verify の有効化はトグルスイッチで設定可能ですが、その前に関連する **TLS Cert**、**TLS Key**、および **CA Cert** の情報を設定する必要があります。ファイルの内容を直接入力するか、**Select File** ボタンでアップロードできます。詳細は [Enable SSL/TLS Connection](../network/emqx-mqtt-tls.md) を参照してください。

続いて以下の設定が可能です。

- **SSL Versions**: サポートする SSL バージョンを設定します。デフォルトは `tlsv1.3`、`tlsv1.2`、`tlsv1.1`、`tlsv1` です。
- **Fail If No Peer Cert**: クライアントが空の証明書を送信した場合に EMQX が接続を拒否するかどうかを設定します（デフォルト: `false`、選択肢: `true`, `false`）。
- **Intermediate Certificate Depth**: ピア証明書に続く有効な認証パスに含まれる自己発行でない中間証明書の最大数を設定します（デフォルト: `10`）。
- **Key Password**: プライベートキーがパスワード保護されている場合に使用するパスワードを設定します。

## 認証の設定

GB/T 32960 ゲートウェイは [HTTP サーバー認証](../access-control/authn/http.md) のみをサポートしています。`login` コマンドの情報を利用し、`vin` コードを `clientid` としてクライアントの認証フィールドを生成します。

- クライアント ID: `vin` コード
- ユーザー名: `vin` コード

以下の例は、REST API または設定ファイルを使って GB/T 32960 ゲートウェイの HTTP 認証を作成する方法を示しています。

:::: tabs type:card

::: tab REST API

```bash
curl -X 'POST' 'http://127.0.0.1:18083/api/v5/gateway/gbt32960/authentication' \
  -u <your-application-key>:<your-security-key> \
  -H 'Content-Type: application/json' \
  -d '{
  "method": "post",
  "url": "http://127.0.0.1:8080",
  "headers": {
    "content-type": "application/json"
  },
  "body": {
    "vin": "${clientid}"
  },
  "pool_size": 8,
  "connect_timeout": "5s",
  "request_timeout": "5s",
  "enable_pipelining": 100,
  "ssl": {
    "enable": false,
    "verify": "verify_none"
  },
  "backend": "http",
  "mechanism": "password_based",
  "enable": true
}'
```

:::

::: tab 設定ファイル

```properties
gateway.gbt32960 {
  authentication {
    backend = "http"
    mechanism = "password_based"
    method = "post"
    connect_timeout = "5s"
    enable_pipelining = 100
    url = "http://127.0.0.1:8080"
    headers {
      "content-type" = "application/json"
    }
    body {
      "vin": "${clientid}"
    }
    pool_size = 8
    request_timeout = "5s"
    ssl.enable = false
  }
}
```

:::

::::
