はじめに: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を支える鍵となります。