@Override public void getBeacons(Collection<Beacon> beacons) { // 防止停止收集beacons前,再次收到此回调,导致重复记录,在开始和结束监控(查找)beacons时设置。 if (isRecorded) return; // 已经记录了 // 日志记录和屏幕显示Beacon信息 // 有可能到达采样周期时,没有找到所有beacons,甚至是0个beacons,因此,应重复记录,一直到采样周期结束。当然是最后更新的有效。 String str = "beacons=" + beacons.size(); LogManager.d(TAG, str); logToDisplay(str); String rssi; for (Beacon beacon : beacons) { // becaon的两个id(major,minor),rssi及其平均值 str = beacon.getId2() + ":" + beacon.getId3() + "=" + beacon.getRssi() + "," + String.format("%.2f", beacon.getRunningAverageRssi()); LogManager.d(TAG, str); logToDisplay(str); // 记录至mBeaconsRssi rssi = beacon.getId2() + "_" + beacon.getId3() + ":" + String.format("%.2f", beacon.getRunningAverageRssi()); mBeaconsRssi.put(beacon, rssi); } // 记录参考点的各个beacon的id和rssi平均值 if ((System.currentTimeMillis() - startSample) >= SamplePeroid) { // 将目前定位参考点测量的各个beacons的rssi平均值计入数据库。 SaveRssiToDb(); str = "记录完毕,定位参考点[" + reference_pointPerf + reference_pointNum + "]" + "各个beacon的rssi平均值"; LogManager.d(TAG, str); logToDisplay(str); // 以下必须在UI现成中执行,否则,程序将异常终止。 runOnUiThread( new Runnable() { public void run() { String str = "记录完毕,定位参考点[" + reference_pointPerf + reference_pointNum + "]"; Toast.makeText(trainingActivity.this, str, Toast.LENGTH_LONG).show(); // 下一个参考点默认名称 reference_pointNum++; reference_point_edit.setText(reference_pointPerf + reference_pointNum); // 停止查找beacons onMonitoringStop(null); } }); } }
/** * 每个扫描周期结束,根据20秒内各beacon的RSSI平均值计算它的距离,该回调获取这些beacon的距离值 Called once per second (实际上是每扫描周期) * to give an estimate of the mDistance to visible beacons */ @Override public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { LogManager.d(TAG, "didRangeBeaconsInRegion(),beacons=" + beacons.size()); for (Beacon beacon : beacons) { LogManager.d(TAG, beacon.getId2() + ":" + beacon.getId3() + "," + beacon.getDistance()); } Beacon beacon = mNearestBeacon.getNearestBeacon(mGetBeaconType, beacons); mOnNearestBeaconListener.getNearestBeacon(mGetBeaconType, beacon); }