Partilhar via


Cenário RFCOMM: receber arquivo como um servidor (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Outro cenário de aplicativo comum RFCOMM é hospedar um serviço no computador e expô-lo para outros dispositivos. Nesse cenário, o desenvolvedor de aplicativo primeiro cria um RfcommServiceProvider para anunciar o serviço desejado. O desenvolvedor então define o atributo SDP conforme necessário (usando established data helpers para gerar os dados do atributo) e inicia o anúncio dos registros SDP para outros dispositivos recuperarem. Para conectar a um dispositivo cliente, o desenvolvedor do aplicativo cria um ouvinte de soquete para começar a escutar as solicitações de conexão de entrada. Quando uma conexão é recebida, o desenvolvedor pode armazenar o soquete conectado para processamento posterior. Quando for o momento de receber o arquivo, o desenvolvedor do aplicativo pode seguir os padrões de fluxo de dados estabelecidos para ler parte dos dados do InputStream do soquete e enviá-lo para um arquivo.

var _provider;   // Windows.Devices.Bluetooth.RfcommServiceProvider

function Initialize()
{
    // Initialize the provider for the hosted RFCOMM service
    Windows.Devices.Bluetooth.RfcommServiceProvider.createAsync(
        RfcommServiceId.obexObjectPush)
    .done(function(provider) {
        _provider = provider;

        // Create a listener for this service and start listening
        var listener = new StreamSocketListener();
        listener.addEventListener(
            “connectionreceived”, OnConnectionReceived);
        return listener.bindServiceNameAsync(
            _provider.serviceId.asString(),
            SocketProtectionLevel
                .bluetoothEncryptionAllowNullAuthentication);
    }).done(function() {
        // Set the SDP attributes and start advertising
        InitializeServiceSdpAttributes(_provider);
        _provider.startAdvertising();
    )};
}

var SERVICE_VERSION_ATTRIBUTE_ID = 0x0300;
var SERVICE_VERSION_ATTRIBUTE_TYPE = 0x0A;   // UINT32
var SERVICE_VERSION = 200;
function InitializeServiceSdpAttributes(RfcommServiceProvider provider)
{
    var writer = new Windows.Storage.Streams.DataWriter();

    // First write the attribute type
    writer.writeByte(SERVICE_VERSION_ATTRIBUTE_TYPE)
    // Then write the data
    writer.writeUint32(SERVICE_VERSION);
    
    var data = writer.detachBuffer();
    provider.sdpRawAttributes.add(SERVICE_VERSION_ATTRIBUTE_ID, data);
}

void OnConnectionReceived(listener, args)
{
    // Stop advertising/listening so that we’re only serving one client
    _provider.stopAdvertising();
    listener.close()
    .done(function() {
        _socket = args.socket;

        // The client socket is connected. At this point the App can wait for
        // the user to take some action, e.g. click a button to receive a
        // file from the device, which could invoke the Picker and then save
        // the received file to the picked location. The transfer itself
        // would use the Sockets API and not the Rfcomm API, and so is
        // omitted here for brevity.
    });
}