通用应用+蓝牙+SPP
Universal Application + Bluetooth + SPP
我目前正在尝试构建一个库,以便在通用应用程序上使用串行端口配置文件 (SPP)。
据我所知,SPP 在 RFCOMM 之上运行。 RFCOMM 的基础知识在 MSDN 中进行了概述,这很好。我还能够 "find" 我的设备并 "connect" 到它。我还能够为 RFCOMM 创建 StreamReader 和 StreamWriter。
麻烦来了。我知道 RFCOMM 为各种 features/tasks 提供了某种通道,其中之一可能是 SPP(我知道该设备具有 SPP 功能,它甚至可以通过 "normal" 串行连接完成)。
我想知道是否有一个示例,我必须通过该通道发送哪些字节才能在另一端获得单字节输出。是否需要某种连接设置(双向交换)?这些数据包是否有示例,它们的名称是什么,是否有特定的规范。我想即使搜索一些正确的术语我也会很高兴。
好吧,我的假设基本上是错误的。这是一个非常简单的(没有错误处理,没有任务,...)通信的简约代码。
这进入 Package.appxmanifest:
<Capabilities>
<m2:DeviceCapability Name="bluetooth.rfcomm">
<m2:Device Id="any">
<m2:Function Type="name:serialPort" />
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
这是您选择的方法(确保您的蓝牙设备已配对,我的设备名称为 "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();
字节将按原样传输,不需要额外的协议或类似协议。享受吧。
我目前正在尝试构建一个库,以便在通用应用程序上使用串行端口配置文件 (SPP)。
据我所知,SPP 在 RFCOMM 之上运行。 RFCOMM 的基础知识在 MSDN 中进行了概述,这很好。我还能够 "find" 我的设备并 "connect" 到它。我还能够为 RFCOMM 创建 StreamReader 和 StreamWriter。
麻烦来了。我知道 RFCOMM 为各种 features/tasks 提供了某种通道,其中之一可能是 SPP(我知道该设备具有 SPP 功能,它甚至可以通过 "normal" 串行连接完成)。
我想知道是否有一个示例,我必须通过该通道发送哪些字节才能在另一端获得单字节输出。是否需要某种连接设置(双向交换)?这些数据包是否有示例,它们的名称是什么,是否有特定的规范。我想即使搜索一些正确的术语我也会很高兴。
好吧,我的假设基本上是错误的。这是一个非常简单的(没有错误处理,没有任务,...)通信的简约代码。
这进入 Package.appxmanifest:
<Capabilities>
<m2:DeviceCapability Name="bluetooth.rfcomm">
<m2:Device Id="any">
<m2:Function Type="name:serialPort" />
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
这是您选择的方法(确保您的蓝牙设备已配对,我的设备名称为 "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();
字节将按原样传输,不需要额外的协议或类似协议。享受吧。