Programming

실내위치인식

 2015. 7. 14. 13:44
반응형
package com.example.positionprovider;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import GEO2.LBSP.Client.*;
import android.app.Activity;
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.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TableRow;


import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener {
private SvrPositionProvider posProvider;
private ArrayList<PDI_SCANINFO> lstScanInfo;
private WifiManager wifiMgr;

private Button btnGetPos;
private TextView txtFloor;
private TextView txtX;
private TextView txtY;
private TextView txtErr;
private TableLayout tableList;

private boolean received = false;

private static String ip = "14.35.194.146"; // "203.252.104.45";
//서버주소
String logContent = new String("");

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

//하나의 log에 처음부터 끝까지 기록하게 하려고 여기로 옮김
//원래는 버튼 누를때마다 txt로 남았음
String format = new String("yyyyMMddHHmmss"); // 텍스트 파일 명을 시간 값으로 하기 위한 포맷
final SimpleDateFormat timeData = new SimpleDateFormat(format, Locale.KOREA);
final File dir = makeDirectory(Environment.getExternalStorageDirectory() + "/GEO2LOG/");
final File file = makeFile(dir, Environment.getExternalStorageDirectory() + "/GEO2LOG/" + timeData.format(new Date()) + ".txt"); //log로 남기는 파일명을 날짜시간으로

wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (received)
received = false;
else
return;

tableList.removeAllViews();
txtFloor.setText("");
txtX.setText("");
txtY.setText("");
txtErr.setText("");


ArrayList<String> SSIDs = new ArrayList<String>();
ArrayList<String> MACs = new ArrayList<String>();
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
lstScanInfo = new ArrayList<PDI_SCANINFO>();

List<ScanResult> wifiList = wifiMgr.getScanResults();
tableList.removeAllViews();
for(int i = 0; i < wifiList.size(); i++) {
String MACaddr
= wifiList.get(i).BSSID.substring(0, 2)
+ wifiList.get(i).BSSID.substring(3, 5)
+ wifiList.get(i).BSSID.substring(6, 8)
+ wifiList.get(i).BSSID.substring(9, 11)
+ wifiList.get(i).BSSID.substring(12, 14)
+ wifiList.get(i).BSSID.substring(15, 17);
String SSID = wifiList.get(i).SSID;
int RSSI = wifiList.get(i).level;

int Freq = wifiList.get(i).frequency;

PDI_SCANINFO scandata = new PDI_SCANINFO();
scandata.FD1_INFRA_TYPE = PDI_SCANINFO.DEF_INFRA_TYPE_WiFi;
scandata.FD2_INFRA_ID = MACaddr;
scandata.FD3_RSSI = (byte) RSSI;
scandata.FD4_FREQ = (short) Freq;
scandata.FD5_ENCRYPTION = 0;
scandata.FD6_SSID_LEN = (short) SSID.length();
scandata.FD7_SSID = SSID;
lstScanInfo.add(scandata);

SSIDs.add(SSID);
MACs.add(MACaddr);

TextView txtSSID = new TextView(context);
txtSSID.setText(SSID);
TableRow row = new TableRow(context);
row.addView(txtSSID);

tableList.addView(row);
}

if(posProvider == null) {
posProvider = new SvrPositionProvider(ip);
posProvider.setCoordType(SvrPositionProvider.COORDTYPE.emMiddleTM);
}

posProvider.addWifiScanInfo(lstScanInfo);
RspPosition reqPos = posProvider.requestPos();

txtFloor.setText(reqPos.strFloor);
txtX.setText("" + reqPos.x);
txtY.setText("" + reqPos.y);
txtErr.setText("Error: " + reqPos.strError);

posProvider.clear();
posProvider = null;

//String format = new String("yyyyMMddHHmmss"); // 텍스트 파일 명을 시간 값으로 하기 위한 포맷
//SimpleDateFormat timeData = new SimpleDateFormat(format, Locale.KOREA);
//File dir = makeDirectory(Environment.getExternalStorageDirectory() + "/GEO2LOG/");
//File file = makeFile(dir, Environment.getExternalStorageDirectory() + "/GEO2LOG/" + timeData.format(new Date()) + ".txt"); //log로 남기는 파일명을 날짜시간으로
//원래코드 File file = makeFile(dir, Environment.getExternalStorageDirectory() + "/GEO2LOG/" + Calendar.getInstance().getTimeInMillis() + ".txt");

String content = new String("SSID List\n");
Iterator<String> i = SSIDs.iterator();
while (i.hasNext()) {
content += i.next() + "\n";
}
content += "MACaddr List\n";
i = MACs.iterator();
while (i.hasNext()) {
content += i.next() + "\n";
}

content += "\nResult\n" + "strFloor = " + txtFloor.getText() + "\nx = " + txtX.getText() + "\ny = " + txtY.getText() + "\n";

//x, y좌표만 log에 기록되게하기
logContent += "time = "+timeData.format(new Date())+ ", x = "+txtX.getText() + ", y = " + txtY.getText() + "\n";
writeFile(file , logContent.getBytes());
//writeFile(file , content.getBytes());
}
}
}, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

posProvider = new SvrPositionProvider(ip);
posProvider.setCoordType(SvrPositionProvider.COORDTYPE.emMiddleTM);

btnGetPos = (Button)findViewById(R.id.btnPos);
btnGetPos.setOnClickListener(this);

txtFloor = (TextView)findViewById(R.id.txtFloor);
txtX = (TextView)findViewById(R.id.txtX);
txtY = (TextView)findViewById(R.id.txtY);
txtErr = (TextView)findViewById(R.id.txtErr);

tableList = (TableLayout)findViewById(R.id.tableList);
}

@Override
public void onClick(View arg0) {
received = true;
wifiMgr.startScan();
}

private File makeDirectory(String dir_path){
File dir = new File(dir_path);
if (!dir.exists())
{
dir.mkdirs();
}

return dir;
}

private File makeFile(File dir , String file_path){
File file = null;
if(dir.isDirectory()){
file = new File(file_path);
if(file!=null&&!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}

private boolean writeFile(File file , byte[] file_content){
boolean result;
FileOutputStream fos;
if(file!=null&&file.exists()&&file_content!=null){
try {
fos = new FileOutputStream(file);
try {
fos.write(file_content);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
result = true;
}else{
result = false;
}
return result;
}
}


반응형