Cenário RFCOMM: enviar arquivo como um cliente (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]
O cenário de Aplicativo básico é conectar a um dispositivo emparelhado com base em um serviço desejado. Nesse cenário, o desenvolvedor pode usar as funções RfcommDeviceService.GetDeviceSelector* para ajudar a gerar uma consulta AQS que pode ser usada para enumerar instâncias de dispositivo emparelhado do serviço desejado. De lá, o desenvolvedor do aplicativo seleciona um dispositivo enumerado, cria um RfcommDeviceService, e lê os atributos SDP conforme necessário (usando established data helpers para analisar os dados do atributo). O desenvolvedor do aplicativo, em seguida, pode criar um soquete e usar as propriedades ConnectionHostName e ConnectionServiceName do RfcommDeviceService para ConnectAsync para o serviço do dispositivo remoto com os parâmetros apropriados. Quando for o momento de enviar um arquivo, o desenvolvedor do aplicativo pode seguir os padrões de fluxo de dados estabelecidos para ler parte dos dados do arquivo e enviá-lo no OutputStream do soquete para o dispositivo.
var _service; // Windows.Devices.Bluetooth.RfcommDeviceService
var _socket; // Windows.Networking.Sockets.StreamSocket
function Initialize() {
// Enumerate devices with the object push service
Windows.Devices.Enumeration.DeviceInformation.findAllAsync(
RfcommDeviceService.getDeviceSelector(
RfcommServiceId.obexObjectPush))
.done(function(services) {
if (services.length > 0) {
// Initialize the target Bluetooth BR device
RfcommDeviceService.fromIdAsync(services[0].id)
.done(function(service) {
// Check that the service meets this App’s minimum
// requirement
if (SupportsProtection(service)
&& IsCompatibleVersion(service))
{
_service = service;
// Create a socket and connect to the target
_socket = new StreamSocket();
_socket.connectAsync(
_service.connectionHostName,
_service.connectionServiceName,
SocketProtectionLevel
.bluetoothEncryptionAllowNullAuthentication)
.done(function () {
// The socket is connected. At this point the App can
// wait for the user to take some action, e.g. click
// a button to send a file to the device, which could
// invoke the Picker and then send the picked file.
// The transfer itself would use the Sockets API and
// not the Rfcomm API, and so is omitted here for
// brevity.
});
}
});
}
});
}
// This App requires a connection that is encrypted but does not care about
// whether its authenticated.
function SupportsProtection(service)
{
switch (service.protectionLevel)
{
case SocketProtectionLevel.plainSocket:
if ((service.maximumProtectionLevel == SocketProtectionLevel
.bluetoothEncryptionWithAuthentication)
|| (service.maximumProtectionLevel == SocketProtectionLevel
.bluetoothEncryptionAllowNullAuthentication)
{
// The connection can be upgraded when opening the socket so the
// App may offer UI here to notify the user that Windows may
// prompt for a PIN exchange.
return true;
}
else
{
// The connection cannot be upgraded so an App may offer UI here
// to explain why a connection won’t be made.
return false;
}
case SocketProtectionLevel.bluetoothEncryptionWithAuthentication:
return true;
case SocketProtectionLevel.bluetoothEncryptionAllowNullAuthentication:
return true;
}
return false;
}
// This App relies on CRC32 checking available in version 2.0 of the service.
var SERVICE_VERSION_ATTRIBUTE_ID = 0x0300;
var byte SERVICE_VERSION_ATTRIBUTE_TYPE = 0x0A; // UINT32
var MINIMUM_SERVICE_VERSION = 200;
function IsCompatibleVersion(service)
{
service.getSdpRawAttributesAsync(BluetoothCacheMode.Uncached)
.done(function(attributes) {
var attribute = attributes[SERVICE_VERSION_ATTRIBUTE_ID];
var reader = DataReader.fromBuffer(attribute);
// The first byte contains the attribute's type
var attributeType = reader.readByte();
if (attributeType == SERVICE_VERSION_ATTRIBUTE_TYPE)
{
// The remainder is the data
var version = reader.uint32();
return version >= MINIMUM_SERVICE_VERSION;
}
});
}