获取从 iBeacon 传输的数据包数据 android
Getting packet data transferred from iBeacon android
我有以下代码用于从 Android 应用程序传输 iBeacon。
Beacon beacon = new Beacon.Builder()
.setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
.setId2(Integer.toString(minor1))
.setId3(Integer.toString(minor2))
.setManufacturer(0x0000)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
beaconTransmitter.startAdvertising(beacon);
}
});
是否可以获取数据包中传输的数据?如何获取这些数据?
谢谢!
假设您要在某些 Android 设备上接收传输的数据,您可以使用相同的库来执行此操作。
这就是流程,
@Override
public void onCreate(Bundle bundle){
...
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
...
}
@Override
public void onBeaconServiceConnect() {
/**
* Start Monitoring the relevant region.
* */
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("Generic_Region", null,
null, null));
}
catch (RemoteException e){
e.printStackTrace();
}
beaconManager.addMonitorNotifier(new MonitorNotifier() {
/**
* Start ranging for Beacons when a region is entered.
* */
@Override
public void didEnterRegion(Region region) {
try {
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* Stop ranging for Beacons on region exit.
* */
@Override
public void didExitRegion(Region region) {
try {
beaconManager.stopRangingBeaconsInRegion(region);
}
catch (RemoteException e) {
e.printStackTrace();
}
Log.i(TAG, "SERVICE : I no longer see a beacon");
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i(TAG, "SERVICE : I have just switched from seeing/not seeing beacons: " + state);
}
});
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
}
});
}
如果你只是想获取要传输的数据包的字节数,你可以这样做:
Beacon beacon = new Beacon.Builder()
.setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
.setId2(Integer.toString(minor1))
.setId3(Integer.toString(minor2))
.setManufacturer(0x0000)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
byte[] bytes = p.getBeaconAdvertisementData(beacon);
使用上面的代码,字节数组将如下所示:
02 15 6f b0 e0 e9 2a e6 49 d3 bb a3 3c b7 69 8c 77 e2 ...
请注意,此字节数组不是通过空中传输的完整数据包,只是其中的制造商数据部分。通过空中传输的数据包以 PDU 类型字节和长度字节为前缀,并且还以标志 PDU 为前缀。但是,这些前缀对于每个传输的数据包都是相同的,并且由 Android 的 BLE 传输 API 自动添加,因此它们不包含在 getBeaconAdvertisementData()
.
返回的字节中
我有以下代码用于从 Android 应用程序传输 iBeacon。
Beacon beacon = new Beacon.Builder()
.setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
.setId2(Integer.toString(minor1))
.setId3(Integer.toString(minor2))
.setManufacturer(0x0000)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
beaconTransmitter.startAdvertising(beacon);
}
});
是否可以获取数据包中传输的数据?如何获取这些数据? 谢谢!
假设您要在某些 Android 设备上接收传输的数据,您可以使用相同的库来执行此操作。
这就是流程,
@Override
public void onCreate(Bundle bundle){
...
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
beaconManager.bind(this);
...
}
@Override
public void onBeaconServiceConnect() {
/**
* Start Monitoring the relevant region.
* */
try {
beaconManager.startMonitoringBeaconsInRegion(new Region("Generic_Region", null,
null, null));
}
catch (RemoteException e){
e.printStackTrace();
}
beaconManager.addMonitorNotifier(new MonitorNotifier() {
/**
* Start ranging for Beacons when a region is entered.
* */
@Override
public void didEnterRegion(Region region) {
try {
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
/**
* Stop ranging for Beacons on region exit.
* */
@Override
public void didExitRegion(Region region) {
try {
beaconManager.stopRangingBeaconsInRegion(region);
}
catch (RemoteException e) {
e.printStackTrace();
}
Log.i(TAG, "SERVICE : I no longer see a beacon");
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.i(TAG, "SERVICE : I have just switched from seeing/not seeing beacons: " + state);
}
});
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) {
}
});
}
如果你只是想获取要传输的数据包的字节数,你可以这样做:
Beacon beacon = new Beacon.Builder()
.setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
.setId2(Integer.toString(minor1))
.setId3(Integer.toString(minor2))
.setManufacturer(0x0000)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
byte[] bytes = p.getBeaconAdvertisementData(beacon);
使用上面的代码,字节数组将如下所示:
02 15 6f b0 e0 e9 2a e6 49 d3 bb a3 3c b7 69 8c 77 e2 ...
请注意,此字节数组不是通过空中传输的完整数据包,只是其中的制造商数据部分。通过空中传输的数据包以 PDU 类型字节和长度字节为前缀,并且还以标志 PDU 为前缀。但是,这些前缀对于每个传输的数据包都是相同的,并且由 Android 的 BLE 传输 API 自动添加,因此它们不包含在 getBeaconAdvertisementData()
.