わかりました、私が想定したことは基本的に間違っていました。以下は、非常に単純な (エラー処理なし、タスクなしなど) 通信用の最小限のコードです。
これは 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();
バイトはそのまま転送されます。追加のプロトコルなどは必要ありません。楽しみ。