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