我正在Windows 8.1和Windows Phone 8.1平台上实现一个通用应用程序,它应该通过蓝牙技术连接scale等设备或血压监测器。不幸的是,我在发现过程中遇到困难,根据我没有机会配对并连接到设备。
我找到了关于此问题的thread,但不幸的是它与Android有关。
从上面的帖子:
描述医疗设备:设备正在使用服务发现 协议(SDP)和串行端口配置文件(SPP)。它开始调查 用于发现(最多10个)周围接入点的过程 匹配的COD过滤器和服务名称。然后它顺序建立 通过检查连接(使用页面过程)与访问点 密码。匹配PIN后,将上载数据。上传后 设备等待确认的数据。决定是主人和 发起沟通。
我也是从Microsoft Bluetooth Rfcomm Sample开始的。
我的问题:
我对我的标准 UUID 编号00001101-0000-1000-8000-00805F9B34FB很不满意。在这种情况下是否合适?
// The Id of the Service Name SDP attribute
protected const UInt16 SdpServiceNameAttributeId = 0x100;
// The SDP Type of the Service Name SDP attribute.
// The first byte in the SDP Attribute encodes the SDP Attribute Type as follows :
// - the Attribute Type size in the least significant 3 bits,
// - the SDP Attribute Type value in the most significant 5 bits.
protected const byte SdpServiceNameAttributeType = (4 << 3) | 5;
public async Task Start()
{
try
{
if (rfcommProvider == null)
rfcommProvider = await RfcommServiceProvider.CreateAsync(
RfcommServiceId.FromUuid(BluetoothServiceUuid));
if (rfcommProvider != null)
{
if (socketListener != null)
{
socketListener.Dispose();
socketListener = null;
}
// Create a listener for this service and start listening
socketListener = new StreamSocketListener();
socketListener.ConnectionReceived += OnConnectionReceived;
await socketListener.BindServiceNameAsync(rfcommProvider.ServiceId.AsString(),
SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
// Set the SDP attributes and start Bluetooth advertising
DataWriter sdpWriter = new DataWriter();
// Write the Service Name Attribute.
sdpWriter.WriteByte(SdpServiceNameAttributeType);
// The length of the UTF-8 encoded Service Name SDP Attribute.
sdpWriter.WriteByte((byte)BluetoothServiceDisplayName.Length);
// The UTF-8 encoded Service Name value.
sdpWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
sdpWriter.WriteString(BluetoothServiceDisplayName);
// Set the SDP Attribute on the RFCOMM Service Provider.
if (rfcommProvider.SdpRawAttributes.ContainsKey(SdpServiceNameAttributeId))
rfcommProvider.SdpRawAttributes.Remove(SdpServiceNameAttributeId);
rfcommProvider.SdpRawAttributes.Add(SdpServiceNameAttributeId, sdpWriter.DetachBuffer());
// Start Bluetooth advertising
//SetState(BluetoothServerState.Started);
rfcommProvider.StartAdvertising(socketListener);
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine( "ERROR: " + e.Message);
}
}
我不确定是否有更好的方法来设置服务名称?也许我做错了?我认为这是一个主要问题。
COD过滤器怎么样?(在规范中有一个注释,它应该等于[00000000]以进行正确的通信?有没有任何方法可以使用RfcommServiceProvider设置它?也许我也应该手动设置PIN码或仅在配对过程中是否需要?
我注意到,在微软样本中 - 服务器仅支持Windows平台。 是否也可以为WP实现服务器功能? - 将从医疗设备接收数据的设备应该是从属设备。
我也读过有关Gatt协议的内容,但它没有为我需要的所有设备提供配置文件。
提前感谢您的帮助。
答案 0 :(得分:1)
解决我的问题的关键是在应用清单文件中声明串口连接,而不是通过指定的UUID号声明连接:
<Capabilities>
<DeviceCapability Name="proximity" />
<m2:DeviceCapability Name="bluetooth.rfcomm">
<m2:Device Id="any">
<m2:Function Type="name:serialPort" />
</m2:Device>
</m2:DeviceCapability>
</Capabilities>
并使用 RfcommServiceId.SerialPort 作为RfcommServiceProvider的参数。
答案 1 :(得分:0)
我在一艘非常相似的船上;我尝试使用WinJS / HTML连接到医疗设备用于RT设备,我发现这篇文章非常好:
看起来您正在使用c#,但您可以从文章中的javascript中获得想法。创建一个查找串行类型设备的选择器,然后查询所有这些设备的列表。这里有一些来自文章的javascript来说明这个想法
var selector = Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService.getDeviceSelector(Windows.Devices.Bluetooth.Rfcomm.RfcommServiceId.serialPort);
var devices = Windows.Devices.Enumeration.DeviceInformation.findAllAsync(selector,null);
var device = devices [0];
返回Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService.fromIdAsync(device.id);
我仍然在解析从设备获得的字节,但是使用上面的代码,WinRT要求连接到设备,我的设备开始流式传输数据,这是最大的障碍。祝你好运!