Bluetooth-соединение между универсальным приложением и медицинским устройством - UUID и CODFilter

Я реализую универсальное приложение на платформах Windows 8.1 и Windows Phone 8.1, которое должно подключаться к таким устройствам, как шкала или тонометр по технологии Bluetooth. К сожалению, у меня проблемы с процессом обнаружения, и, соответственно, у меня нет возможности выполнить сопряжение и подключиться к устройству.

Я нашел поток об этой проблеме, но, к сожалению, она связана с Android.

Из сообщения выше:

Описание медицинского устройства: устройство использует протокол обнаружения служб (SDP) и профиль последовательного порта (SPP). Он запускает процедуру запроса для обнаружения (до 10) окружающих точек доступа с совпадающими фильтром наложенного платежа и именем службы. Затем он последовательно устанавливает соединение (с помощью процедуры страницы) с точкой доступа, проверяя PIN-код. После сопоставления PIN-кода данные загружаются. После загрузки данных устройство ожидает подтверждения. Решение является хозяином и инициирует общение.

Я также начал с образца Microsoft Bluetooth Rfcomm.

Мои вопросы:

  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. Я заметил, что в примерах от Microsoft - Server поддерживается только для платформы Windows. Можно также реализовать серверную функциональность для WP? - устройство, которое будет получать данные от медицинского устройства, должно быть подчиненным.

Я также читал о протоколе Gatt, но он не предоставляет профили для всех устройств, которые мне нужны.

Заранее спасибо за помощь.


person damian131    schedule 10.07.2014    source источник


Ответы (2)


Ключом к решению моей проблемы было объявление соединения через последовательный порт в файле манифеста приложения вместо объявления соединения по указанному номеру 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.

person damian131    schedule 21.08.2014

Я нахожусь в очень похожей лодке; Я пытаюсь подключиться к медицинскому устройству с помощью 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 (селектор, ноль);

var device = devices [0];

вернуть Windows.Devices.Bluetooth.Rfcomm.RfcommDeviceService.fromIdAsync (device.id);

Я все еще работаю над синтаксическим анализом байтов, которые я получаю от устройства, но, используя приведенный выше код, WinRT запрашивает подключение к устройству, и мое устройство начинает передавать данные в потоке, что было самым большим препятствием. Удачи!

person John    schedule 29.07.2014