2016-12-08 105 views
0
訪問RfcommDeviceService

這裏是我有什麼,異常而從可穿戴在UWP

  1. 藍牙穿戴式(MyoArm帶)。
  2. Windows Mobile 10週年更新。

兩者都配對正確。

現在,這裏就是我試圖做的,

  1. 我試圖枚舉通過連接到我的Windows Mobile藍牙設備暴露的所有服務的列表。
  2. 然後我想讀取輸入流,如果服務提供一個。

我去了MSDN文檔,這裏是我迄今爲止所做的。

P.S.我已經添加了藍牙訪問應用程序清單中的功能。

private async void OnReceiveClick(object sender, RoutedEventArgs e) 
    { 
     var devices = await DeviceInformation.FindAllAsync(); 
     IList<DeviceInformation> myBluetoothDevices = new List<DeviceInformation>(); 
     foreach (var device in devices) 
     { 
      if (device.Name.Contains("myo")) 
      { 
       var trace = string.Format("Name: {2} \t Paired: {3} \t Kind: {1} \t Id: {0}", device.Id, device.Kind, device.Name, device.Pairing?.IsPaired); 
       builder.AppendLine(trace); 
       myBluetoothDevices.Add(device); 
      } 
     } 

     foreach (var myBluetoothDevice in myBluetoothDevices) 
     { 
      try 
      { 
       if (myBluetoothDevice != null) 
       { 
        var service = await RfcommDeviceService.FromIdAsync(myBluetoothDevice.Id); 
        // TODO: Read input stream somehow here!!! 
        log.Text = builder.AppendLine(string.Format("Name: {0} \t Id: {1} \t Device Info Name: {2} \t Connection Host Name: {3} \t Service Id: {4}", service.Device.Name, service.Device.DeviceId, service.Device.DeviceInformation.Name, service.ConnectionHostName, service.ServiceId.Uuid)).ToString(); 
       } 
      } 
      catch (Exception ex) 
      { 
       builder.AppendLine(ex.Message); 
      } 
      finally 
      { 
       log.Text = builder.ToString(); 
      } 
     } 
    } 

當我運行的代碼,點擊「接收」按鈕,我得到一個異常而調用RfcommDeviceService.FromIdAsync方法。

例外:未找到元素。 (來自HRESULT的異常:0x80070490)

我在這裏錯過了什麼嗎?我是用藍牙設備編程的新手,所以我正確地處理了這個問題?

+1

可能是重複的http://stackoverflow.com/questions/38845320/uwp-serialdevice-fromidasync-throws-element-not-found-exception-from-hresult?rq=1 – josef

+0

你成功了嗎? –

回答

1

首先,請確保按設備名稱查詢的設備都是藍牙設備,因爲您發現所有設備不僅僅是用於查詢的藍牙設備。對於查找藍牙設備,建議使用DeviceWatcher,示例代碼請參考this file中的StartUnpairedDeviceWatcher()方法。

其次,我不確定爲什麼RfcommDeviceService.FromIdAsync(myBluetoothDevice.Id);無法獲得RfcommDeviceService實例,但官方示例未使用此方法獲取服務。它首先獲得了BluetoothDeivce,然後從設備獲得了GetRfcommServices

var bluetoothDevice = await BluetoothDevice.FromIdAsync(myBluetoothDevice.Id); 
var rfcommServices = await bluetoothDevice.GetRfcommServicesForIdAsync(RfcommServiceId.FromUuid(Constants.RfcommChatServiceUuid)); 
if (rfcommServices.Services.Count > 0) 
{ 
    service = rfcommServices.Services[0]; 
} 

RfcommServiceId是相同創建RfcommServiceProvider。詳情請參考我測試過的official sample可以運行併成功找到RfcommDeviceService實例。

+0

我有點跟着你的方法。我現在使用DeviceWatcher,然後我正在查找設備。我能夠找到設備,當我查詢服務時,它返回null。 我試圖通過將我的電腦配對到Pebble Watch。我的目標是爲windows手機編寫一個鵝卵石伴侶應用程序,任何武術幫助我將不勝感激! – sudarsanyes

+0

@sudarsanyes,請嘗試測試官方示例。該示例顯示服務提供商需要監聽客戶端。我不熟悉你的卵石手錶,是否聽客戶?你有沒有得到正確的'RfcommServiceId'?對於這些,我無法幫助你。也請嘗試使用[this](https://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.bluetooth.bluetoothdevice.getrfcommservicesasync)獲取所有服務的方法,以查看是否可以獲取。 –