2

現在、ユニバーサル アプリでシリアル ポート プロファイル (SPP) を使用するためのライブラリを構築しようとしています。

私が発見した限りでは、SPP は RFCOMM の上で動作します。RFCOMM の基本は、MSDN で概説されています。デバイスを「見つけて」「接続」することもできました。RFCOMM 用の StreamReader と StreamWriter も作成できました。

今、トラブルが発生します。RFCOMM がさまざまな機能/タスクにある種のチャネルを提供していることを理解しています。そのうちの 1 つはおそらく SPP です (デバイスの機能は SPP であり、「通常の」シリアル接続を介して実行した場合でも機能します)。

反対側で1バイトの出力を得るために、そのチャネルを介して送信する必要があるバイトの例があるかどうかを知りたいです。ある種の接続セットアップが必要ですか (双方向交換)? これらのデータ パケットの例はありますか。それらの名前は何ですか。具体的な仕様はありますか。検索するための正しい用語のいくつかでも満足できると思います。

4

1 に答える 1

3

わかりました、私が想定したことは基本的に間違っていました。以下は、非常に単純な (エラー処理なし、タスクなしなど) 通信用の最小限のコードです。

これは Package.appxmanifest に入ります。

<Capabilities>
  <m2:DeviceCapability Name="bluetooth.rfcomm">
    <m2:Device Id="any">
      <m2:Function Type="name:serialPort" />
    </m2:Device>
  </m2:DeviceCapability>
</Capabilities>

そして、これを任意の方法にします (Bluetooth デバイスがペアリングされていることを確認してください。私のデバイスの名前は「HC-06」です)。

// Find the device
var bluetoothDevicesSpp = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
var bluetoothDeviceHc06 = bluetoothDevicesSpp.SingleOrDefault(d => d.Name == "HC-06");
var serviceRfcomm = await RfcommDeviceService.FromIdAsync(bluetoothDeviceHc06.Id);
StreamSocket socket = new StreamSocket();
await socket.ConnectAsync(serviceRfcomm.ConnectionHostName, serviceRfcomm.ConnectionServiceName, SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
DataWriter writer = new DataWriter(socket.OutputStream);
DataReader reader = new DataReader(socket.InputStream);

読み取るには、これを使用します。

await reader.LoadAsync(1);
byte b = reader.ReadByte();
Debug.WriteLine((char)b);

書くには、これを使用します:

writer.WriteString("MaM\r\n");
writer.StoreAsync();

バイトはそのまま転送されます。追加のプロトコルなどは必要ありません。楽しみ。

于 2015-06-18T18:39:42.103 に答える