- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个能够基于 Eddystone 协议(protocol)发布 UID 帧的 android 应用程序。其代码如下
private void advertise() {
//To check if Bluetooth Multiple Advertising is supported on the Device
if( !BluetoothAdapter.getDefaultAdapter().isMultipleAdvertisementSupported() ) {
Toast.makeText( this, "Multiple advertisement not supported", Toast.LENGTH_SHORT ).show();
start.setEnabled(false);
}
BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
//defining the settings used while advertising
AdvertiseSettings settings = new AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH).setConnectable(true).build();
//We make Parcel UUID(UUID can be generated online) and Advertise Data object
ParcelUuid pUuid = ParcelUuid.fromString("4db3d4ff-eda4-46e8-bd89-9a7b1f63cc83");
//building servicedata
byte txPower = (byte) -16;
byte FrameType = 0x00;
byte[] namespaceBytes =toByteArray("01020304050607080910");
Log.e("nB",Integer.toString(namespaceBytes.length));
byte[] instanceBytes =toByteArray("AABBCCDDEEFF");
Log.e("instanceIdlength",Integer.toString(instanceBytes.length));
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
os.write(new byte[]{FrameType,txPower});
os.write(namespaceBytes);
os.write(instanceBytes);
} catch (IOException e) {
e.printStackTrace();
}
byte[] serviceData =os.toByteArray();
Log.e("Service Data Length",Integer.toString(serviceData.length));
Log.e("ServiceData",serviceData.toString());
AdvertiseData ADdata = new AdvertiseData.Builder().addServiceData(pUuid,serviceData).addServiceUuid(pUuid).setIncludeDeviceName(false).setIncludeTxPowerLevel(false).build();
Log.e("Data",ADdata.toString());
//callback to check success or failure when advertising
AdvertiseCallback advertisingCallback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
Log.e("BLE","Advertising");
status.setText("Advertising");
status.setTextColor(Color.GREEN);
}
@Override
public void onStartFailure(int errorCode) {
Log.e( "BLE", "Advertising onStartFailure: " + errorCode );
super.onStartFailure(errorCode);
status.setText("ErrorCode: "+errorCode);
status.setTextColor(Color.RED);
}
};
advertiser.startAdvertising(settings, ADdata, advertisingCallback);
}
private byte[] toByteArray(String hexString) {
// hexString guaranteed valid.
int len = hexString.length();
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
+ Character.digit(hexString.charAt(i + 1), 16));
}
return bytes;}
我已遵循所有帧长度指南。
InstanceID:6bytes
NameSpaceID:10bytes
但由于错误代码,我仍然无法发布数据....:ADVERTISE_FAILED_DATA_TOO_LARGE
我在这里遗漏了什么吗?
最佳答案
我怀疑问题是您在广告中插入的服务 uuid 最终是一个完整的 16 字节服务 UUID,而不是所需的 0xFEAA 的 2 字节短服务 UUID。没有足够的空间容纳完整的 16 字节服务 UUID,这就是您收到此错误的原因。
我在构建 Eddystone 时遇到了一点问题 transmission support in the Android Beacon Library ,并最终从 AOSP 中复制了一个函数,如下所示。您可以在下面的库中看到它是如何使用的。
int serviceUuid = 0xFEAA;
byte[] serviceUuidBytes = new byte[] {
(byte) (serviceUuid & 0xff),
(byte) ((serviceUuid >> 8) & 0xff)};
ParcelUuid parcelUuid = parseUuidFrom(serviceUuidBytes);
/**
* Parse UUID from bytes. The {@code uuidBytes} can represent a 16-bit, 32-bit or 128-bit UUID,
* but the returned UUID is always in 128-bit format.
* Note UUID is little endian in Bluetooth.
*
* @param uuidBytes Byte representation of uuid.
* @return {@link ParcelUuid} parsed from bytes.
* @throws IllegalArgumentException If the {@code uuidBytes} cannot be parsed.
*
* Copied from java/android/bluetooth/BluetoothUuid.java
* Copyright (C) 2009 The Android Open Source Project
* Licensed under the Apache License, Version 2.0
*/
private static ParcelUuid parseUuidFrom(byte[] uuidBytes) {
/** Length of bytes for 16 bit UUID */
final int UUID_BYTES_16_BIT = 2;
/** Length of bytes for 32 bit UUID */
final int UUID_BYTES_32_BIT = 4;
/** Length of bytes for 128 bit UUID */
final int UUID_BYTES_128_BIT = 16;
final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
if (uuidBytes == null) {
throw new IllegalArgumentException("uuidBytes cannot be null");
}
int length = uuidBytes.length;
if (length != UUID_BYTES_16_BIT && length != UUID_BYTES_32_BIT &&
length != UUID_BYTES_128_BIT) {
throw new IllegalArgumentException("uuidBytes length invalid - " + length);
}
// Construct a 128 bit UUID.
if (length == UUID_BYTES_128_BIT) {
ByteBuffer buf = ByteBuffer.wrap(uuidBytes).order(ByteOrder.LITTLE_ENDIAN);
long msb = buf.getLong(8);
long lsb = buf.getLong(0);
return new ParcelUuid(new UUID(msb, lsb));
}
// For 16 bit and 32 bit UUID we need to convert them to 128 bit value.
// 128_bit_value = uuid * 2^96 + BASE_UUID
long shortUuid;
if (length == UUID_BYTES_16_BIT) {
shortUuid = uuidBytes[0] & 0xFF;
shortUuid += (uuidBytes[1] & 0xFF) << 8;
} else {
shortUuid = uuidBytes[0] & 0xFF ;
shortUuid += (uuidBytes[1] & 0xFF) << 8;
shortUuid += (uuidBytes[2] & 0xFF) << 16;
shortUuid += (uuidBytes[3] & 0xFF) << 24;
}
long msb = BASE_UUID.getUuid().getMostSignificantBits() + (shortUuid << 32);
long lsb = BASE_UUID.getUuid().getLeastSignificantBits();
return new ParcelUuid(new UUID(msb, lsb));
}
关于android - 广告数据太大 Eddystone Beacon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824740/
我读到 Nexus6 和 Nexus9 只能作为 eddystone 格式的信标。 目前我没有任何一部手机。我有一部 iphone,我们可以用 aniphone 播放 eddystone 格式吗? 最
我正在使用 nRF connect Apk 来设置主要和次要。信标始终断开连接,并且停止发送主要和次要信号。我尝试了很多应用程序,但出现了同样的情况。请建议我该怎么做。 最佳答案 第1步:首先检查您的
这是我使用 iPhone iOS 9 检测 Eddystone 的代码: - (void)viewDidLoad { [super viewDidLoad]; if ([CLLocat
我正在尝试制作一个能够基于 Eddystone 协议(protocol)发布 UID 帧的 android 应用程序。其代码如下 private void advertise() { //To
我希望开发一款与 Eddystone 信标配合使用的应用,作为本地艺术节的一部分。似乎信标可以将内容推送到 Chrome,无论手机所有者是否愿意接收内容,而且谷歌设计了“临时标识符”(EID),可以确
我正在尝试开发一个 IOS 应用程序来检测 Eddystone 和 iBeacons。我已经使用了 Corelocation 和 Corebluetooth 来实现。我想在后台检测信标,因此也设置后台
与 Google's new Eddystone standard他们将在 Google Play 服务中提供对安卓的支持 Nearby Api .我们是否可以注册 eddystone 信标并让我们的
我基本上是在尝试完成 this ,使用提供的第一个答案。这个问题在网上和 SO 都有答案,但我无法让它发挥作用。有什么我需要启用、添加到我的 list 等吗?我想对手机范围内的信标使用react。我在
我正在尝试在 Android 中使用 Eddystone 和 Nearby 消息。我用 Proximity Beacon API 注册了一个 Eddystone-UID|并附上一些数据。然后在我的应用
我想知道在 iOS 上使用 Eddystone 信标跟踪是否真的可以实现这样的事情。 我目前正在开发应该扫描 Eddystone 信标的应用程序。该应用程序的基本思想是:- 用户打开应用程序;- 用户
我正在开发一款扫描 BLE 设备的 Android 应用程序。每次找到设备时,我都会收到: byte[] scanRecord, BluetoothDevice 设备, int rssi 来自 Blu
我正在尝试使用 Eddystone URL 向 Android 设备发送通知。 到目前为止我尝试了什么: 我已尝试使用 altbeacon 库传输 Eddystone URL。 我已经使用 Locat
我正在考虑在 ionic 上开发一个基于 eddyston beacon 的应用程序。我需要确保我可以涵盖这种情况: 1- 用户口袋里有手机和屏幕锁。 2- 手机进入信标范围。 3- 当用户安装我的应
我正在开发一个提供后台 Beacon 监控的应用程序。当用户从定义的区域进入信标时,我想开始测距。不幸的是,我无法为 Eddystone 配置文件定义区域。当我使用 Eddystone Namespa
我想从一个信标(PiBeacon)同时发送 ibeacon 和 eddystone 数据包。实际上,我在两个终端中运行不同的命令,每个命令都针对其中一个具有间隔时间的协议(protocol),它有效并
是否有基于客户端的 JavaScript 方法可以直接从 iOS 中的 Chrome 浏览器检测 Eddystone-URL 信标?我知道 Chrome 有用于今日 View 的小部件,效果很好,但我
我已经创建了一个安卓应用程序来使用蓝牙 LEscanner 扫描 BLE。现在我需要我的应用程序来识别信标是属于 iBeacon 还是属于 Eddystone。至此,我通过解析AD帧成功确定了ibea
Android 版本。 > 4.3标准安卓信标库估计信标。Eddystone-UID包遥测包。 我正在尝试从 Eddystone-UID 包传输的遥测包中读取温度传感器传输。根据 Android Be
我尝试使用 beacon-android 库在 Android 设备上实现 Eddystone 信标https://github.com/adriancretu/beacons-android#fea
我需要编写一个应用程序,每次靠近 Eddystone 信标时调用 REST 服务。 我的目标是 iOS 9 或更高版本并使用 Swift 编写。 到目前为止,当应用程序处于前台以及应用程序处于后台几个
我是一名优秀的程序员,十分优秀!