为维护人员查找 : 最近我们专门支持这个库的时间非常有限,我们会感谢任何志愿者,他们会帮助维护这个有用插件:)。 请发表评论 #274: ) 谢谢
用于 Xamarin 的蓝牙LE插件
用于访问蓝牙功能的Xamarin和MvvMCross插件。 插件是松散的基于BLE实现的猴机器人。
重要注意: with"香草",我们指的是非 mvvmcross/pure Xamarin版本。 你可以使用 ,如果你下载了vanilla软件包的话,可以使用它。
支持&限制平台版本限制Xamarin.Android4.3
Xamarin.iOS7.0
安装//stable
Install-Package Plugin.BLE
//or pre-release
Install-Package Plugin.BLE -Pre
MvvmCrossInstall-Package MvvmCross.Plugin.BLE
//or
Install-Package MvvmCross.Plugin.BLE -Pre
Android
将这些权限添加到 AndroidManifest.xml。 对于 Marshmallow 和上,请按照 Marshmallow 请求运行时权限,并不要忘记提示用户输入位置权限。
如果你想声明你的应用程序可以用于可以ble设备,只需 ,请将该行添加到你的清单中。
示例应用程序
我们提供一个示例 Xamarin.Forms 应用程序,这是一个基本的蓝牙镜头扫描程序。 有了这个应用,就有可能检查ble状态
发现设备
连接/断开
发现服务
发现特征
查看特征详细信息
读/写和 register 用于特性的通知
查看代码并使用它作为起始点,了解插件和使用它的起点。
用法varble= CrossBluetoothLE.Current;varadapter= CrossBluetoothLE.Current.Adapter;
MvvmCross
MvvmCross插件将 IBluetoothLE 和 IAdapter 注册为惰性初始化的单例。 你可以像任何其他MvvmCross服务那样解析/注入它们。 你不需要解析/插入两者。 这取决于你的情况。varble= Mvx.Resolve();varadapter= Mvx.Resolve();
或者MyViewModel(IBluetoothLE ble, IAdapter adapter)
{
this.ble = ble;
this.adapter = adapter;
}
IBluetoothLE获得蓝牙状态varstate= ble.State;
你还可以侦听状态更改。 所以如果用户在智能手机上打开/关闭蓝牙,你可以做出React。ble.StateChanged += (s, e) =>
{
Debug.WriteLine($"The bluetooth state changed to{e.NewState}");
};
IAdapter扫描设备adapter.DeviceDiscovered += (s,a) => deviceList.Add(a.Device);awaitadapter.StartScanningForDevicesAsync(); ScanTimeout
设置 adapter.ScanTimeout 以指定扫描的最长持续时间。 ScanMode
设置 adapter.ScanMode 以指定扫描模式。 必须在调用 StartScanningForDevicesAsync() 前设置为。 扫描时更改它不会影响当前扫描。连接到设备
ConnectToDeviceAsync 返回一个任务,如果设备已经成功连接,则完成该任务。 否则 DeviceConnectionException 会被丢弃。try
{
await _adapter.ConnectToDeviceAsync(device);
}catch(DeviceConnectionException e)
{
//... could not connect to device}连接到已知设备
ConnectToKnownDeviceAsync 只能通过传递GUI连接到设备。 这意味着如果设备GUID已经知,则无需扫描即可以连接到设备。 对于快速背景重新连接非常有用。 始终使用这里方法的取消令牌。即使超过了 ,它将尝试连接,即使超出范围,那么取消它的唯一方法就是使用令牌。
如果设备超出范围的话,这将在几秒钟内引发GATT错误。try
{
await _adapter.ConnectToKnownDeviceAsync(guid, cancellationToken);
}catch(DeviceConnectionException e)
{
//... could not connect to device}获取服务varservices= awaitconnectedDevice.GetServicesAsync();
或者获取特定服务:varservice= awaitconnectedDevice.GetServiceAsync(Guid.Parse("ffe0ecd2-3d16-4f8d-90de-e89e7fc396a5"));获得特性varcharacteristics= awaitservice.GetCharacteristicsAsync();
或者获得一个特定的特征:varcharacteristic= awaitservice.GetCharacteristicAsync(Guid.Parse("d8de624e-140f-4a22-8594-e2216b84a5f2"));读特性varbytes= awaitcharacteristic.ReadAsync();写特性awaitcharacteristic.WriteAsync(bytes);特性通知characteristic.ValueUpdated += (o, args) =>
{
varbytes= args.Characteristic.Value;
};awaitcharacteristic.StartUpdatesAsync();获取描述符vardescriptors= awaitcharacteristic.GetDescriptorsAsync();读取描述符varbytes= awaitdescriptor.ReadAsync();写入描述符awaitdescriptor.WriteAsync(bytes);获取系统设备
返回所有连接或者绑定( 仅 Android ) 至系统的BLE设备。 为了在应用程序中使用该设备,你必须首先调用 ConnectAsync。varsystemDevices= adapter.GetSystemConnectedOrPairedDevices();foreach(var device in systemDevices)
{
await _adapter.ConnectToDeviceAsync(device);
}
警告重要的注释/api限制 !
BLE API实现( 尤其是在的安卓 ) 具有以下限制:characterisitc/descriptor写: 确保调用特性。 ,,,,,,,,,,GattWriteError。
顺序调用: 在调用下一个ble命令之前,等待前一个ble命令完成前的等待。 Android需要调用为 seriall,否则不等待之前的调用的调用将失败,某些类型的调用将失败。 更明确的例子:如果你在视图生命周期中调用这个方法,所有这些方法返回 void void 100% not在这里等待任何等待 bleCommand(),其他生命周期方法都会被调用。
扫描服务筛选器: 在 specifically specifically specifically scan扫描服务过滤器不工作。 对于 android 4.3,你必须使用一个解决方案和扫描没有过滤器,然后手动筛选数据( 它包含已经发布的服务 guid )。
最佳实践
API在 try-catch blocks中环绕异步API调用。 大多数BLE调用都会在cetain中抛出异常,这是Android的especiialy true。 我们将尝试更新xml文档以反映这一点。try {
await _adapter.ConnectToDeviceAsync(device);
}
catch(DeviceConnectionException ex)
{
//specific }
catch(Exception ex)
{
//generic }避免在连接会话中缓存特征或者服务实例。 这样做包括在连接会话时保存对它们的引用:设备断开所有服务&特征实例的连接将成为无效的电子邮件。 Allways 使用GetServiceAsync和GetCharacteristicAsync获得有效的实例。
通用 BLE扫描:在扫描设备时避免执行诸如连接。读。写等设备操作。 扫描是电池密集。执行设备操作 (connect/read/write/etc) 之前尝试停止扫描
在找到所需设备后立即停止扫描
从不扫描循环,并设置扫描的时间限制
扩展主题
有用的链接
我们通常在一个带有里程碑的NAME 分支上做我们的开发工作。 因此,请根据当前开放开发分支的请求请求。
许可证
Apache?