2016-03-07 189 views
0

我非常喜欢蓝牙LE,并且在阅读和写入设备时遇到一些困难。Xamarin蓝牙LE

我一直在关注Monkey.Robotics项目来指导我。现在我已经达到了保存我需要的特性和相应的描述符(用于读写)的部分。我试着实现写这个函数,但是我没有成功。

我一直在尝试使用这种方法来进行写入:

connectedPeripheral.WriteValue(NSData.FromString (sendText.Text), write_desc); 

我也打印出来的我已经保存的所有特性的UUID和核实它们是否正确使用我的Mac的LightBlue应用。

我只是好奇,如果我需要做任何其他的准备工作,以便能够执行此写?

我已将我的代码附加到本帖子的底部。

感谢,

奥斯汀

CODE:

partial class ThirdViewController : UIViewController 
{ 
     CBService serviceNeeded; 
    private string serv_to_find = "6e400001-b5a3-f393-e0a9-e50e24dcca9e"; 
    private string read_to_find = "6e400003-b5a3-f393-e0a9-e50e24dcca9e"; 
    private string write_to_find = "6e400002-b5a3-f393-e0a9-e50e24dcca9e"; 
    CBPeripheral connectedPeripheral; 
    CBCharacteristic write; 
    CBCharacteristic read; 
    CBDescriptor write_desc; 

    private string value = ""; 
    List<CBPeripheral> ps = new List<CBPeripheral>(); 

    public ThirdViewController (IntPtr handle) : base (handle) 
    { 
    } 

    public ThirdViewController() 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     MyPickerModel model = new MyPickerModel(); 

     // Tie model to selected event 
     model.comSelected += (object sender, EventArgs e) => 
     { 
      value = model.selectedCom; 
     }; 

     // wire up the DiscoveredPeripheral event to update the table 
     BluetoothLEManager.Current.DeviceDiscovered += (object sender, CBDiscoveredPeripheralEventArgs e) => { 
      ps = BluetoothLEManager.Current.DiscoveredDevices; 

      textBox.Text += "\nFound device: "; 
      foreach (var temp in ps) 
      { 
       model.Add(temp.Name); 
       if (value == ""){ 
        value = temp.Name; 
       } 
       textBox.Text += temp.Name + "\n"; 
      } 

      Blue_Picker.Model = model; 
     }; 

     BluetoothLEManager.Current.ScanTimeoutElapsed += (sender, e) => { 
      textBox.Text += "\nScan Timeout."; 
      BluetoothLEManager.Current.StopScanningForDevices(); 
     }; 
    } 

    partial void Logout_Button_TouchUpInside (UIButton sender) 
    { 
     // Create an instance of our AppDelegate 
     var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate; 

     // Get an instance of our MainStoryboard.storyboard 
     var mainStoryboard = appDelegate.MainStoryboard; 

     // Get an instance of our Login Page View Controller 
     var loginPageViewController = appDelegate.GetViewController(mainStoryboard, "LoginPageViewController") as LoginPageViewController; 

     // Wire our event handler to show the MainTabBarController after we successfully logged in. 
     loginPageViewController.OnLoginSuccess += (s, e) => 
     { 
      var tabBarController = appDelegate.GetViewController(mainStoryboard, "MainTabBarController"); 
      appDelegate.SetRootViewController(tabBarController, true); 
     }; 

     // Set the Login Page as our RootViewController 
     appDelegate.SetRootViewController(loginPageViewController, true); 
    } 

    partial void ScanButton_TouchUpInside (UIButton sender) 
    { 
     if (BluetoothLEManager.Current.IsScanning) 
     { 
      BluetoothLEManager.Current.StopScanningForDevices(); 
      textBox.Text += "\nDone Scanning"; 
     } 
     else 
     { 
      BluetoothLEManager.Current.BeginScanningForDevices(); 
      textBox.Text += "\nNow Scanning"; 
     } 
    } 

    partial void DisconnectButton_TouchUpInside (UIButton sender) 
    { 
     if (connectedPeripheral == null) { 
      textBox.Text += "\nNo device connected."; 
      return; 
     } 

     textBox.Text += "\nDisconnecting from device " + connectedPeripheral.Name + "..."; 

     BluetoothLEManager.Current.DisconnectPeripheral (connectedPeripheral); 
     connectedPeripheral = null; 

     Blue_Picker.Hidden = false; 
    } 

    async partial void ConnectButton_TouchUpInside (UIButton sender) 
    { 
     if (connectedPeripheral != null) { 
      textBox.Text += "\nDevice already connected."; 
      return; 
     } 

     StopScanning(); 

     textBox.Text += "\nConnecting to device " + value + "..."; 

     foreach (var temp in ps){ 
      if (temp.Name == value){ 
       BluetoothLEManager.Current.CentralBleManager.ConnectPeripheral (temp, new PeripheralConnectionOptions()); 
       await Task.Delay(5000); 
       connectedPeripheral = temp; 
       InitializePeripheral(); 
       break; 
      } 
     } 

     Blue_Picker.Hidden = true; 
    } 

    void StopScanning() 
    { 
     Task.Factory.StartNew (() => { 
      if (!BluetoothLEManager.Current.IsScanning) 
       return; 

      BluetoothLEManager.Current.StopScanningForDevices(); 
     }); 
    } 

    void InitializePeripheral() 
    { 
     // update all our shit 

     // > peripheral 
     // > service[s] 
     //  > characteristic 
     //   > value 
     //   > descriptor[s] 

     connectedPeripheral.DiscoveredService += HandleDiscoveredService; 
     connectedPeripheral.DiscoveredCharacteristic += (sender, e) => { 
      HandleDiscoveredCharacteristic((CBPeripheral)sender, serviceNeeded); 
     }; 
     connectedPeripheral.DiscoveredDescriptor += HandleDiscoveredDescriptor; 

     connectedPeripheral.DiscoverServices(); 
     textBox.Text += "\nLooking for services"; 
    } 

    void HandleDiscoveredService (object sender, NSErrorEventArgs e) 
    { 
     var peripheral = (CBPeripheral)sender; 

     //foreach (CBService service in peripheral.Services) { 
     // textBox.Text += "\nDiscovered Service: " + service.UUID.ToString(); 
     // if (!services.Contains (service)) 
     //  services.Add (service); 
     //} 

     foreach (CBService service in peripheral.Services) { 
      if (service.UUID.ToString().Contains(serv_to_find)) { 
       serviceNeeded = service; 
      } 
     } 

     if (serviceNeeded == null) 
      return; 

     textBox.Text += "\nDiscovered service: " + serviceNeeded.UUID.ToString(); 

     // discover the charactersistics 
     connectedPeripheral.DiscoverCharacteristics(serviceNeeded); 
    } 

    void HandleDiscoveredCharacteristic (CBPeripheral peripheral, CBService service) 
    { 
     foreach (CBService srv in peripheral.Services) { 

      // if the service has characteristics yet 
      if (srv.Characteristics == null) 
       continue; 

      foreach (var characteristic in service.Characteristics) { 
       if (characteristic.UUID.ToString().Contains (read_to_find)) { 
        read = characteristic; 
        textBox.Text += "\nDiscovered read characteristic: " + read.UUID.ToString(); 
        connectedPeripheral.DiscoverDescriptors (read); 
       } 
       else if (characteristic.UUID.ToString().Contains (write_to_find)) { 
        write = characteristic; 
        textBox.Text += "\nDiscovered write characteristic: " + write.UUID.ToString(); 
        connectedPeripheral.DiscoverDescriptors (write); 
       } 
      } 
     } 
    } 

    void HandleDiscoveredDescriptor (object sender, CBCharacteristicEventArgs e) 
    { 
     foreach (var descriptor in e.Characteristic.Descriptors) { 
      if (e.Characteristic.UUID == write.UUID) { 
       textBox.Text += "\nWrite descriptor: " + descriptor.ToString(); 
       write_desc = descriptor; 
      } 
      else if (e.Characteristic.UUID == read.UUID) { 
       textBox.Text += "\nRead descriptor: " + descriptor.ToString(); 
      } 
     } 
    } 

    partial void SendButton_TouchUpInside (UIButton sender) 
    { 
     textBox.Text += "\nNow writing: " + sendText.Text; 
     connectedPeripheral.WriteValue(NSData.FromString (sendText.Text), write_desc); 
    } 
} 

我也曾尝试:

connectedPeripheral.WriteValue(NSData.FromString (sendText.Text), write, CBCharacteristicWriteType.WithoutResponse); 

而且似乎没有任何工作。

回答

3

猴子机器人是有点过时和不完整。看看xabre/xamarin-bluetooth-le。它基本上是猴子机器人,填补了空白。更容易使用。