Не удалось установить запись SDP для поставщика услуг Rfcomm (InTheHand, uwp)

Я хочу создать двустороннее соединение Bluetooth Rfcomm. Серверная часть реализована в UWP. Используя InTheHand.Devices.Bluetooth (NuGet v4.0.1803.22-preview), я не могу прикрепить запись SDP к поставщику услуг. Это приводит к ошибке при попытке рекламировать услугу.

Я полагаю, что поставщик услуг «InTheHand» можно было бы отнести к разновидности Windows.Devices.Bluetooth.Rfcomm, но я бы предпочел решение в библиотеке InTheHand, если это возможно. Я что-то упускаю?

private async void InitializeService(){
    var localRfcommServiceID = RfcommServiceId.FromUuid(uuid);
    var localRfcommService = await RfcommServiceProvider.CreateAsync(localRfcommServiceID);

//This is where I would expect to add SDP records to the service provider

    localRfcommService.StartAdvertising();
    localRfcommService.ConnectionReceived += LocalRfcommService_ConnectionReceived;
}

Я получаю исключение, когда пытаюсь запустить рекламу. (Извините за сообщения об ошибках на немецком языке)

Exception thrown: 'System.IO.FileNotFoundException' in InTheHand.Devices.Bluetooth.dll
WinRT information: Der StreamSocketListener muss gebunden werden, bevor Sie mit der Ankündigung beginnen können.
Exception thrown: 'System.IO.FileNotFoundException' in System.Private.CoreLib.ni.dll
WinRT information: Der StreamSocketListener muss gebunden werden, bevor Sie mit der Ankündigung beginnen können.

В переводе: StreamSocketListener необходимо привязать, прежде чем начнется реклама.


person ChrisM    schedule 15.08.2019    source источник
comment
Привет! Вы добавили StreamSocketListener, как указано в сообщении об ошибке?   -  person Richard Zhang - MSFT    schedule 16.08.2019
comment
До сих пор я приводил поставщика к разновидности Windows и привязывал его к StreamSocketLiestener, поскольку не нашел очевидного способа привязать его к библиотеке InTheHand. Кажется, работает; все еще пытаюсь обнаружить это на стороне клиента.   -  person ChrisM    schedule 19.08.2019


Ответы (1)


В итоге я привел RfcommServiceProvider «InTheHand» к «Windows.Devices.Bluetooth.Rfcomm.RfcommServiceProvider», затем привязал к нему имя службы и инициализировал атрибуты SDP.

async void InitializeService()
{
    var localRfcommProvider = await RfcommServiceProvider.CreateAsync(Constants.RfcommServiceUuid);
    var rfcommServiceID = RfcommServiceId.FromUuid(Constants.RfcommServiceUuid);
    socketListener = new StreamSocketListener();
    socketListener.ConnectionReceived += SocketListener_ConnectionReceived;      
    await socketListener.BindServiceNameAsync(rfcommServiceID.AsString(),SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);
    InitializeServiceSdpAttributes(localRfcommProvider);

    try
    {
        ((Windows.Devices.Bluetooth.Rfcomm.RfcommServiceProvider)localRfcommProvider).StartAdvertising(socketListener);  
    }
    catch (Exception e)
    {
            Debug.WriteLine(e.Message);
    }
}


void InitializeServiceSdpAttributes(Windows.Devices.Bluetooth.Rfcomm.RfcommServiceProvider provider)
    {
        var sdpWriter = new DataWriter();

        //Write the service name attribute
        sdpWriter.WriteByte(Constants.SdpServiceNameAttributeType);

        // The length of the UTF-8 encoded Service Name SDP Attribute.
        sdpWriter.WriteByte((byte)Constants.SdpServiceName.Length);

        // The UTF-8 encoded Service Name value.
        sdpWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
        sdpWriter.WriteString(Constants.SdpServiceName);

        // Set the SDP Attribute on the RFCOMM Service Provider.
        provider.SdpRawAttributes.Add(Constants.SdpServiceNameAttributeId, sdpWriter.DetachBuffer());
    }

Пример инициализации атрибутов SDP можно найти в примеры Microsoft UWP.

person ChrisM    schedule 26.08.2019