Skip to content

Instantly share code, notes, and snippets.

@ToeJamson
Last active December 8, 2021 13:28
Show Gist options
  • Save ToeJamson/635b14892364af30e3ad to your computer and use it in GitHub Desktop.
Save ToeJamson/635b14892364af30e3ad to your computer and use it in GitHub Desktop.
Android Beacon Tutorial (Building the Detector - Listener - Observer)
private void setScanFilter() {
ScanFilter.Builder mBuilder = new ScanFilter.Builder();
ByteBuffer mManufacturerData = ByteBuffer.allocate(23);
ByteBuffer mManufacturerDataMask = ByteBuffer.allocate(24);
byte[] uuid = getIdAsByte(UUID.fromString("0CF052C297CA407C84F8B62AAC4E9020");
mManufacturerData.put(0, (byte)0xBE);
mManufacturerData.put(1, (byte)0xAC);
for (int i=2; i<=17; i++) {
mManufacturerData.put(i, uuid[i-2]);
}
for (int i=0; i<=17; i++) {
mManufacturerDataMask.put((byte)0x01);
}
mBuilder.setManufacturerData(224, mManufacturerData.array(), mManufacturerDataMask.array());
mScanFilter = mBuilder.build();
}
public void getAdOfTheDay(int major, int minor) {
String channel = "YourCompany_"+major+"_"+minor;
try {
pubnub.subscribe(channel, mPubNubCallback);
} catch (PubnubException e) {
System.out.println(e.toString());
}
}
protected Callback mPubNubCallback = new Callback() {
@Override
public void successCallback(String channel, Object message) {
System.out.println(message.toString());
}
};
private void setScanSettings() {
ScanSettings.Builder mBuilder = new ScanSettings.Builder();
mBuilder.setReportDelay(0);
mBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER);
mScanSettings = mBuilder.build();
}
mBluetoothLeScanner.startScan(Arrays.asList(mScanFilter), mScanSettings, mScanCallback);
protected ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
ScanRecord mScanRecord = result.getScanRecord();
int[] manufacturerData = mScanRecord.getManufacturerSpecificData(224);
int mRssi = result.getRssi();
}
}
public double calculateDistance(int txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine accuracy, return -1.
}
double ratio = rssi*1.0/txPower;
if (ratio < 1.0) {
return Math.pow(ratio,10);
}
else {
double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111;
return accuracy;
}
}
private String getDistance(accuracy) {
if (accuracy == -1.0) {
return "Unknown";
} else if (accuracy < 1) {
return "Immediate";
} else if (accuracy < 3) {
return "Near";
} else {
return "Far";
}
}
<uses-permission android:name="android.permission.INTERNET"/>
this.pubnub = new Pubnub("publish_key", "subscribe_key");
@Override
public void onScanResult(int callbackType, ScanResult result) {
[...]
if ((mBeaconScanRecord.getDistance() == "Immediate") && !isSubscribed()) {
getAdOfTheDay(mIBeaconScanRecord.getMajor(), mIBeaconScanRecord.getMinor());
}
}
@marriusco
Copy link

Does anyone figured out the missing mess.

@huygao
Copy link

huygao commented Dec 8, 2021

@ToeJamson
After a long time, can you share the source code for everyone to refer to?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment