混合APP低功耗蓝牙项目解析数据可能用到的一些小方法---ble
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了混合APP低功耗蓝牙项目解析数据可能用到的一些小方法---ble相关的知识,希望对你有一定的参考价值。
参考技术A 可用于第三方蓝牙设备交互,必须要支持蓝牙 4.0。
ios上:硬件至少是 iphone4s,系统至少是 iOS6。
android上:系统版本至少是 android4.3。
蓝牙 4.0 以低功耗著称,一般也叫 BLE(BluetoothLowEnergy)。目前应用比较多的案例:运动手坏、嵌入式设备、智能家居
在蓝牙通讯中有两个主要的部分,Central 和 Peripheral,有一点类似Client Server。Peripheral 作为周边设备是服务器。Central 作为中心设备是客户端。所有可用的蓝牙设备可以作为周边(Peripheral)也可以作为中央(Central),但不可以同时既是周边也是中央。
一般手机是客户端, 设备(比如手环)是服务器,因为是手机去连接手环这个服务器。周边(Peripheral)是生成或者保存了数据的设备,中央(Central)是使用这些数据的设备。你可以认为周边是一个广播数据的设备,他广播到外部世界说他这儿有数据,并且也说明了能提供的服务。另一边,中央开始扫描附近有没有服务,如果中央发现了想要的服务,然后中央就会请求连接周边,一旦连接建立成功,两个设备之间就开始交换传输数据了。
除了中央和周边,我们还要考虑他俩交换的数据结构。这些数据在服务中被结构化,每个服务由不同的特征(Characteristics)组成,特征是包含一个单一逻辑值的属性类型。
上文中提到了特征(Characteristics),这里简单说明下什么是特征。
特征是与外界交互的最小单位。蓝牙4.0设备通过服务(Service)、特征(Characteristics)和描述符(Descriptor)来形容自己,同一台设备可能包含一个或多个服务,每个服务下面又包含若干个特征,每个特征下面有包含若干个描述符(Descriptor)。比如某台蓝牙4.0设备,用特征A来描述设备信息、用特征B和描述符b来收发数据等。而每个服务、特征和描述符都是用 UUID 来区分和标识的。
source ==> 字符串
count ==> 切割的位数
转换接收的ios数据
初始化蓝牙4.0管理器 => initManager
搜索蓝牙4.0设备,模块内部会不断的扫描更新附近的蓝牙4.0设备信息 => scan
注: 参数(params):single 类型:布尔 true 为单例模式,false为非单例模式;默认为false; 描述:(可选项)则扫描附近的所有支持蓝牙4.0的设备类型:parmas:布尔 true 为单例模式,false为非单例模式;默认为false; 非单例模式为仅在本页面生效连接,单例模式为在连接成功后整个app全局生效
获取当前扫描到的所有外围设备信息 => getPeripheral
连接指定外围设备。iOS端无超时判断,android端默认有30秒超时判断 => connect
根据指定的外围设备 UUID 获取该外围设备的所有服务 => discoverService
根据指定的外围设备 UUID 及其服务 UUID 获取该外围设备的所有特征(Characteristic)=> discoverCharacteristics
根据指定的外围设备 UUID 及其服务 UUID 和特征 UUID 监听数据回发 =>setNotify
根据指定的外围设备 UUID 及其服务 UUID 和特征 UUID 写数据 => writeValueForCharacteristic
剩余方法根据需求酌情使用
此次开发需求 传递字节以及ASCII码,apicloud中ble模块仅仅满足于传递字节,并且初始低功耗蓝牙仅仅满足于传递20字节以下数据,需设置MTU进行大数据传输,此次流控为蓝牙的特征FF03监听来进行数据流控, 蓝牙模块使用百瑞互联,如需定制开发模块或SDK可联系!
Windows 10 蓝牙低功耗连接 c#
【中文标题】Windows 10 蓝牙低功耗连接 c#【英文标题】:Windows 10 Bluetooth Low Energy Connection c# 【发布时间】:2015-10-01 16:49:09 【问题描述】:对于一个项目,我需要使用 C# 从 Windows 10 上的蓝牙设备获取一些数据。我对蓝牙 API 不太熟悉,无法弄清楚为什么以下内容不起作用:
使用BluetoothLEAdvertisementWatcher
搜索广告,效果很好。我确实收到了来自设备的广告(本地名称适合)以及ServiceUuids
。接下来我尝试使用与广告一起收到的BluetoothAddress
连接到设备:
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher,
BluetoothLEAdvertisementReceivedEventArgs eventArgs)
ulong blAdress = eventArgs.BluetoothAddress;
BluetoothLEDevice blDevice = await
Windows.Devices.Bluetooth.BluetoothLEDevice.FromBluetoothAddressAsync(blAdress);
但是,这样做会导致异常:
未找到元素。 (HRESULT 异常:0x80070490)。
这是从设备读取数据的正确方法吗?是否有其他选项可用于从服务中读取数据?在 Windows 中手动配对设备并不是一个真正的选择,而且似乎也失败了。
/Edit 1:我检查设备的本地名称以确保我只尝试连接到正确的设备。所以我猜想连接到这个特定设备有问题,但我仍然不知道如何解决这个问题。服务数据在iOS上读取成功,应该是可以的。
【问题讨论】:
【参考方案1】:在 MS 解决这个问题之前,我发现连接到 BLE 设备的唯一可靠解决方案是向注册表询问配对 BLE 设备的列表,并将广告中的蓝牙地址与配对的注册表列表进行比较设备。我的经验是,当在未配对的设备上调用 FromBluetoothAddressAsync 时,Windows 会引发异常并终止观察者线程。我有一些我很乐意分享的 C++ 代码,它读取注册表并创建配对的 BLE 设备列表。
希望 MS 能够像 Apple 一样花时间全面支持 BLE。
【讨论】:
嗨,你能分享这个代码吗?谢谢【参考方案2】:这是来自 MS (https://social.msdn.microsoft.com/Forums/vstudio/en-US/e321cb3c-462a-4b16-b7e4-febdb3d0c7d6/windows-10-pairing-a-ble-device-from-code?forum=wdk) 的参考。似乎要使用此 BluetoothLEDevice.FromBluetoothAddressAsync,我们必须在设备正在广告但尚未配对时处理异常。
【讨论】:
【参考方案3】:当我直接使用 BluetoothLEAdvertisementWatcher 时,我遇到了同样的问题。
然后我测试了观察者列出的不同地址。我发现它与蓝牙设备有关。
添加如下过滤器后,我可以成功连接到GATT设备(TI Sensor Tag)。
public sealed partial class MainPage : Page
private BluetoothLEAdvertisementWatcher watcher;
public MainPage()
this.InitializeComponent();
// Create and initialize a new watcher instance.
watcher = new BluetoothLEAdvertisementWatcher();
// Part 1B: Configuring the signal strength filter for proximity scenarios
// Configure the signal strength filter to only propagate events when in-range
// Please adjust these values if you cannot receive any advertisement
// Set the in-range threshold to -70dBm. This means advertisements with RSSI >= -70dBm
// will start to be considered "in-range".
watcher.SignalStrengthFilter.InRangeThresholdInDBm = -70;
// Set the out-of-range threshold to -75dBm (give some buffer). Used in conjunction with OutOfRangeTimeout
// to determine when an advertisement is no longer considered "in-range"
watcher.SignalStrengthFilter.OutOfRangeThresholdInDBm = -75;
// Set the out-of-range timeout to be 2 seconds. Used in conjunction with OutOfRangeThresholdInDBm
// to determine when an advertisement is no longer considered "in-range"
watcher.SignalStrengthFilter.OutOfRangeTimeout = TimeSpan.FromMilliseconds(2000);
// By default, the sampling interval is set to zero, which means there is no sampling and all
// the advertisement received is returned in the Received event
// End of watcher configuration. There is no need to comment out any code beyond this point.
protected override void OnNavigatedTo(NavigationEventArgs e)
watcher.Received += OnAdvertisementReceived;
watcher.Stopped += OnAdvertisementWatcherStopped;
App.Current.Suspending += App_Suspending;
App.Current.Resuming += App_Resuming;
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
App.Current.Suspending -= App_Suspending;
App.Current.Resuming -= App_Resuming;
watcher.Stop();
watcher.Received -= OnAdvertisementReceived;
watcher.Stopped -= OnAdvertisementWatcherStopped;
base.OnNavigatingFrom(e);
private void App_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e)
// Make sure to stop the watcher on suspend.
watcher.Stop();
// Always unregister the handlers to release the resources to prevent leaks.
watcher.Received -= OnAdvertisementReceived;
watcher.Stopped -= OnAdvertisementWatcherStopped;
private void App_Resuming(object sender, object e)
watcher.Received += OnAdvertisementReceived;
watcher.Stopped += OnAdvertisementWatcherStopped;
private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
var address = eventArgs.BluetoothAddress;
BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(address);
var cnt =device.GattServices.Count;
watcher.Stop();
/// <summary>
/// Invoked as an event handler when the watcher is stopped or aborted.
/// </summary>
/// <param name="watcher">Instance of watcher that triggered the event.</param>
/// <param name="eventArgs">Event data containing information about why the watcher stopped or aborted.</param>
private void OnAdvertisementWatcherStopped(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementWatcherStoppedEventArgs eventArgs)
private void start_Click(object sender, RoutedEventArgs e)
watcher.Start();
【讨论】:
你的代码很相似,但我试了一下。可悲的是,一旦我调用“BluetoothLEDevice device = ...”,就会引发相同的异常:(这是设备特定的问题吗?你知道任何解决方法吗?【参考方案4】:只是一个猜测,但也许你需要这个:
watcher.ScanningMode = BluetoothLEScanningMode.Active;
在 OnAdvertisementReceived 事件中
if (e.AdvertisementType == BluetoothLEAdvertisementType.ScanResponse)
BluetoothLEDevice blDevice = await BluetoothLEDevice.FromBluetoothAddressAsync(e.BluetoothAddress);
【讨论】:
【参考方案5】:如果这是一个 UWP 项目,请确保启用蓝牙功能。
为此,请在 Visual Studio 解决方案资源管理器中双击 *.appxmanifest,选择“功能”选项卡并确保选中“蓝牙”。
它会添加一些与以下类似的xml;
<Capabilities>
<Capability Name="internetClientServer" />
<DeviceCapability Name="bluetooth" />
</Capabilities>
【讨论】:
【参考方案6】:这个问题已经超过 3 年了,但是因为它有超过 13000 的浏览量,所以我会回答。 Element not found 的原因是 Windows.Devices 在配对或连接之前不知道广告 Ble 设备。 而是在 OnAdvertisementReceived 中使用:
var device = await BluetoothLEDevice.FromBluetoothAddressAsync(eventArgs.BluetoothAddress);
我在 github 上也有一个非常简单的 uwp 示例,它没有控制以使其尽可能简单。所有结果都显示在调试输出窗口中。 最有用的信息在 MainPage.xaml.cs 中
查看:https://github.com/GrooverFromHolland/SimpleBleExample_by_Devicename
【讨论】:
以上是关于混合APP低功耗蓝牙项目解析数据可能用到的一些小方法---ble的主要内容,如果未能解决你的问题,请参考以下文章