Xamarin中如何识别BLE扫描设备所用协议以区分iBeacon、Eddystone等
解决方案
是的,你完全可以通过解析Plugin.BLE.Abstractions.AdvertisementRecord中的广播原始数据,区分iBeacon、Eddystone等不同类型的BLE Beacon协议。
核心判断逻辑
你当前的代码只存储了扫描到的Device对象,要获取协议信息需要在DeviceDiscovered事件中读取a.AdvertisementRecords集合,按照不同协议的特征匹配即可:
- iBeacon识别:iBeacon属于苹果定制的厂商自定义广播,匹配两个特征即可确认:
- 广播记录类型为
ManufacturerSpecificData(厂商自定义数据) - 厂商ID为
0x004C(苹果官方厂商ID),且数据段前两个字节为0x02 0x15
- 广播记录类型为
- Eddystone识别:Eddystone是谷歌推出的Beacon协议,匹配特征为:
- 广播记录类型为
ServiceData(服务数据) - 对应的服务UUID为
0xFEAA(Eddystone专属服务ID),后续还可以根据帧头区分是UID、URL、TLM等不同子类型
- 广播记录类型为
代码修改示例
你可以参考下面的逻辑修改你的扫描回调部分:
Adapter.DeviceDiscovered += (s, a) => { if (!deviceList.Contains(a.Device)) { deviceList.Add(a.Device); // 新增:解析广播记录判断协议类型 string deviceType = "普通BLE设备"; foreach(var record in a.AdvertisementRecords) { // 判断iBeacon if(record.Type == AdvertisementRecordType.ManufacturerSpecificData) { var data = record.Data; if(data.Length >= 4 && data[0] == 0x4C && data[1] == 0x00 && data[2] == 0x02 && data[3] == 0x15) { deviceType = "iBeacon设备"; // 还可以继续解析后续字节获取UUID、Major、Minor、发射功率等参数 break; } } // 判断Eddystone if(record.Type == AdvertisementRecordType.ServiceData) { var uuid = BitConverter.ToUInt16(record.Uuid.ToByteArray(), 0); if(uuid == 0xFEAA) { deviceType = "Eddystone设备"; // 可根据数据段第一个字节判断是UID/URL/TLM等帧类型 break; } } } System.Diagnostics.Debug.WriteLine($"设备 {a.Device.Name} 类型:{deviceType}"); } };
注意事项
部分Beacon设备会分批发送多个广播包,单次扫描可能无法拿到完整的广播记录,遇到识别不准的情况可以增加多次广播采集的逻辑再做判断,准确率会更高。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

