1

私は初心者です。すべての Wi-Fi チャネルをスキャンしてファイルに保存するアプリを作成しようとしています。ここで、特定のスキャンごとにデバイスの GPS 情報を統合し、同じファイルに入れたいと思いました。現在、私は Wi-Fi 情報をブロードキャストしており、ブロードキャスト フィルターを使用してそれをキャプチャしています。現在のアプリケーションに GPS 追跡情報を追加するための正しいアプローチは何でしょうか。

これは私の DataPoint コードです

public class DataPoint {
int     level;
String  BSSID;
String  SSID;
long    time;


public DataPoint(long time, int level, String BSSID, String SSID){
    this.level = level;
    this.time = time;
    this.BSSID = BSSID;
    this.SSID = SSID;
}

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("TIME: ").append(time).append("\n");
    sb.append("SSID: ").append(SSID).append("\n");
    sb.append("BSSID: ").append(BSSID).append("\n");
    sb.append("RSSI: ").append(level).append(" [dBm]\n\n");

    return sb.toString();
}

public String toCSVString() {
    StringBuilder sb = new StringBuilder();
    sb.append(time).append(",");
    sb.append(SSID).append(",");
    sb.append(BSSID).append(",");
    sb.append(level).append("\n");

    return sb.toString();   
}
}

これは私のMainActivityコードです

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

public class MainActivity extends Activity implements OnClickListener{
private static final String TAG = "RSSIMiner";
WifiManager wifi;
BroadcastReceiver receiver;

TextView textStatus;
Button scanButton;
Button recordButton;

boolean toFile = true;
String fid = "0";

Timer tim;
boolean scanning = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Setup UI
    textStatus = (TextView) findViewById(R.id.textStatus);

    // Set up buttons and listeners
    scanButton = (Button) findViewById(R.id.buttonScan);
    scanButton.setOnClickListener(this);

    recordButton = (Button) findViewById(R.id.buttonRecord);
    recordButton.setOnClickListener(this);

    Button clearButton = (Button) findViewById(R.id.buttonClear);
    clearButton.setOnClickListener(this);

    // Setup WiFi
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    // Setup Timer
    tim = new Timer(true);

    // Register Broadcast Receiver
    if (receiver == null)
        receiver = new WiFiScanReceiver(this);

    registerReceiver(receiver, new IntentFilter(
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    Log.d(TAG, "onCreate()");
}


@Override
public void onDestroy() {
    Log.d(TAG,"onDestroy()");
    this.unregisterReceiver(receiver);
    super.onDestroy();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}


public void onClick(View view) {
    // Scan button
    if (view.getId() == R.id.buttonScan) {
        Log.d(TAG, "onClick() Scan");

        if(scanning) {
            tim.cancel();
            scanButton.setText(R.string.scan_button);
        } else {
            tim.schedule(new TimerTask(){
                @Override
                public void run(){
                    wifi.startScan();
                }
            }, 0, 2000);

            scanButton.setText(R.string.scan_button_scanning);
        }
        scanning = !scanning;

        // Record button
    } else if (view.getId() == R.id.buttonRecord) {
        Log.d(TAG, "onClick() Record");
        toFile = !toFile; 

        if(toFile) {
            Date d = new Date();
            fid = "data-" + d.getTime() + ".csv";
            recordButton.setText(R.string.record_button_recording);
            textStatus.setText("");
        } else {
            recordButton.setText(R.string.record_button);
            Toast.makeText(this, "File saved to " + fid,
                    Toast.LENGTH_LONG).show();
        }

        // Clear button
    } else if (view.getId() == R.id.buttonClear) {
        Log.d(TAG, "onClick() Clear");
        textStatus.setText("");
    }
}

public void update(String s) {
    // Get WiFi status
    WifiInfo info = wifi.getConnectionInfo();
    textStatus.append("\nCurrent WiFi connection: " + info.toString() + "\n\n");
    textStatus.append(s);
    textStatus.append("-------------------------------");

    ScrollView sv = (ScrollView) findViewById(R.id.ScrollView);
    sv.fullScroll(ScrollView.FOCUS_DOWN);
    Log.d(TAG, "UI updated.");
}
}

最後に私の放送受信機コード

package se.illuminati.rssiminer;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.ScanResult;
import android.util.Log;
import android.widget.Toast;

  public class WiFiScanReceiver extends BroadcastReceiver {
private static final String TAG = "WiFiScanReceiver";
MainActivity rssiminer;

public WiFiScanReceiver(MainActivity rssiminer) {
    super();
    this.rssiminer = rssiminer;
}

@Override
public void onReceive(Context c, Intent intent) {

    List<ScanResult> results = rssiminer.wifi.getScanResults();
    Date d = new Date();


    ArrayList<DataPoint> data = new ArrayList<DataPoint>(results.size());
    for (ScanResult result : results) {
        data.add(new DataPoint(d.getTime(), result.level, result.BSSID, result.SSID));
    }

    String message = String.format("%s networks found. Updating list.",
            results.size());
    Toast.makeText(rssiminer, message, Toast.LENGTH_SHORT).show();
    Log.d(TAG, "onReceive() message: " + message);

    StringBuilder sbs = new StringBuilder();
    StringBuilder sbm = new StringBuilder();

    for(DataPoint dp : data) {
        sbs.append(dp.toString());
        sbm.append(dp.toCSVString());
    }

    Log.d(TAG, "Updating UI...");
    rssiminer.update(sbs.toString());

    if(rssiminer.toFile) {              
        try {
            File dataDir = new File("/sdcard/RSSIMiner/");
            dataDir.mkdirs();
            File dataFile = new File(dataDir,rssiminer.fid);
            Log.d(TAG,"Printing to file /sdcard/RSSIMiner/" + rssiminer.fid);
            FileWriter fw = new FileWriter(dataFile,true);

            fw.write(sbm.toString());
            fw.close();

        } catch(FileNotFoundException e) {
            System.err.println("Error: FileNotFoundException\n" + e.getStackTrace());
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Error: IOException\n" + e.getStackTrace());
            System.exit(1);
        } 


    }

}
}
4

0 に答える 0