/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2014, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: gsn-tiny/src/tinygsn/model/wrappers/AndroidGyroscopeWrapper.java
*
* @author Do Ngoc Hoan
*/
package tinygsn.model.wrappers;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.PendingIntent;
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.Bundle;
import android.util.Log;
import tinygsn.beans.DataField;
import tinygsn.beans.DataTypes;
import tinygsn.beans.StaticData;
import tinygsn.beans.StreamElement;
import tinygsn.beans.WrapperConfig;
import tinygsn.services.WrapperService;
import tinygsn.storage.db.SqliteStorageManager;
public class WifiWrapper extends AbstractWrapper {
public WifiWrapper(WrapperConfig wc) {
super(wc);
}
public WifiWrapper() {
}
private static final String[] FIELD_NAMES = new String[] { "mac1", "mac2", "level" };
private static final Byte[] FIELD_TYPES = new Byte[] { DataTypes.DOUBLE, DataTypes.DOUBLE, DataTypes.DOUBLE };
private static final String[] FIELD_DESCRIPTION = new String[] { "mac1", "mac2", "level" };
private static final String[] FIELD_TYPES_STRING = new String[] { "double", "double", "double" };
public final Class<? extends WrapperService> getSERVICE(){ return WifiService.class;}
@Override
public void runOnce(){}
@Override
public DataField[] getOutputStructure() {
ArrayList<DataField> output = new ArrayList<DataField>();
for (int i = 0; i < FIELD_NAMES.length; i++)
output.add(new DataField(FIELD_NAMES[i], FIELD_TYPES_STRING[i],
FIELD_DESCRIPTION[i]));
return output.toArray(new DataField[output.size()]);
}
@Override
public String[] getFieldList() {
return FIELD_NAMES;
}
@Override
public Byte[] getFieldType() {
return FIELD_TYPES;
}
public static class WifiService extends WrapperService {
WifiManager mainWifiObj;
WifiScanReceiver wifiReciever;
SqliteStorageManager storage = null;
long ctr = 0;
boolean scanning = false;
boolean wifiEnabled = false;
public WifiService()
{
super("wifiService");
}
@Override
public void onCreate(){
mainWifiObj = (WifiManager) getSystemService(Context.WIFI_SERVICE);
wifiReciever = new WifiScanReceiver();
registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
Log.d("wifi-scanning", "registered");
super.onCreate();
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle b = intent.getBundleExtra("tinygsn.beans.config");
config = (WrapperConfig) b.getParcelable("tinygsn.beans.config");
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
if (!config.isRunning()){
am.cancel(PendingIntent.getService(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT));
return;
}
storage = new SqliteStorageManager();
try {
w = StaticData.getWrapperByName("tinygsn.model.wrappers.WifiWrapper");
} catch (Exception e1) {}
int duration = w.getDcDuration();
int interval = w.getDcInterval();
if (duration > 0 && ctr % duration == 0 ){
wifiEnabled = mainWifiObj.isWifiEnabled();
mainWifiObj.setWifiEnabled(true);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
mainWifiObj.startScan();
scanning = true;
Log.d("wifi-scanning", "calling scan" + wifiReciever);
long t = System.currentTimeMillis();
while (scanning){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
if (System.currentTimeMillis() - t > 120000){
StreamElement streamElement = new StreamElement(w.getFieldList(), w.getFieldType(),
new Serializable[] { 1.0, mainWifiObj.isWifiEnabled()?1.0:0.0 , 0.0 });
((WifiWrapper) w).postStreamElement(streamElement);
break;
}
}
//return wifi to its previous state
mainWifiObj.setWifiEnabled(wifiEnabled);
}
ctr++;
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000*interval,PendingIntent.getService(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT));
}
@Override
public void onDestroy() {
try{
unregisterReceiver(wifiReciever);
Log.d("wifi-scanning", "de-registered");
}catch( Exception e)
{}
super.onDestroy();
}
class WifiScanReceiver extends BroadcastReceiver {
@SuppressLint("UseValueOf")
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = mainWifiObj.getScanResults();
Log.d("wifi-scanning", "received " + wifiScanList.size());
StreamElement streamElement = null;
if (wifiScanList.size() == 0){
streamElement = new StreamElement(w.getFieldList(), w.getFieldType(),
new Serializable[] { 0.0, mainWifiObj.isWifiEnabled()?1.0:0.0 , 0.0 });
((WifiWrapper) w).postStreamElement(streamElement);
}
for(int i = 0; i < wifiScanList.size(); i++){
streamElement = new StreamElement(w.getFieldList(), w.getFieldType(),
new Serializable[] { converTingBSSID(wifiScanList.get(i).BSSID.substring(0, 8)), converTingBSSID(wifiScanList.get(i).BSSID.substring(8)), wifiScanList.get(i).level });
((WifiWrapper) w).postStreamElement(streamElement);
storage.updateWifiFrequency(wifiScanList.get(i).BSSID);
}
// unregisterReceiver(wifiReciever);
// registerReceiver(wifiReciever, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
scanning = false;
}
}
private double converTingBSSID(String bssid)
{
bssid = bssid.replaceAll(":", "");
return Integer.parseInt(bssid, 16);
}
}
}