- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在在这里遇到问题,因为我正在尝试从我的 Onyx iBeacon 读取 tx-Power。我已经阅读了多个建议并在互联网上尝试了很多代码,但我仍然无法弄清楚。
我正在使用 android lollipop 并尝试了来自 https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt 的 iBeacon 教程用于提取 BLUETOOTH_THERM_SERVICE
的蓝牙应用程序。
我从广告中发现了 tx-Power 的两个值: Bluetooth LE TX Power reading
0x1804
及其特征 0x2A07
,因此我调整了 Parcel UUID 以使用 0x1804
过滤我的 ScanResults:
public static final ParcelUuid THERM_SERVICE = ParcelUuid.fromString("00001809-0000-1000-8000-00805f9b34fb");
public static final ParcelUuid TX_POWER_SERVICE = ParcelUuid.fromString("00001804-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid ONYX_STANDARD_SERVICE = ParcelUuid.fromString("0000180a-0000-1000-8000-00805f9b34fb");
如教程中所述:
byte[] data = record.getServiceData(TX_POWER_SERVICE);
应该存储一个字节数组但它总是返回null!唯一存储字节数组,但我认为它存储整个记录的是:
byte[] data = record.getServiceData(ONYX_STANDARD_SERVICE);
尝试继续并使用我可以通过 ONYX_STANDARD_SERVICE
获得的数据我可以看到一个扫描结果:
onScanResult() - ScanResult{mDevice=78:A5:04:07:AE:96, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData={76=[2, 21, 32, -54, -24, -96, -87, -49, 17, -29, -91, -30, 8, 0, 32, 12, -102, 102, 0, 7, -82, -106, -78]}, mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}, mTxPowerLevel=-2147483648, mDeviceName=OnyxBeacon], mRssi=-63, mTimestampNanos=174691272168825}
我认为我记录的重要部分是:
mServiceData={0000180a-0000-1000-8000-00805f9b34fb=[120, -91, 4, 7, -82, -106, -78, 32, -54, -24, -96, 0, 7, -82, -106]}
如何从这个 ServiceData 中提取我的 txPower 值?我检查了几个应用程序,我的 tx-power 为 -78。
通过使用 ONYX_STANDARD_SERVICE 检查结果,我可以使用 scanResult[6] = -78
获得此值。
这是正确的做法吗?如果是,为什么?
我还发现了一些关于这个问题的有趣示例,其中提到了要从记录中读取的另一个值:
如果您在此处查找代码:
private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;
其中哪一个(0x1804
、0x2A07
、0x0A
)是正确的?
如果有人可以向我解释获取 THERM_SERVICE
的示例代码是如何工作的,那也很好,但没有必要:
private float parseTemp(byte[] serviceData) {
/*
* Temperature data is two bytes, and precision is 0.5degC.
* LSB contains temperature whole number
* MSB contains a bit flag noting if fractional part exists
*/
float temp = (serviceData[0] & 0xFF);
if ((serviceData[1] & 0x80) != 0) {
temp += 0.5f;
}
return temp;
}
请帮助我阅读广告数据和提取 tx-Power。
最佳答案
OnyxBeacon 以及任何其他兼容 iBeacon 的 BLE 设备的发射 (TX) 功率可以从广告数据包中获得。这不需要连接到设备。此外,TX 功率值将根据功率级别而有所不同,因为 TX 功率值是针对设备的每个功率级别进行校准的。 TX 功率是广告负载的最后一个字节。关于 iBeacon 数据包结构的更多信息可以在这里找到:http://www.havlena.net/en/location-technologies/ibeacons-how-do-they-technically-work/
以下是如何解析 iBeacon 数据包并获取 TX 功率的示例:
BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, final int rssi, final byte[] scanData) {
if (scanData[7] == 0x02 && scanData[8] == 0x15) { // iBeacon indicator
System.out.println("iBeacon Packet: %s", bytesToHexString(scanData));
UUID uuid = getGuidFromByteArray(Arrays.copyOfRange(scanData, 9, 25));
int major = (scanData[25] & 0xff) * 0x100 + (scanData[26] & 0xff);
int minor = (scanData[27] & 0xff) * 0x100 + (scanData[28] & 0xff);
byte txpw = scanData[29];
System.out.println("iBeacon Major = " + major + " | Minor = " + minor + " TxPw " + (int)txpw + " | UUID = " + uuid.toString());
}
}
};
public static String bytesToHexString(byte[] bytes) {
StringBuilder buffer = new StringBuilder();
for(int i=0; i<bytes.length; i++) {
buffer.append(String.format("%02x", bytes[i]);
}
return buffer.toString();
}
public static UUID getGuidFromByteArray(byte[] bytes)
{
ByteBuffer bb = ByteBuffer.wrap(bytes);
UUID uuid = new UUID(bb.getLong(), bb.getLong());
return uuid;
}
关于bluetooth-lowenergy - Android : iBeacon - read its advertisement (e. g txPower),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30445331/
来自 this book它说 A peripheral can be connected to multiple centrals. 任何 BLE 模块都可以做到这一点吗?更具体的可以bluegiga
对于从 BLE 设备读取数据 block (9000 字节)的应用程序,我需要尽可能快地修改连接间隔。 我正在使用 linux 内核 = 3.14.43 运行 BlueZ 堆栈 4.101 目前,我可
BLE广告最多可以发送31个字节。在广告内,可能有多个广告。 我想知道制作一个广告仅包含一个制造商特定数据广告是否有效,并且这种广告是否可以填满所有31个字节(长度字段为1个字节,类型字段为(0xff
在尝试研究 BLE 时,我想知道是否可以通过 Wireshark 和 snort 等工具对其进行分析?我遇到了一个名为“ubertooth”的设备,但这是一个需要购买的 USB 设备,以便我们在 BL
LE随机地址是怎么产生的,一般用什么算法产生? 最佳答案 这是一个随机数。所以除非特殊情况,否则不应该是可逆的。地址中的高 2 位指示其余部分是否可通过 key 解析。建立关联时, key 在服务器和
我的问题是关于服务请求。在 BLE 中,广告数据包中有服务请求的选项。服务征集是什么意思??在什么情况下,我们将服务请求数据包含在广告数据包中? 最佳答案 想法是,当设备扫描广告设备时,在其广告数据中
我的问题是关于服务请求。在 BLE 中,广告数据包中有服务请求的选项。服务征集是什么意思??在什么情况下,我们将服务请求数据包含在广告数据包中? 最佳答案 想法是,当设备扫描广告设备时,在其广告数据中
我想知道处于从属角色的 LE 设备的链路层是否可以有多个主控。我知道master可以有多个slave,但是一个slave可以有多个master吗? 最佳答案 来自 1.2 蓝牙低功耗操作概述、蓝牙 v
我知道 iBeacon 的定义是它正在传输的广告数据包的固定规范: 9 字节 iBeacon 前缀 16 字节 UUID 2 个字节主要 2 字节次要 1 字节 TX 功率 话虽如此,是否有任何东西可
阅读文档,我构建了 2 个使用 BLE 连接 2 个 iDevices 的应用程序。 一个设备是中央设备,另一个是外围设备。 Central在寻找Peripheral,当找到它时,探索它的服务和特性,
这个问题与Android notificatinos无关,但与BLE通知有关(标题可能暗示) 我在Android-L上有基本的BLE外设模式 有什么方法可以在Android-L预览中实现BLE通知。我
我正在从事一个需要 Windows 通用应用程序与 BLE 设备通信的项目。我正在尝试找到一种方法,以查看如何扫描、配对和发送/接收数据的低功耗蓝牙设备。 最佳答案 Windows.Devices.E
我正在研究使用多个 iBeacons 进行“粗略”室内定位的可能性。该应用程序是一种“博物馆”设置,能够更容易地形成一个包含不同对象位置的网格,然后形成单独的信标(尽管这也不是不可能的)。 是否有使用
BLE的GATT架构适用于固定的小数据块(每个特性最大20字节)。但是在某些情况下,您最终想要“流式传输”任意长度的数据,该长度大于20个字节。例如,即使您知道固件升级很慢,也可以进行固件升级。 我很
蓝牙 5.1 规范宣布了一项新的测向功能,该功能有望显着提高蓝牙定位服务解决方案的性能。新功能允许设备确定蓝牙信号的方向,从而能够开发能够理解设备方向的蓝牙近距离解决方案以及能够实现厘米级定位精度的蓝
我正在阅读蓝牙核心规范。 v 4.2 文档,但我找不到有关特征长度限制的任何信息。 BLE 服务特性的长度限制是多少? 最佳答案 限制由属性值的可能值设置,请参阅 ATT 部分(第 3 卷,第 F 部
我的应用程序需要同时连接9个Ble设备。 在此article和任何其他资源中,它写到android 4.4+只能连接到7个设备。 M或N版本有什么新功能吗? 谢谢。 最佳答案 连接数受常数MAX_L2
我一直在寻找在一次扫描中扫描大量 BLE 标签 (StickNFind) 的可能性。我注意到,当我扫描 10 秒时,我可以轻松检测到大约 20 个 BLE。当我将扫描间隔增加到 30 秒左右并尝试扫描
总结:Micropython Bluetooth BLE scan() 不返回完整的广告负载,特别是缺少“完整的本地名称”。 设置: ESP32-WROOM-32 esp32-idf4-2021020
我正在尝试自动重新连接到 BLE 设备,在这种情况下是 Taidoc 温度计。我已经扫描了设备,然后发出了一个成功的“pair”命令,然后发出了一个也成功的“trust”命令。 如果我在设备上执行“信
我是一名优秀的程序员,十分优秀!