RFCOMM-Szenario: Senden einer Datei als Client (HTML)
[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]
Das einfache App-Szenario besteht darin, auf Basis eines gewünschten Dienstes eine Verbindung zu einem gekoppelten Gerät herzustellen. In diesem Szenario kann der Entwickler die bereitgestellten RfcommDeviceService.GetDeviceSelector*-Funktionen verwenden, um eine AQS-Abfrage zu erstellen, die für Instanzen aufgezählter, gekoppelter Geräte des gewünschten Dienstes verwendet werden kann. Von dort aus wählt der App-Entwickler ein aufgezähltes Gerät aus, erstellt einen RfcommDeviceService und liest nach Bedarf die SDP-Attribute (mit established data helpers zum Analysieren der Attributdaten). Der App-Entwickler kann dann ein Socket erstellen und die ConnectionHostName- und ConnectionServiceName-Eigenschaften von RfcommDeviceService für ConnectAsync bzw. für den Remotegerätedienst verwenden, und zwar mit den entsprechenden Parametern. Wenn eine Datei gesendet werden soll, kann der App-Entwickler etablierte Datenstrommuster befolgen, um Datenblöcke der Datei auszulesen und sie über OutputStream des Sockets an das Gerät zu senden.
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;
}
});
}