Android客戶端程序代碼

//*******************************************************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(mListenermSensorManager.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.xmid.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 (isClosedreturn;

     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 (isClosedreturn "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_xpeopleList.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 (isClosedreturn;

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 == falsereturn 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********************************************//

發佈了223 篇原創文章 · 獲贊 20 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章