Share via


Escenario de RFCOMM: Recibir un archivo como servidor (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

Otro escenario de aplicación RFCOMM común es hospedar un servicio en el equipo y exponerlo para otros dispositivos. En este escenario, el desarrollador de la aplicación primero crea un RfcommServiceProvider para publicitar el servicio deseado. Posteriormente el desarrollador establece los atributos de SDP según sea necesario (con established data helpers para generar los datos del atributo) y empieza a publicitar los registros de SDP para que otros dispositivos los recuperen. Para conectarse a un dispositivo cliente, el desarrollador de aplicaciones crea una escucha de socket para empezar a escuchar las solicitudes de conexiones entrantes. Cuando se recibe una conexión, el desarrollador puede almacenar el socket conectado para un procesamiento posterior. A la hora de recibir el archivo, el desarrollador de la aplicación puede seguir unos patrones de flujo de datos establecidos para leer fragmentos de datos de InputStream del socket y guardarlos en un archivo.

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.
    });
}