ACR Reactive BluetoothLE Plugin启动服务器时的状态无效

时间:2017-06-19 15:16:19

标签: xamarin xamarin.ios mvvmcross

我正在使用Xamarin和MvvmCross构建一个iOS应用程序,需要使用蓝牙LE。我正在尝试使用此插件:

https://github.com/aritchie/bluetoothle

这是我的代码:

var server = CrossBleAdapter.Current.CreateGattServer();
await server.Start(new AdvertisementData()); // throws exception

尝试启动服务器时会抛出异常:

  

{System.ArgumentException:无效状态 - 未知   Plugin.BluetoothLE.Server.GattServer.Start   (Plugin.BluetoothLE.Server.AdvertisementData adData)[0x0005f] in   < 4281c4bd57f24525b20baae1afdf610b>:0

显然这个插件很容易使用,所以我必须遗漏一些明显的东西?

2 个答案:

答案 0 :(得分:1)

该异常表示硬件处于无效或初始化状态,可在此处查看:https://github.com/aritchie/bluetoothle/blob/master/Plugin.BluetoothLE.Apple.Shared/Server/GattServer.cs#L74

if (this.manager.State != CBPeripheralManagerState.PoweredOn)
    throw new ArgumentException("Invalid State - " + this.manager.State);

我认为这是代码中的一个错误,因为它不会等待代表发出状态已发生变化的信号。

答案 1 :(得分:0)

我找到了解决方案。我没有将代码放在我的Core项目中,而是将它放在iOS项目本身的ViewDidAppear函数中,并在我的UIViewController类中放置了一个全局变量:

private IGattServer server = CrossBleAdapter.Current.CreateGattServer();

我认为您需要使用适当的线程访问适配器,或者在适当的时候(在其他初始化之后),因此之前崩溃的原因。我找不到合适的位置把它放在我的Core项目中,所以我不确定是否必须在每个平台中放置此代码。无论如何这里是解决这个问题的其他人的解决方案。