我正在尝试创建一个侦听蓝牙串行端口连接的 UWP 应用程序。当我在应用程序中设置侦听器(通过按钮单击)时,我在以下行出现异常:
await socketListener.BindServiceNameAsync(
rfcommProvider.ServiceId.ToString(),
SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);`
异常消息为:System.ArgumentException:">参数不正确。 'protectionLevel':IP StreamSocketListeners只允许使用普通套接字。
这是代码:
private async void btnBluetoothServerClick(object sender, RoutedEventArgs e)
{
var rfcommProvider =
await RfcommServiceProvider.CreateAsync(RfcommServiceId.SerialPort);
var socketListener = new StreamSocketListener();
socketListener.ConnectionReceived += OnConnectionReceived;
await socketListener.BindServiceNameAsync(
rfcommProvider.ServiceId.ToString(),
SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
rfcommProvider.StartAdvertising(socketListener);
}
当protectionLevel
参数SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication
更改为异常指示SocketProtectionLevel.PlainSocket
时,新的异常消息为:System.Exception:">找不到指定的类。(HRESULT的例外:0x8007277D)'。
应用程序清单文件包括:
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="bluetooth" />
<DeviceCapability Name="proximity" />
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
<DeviceCapability Name="bluetooth.rfcomm">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
<DeviceCapability Name="wifiControl" />
</Capabilities>
似乎此代码应该根据以下文档工作: https://learn.microsoft.com/en-us/uwp/api/windows.networking.sockets.streamsocketlistener#Windows_Networking_Sockets_StreamSocketListener_BindServiceNameAsync_System_String_Windows_Networking_Sockets_SocketProtectionLevel_Windows_Networking_Connectivity_NetworkAdapter_
我做错了什么?
只需更改BindServiceNameAsync
方法的参数,
rfcommProvider.ServiceId.ToString()
自
rfcommProvider.ServiceId.AsString()
然后你的代码片段就可以工作了。
RfcommServiceId
的AsString()
方法会将RfcommServiceId
转换为字符串。ToString
将返回不是BindServiceNameAsync
正确参数的类型。
更多详情请参考官方样本。