//*******************************************************mobile Internet wisdom city WiFi********************************************//
//*******************************************************mobile Internet wisdom city WiFi********************************************//
//*******************************************************mobile Internet wisdom city WiFi********************************************//
MainActivity.java
package com.wght.wifiRTLS;
import com.wght.wifiRTLS.R;
import android.app.Activity;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_logo);
WifiManager wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
Thread waitThread = new Thread() {
public void run() {
try {
sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent intent=new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
MainActivity.this.finish();//关闭当前Activity
}
};
waitThread.start();
}
}
SecondActivity.java
package com.wght.wifiRTLS;
import java.util.List;
import com.wght.wifiRTLS.MainService.LocalBinder;
import com.wght.wifiRTLS.MainService.People;
import com.wght.wifiRTLS.R;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.IBinder;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.util.FloatMath;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.graphics.Matrix;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
public class SecondActivity extends Activity {
private static final String MSG = "android.intent.action.PICK";
private static int MAP_MODE_NONE = 0;
private static int MAP_MODE_DRAG = 1;
private static int MAP_MODE_ZOOM = 2;
private int mapMode = MAP_MODE_NONE;
private Matrix matrix;
private ImageView imageView;
private static MainService mService;
boolean mBound = false;
private float multiply = 1;
private static final float real_width = 1100 / 11f;
private static final float real_height = 750 / 8f;
private PointF origin;
private PointF real_origin = new PointF(0.76f,2.55f);
private float middleX;
private float middleY;
private Bitmap ic_customer;
private Bitmap ic_guard;
private Bitmap ic_server;
private Bitmap ic_kid;
private float oldDist;
private PointF mid;
private PointF start;
private SensorManager mSensorManager;
private ChangeReceiver changeReceiver = new ChangeReceiver();
private float rValues = 0;
private Bitmap compass;
private boolean located = false;
private String QID = "-1";
private SensorView sensorView;
private PointF downPos = new PointF(0,0);
private final SensorEventListener mListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
rValues = event.values[0];
DrawS();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
sensorView = new SensorView(this);
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.sensorLayout);
linearLayout.addView(sensorView);
System.out.println("onCreate");
}
@Override
protected void onStart() {
super.onStart();
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();//屏幕宽度
int height = wm.getDefaultDisplay().getHeight();//屏幕高度
Rect rect= new Rect();
this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top; //状态栏高度
middleX = width/2;
middleY = (height - statusBarHeight)/2;
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
compass = BitmapFactory.decodeResource(getResources(), R.drawable.orientation);
BitmapFactory.decodeResource(getResources(), R.drawable.pointr);
ic_customer = BitmapFactory.decodeResource(getResources(), R.drawable.customer);
ic_guard = BitmapFactory.decodeResource(getResources(), R.drawable.guard);
ic_server = BitmapFactory.decodeResource(getResources(), R.drawable.server);
ic_kid = BitmapFactory.decodeResource(getResources(), R.drawable.kid);
imageView = (ImageView)findViewById(R.id.imageView1);
matrix = new Matrix();
start = new PointF();
mid = new PointF();
origin = new PointF(0,0);
imageView.setImageMatrix(matrix);
mSensorManager.registerListener(mListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_FASTEST);
System.out.println("onStart");
}
@Override
protected void onResume()
{
super.onResume();
System.out.println("onResume");
IntentFilter filter = new IntentFilter();
filter.addAction(MSG);
registerReceiver(changeReceiver, filter);
Intent intent = new Intent();
intent.setClass(SecondActivity.this, MainService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
System.out.println("onPause");
try {
unregisterReceiver(changeReceiver);
} catch (Exception e) {
}
super.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
System.out.println("onStop");
mService.isClosed = true;
mService.wifiScanning = false;
mService.OffLine();
if (mBound) {
unbindService(mConnection);
mBound = false;
}
super.onStop();
}
@Override
protected void onDestroy() {
System.out.println("onDestroy");
try {
mSensorManager.unregisterListener(mListener);
} catch (Exception e) {
}
super.onDestroy();
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
// String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
if (contents.startsWith("%") && contents.endsWith("$") ){
QID = contents.substring(1, contents.length()-1);
Toast.makeText(this, "QR修正码代号:" + QID, Toast.LENGTH_SHORT).show();
return;
}
// Handle successful scan
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder server) {
// 已经绑定了LocalService,强转IBinder对象,调用方法得到LocalService对象
System.out.println("Connected");
LocalBinder binder = (LocalBinder) server;
mService = binder.getService();
mBound = true;
mService.QID = QID;
if (QID != "-1") {
mService.scanMode = MainService.SCAN_MODE_QRFIX;
QID = "-1";
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
System.out.println("Disconnected?");
mBound = false;
}
};
public void ZoomInListener(View view) {
matrix.postScale(1.25f, 1.25f);
multiply = multiply * 1.25f;
imageView.setImageMatrix(matrix);
}
public void ZoomOutListener(View view) {
matrix.postScale(0.8f, 0.8f);
multiply = multiply * 0.8f;
imageView.setImageMatrix(matrix);
}
public void QRScanListener(View view) {
mService.scanMode = MainService.SCAN_MODE_STOP;
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
};
public void InCenter() {
People people = null;
float x = 0;
float y = 0;
if(mService.GetPeopleList().size() != 0) {
located = true;
people = mService.GetPeopleList().get(0);
x = origin.x + (people.GetX() + real_origin.x) * multiply * real_width - compass.getWidth()/2;
y = origin.y + (people.GetY() + real_origin.y) * multiply * real_height - compass.getHeight()/2;
matrix.postTranslate(middleX - x , middleY - y );
float xo = origin.x;
float yo = origin.y;
origin.set(xo + middleX - x, yo + middleY - y);
imageView.setImageMatrix(matrix);
}
}
public void DrawMe()
{
DrawView view = new DrawView(this);
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.cLayout);
linearLayout.addView(view);
if(located == false) {
located = true;
InCenter();
}
}
class DrawView extends View {
Paint paintL = new Paint();
Paint paintP = new Paint();
public DrawView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paintL.setStrokeWidth(9);
paintL.setARGB(200, 255, 180, 0);
paintP.setStrokeWidth(12);
paintP.setARGB(200, 255, 80, 0);
List<People> peopleList = mService.GetPeopleList();
PointF[] road = mService.GetRoad();
People people;
float x = 0;
float y = 0;
for(int i = 1;i < peopleList.size(); i++) {
people = peopleList.get(i);
x = origin.x + (people.GetX() + real_origin.x) * multiply * real_width - ic_customer.getWidth()/2;
y = origin.y + (people.GetY() + real_origin.y) * multiply * real_height - ic_customer.getHeight()/2;
if(people.GetJob() == 0)
canvas.drawBitmap(ic_customer, x, y, null);
if(people.GetJob() == 1)
canvas.drawBitmap(ic_guard, x, y, null);
if(people.GetJob() == 2)
canvas.drawBitmap(ic_server, x, y, null);
if(people.GetJob() == 4)
canvas.drawBitmap(ic_kid, x, y, null);
}
float x1;
float y1;
if(road[0].x != 0) {
for(int i = 1; i <= (int)road[0].y - 2; i++) {
x = origin.x + (road[i].x + real_origin.x) * multiply * real_width;
y = origin.y + (road[i].y + real_origin.y) * multiply * real_height;
x1 = origin.x + (road[i+1].x + real_origin.x) * multiply * real_width;
y1 = origin.y + (road[i+1].y + real_origin.y) * multiply * real_height;
canvas.drawLine(x, y, x1, y1, paintL);
canvas.drawPoint(x, y, paintP);
}
canvas.drawPoint(x, y, paintP);
}
invalidate();
}
}
public void DrawS() {
new DrawThread().run();
}
private class DrawThread implements Runnable {
public void run() {
sensorView.postInvalidate();
}
}
private class SensorView extends View {
public SensorView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
float x,y;
if(mService.GetPeopleList().size() != 0){
People people = mService.GetPeopleList().get(0);
x = origin.x + (people.GetX() + real_origin.x) * multiply * real_width - compass.getWidth()/2;
y = origin.y + (people.GetY() + real_origin.y) * multiply * real_height - compass.getHeight()/2;
canvas.translate(x, y);
canvas.rotate(rValues);
canvas.drawBitmap(compass, -compass.getWidth()/2, -compass.getHeight(), null);
}
}
}
public class ChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MSG)) {
if(intent.getBooleanExtra("arrive", false) == true)
Toast.makeText(SecondActivity.this, "到达!", Toast.LENGTH_LONG).show();
DrawMe();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
downPos.set(event.getX(), event.getY());
matrix.set(imageView.getImageMatrix());
matrix.set(matrix);
start.set(event.getX(), event.getY());
mapMode = MAP_MODE_DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
matrix.set(matrix);
midPoint(mid, event);
mapMode = MAP_MODE_ZOOM ;
}// ACTION_DOWN, ACTION_MOVE, ACTION_UP, or ACTION_CANCEL.
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
if(Math.abs(event.getX() - downPos.x) <= 5 && Math.abs(event.getY() - downPos.y) <= 5)
InCenter();
mapMode = MAP_MODE_NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mapMode == MAP_MODE_DRAG) {
float x = origin.x;
float y = origin.y;
origin.set((float)(x + event.getX() - start.x), (float)(y + event.getY() - start.y));
matrix.set(matrix);
matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
start.set(event.getX(), event.getY());
} else if (mapMode == MAP_MODE_ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
float scale;
scale = newDist / oldDist;
float x = origin.x;
float y = origin.y;
if(((multiply >= 3 && scale > 1)) || ((multiply <=0.5) && scale < 1)) {
;
} else {
multiply *= scale;
origin.set(x + (x - mid.x) * (scale - 1) , y + (y - mid.y) * (scale - 1));
matrix.set(matrix);
matrix.postScale(scale, scale, mid.x, mid.y);
}
oldDist = newDist;
}
}
break;
}
imageView.setImageMatrix(matrix);
return true; // indicate event was handled
}
/**
* 求两点间距离:
*/
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
/**
* 求两点间中点
*/
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x/2, y/2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*
* add()方法的四个参数,依次是:
* 1、组别,如果不分组的话就写Menu.NONE,
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
* 3、顺序,那个菜单现在在前面由这个参数的大小决定
* 4、文本,菜单的显示文本
*/
// setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以
// android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "导航").setIcon(
android.R.drawable.ic_menu_search);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "原路返回").setIcon(
android.R.drawable.ic_menu_myplaces);
menu.add(Menu.NONE, Menu.FIRST + 3, 3, "退出").setIcon(
android.R.drawable.ic_menu_close_clear_cancel);
menu.add(Menu.NONE, Menu.FIRST + 4, 4, "关于").setIcon(
android.R.drawable.ic_menu_info_details);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Menu.FIRST + 1:
SearchDialog();
break;
case Menu.FIRST + 2:
mService.SendMsg("[T," + mService.GetMyID() + ",0]");
break;
case Menu.FIRST + 3:
QuitDialog();
break;
case Menu.FIRST + 4:
Toast.makeText(this, "By WGHT @2012", Toast.LENGTH_LONG).show();
break;
default:
break;
}
return false;
}
protected void QuitDialog() {
AlertDialog.Builder builder = new Builder(SecondActivity.this);
builder.setMessage("确认退出吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
SecondActivity.this.finish();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
protected void SearchDialog() {
final EditText text = new EditText(this);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(android.R.drawable.ic_menu_search).setTitle("搜索导航")
.setMessage("请输入您想要物品").setView(text)
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int status = mService.Search(text.getText().toString());
switch(status) {
case 0:
Toast.makeText(SecondActivity.this, "导航成功", Toast.LENGTH_LONG).show();
break;
case 1:
Toast.makeText(SecondActivity.this, "无法定位自身位置", Toast.LENGTH_LONG).show();
break;
case 2:
Toast.makeText(SecondActivity.this, "无法找到您想要的物品", Toast.LENGTH_LONG).show();
break;
case 3:
Toast.makeText(SecondActivity.this, "发送失败", Toast.LENGTH_LONG).show();
break;
}
}})
.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}}).create();
builder.create().show();
}
}
MainService.java
package com.wght.wifiRTLS;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.media.MediaPlayer;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.util.Log;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.graphics.PointF;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class MainService extends Service {
public static final int UT_C = 0;//Customer
public static final int UT_G = 1; //Guard
public static final int UT_S = 2; //Server
public static final int UT_P = 3; //Parent
public static final int UT_K = 4; //Kid
public static final float SAFETY_DISTANCE = 3.0f;
public static final float ARRIVE_DISTANCE = 0.5f;
public static final int SCAN_MODE_STOP = 0;
public static final int SCAN_MODE_UPDATE = 1;
public static final int SCAN_MODE_QRFIX = 2;
private static final Item[] itemList = new Item[]{new Item("肉", new PointF(1.25f,1.25f)),
new Item("蔬菜", new PointF(1.70f,3.00f)), new Item("水果", new PointF(5.54f,7.03f)),
new Item("零食", new PointF(3.33f,2.54f)), new Item("衣服", new PointF(5.87f,9.33f)),
new Item("日用品", new PointF(6.66f,8.41f)), new Item("绿色装备", new PointF(7.98f,-1.21f)),
new Item("华伦天奴", new PointF(-2.08f,1.64f)), new Item("安踏", new PointF(2.20f,4.94f)),
new Item("出口", new PointF(2.35f,-1.58f)), new Item("出口", new PointF(9.47f,-1.58f)),
new Item("收银台", new PointF(8.87f,-1.58f)), new Item("厕所", new PointF(4.20f,6.66f)),
new Item("入口", new PointF(0.06f,2.47f))
};
private static final String MSG = "android.intent.action.PICK";
public String serverIP = "192.168.1.88";
public int sendPort = 8899;
public int recvPort = 8899;
public int scanMode = SCAN_MODE_UPDATE;
public String QID = "-1";
public boolean wifiScanning = false;
public boolean isClosed = false;
public boolean isAlerted = false;
private WifiReceiver wifiReceiver = null;
private WifiManager wifiManager = null;
private int myID = -1;
private List<AP> apList = null;
private List<People> peopleList = null;
private int mstatus = 0;
private final IBinder mBinder = (IBinder) new LocalBinder(); // 实例化自定义的Binder类
private PointF[] road = new PointF[50];
private MediaPlayer alert = new MediaPlayer();
@Override
public void onCreate() {
super.onCreate();
apList = new ArrayList<AP>();
peopleList = new ArrayList<People>();
wifiManager = (WifiManager)getSystemService(WIFI_SERVICE);
wifiReceiver = new WifiReceiver();
alert = MediaPlayer.create(MainService.this, R.raw.alert);
try {
alert.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i <= 49;i++) {
road[i] = new PointF();
road[i].set(0f, 0f);
}
new ReadThread().start();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiReceiver, filter);
new ScanThread().start();
System.out.println("service create");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
try {
unregisterReceiver(wifiReceiver);
} catch (Exception e) {
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
MainService getService() {
// 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法和公用属性
return MainService.this;
}
}
public void SendMsg(final String msg) {
Thread sendThread = new Thread() {
public void run() {
do {
SystemClock.sleep(100);
} while(wifiScanning);
try {
DatagramSocket socket;
socket = new DatagramSocket();
byte[] buf = new byte[1024];
buf = msg.getBytes();
InetAddress addr = InetAddress.getByName(serverIP);
DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, addr, sendPort);
socket.send(sendPacket);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
};
sendThread.start();
}
class ScanThread extends Thread {
public void run() {
if (isClosed) return;
System.out.println("ScanThread");
try {
do {
sleep(2000);
} while (wifiScanning);
wifiScanning = true;
wifiManager.startScan();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class ReadThread extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(recvPort);
socket.setSoTimeout(3000);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
if (socket != null) {
while (!isClosed) {
if (myID == -1) {
SendMsgR();
}
try {
socket.receive(packet);
String message = new String(data, 0, packet.getLength(), "UTF-8");
System.out.println(message);
DealMessage(message);
} catch (Exception e) {
// e.printStackTrace();
}
}
}
socket.close();
} catch (Exception e) {
Log.i("UDP", "Init Socket Error");
e.printStackTrace();
}
}
}
public void SendMsgR() {
String msg = "[R,";
WifiInfo info = wifiManager.getConnectionInfo();
msg += info.getMacAddress() + "]";
SendMsg(msg);
}
public void SendMsgU() {
List<ScanResult> scanResultsList = wifiManager.getScanResults();
int size = scanResultsList.size();
int i;
int j = 0;
while (j < size)
{
i = GetAPByMAC(scanResultsList.get(j).BSSID);
if (i>=0) {
apList.get(i).rssiList.add(scanResultsList.get(j).level);
}
j++;
}
double avg;
String msg = "[U," + myID + ",0," + mstatus;
for (AP ap : apList) {
avg = 0;
while (ap.rssiList.size() > 4)
ap.rssiList.remove(0);
for (Integer rssi : ap.rssiList) {
avg += rssi.intValue();
}
avg /= ap.rssiList.size();
if (ap.rssiList.size() > 0) {
BigDecimal bAvg = new BigDecimal(avg);
msg += "," + ap.ID;
msg += "," + bAvg.setScale(5, BigDecimal.ROUND_HALF_UP);
}
}
msg += "]";
SendMsg(msg);
}
public void SendMsgF() {
List<ScanResult> scanResultsList = wifiManager.getScanResults();
int size = scanResultsList.size();
int i;
int j = 0;
while (j < size)
{
i = GetAPByMAC(scanResultsList.get(j).BSSID);
if (i>=0) {
apList.get(i).rssiList.add(scanResultsList.get(j).level);
}
j++;
}
String msg = "[F," + myID + "," + QID;
double avg;
for (AP ap : apList) {
avg = 0;
while (ap.rssiList.size() > 4)
ap.rssiList.remove(0);
for (Integer rssi : ap.rssiList) {
avg += rssi.intValue();
}
avg /= ap.rssiList.size();
if (ap.rssiList.size() > 0) {
BigDecimal bAvg = new BigDecimal(avg);
msg += "," + ap.ID;
msg += "," + bAvg.setScale(5, BigDecimal.ROUND_HALF_UP);
}
}
msg += "]";
SendMsg(msg);
}
static class People {
private int id;
private String mac;
private float pos_x;
private float pos_y;
private int job;
private int status;
public People(int id, int job, int status, float x, float y) {
this.pos_x = x;
this.pos_y = y;
this.job = job;
this.status = status;
this.id = id;
}
public float GetX() {
return this.pos_x;
}
public float GetY() {
return this.pos_y;
}
public String GetMac() {
return this.mac;
}
public int GetId() {
return this.id;
}
public int GetJob() {
return this.job;
}
public int GetStatus() {
return this.status;
}
public void ResetPos(float x, float y) {
this.pos_x = x;
this.pos_y = y;
}
}
public List<People> GetPeopleList() {
return peopleList;
}
public PointF[] GetRoad() {
return road;
}
public int GetMyID() {
return myID;
}
public String GetIP() {
return serverIP;
}
public void SetIP(String ip) {
serverIP = ip;
}
public String DealMessage(String message) {
if (isClosed) return "0";
Intent intent = new Intent();
intent.setAction(MSG);
if (message.startsWith("[L,") && message.endsWith("]")) {
SetAPList(message);
return "L";
} else
if (message.startsWith("[M,") && message.endsWith("]")) {
AddPeople(message, intent);
sendBroadcast(intent);
return "M";
} else
if (message.startsWith("[P,") && message.endsWith("]")) {
AddRoad(message);
return "P";
} else
return "0";
}
public void AddPeople(String message, Intent intent) {
String[] set = new String[5];
String tmp = message;
tmp = message.substring(3, message.length()-1);
int pos;
pos = tmp.indexOf(',');
set[0] = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
pos = tmp.indexOf(',');
set[1] = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
pos = tmp.indexOf(',');
set[2] = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
pos = tmp.indexOf(',');
set[3] = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
set[4] = tmp;
int id = Integer.parseInt(set[0]);
int job = Integer.parseInt(set[1]);
int status = Integer.parseInt(set[2]);
float x = Float.parseFloat(set[3]);
float y = Float.parseFloat(set[4]);
boolean flag = false;
for(People i:peopleList) {
if (i.id == id) {
if ((i.id == myID) && (road[0].x != 0)) {
int step = (int)road[0].y - 1;
if ((Math.abs(road[step].x - x) <= ARRIVE_DISTANCE) && (Math.abs(road[step].y - y) <= ARRIVE_DISTANCE)) {
road[0].set(0, 0);
System.out.println("Arrived!");
intent.putExtra("arrive", true);
}
System.out.println(road[step].x + " " + road[step].y);
}
i.ResetPos(x, y);
flag = true;
break;
}
if(i.job == UT_K) {//kid
if(PointF.length(peopleList.get(0).pos_x - i.pos_x, peopleList.get(0).pos_y - i.pos_y) >= SAFETY_DISTANCE) {
if(!isAlerted) {
isAlerted = true;
Thread alertThread = new Thread() {
public void run() {
while (isAlerted) {
if(!alert.isPlaying())
alert.start();
}
alert.stop();
}
};
alertThread.start();
}
} else {
isAlerted = false;
}
}
}
if(flag == false) {
peopleList.add(new People(id, job, status, x, y));
}
}
public void AddRoad(String message) {
/**road[0].x的值表示从第几个点开始,0表示不存在
* road[0].y表示路径长度
**/
String tmp = message;
String tmpP = null;
tmp = message.substring(3, message.length()-1);
int pos;
int i;
float x,y;
for(i = 1; tmp.indexOf(',') != -1; i++) {
pos = tmp.indexOf(',');
tmpP = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
x = Float.parseFloat(tmpP);
if(tmp.indexOf(',') != -1) {
pos = tmp.indexOf(',');
tmpP = tmp.substring(0, pos);
y = Float.parseFloat(tmpP);
tmp = tmp.substring(pos+1);
} else {
y = Float.parseFloat(tmp);
}
road[i].set(x, y);
}
road[0].set(1f, (float)i);
System.out.println("I built a road");
}
class AP {
private String MAC;
private int ID;
private List<Integer> rssiList;
public AP(String MAC, int ID) {
this.MAC = MAC;
this.ID = ID;
rssiList = new ArrayList<Integer>();
}
public String getMAC() {
return MAC;
}
public void setMAC(String MAC) {
this.MAC = MAC;
}
public int getID() {
return this.ID;
}
public void setID(int ID) {
this.ID = ID;
}
}
public void SetAPList(String message) {
String tmp = message;
String tmpP = null;
tmp = message.substring(3, message.length()-1);
int pos;
pos = tmp.indexOf(',');
tmpP = tmp.substring(0, pos);
myID = Integer.parseInt(tmpP);
tmp= tmp.substring(pos + 1);
String MAC;
int ID;
while(tmp.indexOf(',') != -1) {
pos = tmp.indexOf(',');
tmpP = tmp.substring(0, pos);
ID = Integer.parseInt(tmpP);
tmp = tmp.substring(pos+1);
if(tmp.indexOf(',') != -1) {
pos = tmp.indexOf(',');
MAC = tmp.substring(0, pos);
tmp = tmp.substring(pos+1);
} else {
MAC = tmp;
}
apList.add(new AP(MAC, ID));
}
}
public class WifiReceiver extends BroadcastReceiver {
//接收WiFi扫描完成事件
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceive");
wifiScanning = false;
if (isClosed) return;
switch (scanMode) {
case SCAN_MODE_UPDATE:
SendMsgU();
new ScanThread().start();
break;
case SCAN_MODE_QRFIX:
SendMsgF();
scanMode = SCAN_MODE_UPDATE;
new ScanThread().start();
break;
}
}
}
public int GetAPByMAC(String MAC) {
for (int i = 0; i<apList.size(); i++) {
if (MAC.equals(apList.get(i).getMAC()) == true) {
return i;
}
}
return -1;
}
private static class Item {
public final String name;
public final PointF position;
public Item(String name, PointF position) {
this.name = name;
this.position = position;
}
}
public int Search(String name){
/**
* return 0:成功
* return 1:无法定位自身位置
* return 2:无法找到对应物品
* return 3:发送错误
*/
String msg = "[N," + myID + ",1";
if(peopleList.size() == 0)
return 1;
boolean flag = false;
for(Item item:itemList)
if(name.equals(item.name)) {
msg += ',' + String.valueOf(item.position.x) + ',' + String.valueOf(item.position.y);
flag = true;
}
msg += ']';
if(flag == false) return 2;
//System.out.println("search!");
SendMsg(msg);
return 0;
}
public void OffLine() {
if(myID != -1) {
String msg = "[O," + myID + ']';
SendMsg(msg);
}
}
}
//*******************************************************mobile Internet wisdom city WiFi********************************************//
//*******************************************************mobile Internet wisdom city WiFi********************************************//
//*******************************************************mobile Internet wisdom city WiFi********************************************//