- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 BluetoothLeAdvertiser 通过 android 传输 iBluetooth来自 android.bluetooth.le 的类(class).但我似乎无法设置某些制造商规范数据字段以匹配 iBeacon 的字段。
iBeacon结构:
This和 this告诉您 iBeacon 的 Manufacturer spec data 值需要包含什么。基本上:
Apple Company Identifier (Little Endian), 0x004c = 76
data type, 0x02 => iBeacon
data length, 0x15 = 21
uuid: 585CDE931B0142CC9A1325009BEDC65E
major: [0000]
minor: 0000
meaured power at 1 meter: 0xc5 = -59
创建 AdvertiseData对象使用 AdvertiseData.Builder.addManufacturerData() (我认为应该是制造商规范数据,请参阅下面的问题)
protected void setAdvertiseData() {
AdvertiseData.Builder mBuilder = new AdvertiseData.Builder();
ByteBuffer mManufacturerData = ByteBuffer.allocate(24);
byte[] uuid = getIdAsByte(UUID.fromString("0CF052C2-97CA-407C-84F8-B62AAC4E9020"));
mManufacturerData.put(0, (byte)0xBE); // Beacon Identifier
mManufacturerData.put(1, (byte)0xAC); // Beacon Identifier
for (int i=2; i<=17; i++) {
mManufacturerData.put(i, uuid[i-2]); // adding the UUID
}
mManufacturerData.put(18, (byte)0x00); // first byte of Major
mManufacturerData.put(19, (byte)0x09); // second byte of Major
mManufacturerData.put(20, (byte)0x00); // first minor
mManufacturerData.put(21, (byte)0x06); // second minor
mManufacturerData.put(22, (byte)0xB5); // txPower
mBuilder.addManufacturerData(224, mManufacturerData.array()); // using google's company ID
mAdvertiseData = mBuilder.build();
}
创建 AdvertiseSettings使用 AdvertiseSettings.Builder
protected void setAdvertiseSettings() {
AdvertiseSettings.Builder mBuilder = new AdvertiseSettings.Builder();
mBuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER);
mBuilder.setConnectable(false);
mBuilder.setTimeout(0);
mBuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM);
mAdvertiseSettings = mBuilder.build();
}
使用 BluetoothLeAdvertiser 广播 AdvertiseSettings 和 AdvertiseData . (这也需要一个回调,告诉蓝牙传输是否有效,没有问题)
mBluetoothLeAdvertiser.startAdvertising(mAdvertiseSettings, mAdvertiseData, mAdvertiseCallback);
这些步骤的问题是:
不清楚在哪里AdvertiseData.Builder.addManufacturerData()将其第二个 Byte[] manufacturerSpecificData 参数放在 Manufacturer spec data 中,特别是因为 AdvertiseData.Builder.addManufacturerData() 的第一个参数也是制造商规范数据
以下BluetoothLeAdvertiser构造函数参数似乎将字节写入 Manufacturer spec data,覆盖在 addManufacturerData 中添加的字节
其他资源:
更新代码
public AdvertiseData getiBeaconData() {
AdvertiseData.Builder mBuilder = new AdvertiseData.Builder();
ByteBuffer mManufacturerData = ByteBuffer.allocate(24);
byte[] uuid = getIdAsByte(UUID.fromString(thisCont.getString( R.string.ble_uuid )) );
ParcelUuid parced = new ParcelUuid(UUID.fromString(thisCont.getString( R.string.ble_uuid )) );
/*
R.string.ble_uuid == CDB7950D-73F1-4D4D-8E47-C090502DBD63 这是关于 iBeacon 结构 http://smlie-blog.blogspot.com/2014/06/bluetooth-ibeacon-packet-format.html */
//mManufacturerData.put((byte)0x00); //Manufactor Id 1
//mManufacturerData.put((byte)0x4C); //Manufactor Id 2
// mManufacturerData.put((byte)0xBE); //ibeconid1
mManufacturerData.put((byte)0x02); //ibeconid2
mManufacturerData.put((byte)0x15); //Data length
for (byte i:uuid) {
mManufacturerData.put(i); // adding the UUID
}
mManufacturerData.put((byte)0x00); //major first
mManufacturerData.put((byte)0x00); //major second
mManufacturerData.put((byte)0x00); //minor first
mManufacturerData.put((byte)0x00); //minor second
//mManufacturerData.put((byte)0xC5); //TX power
/*
mManufacturerData.put((byte)0x1A); // Beacon Identifier was BE iBeacon = 00
mManufacturerData.put((byte)0xFF); // Beacon Identifier was AC iBeacon = 02
/* the above 2 lines are the ibeacon AD Indicator
for (byte i:uuid) {
mManufacturerData.put(i); // adding the UUID
}
mManufacturerData.put((byte)0x00); // first byte of Major
mManufacturerData.put((byte)0x00); // second byte of Major
mManufacturerData.put((byte)0x00); // first minor
mManufacturerData.put((byte)0x00); // second minor
mManufacturerData.put((byte)0xC5); // txPower (RSSI) (from tx)
mBuilder.addManufacturerData(16, mManufacturerData.array()); // using google's company ID
*/
mBuilder.addManufacturerData(76, mManufacturerData.array()); // using google's company ID
//mBuilder.addServiceUuid(parced);
return mBuilder.build();
}
最佳答案
我觉得你的代码很好。一些评论:
mBuilder.addManufacturerData(76, mManufacturerData.array())
mManufacturerData.put(0, (byte)0x02);//信标标识符
mManufacturerData.put(1, (byte)0x15);//信标标识符
UUID.fromString("0CF052C297CA407C84F8B62AAC4E9020")
。通常 fromString()
方法需要这样的东西:UUID.fromString("F0018B9B-7509-4C31-A905-1A27D39C003D")
总结:
protected void setAdvertiseData() {
AdvertiseData.Builder mBuilder = new AdvertiseData.Builder()
ByteBuffer mManufacturerData = ByteBuffer.allocate(23);
byte[] uuid = getIdAsByte(UUID.fromString("0CF052C297CA407C84F8B62AAC4E9020"));
mManufacturerData.put(0, (byte)0x02);
mManufacturerData.put(1, (byte)0x15);
for (int i=2; i<=17; i++) {
mManufacturerData.put(i, uuid[i-2]); // adding the UUID
}
mManufacturerData.put(18, (byte)0x00); // first byte of Major
mManufacturerData.put(19, (byte)0x09); // second byte of Major
mManufacturerData.put(20, (byte)0x00); // first minor
mManufacturerData.put(21, (byte)0x06); // second minor
mManufacturerData.put(22, (byte)0xB5); // txPower
mBuilder.addManufacturerData(76, mManufacturerData.array());
mAdvertiseData = mBuilder.build();
}
关于android - 如何使用 BluetoothLeScanner 类广播 iBeacon?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438881/
我的蓝牙应用程序有问题。当我在启动应用程序之前启用蓝牙时,一切正常。但是当我不这样做时,我的应用程序会通过 turnOn 方法请求启用蓝牙的权限。但是当我按下我的 onScan 按钮时,我收到一条错误
我对 Android 和 Kotlin 很陌生,所以我可能会遇到一些非常简单的错误,但据我所知,当我调用 BluetoothLeScanner.startScan() 时,我创建的 ScanCallb
所以我尝试实现一个 BLE 扫描器。唯一的问题是我无法让它给我任何输出。这是我的代码: MainActivity.java public class MainActivity extends
我正在尝试实现一个应用程序,当拿着手机的人移动时启动 BLE 扫描,如果超过 10 秒没有移动则自动关闭,而移动检测工作正常 BLEscanner 出了点问题这是代码 import android.a
我想用 BluetoothLeAdvertiser 通过 android 传输 iBluetooth来自 android.bluetooth.le 的类(class).但我似乎无法设置某些制造商规范数
我正在 android 上使用 BLE 实现一个简单的广告 + 扫描功能,由于某种原因,我收到了很多通过同一设备的 onScanResult 回调调用。 用于广告: //Advertise setti
我正在尝试在一个简单的安卓应用程序中实现一个 BLE 扫描仪。我一直在关注: startLeScan replacement to current api和 https://developer.and
我正在使用我自己的 BLE 设备。在监听这些设备时,我想使用 ScanFilter,所以我只得到我感兴趣的设备。我现在的解决方案是在回调内部进行过滤,但如果可以进行这种过滤会更好更早并且根据规范应该是
我正在研究低蓝牙室内定位系统,并且一直在使用 https://github.com/inthepocket/ibeacon-scanner-android用于计算我的移动设备和多个 BLE 信标之间的
由于我在 Android Lollipop 上遇到蓝牙问题,我尝试更改扫描仪方法。 所以我尝试使用新包。 在以前的版本中,我调用了 startScan(mLeScanCallback) 并且一切正常,
我有一个 Android 应用用例,需要“连续”扫描 BLE 设备。 仅此一项要求就可能让我成为受虐狂,我猜这会让 Android 成为我的施虐狂。 我知道[我相信]仍未正式记录“30 秒内扫描不超过
我有一个 Android 应用用例,需要“连续”扫描 BLE 设备。 仅此一项要求就可能让我成为受虐狂,我猜这会让 Android 成为我的施虐狂。 我知道[我相信]仍未正式记录“30 秒内扫描不超过
在 Android 6.0 版本(API 23)中,我注意到 BluetoothLeScanner.startScan() 需要新的权限; ACCESS_COARSE_LOCATION 和/或 ACC
我正在尝试使用函数 BluatoothLeScanner.startScan 而不是已弃用的 BluetoothAdapter.startLeScan。昨天我将我的 Nexus 5 更新到了 Andr
我是一名优秀的程序员,十分优秀!