2017-05-19 3 views
1

Ich möchte zwei einfache Apps erstellen, die miteinander über Bluetooth RFCOMM kommunizieren.UWP Bluetooth RFCOMM FindAllAsync

Allerdings, wenn ich Client-Anwendung führen Sie es finden keine Geräte mit _devices = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.ObexObjectPush));

_devices Sammlung leer ist.

Basierend auf den Beispielen von Microsoft Docs habe ich es geschafft, etwas zu schreiben.

Anwendung Empfangen von Nachrichten (Server) - PI auf Raspberry 3.

eingesetzt
namespace RaspRFCOMM 
{ 
    public sealed partial class MainPage : Page 
    { 
     private RfcommServiceProvider _provider; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      this.Initialize(); 
     } 

     private async void Initialize() 
     { 
      msgStatus.Text = "Inicjalizacja..."; 

      // Initialize the provider for the hosted RFCOMM service 
      _provider = await RfcommServiceProvider.CreateAsync(RfcommServiceId.ObexObjectPush); 

      // Create a listener for this service and start listening 
      StreamSocketListener listener = new StreamSocketListener(); 
      listener.ConnectionReceived += OnConnectionReceived; 
      await listener.BindServiceNameAsync(
       _provider.ServiceId.AsString(), 
       SocketProtectionLevel 
        .BluetoothEncryptionAllowNullAuthentication); 

      // Set the SDP attributes and start advertising 
      InitializeServiceSdpAttributes(_provider); 
      _provider.StartAdvertising(listener, true); 
     } 

     const uint SERVICE_VERSION_ATTRIBUTE_ID = 0x0300; 
     const byte SERVICE_VERSION_ATTRIBUTE_TYPE = 0x0A; // UINT32 
     const uint SERVICE_VERSION = 200; 
     private void InitializeServiceSdpAttributes(RfcommServiceProvider provider) 
     { 
      DataWriter writer = new DataWriter(); 

      // First write the attribute type 
      writer.WriteByte(SERVICE_VERSION_ATTRIBUTE_TYPE); 
      // Then write the data 
      writer.WriteUInt32(SERVICE_VERSION); 

      IBuffer data = writer.DetachBuffer(); 
      provider.SdpRawAttributes.Add(SERVICE_VERSION_ATTRIBUTE_ID, data); 
     } 

     private async void OnConnectionReceived(
      StreamSocketListener listener, 
      StreamSocketListenerConnectionReceivedEventArgs args) 
     { 
      msgStatus.Text = "Odczytuje..."; 

      _provider.StopAdvertising(); 
      listener.Dispose(); 

      StreamSocket _socket = args.Socket; 
      StreamReader reader = new StreamReader(_socket.InputStream.AsStreamForRead()); 

      string response = await reader.ReadLineAsync(); 
      msgStatus.Text = "Odczytałem..."; 
      textboxMsg.Text = response + "To odczytalem"; 

     } 
    } 
} 

Senden von Nachrichten:

namespace WinRFCOMM 
{ 
    public sealed partial class MainPage : Page 
    { 
     private RfcommDeviceService _service; 
     private StreamSocket _socket; 
     private DeviceInformationCollection _devices; 
     private StreamWriter _writer; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      this.Initialize(); 
     } 

     private async void Initialize() 
     { 
      msgStatus.Text = "Inicjalizacja..."; 
      _devices = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.ObexObjectPush)); 

      this.PopulateDevicesListview(_devices); 
      msgStatus.Text = "Oczekiwanie na wybór..."; 
     } 

     private void PopulateDevicesListview(DeviceInformationCollection devices) 
     { 
      foreach (DeviceInformation di in devices) 
      { 
       String deviceInfo = di.Name + " - " + di.Id; 
       lvDevices.Items.Add(deviceInfo); 
      } 
     } 

     private void btnConnect_Click(object sender, RoutedEventArgs e) 
     { 
      var selected = lvDevices.SelectedIndex; 
      if (selected != -1) 
      { 
       ConnectToRFC(_devices[selected]); 
      } 
     } 

     private async void ConnectToRFC(DeviceInformation selectedDevice) 
     { 
      _service = await RfcommDeviceService.FromIdAsync(selectedDevice.Id); 

      _socket = new StreamSocket(); 

      await _socket.ConnectAsync(
       _service.ConnectionHostName, 
       _service.ConnectionServiceName, 
       SocketProtectionLevel 
        .BluetoothEncryptionAllowNullAuthentication); 

      msgStatus.Text = "Połączono..."; 

      _writer = new StreamWriter(_socket.OutputStream.AsStreamForWrite()); 
      _writer.WriteLineAsync("Test"); 
     } 
    } 
} 

Beide haben Manifest-Datei wie folgt ein:

<Capabilities> 
    <Capability Name="internetClient" /> 
    <Capability Name="internetClientServer" /> 
    <Capability Name="privateNetworkClientServer" /> 
    <DeviceCapability Name="bluetooth" /> 
    </Capabilities> 

Ich würde jede Hilfe sehr schätzen, da ich seit fast 2 Tagen feststecke.

+0

Irgendwie fing es an zu arbeiten, aber ich bin nicht sicher warum. Ich werde es wissen lassen, wenn ich das herausfinden werde. – br33f

+0

Kann es ohne Pairing funktionieren? –

Antwort

0

Das Problem liegt nicht im Code.

Sie müssen zuerst zwei Geräte verbinden, bevor Sie diese RFCOMM-Probe ausführen. Da

über die RfcommDeviceService.GetDeviceSelector * Funktionen erzeugen eine AQS Abfrage helfen, die Instanzen des gewünschten Dienstes aufgezählt gekoppeltes Gerät verwendet werden kann.

Ref: Send a file as a client

+0

Vielen Dank für Ihre Antwort, aber Pairing-Geräte löst das Problem noch nicht. Das Auflisten von Geräten mit dem RfcommServiceId.ObexObjectPush-Selektor funktioniert immer noch nicht. Es zeigt Himbeer-Gerät mit BluetoothDevice.GetDeviceSelector(), aber dann wirft es die Ausnahme "Element kann nicht gefunden werden" auf RfcommDeviceService.FromIdAsync(). – br33f

0

fand ich this Forum posten, die mich durch es.

Mein Problem war der Versuch, die DeviceInformation, die ich zum Pairing entdeckt hatte, als Verbindungspunkt für RFCOMM zu verwenden.

Für rfcomm werden Sie Ihre AppManifest benötigen aussehen:

<DeviceCapability Name="bluetooth.rfcomm"> 

    <Device Id="any"> 

    <Function Type ="name:serialPort"/> 

    </Device> 

</DeviceCapability> 

Anstatt nur den Namen "Bluetooth" mit.

Verwandte Themen