通用应用程序和医疗设备之间的蓝牙连接 - UUID和CODFilter

时间:2014-07-10 10:22:49

标签: bluetooth windows-8.1 windows-phone-8.1 win-universal-app spp

我正在Windows 8.1和Windows Phone 8.1平台上实现一个通用应用程序,它应该通过蓝牙技术连接scale等设备或血压监测器。不幸的是,我在发现过程中遇到困难,根据我没有机会配对并连接到设备。

我找到了关于此问题的thread,但不幸的是它与Android有关。

从上面的帖子:

  

描述医疗设备:设备正在使用服务发现   协议(SDP)和串行端口配置文件(SPP)。它开始调查   用于发现(最多10个)周围接入点的过程   匹配的COD过滤器和服务名称。然后它顺序建立   通过检查连接(使用页面过程)与访问点   密码。匹配PIN后,将上载数据。上传后   设备等待确认的数据。决定是主人和   发起沟通。

我也是从Microsoft Bluetooth Rfcomm Sample开始的。

我的问题:

  1. 我对我的标准 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);
        }
    }
    
  2. 我不确定是否有更好的方法来设置服务名称?也许我做错了?我认为这是一个主要问题。

  3. COD过滤器怎么样?(在规范中有一个注释,它应该等于[00000000]以进行正确的通信?有没有任何方法可以使用RfcommServiceProvider设置它?也许我也应该手动设置PIN码或仅在配对过程中是否需要?

  4. 我注意到,在微软样本中 - 服务器仅支持Windows平台。 是否也可以为WP实现服务器功能? - 将从医疗设备接收数据的设备应该是从属设备。

  5. 我也读过有关Gatt协议的内容,但它没有为我需要的所有设备提供配置文件。

    提前感谢您的帮助。

2 个答案:

答案 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设备,我发现这篇文章非常好:

http://blogs.windows.com/windows/b/buildingapps/archive/2014/05/07/talking-to-robots-or-other-devices-using-bluetooth-from-a-windows-runtime-app.aspx

看起来您正在使用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要求连接到设备,我的设备开始流式传输数据,这是最大的障碍。祝你好运!