1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ネットワーク隔離環境でのデータ同期:Bluetooth通信によるDB連携の実装ガイド

Posted at

はじめに:Wi-Fi禁止、ネット不可。現場の壁をどう超えるか

本記事の実装に至るまでには、特有の厳しい環境制限がありました。

ネットワークの不在: セキュリティや電波干渉の都合上、現場のタブレットはWi-Fiやインターネットに一切接続できない。

孤立したDB: データの最終的な蓄積先はローカルネットワーク上のDB。しかし、タブレットはこのネットワークに物理的、論理的にも参加できない。

求められる利便性: 手入力による転記ミスを避けるため、タブレットで収集したデータはシームレスにメインシステムへ転送したい。

「Wi-Fiが使えないなら、近距離無線通信か有線しかない」——
この極限状態から導き出したのが、Bluetoothを用いたシリアル通信(SPP)によるデータ転送という方法です。

1. Bluetooth受信サービスの設計 (Model層)

Bluetooth通信は、標準的なソケット通信(TCP/IP)と似た手順で実装できます。ここではPCを「サーバー(親機)」として、タブレットからの接続を待ち受けます。

  • 使用ライブラリ: InTheHand.Net.Bluetooth (32feet.NET)

  • プロトコル: SerialPort (SPP) サービスを使用

  • 実装のポイント
    BluetoothListener を使用し、別スレッドで常時接続を監視します。

// BluetoothListenerの初期化と開始
_listener = new BluetoothListener(BluetoothService.SerialPort);
_listener.Start();

while(!token.IsCancellationRequested)
{
    // タブレットからの接続を待機
    using(BluetoothClient client = _listener.AcceptBluetoothClient())
    using(StreamReader reader = new StreamReader(client.GetStream(), Encoding.UTF8))
    {
        // JSONデータを受信(送信側が末尾に改行を入れて送る前提)
        string line = reader.ReadLine(); 
        if(line != null) DataReceived?.Invoke(line); 
    }
}

2. ViewModel でのデータ処理とDB登録

受信したJSON文字列を、アプリケーションが扱えるオブジェクト(DTO)に復元し、隔離ネットワーク内のDBへ仲介します。

UIスレッドへの橋渡し
Bluetoothの受信はバックグラウンドスレッドで行われるため、WPFのUIやコレクションを更新するには Dispatcher を介す必要があります。

private void OnDataReceived(string json)
{
    Application.Current.Dispatcher.Invoke(async () =>
    {
        try {
            // Android等から送られてきたJSONをデシリアライズ
            var records = JsonSerializer.Deserialize<List<InspectionRecordDto>>(json);
            if (records == null) return;

            foreach (var record in records)
            {
                // ここでローカルネットワーク上のリポジトリを通じてDBへ登録
                _repository.RegisterInspectionRecord(record, 1);
                
                // 画面上の受信履歴に表示
                ReceivedRecords.Insert(0, record);
            }
            StatusMessage = $"{DateTime.Now:HH:mm:ss} : {records.Count}件のデータを保存しました。";
        }
        catch (Exception ex) {
            StatusMessage = $"データ処理エラー: {ex.Message}";
        }
    });
}

3. 実装上の注意点と現場での Tips

① デバイスのペアリング
このシステムは、Windows OS側で既にペアリング済みのデバイスからの接続を待ち受けます。現場でのセットアップ時には、まずPCとタブレットのペアリングを済ませておく必要があります。

② BluetoothとUSBのハイブリッド運用
今回のコードでは、Bluetoothが不安定な場合のバックアップとして、USB(ADB経由)での通信も選択できるように設計しています。現場の環境変化に柔軟に対応するための「二段構え」の設計が、システムの信頼性を高めます。

③ 送信側の改行コード
StreamReader.ReadLine() は改行文字 (\n) を受信するまで処理を待機します。送信側のデバイス(Android/iOSアプリ等)では、JSONの末尾に必ず改行コードを付与して送信してください。

まとめ

ネットワークが隔離された現場でも、Bluetoothという「枯れた技術」を適切に使うことで、モダンなMVVMアプリケーションとDBを繋ぐ架け橋を作ることができました。

Wi-Fiが使えないからと諦めるのではなく、デバイスが持つ近距離通信機能を最大限活用することが、現場のDXを支える鍵となります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?