我正在使用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
显然这个插件很容易使用,所以我必须遗漏一些明显的东西?
答案 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项目中,所以我不确定是否必须在每个平台中放置此代码。无论如何这里是解决这个问题的其他人的解决方案。