Я реализую универсальное приложение на платформах Windows 8.1 и Windows Phone 8.1, которое должно подключаться к таким устройствам, как шкала или тонометр по технологии Bluetooth. К сожалению, у меня проблемы с процессом обнаружения, и, соответственно, у меня нет возможности выполнить сопряжение и подключиться к устройству.
Я нашел поток об этой проблеме, но, к сожалению, она связана с Android.
Из сообщения выше:
Описание медицинского устройства: устройство использует протокол обнаружения служб (SDP) и профиль последовательного порта (SPP). Он запускает процедуру запроса для обнаружения (до 10) окружающих точек доступа с совпадающими фильтром наложенного платежа и именем службы. Затем он последовательно устанавливает соединение (с помощью процедуры страницы) с точкой доступа, проверяя PIN-код. После сопоставления PIN-кода данные загружаются. После загрузки данных устройство ожидает подтверждения. Решение является хозяином и инициирует общение.
Я также начал с образца Microsoft Bluetooth Rfcomm.
Мои вопросы:
Меня беспокоит мой стандартный номер 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 или если это требуется только в процессе сопряжения?
Я заметил, что в примерах от Microsoft - Server поддерживается только для платформы Windows. Можно также реализовать серверную функциональность для WP? - устройство, которое будет получать данные от медицинского устройства, должно быть подчиненным.
Я также читал о протоколе Gatt, но он не предоставляет профили для всех устройств, которые мне нужны.
Заранее спасибо за помощь.