package at.univie.sensorium.sensors; import java.util.LinkedList; import java.util.List; import org.xmlrpc.android.XMLRPCSerializable; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Handler; import android.util.Log; import at.univie.sensorium.SensorRegistry; public class WifiSensor extends AbstractSensor { public static BroadcastReceiver wifiReceiver; public static IntentFilter wifiFilter; public static Intent wifiIntent; private WifiManager mainWifi; private List<ScanResult> wifiList = null; private Handler handler = new Handler(); private List<WifiDevice> scannedDevices; private SensorValue wifiNetworks; private int defaultSize = 5; private int totalSize; private int scan_interval = 10; // sec public WifiSensor() { super(); setName("Wifi Scan"); wifiNetworks = new SensorValue(SensorValue.UNIT.LIST, SensorValue.TYPE.WIFI_NETWORK); scannedDevices = new LinkedList<WifiDevice>(); } private Runnable scanTask = new Runnable() { @Override public void run() { wifiFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); wifiIntent = getContext().getApplicationContext().registerReceiver(wifiReceiver, wifiFilter); scannedDevices.clear(); mainWifi.startScan(); Log.d("scanTask", "restart scanning"); handler.postDelayed(this, scan_interval*1000); } }; @Override protected void _enable() { mainWifi = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); wifiReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { context.unregisterReceiver(this); // scannedDevices.clear(); wifiList = mainWifi.getScanResults(); totalSize = wifiList.size(); int length = Math.min(totalSize, defaultSize); for(int i = 0; i < length; i++){ ScanResult result = wifiList.get(i); String message = String.format("%s. %s \t BSSID: %s \t Signal level: %d dBm \t " + "capabilities: %s \t frequency: %.3f GHz", Integer.valueOf(i+1).toString(), result.SSID, result.BSSID, result.level, result.capabilities, (float)result.frequency/1000); SensorRegistry.getInstance().log("WiFi", message); } for(int i = 0; i < length; i++){ ScanResult result = wifiList.get(i); scannedDevices.add(new WifiDevice(i+1, result.SSID, result.BSSID, result.capabilities, result.level, (float)result.frequency/1000)); } wifiNetworks.setValue(scannedDevices); notifyListeners(); } }; handler.postDelayed(scanTask, 0); } @Override protected void _disable() { if(wifiIntent != null) getContext().getApplicationContext().unregisterReceiver(wifiReceiver); handler.removeCallbacks(scanTask); scannedDevices.clear(); wifiNetworks.setValue(scannedDevices); } public class WifiDevice implements XMLRPCSerializable,NestedSensorValue{ private SensorValue DeviceID = new SensorValue(SensorValue.UNIT.NUMBER, SensorValue.TYPE.ID); private SensorValue SSID = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.SSID); private SensorValue BSSID = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.BSSID); private SensorValue capabilities = new SensorValue(SensorValue.UNIT.STRING, SensorValue.TYPE.WIFI_CAPABILITIES); private SensorValue frequency = new SensorValue(SensorValue.UNIT.NUMBER, SensorValue.TYPE.FREQEUENCY); private SensorValue RSSI = new SensorValue(SensorValue.UNIT.NUMBER, SensorValue.TYPE.RSSI); private List<SensorValue> valuelist; public WifiDevice() { } public WifiDevice(int id, String name, String MAC, String cap, int rssi, float freq){ if (name != null) this.SSID.setValue(name); if (MAC != null) this.BSSID.setValue(MAC); if (cap != null) this.capabilities.setValue(cap); this.DeviceID.setValue(id); this.frequency.setValue(freq); this.RSSI.setValue(rssi); valuelist = new LinkedList<SensorValue>(); valuelist.add(SSID); valuelist.add(BSSID); valuelist.add(capabilities); valuelist.add(DeviceID); valuelist.add(frequency); valuelist.add(RSSI); } public Object getID(){ return DeviceID.getValue(); } public String getSSID(){ return (String) SSID.getValue(); } public String getBSSID(){ return (String) BSSID.getValue(); } public String getCapabilities(){ return (String) capabilities.getValue(); } public Object getFreq(){ return frequency.getValue(); } public Object getRSSI(){ return RSSI.getValue(); } @Override public String toString() { return DeviceID.getValue() + ". " + SSID.getValueRepresentation() + "; BSSID: " + BSSID.getValueRepresentation() + "; freq: " + frequency.getValueRepresentation() + " GHz; RSS: " + RSSI.getValueRepresentation() + " dBm; " + capabilities.getValueRepresentation() + (Integer.parseInt(DeviceID.getValue().toString()) == (totalSize) ? "" : '\n'); } @Override public Object getSerializable() { return toString(); } @Override public List<SensorValue> getInnerSensorValues() { return valuelist; } } }