如何使用 Altbeacon Android 库搜索 custom/manufacturer 特定信标
How to search custom/manufacturer specific beacon using Altbeacon Android library
我正在 Android 尝试 search/find 附近的信标,我正在使用 Altbeacon Android 库。
信标是定制的,这里是制造商特定的:
//---------------flags data type------------------------------------------------
// FLAGS data type
typedef PACKED_STRUCT
{
uint8_t len; // # bytes for data type (but not including len field)
uint8_t type; // 0x01
uint8_t attrib; // 0x06
} flags_data_t;
//---------------manufacturer specific data ------------------------------------
#define BLE_MFG_SPECIFIC_DATA_TYPE 0xff
// company identifiers of interest
#define BLE_COMPANY_ID_SOMECOMPANY 0x0312
// Manufacturer specific data (msd) header
typedef PACKED_STRUCT
{
uint8_t len; // # bytes for data type (but not including len field)
uint8_t type; // 0xff for manufacturer specific
uint16_t company_id; // Bluetooth org registered company id, use Enlighted
} msd_data_header_t;
我需要获取该特定制造商附近位置的所有信标。
Android代码为:
beaconManager.getBeaconParsers().add(new BeaconParser()
.setBeaconLayout("m:2-3=0312,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
@Override
public void onBeaconServiceConnect() {
final Region region = new Region("myBeaons", Identifier.parse(UUID), null, null);
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
try {
Log.d(TAG, "didEnterRegion");
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void didExitRegion(Region region) {
try{
Log.d(TAG, "didExitRegion");
beaconManager.stopRangingBeaconsInRegion(region);
} catch (RemoteException e) {
}}
@Override
public void didDetermineStateForRegion(int i, Region region)
{
Log.d(TAG, "didDetermineStateForRegion");
}
});
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon oneBeacon : beacons) {
Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3());
}
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
但是找不到任何信标,请告诉我我该怎么做或者是他们的任何其他图书馆
问题中的信标格式规范没有提供足够的信息。它只是说信标是使用公司代码 0x0312 的制造商广告。一开始这很好,但它没有指定随广告传输的任何其他信息。
如果你真的想匹配发送的任何符合这种格式的BLE广告,你可以使用:
beaconManager.getBeaconParsers().add(new BeaconParser() .setBeaconLayout("m:0-1=0312,i:0-1,p:1-1"));
但这将始终 return 0x0312 作为第一个(也是唯一的)信标标识符。并提供 "dummy" 0x12 RSSI 的测量功率额定值,这将无法让您获得准确的距离估计值。如果您希望能够从信标读取唯一标识符并估计到它的距离,您需要知道信标(如果它确实如此)如何在字节流中传输其唯一标识符和测量功率,该字节流遵循中描述的序列问题。
我正在 Android 尝试 search/find 附近的信标,我正在使用 Altbeacon Android 库。
信标是定制的,这里是制造商特定的:
//---------------flags data type------------------------------------------------
// FLAGS data type
typedef PACKED_STRUCT
{
uint8_t len; // # bytes for data type (but not including len field)
uint8_t type; // 0x01
uint8_t attrib; // 0x06
} flags_data_t;
//---------------manufacturer specific data ------------------------------------
#define BLE_MFG_SPECIFIC_DATA_TYPE 0xff
// company identifiers of interest
#define BLE_COMPANY_ID_SOMECOMPANY 0x0312
// Manufacturer specific data (msd) header
typedef PACKED_STRUCT
{
uint8_t len; // # bytes for data type (but not including len field)
uint8_t type; // 0xff for manufacturer specific
uint16_t company_id; // Bluetooth org registered company id, use Enlighted
} msd_data_header_t;
我需要获取该特定制造商附近位置的所有信标。
Android代码为:
beaconManager.getBeaconParsers().add(new BeaconParser() .setBeaconLayout("m:2-3=0312,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
@Override
public void onBeaconServiceConnect() {
final Region region = new Region("myBeaons", Identifier.parse(UUID), null, null);
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
try {
Log.d(TAG, "didEnterRegion");
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void didExitRegion(Region region) {
try{
Log.d(TAG, "didExitRegion");
beaconManager.stopRangingBeaconsInRegion(region);
} catch (RemoteException e) {
}}
@Override
public void didDetermineStateForRegion(int i, Region region)
{
Log.d(TAG, "didDetermineStateForRegion");
}
});
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon oneBeacon : beacons) {
Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3());
}
}
});
try {
beaconManager.startMonitoringBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
但是找不到任何信标,请告诉我我该怎么做或者是他们的任何其他图书馆
问题中的信标格式规范没有提供足够的信息。它只是说信标是使用公司代码 0x0312 的制造商广告。一开始这很好,但它没有指定随广告传输的任何其他信息。
如果你真的想匹配发送的任何符合这种格式的BLE广告,你可以使用:
beaconManager.getBeaconParsers().add(new BeaconParser() .setBeaconLayout("m:0-1=0312,i:0-1,p:1-1"));
但这将始终 return 0x0312 作为第一个(也是唯一的)信标标识符。并提供 "dummy" 0x12 RSSI 的测量功率额定值,这将无法让您获得准确的距离估计值。如果您希望能够从信标读取唯一标识符并估计到它的距离,您需要知道信标(如果它确实如此)如何在字节流中传输其唯一标识符和测量功率,该字节流遵循中描述的序列问题。