package com.shlb.comb.model; import com.blakequ.bluetooth_manager_lib.device.BeaconType; import com.blakequ.bluetooth_manager_lib.device.BeaconUtils; import com.blakequ.bluetooth_manager_lib.device.BluetoothLeDevice; import com.blakequ.bluetooth_manager_lib.device.ibeacon.IBeaconDevice; import com.blakequ.bluetooth_manager_lib.util.ByteUtils; import com.shlb.comb.util.CsvWriterHelper; import com.shlb.comb.util.TimeFormatter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class BluetoothLeDeviceStore { private final Map mDeviceMap; public BluetoothLeDeviceStore() { mDeviceMap = new HashMap<>(); } public void addDevice(final BluetoothLeDevice device) { //if (mDeviceMap.containsKey(device.getAddress())) { // mDeviceMap.get(device.getAddress()).updateRssiReading(device.getTimestamp(), device.getRssi()); //} else { // mDeviceMap.put(device.getAddress(), device); //} mDeviceMap.put(device.getAddress(), device); } public void clear() { mDeviceMap.clear(); } public List getDeviceList() { final List methodResult = new ArrayList<>(mDeviceMap.values()); if(methodResult==null || methodResult.size()< 1) return methodResult; Collections.sort(methodResult, new Comparator() { @Override public int compare(final BluetoothLeDevice arg0, final BluetoothLeDevice arg1) { return arg0.getAddress().compareToIgnoreCase(arg1.getAddress()); } }); return methodResult; } public int size(){ return mDeviceMap.size(); } private String getListAsCsv() { final List list = getDeviceList(); final StringBuilder sb = new StringBuilder(); sb.append(CsvWriterHelper.addStuff("mac")); sb.append(CsvWriterHelper.addStuff("name")); sb.append(CsvWriterHelper.addStuff("firstTimestamp")); sb.append(CsvWriterHelper.addStuff("firstRssi")); sb.append(CsvWriterHelper.addStuff("currentTimestamp")); sb.append(CsvWriterHelper.addStuff("currentRssi")); sb.append(CsvWriterHelper.addStuff("adRecord")); sb.append(CsvWriterHelper.addStuff("iBeacon")); sb.append(CsvWriterHelper.addStuff("uuid")); sb.append(CsvWriterHelper.addStuff("major")); sb.append(CsvWriterHelper.addStuff("minor")); sb.append(CsvWriterHelper.addStuff("txPower")); sb.append(CsvWriterHelper.addStuff("distance")); sb.append(CsvWriterHelper.addStuff("accuracy")); sb.append('\n'); for (final BluetoothLeDevice device : list) { sb.append(CsvWriterHelper.addStuff(device.getAddress())); sb.append(CsvWriterHelper.addStuff(device.getName())); sb.append(CsvWriterHelper.addStuff(TimeFormatter.getIsoDateTime(device.getFirstTimestamp()))); sb.append(CsvWriterHelper.addStuff(device.getFirstRssi())); sb.append(CsvWriterHelper.addStuff(TimeFormatter.getIsoDateTime(device.getTimestamp()))); sb.append(CsvWriterHelper.addStuff(device.getRssi())); sb.append(CsvWriterHelper.addStuff(ByteUtils.byteArrayToHexString(device.getScanRecord()))); final boolean isIBeacon = BeaconUtils.getBeaconType(device) == BeaconType.IBEACON; final String uuid; final String minor; final String major; final String txPower; final String distance; final String accuracy; if (isIBeacon) { final IBeaconDevice beacon = new IBeaconDevice(device); uuid = String.valueOf(beacon.getUUID()); minor = String.valueOf(beacon.getMinor()); major = String.valueOf(beacon.getMajor()); txPower = String.valueOf(beacon.getCalibratedTxPower()); distance = beacon.getDistanceDescriptor().toString().toLowerCase(Locale.US); accuracy = String.valueOf(beacon.getAccuracy()); } else { uuid = ""; minor = ""; major = ""; txPower = ""; distance = ""; accuracy = ""; } sb.append(CsvWriterHelper.addStuff(isIBeacon)); sb.append(CsvWriterHelper.addStuff(uuid)); sb.append(CsvWriterHelper.addStuff(minor)); sb.append(CsvWriterHelper.addStuff(major)); sb.append(CsvWriterHelper.addStuff(txPower)); sb.append(CsvWriterHelper.addStuff(distance)); sb.append(CsvWriterHelper.addStuff(accuracy)); sb.append('\n'); } return sb.toString(); } private static FileWriter generateFile(final File file, final String contents) { FileWriter writer = null; try { writer = new FileWriter(file); writer.append(contents); writer.flush(); } catch (final IOException e) { e.printStackTrace(); } finally { try { writer.close(); } catch (final IOException e) { e.printStackTrace(); } } return writer; } }