Added Wifi FTM Sensor
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 23
|
compileSdkVersion 28
|
||||||
buildToolsVersion '26.0.2'
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "de.fhws.indoor.sensorreadout"
|
applicationId "de.fhws.indoor.sensorreadout"
|
||||||
@@ -10,6 +9,7 @@ android {
|
|||||||
targetSdkVersion 23
|
targetSdkVersion 23
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName "1.0"
|
||||||
|
multiDexEnabled true
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
|||||||
43
app/src/main/java/android/net/wifi/ScanResultHack.java
Normal file
43
app/src/main/java/android/net/wifi/ScanResultHack.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,6 +35,7 @@ import de.fhws.indoor.sensorreadout.sensors.PedestrianActivity;
|
|||||||
import de.fhws.indoor.sensorreadout.sensors.PedestrianActivityButton;
|
import de.fhws.indoor.sensorreadout.sensors.PedestrianActivityButton;
|
||||||
import de.fhws.indoor.sensorreadout.sensors.PhoneSensors;
|
import de.fhws.indoor.sensorreadout.sensors.PhoneSensors;
|
||||||
import de.fhws.indoor.sensorreadout.sensors.WiFi;
|
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.iBeacon;
|
||||||
import de.fhws.indoor.sensorreadout.sensors.iBeaconOld;
|
import de.fhws.indoor.sensorreadout.sensors.iBeaconOld;
|
||||||
import de.fhws.indoor.sensorreadout.sensors.mySensor;
|
import de.fhws.indoor.sensorreadout.sensors.mySensor;
|
||||||
@@ -277,11 +278,19 @@ public class MainActivity extends Activity {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// logo wifi using sensor number 8
|
// logo wifi using sensor number 8
|
||||||
final WiFi wifi = new WiFi(this);
|
// final WiFi wifi = new WiFi(this);
|
||||||
sensors.add(wifi);
|
// sensors.add(wifi);
|
||||||
wifi.setListener(new mySensor.SensorListener() {
|
// wifi.setListener(new mySensor.SensorListener() {
|
||||||
@Override public void onData(final String csv) { add(SensorType.WIFI, csv); }
|
// @Override public void onData(final String csv) { add(SensorType.WIFI, csv); }
|
||||||
@Override public void onData(final SensorType id, final String csv) {return; }
|
// @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
|
//log gps using sensor number 16
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user