2015-09-26 24 views
0

我正在Xamarin.Forms中構建具有藍牙功能的應用程序。在連接到設備後,我有一個ObsevableCollection收集可用的服務。然後我想選擇我正在尋找的服務。如何在C#中搜索設置ID的列表

使用Monkey.Robotics插件,並基於示例HeartRate Monitor應用程序。目前,有

this.services = new ObservableCollection<IService>(); 
listView.ItemsSource = services; 

// when device is connected 
adapter.DeviceConnected += (s, e) => { 
    device = e.Device; 

    // when services are discovered 
    device.ServicesDiscovered += (object se, EventArgs ea) => { 

     if (services.Count == 0) //if it's only just started 
      Device.BeginInvokeOnMainThread(() => { 
       foreach (var service in device.Services) { 
        services.Add(service); //add all new services found to ObservableCollection 
       } 
      }); 
    }; 

    // start looking for services 
    device.DiscoverServices(); 

}; 

所以當前代碼檢索所有服務,並將它們放入一個ObservableCollection,然後填充一個列表視圖。我不想填充列表並等待用戶輸入,而是想搜索我想要的服務的結果。即

await Task.Delay (5000); // wait 5 seconds for the scan to complete 
IService ChosenService = null; 

try { 
     foreach(var data in services) 
     { 
      if (data!=null && data.ID!=null && data.ID.ToString() == 0x180D.ToString()){ ChosenService = data; break; } 

     } 
    } 
    catch { 

      Debug.WriteLine ("Exception"); 
    } 
    Debug.WriteLineIf(ChosenService == null, "Not Chosen"); 

第三次更新:

我已經加入了嘗試,catch塊如上圖,也增加了檢查,以確保我們不與空引用工作。這一切都編譯,並且應用程序不會在任何時候崩潰!但是,該過程以ChosenService = null結束?所以這段代碼不起作用。任何想法爲什麼不呢?該服務掃描似乎是工作,因爲在調試窗口中,我得到以下回饋:

2015-09-26 22:09:38.329 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12832e7e0, isPrimary = YES, UUID = Heart Rate> 
2015-09-26 22:09:38.333 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12831c950, isPrimary = YES, UUID = Device Information> 
2015-09-26 22:09:38.349 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12832e7e0, isPrimary = YES, UUID = Heart Rate> 
2015-09-26 22:09:38.350 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12831c950, isPrimary = YES, UUID = Device Information> 
2015-09-26 22:09:38.352 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12832e7e0, isPrimary = YES, UUID = Heart Rate> 
2015-09-26 22:09:38.352 Gas_SenseiOS[1431:605554] Device.Discovered Service: <CBService: 0x12831c950, isPrimary = YES, UUID = Device Information> 
+0

有什麼異常?嘗試用'try-catch'模塊包裝代碼並參閱。 – ieaglle

+0

始終報告錯誤/異常消息及其發生的位置。 –

+0

@SamiKuhmonen我在我的iPhone上調試,因爲我需要藍牙,我沒有收到任何錯誤消息。不確定它是調試器錯誤還是應用程序錯誤? –

回答

1

從臀部編號拍攝懷疑你有你的服務數據元素爲空或有一個空ID。 嘗試

if (data!=null && data.ID!=null && data.ID.ToString() == 0x180D.ToString()){ ChosenService = data; break; } 
+0

該行發出警告 - '將值類型'system.guid'與null比較的結果總是'真' - 我們需要第一次檢查嗎? –

0

使用上面所有的評論,一些研究到BLE規範和插件編寫方式,解決的辦法是:

  IService ChosenService = null; 
      try { 
       foreach(var data in services) 
       { 
        if (data!=null && data.Name == "Heart Rate"){ ChosenService = data; } 


       } 
      } 
      catch { 

       Debug.WriteLine ("Exception"); 
      }