Added Wifi FTM Sensor

This commit is contained in:
2019-06-11 16:11:17 +02:00
parent daa0652e39
commit acb4deff27
4 changed files with 219 additions and 7 deletions

View File

@@ -1,8 +1,7 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '26.0.2'
compileSdkVersion 28
defaultConfig {
applicationId "de.fhws.indoor.sensorreadout"
@@ -10,6 +9,7 @@ android {
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {

View File

@@ -0,0 +1,43 @@
package android.net.wifi;
import android.net.MacAddress;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class ScanResultHack {
public static ScanResult createScanResultFromMacAddress(MacAddress mac) {
// only works with targetSDK < 28
ScanResult result = new ScanResult();
result.BSSID = mac.toString();
result.SSID = "tof_test";
result.frequency = 2447;
result.capabilities = "[ESS]";
try {
Class<?> clazz = Class.forName("android.net.wifi.ScanResult$InformationElement");
Object[] ies = (Object[]) Array.newInstance(clazz, 1);
Object ie = clazz.getDeclaredConstructor().newInstance();
ies[0] = ie;
Field f1 = result.getClass().getDeclaredField("flags");
f1.setAccessible(true);
f1.set(result, 2);
Field f2 = result.getClass().getDeclaredField("informationElements");
f2.setAccessible(true);
f2.set(result, ies);
} catch (final Exception e) {
e.printStackTrace();
}
return result;
}
}

View File

@@ -35,6 +35,7 @@ import de.fhws.indoor.sensorreadout.sensors.PedestrianActivity;
import de.fhws.indoor.sensorreadout.sensors.PedestrianActivityButton;
import de.fhws.indoor.sensorreadout.sensors.PhoneSensors;
import de.fhws.indoor.sensorreadout.sensors.WiFi;
import de.fhws.indoor.sensorreadout.sensors.WiFiRTT;
import de.fhws.indoor.sensorreadout.sensors.iBeacon;
import de.fhws.indoor.sensorreadout.sensors.iBeaconOld;
import de.fhws.indoor.sensorreadout.sensors.mySensor;
@@ -277,11 +278,19 @@ public class MainActivity extends Activity {
});
// logo wifi using sensor number 8
final WiFi wifi = new WiFi(this);
sensors.add(wifi);
wifi.setListener(new mySensor.SensorListener() {
@Override public void onData(final String csv) { add(SensorType.WIFI, csv); }
@Override public void onData(final SensorType id, final String csv) {return; }
// final WiFi wifi = new WiFi(this);
// sensors.add(wifi);
// wifi.setListener(new mySensor.SensorListener() {
// @Override public void onData(final String csv) { add(SensorType.WIFI, csv); }
// @Override public void onData(final SensorType id, final String csv) {return; }
// });
// log wifi RTT using sensor number 17
final WiFiRTT wifirtt = new WiFiRTT(this);
sensors.add(wifirtt);
wifirtt.setListener(new mySensor.SensorListener() {
@Override public void onData(final String csv) { add(SensorType.WIFIRTT, csv); }
@Override public void onData(final SensorType id, final String csv) {add(id, csv); }
});
//log gps using sensor number 16

View File

@@ -0,0 +1,160 @@
package de.fhws.indoor.sensorreadout.sensors;
//package android.net.wifi;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.MacAddress;
import android.net.wifi.ScanResult;
import android.net.wifi.ScanResultHack;
import android.net.wifi.rtt.RangingRequest;
import android.net.wifi.rtt.RangingResult;
import android.net.wifi.rtt.RangingResultCallback;
import android.net.wifi.rtt.WifiRttManager;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
public class WiFiRTT extends mySensor {
private final Activity act;
private final WifiRttManager rttManager;
private Executor mainExecutor;
private Thread ftmThread;
private boolean ftmRunning;
public WiFiRTT(final Activity act) {
this.act = act;
this.rttManager = (WifiRttManager) act.getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
this.mainExecutor = act.getMainExecutor();
}
@Override
public void onResume(Activity act) {
startScan();
}
@Override
public void onPause(Activity act) {
stopScan();
}
private void startScan() {
if (ftmRunning)
return;
ftmRunning = true;
final ArrayList<MacAddress> macs = new ArrayList<>();
macs.add(MacAddress.fromString("38:de:ad:6d:77:25")); // NUC 1
macs.add(MacAddress.fromString("38:de:ad:6d:60:ff")); // NUC 2
macs.add(MacAddress.fromString("1c:1b:b5:ef:a2:9a")); // NUC 3
macs.add(MacAddress.fromString("1c:1b:b5:ec:d1:82")); // NUC 4
ftmThread = new Thread() {
public void run() {
while (ftmRunning) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
startRangingOnMacs(macs);
}
}
};
ftmThread.start();
}
private void stopScan() {
ftmRunning = false;
}
private void startRangingOnMacs(final ArrayList<MacAddress> macs) {
RangingRequest.Builder builder = new RangingRequest.Builder();
for (final MacAddress mac : macs) {
//builder.addWifiAwarePeer(mac);
ScanResult sr = ScanResultHack.createScanResultFromMacAddress(mac);
builder.addAccessPoint(sr);
}
// fire#
if (ActivityCompat.checkSelfPermission(act, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ftmRunning = false;
} else {
final RangingRequest request = builder.build();
rttManager.startRanging(request, mainExecutor, rangeCallback);
}
}
// result callback
private final RangingResultCallback rangeCallback = new RangingResultCallback() {
@Override
public void onRangingFailure(final int i) {
//emitter.onError(new RuntimeException("The WiFi-Ranging failed with error code: " + i));
Log.d("RTT", "onRangingFailure: " + i);
}
@Override
public void onRangingResults(final List<RangingResult> list) {
//emitter.onSuccess(list);
Log.d("RTT", "onRangingResults: " + list.size());
for (final RangingResult res : list) {
int success = 0;
MacAddress mac = res.getMacAddress();
int dist = 0;
int stdDevDist = 0;
int rssi = 0;
int numAttemptedMeas = 0;
int numSuccessfulMeas = 0;
if (res.getStatus() == RangingResult.STATUS_SUCCESS) {
success = 1;
dist = res.getDistanceMm();
stdDevDist = res.getDistanceStdDevMm();
rssi = res.getRssi();
numAttemptedMeas = res.getNumAttemptedMeasurements();
numSuccessfulMeas = res.getNumSuccessfulMeasurements();
Log.d("RTT", mac.toString() + " " + dist + " " + stdDevDist + " " + rssi);
} else {
Log.d("RTT", mac.toString() + " FAILED");
}
if (listener != null) {
// success; mac; dist; stdDevDist; RSSI; numAttemptedMeas; numSuccessfulMeas
StringBuilder sb = new StringBuilder();
sb.append(success).append(';');
sb.append(Helper.stripMAC(mac.toString())).append(';');
sb.append(dist).append(';');
sb.append(stdDevDist).append(';');
sb.append(rssi).append(';');
sb.append(numAttemptedMeas).append(';');
sb.append(numSuccessfulMeas);
listener.onData(SensorType.WIFIRTT, sb.toString());
}
}
}
};
}