2014-12-02 43 views
4

這個方案是採用Socket編程派配備陀螺儀和加速度計信息(6位數字)到服務器。怎麼做Socket連接和Android的數據發送到服務器穿

我的問題是如何做的Socket連接和(使用Socket連接)

下面是完整的程序::

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import com.example.helloandroid.R; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class HelloAndroid extends Activity implements SensorEventListener,Runnable { 
    private SensorManager sensorManager; 

    TextView x1; // declare X axis object 
    TextView y1; // declare Y axis object 
    TextView z1; // declare Z axis object 

    TextView x2; // declare X axis object 
    TextView y2; // declare Y axis object 
    TextView z2; // declare Z axis object 

    String x1Str,y1Str,z1Str,x2Str,y2Str,z2Str ; 
    String oldX1,oldY1,oldZ1,oldX2,oldY2,oldZ2; 

    Button sendAtATime,startContinous,dataChanged; 
    private boolean startStop = false ,valueChanged = true; 

    Context context ; 

    public HelloAndroid(){} 

    public HelloAndroid(String x1Str, String y1Str, String z1Str, String x2Str, 
      String y2Str, String z2Str) { 
     super(); 
     this.x1Str = x1Str; 
     this.y1Str = y1Str; 
     this.z1Str = z1Str; 
     this.x2Str = x2Str; 
     this.y2Str = y2Str; 
     this.z2Str = z2Str; 
    } 

    @SuppressLint("NewApi") @Override 
    public void onCreate(Bundle savedInstanceState){ 
     context = getApplicationContext(); 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
      .detectDiskReads() 
      .detectDiskWrites() 
      .detectNetwork() // or .detectAll() for all detectable problems 
      .penaltyLog() 
      .build()); 
      StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
      .detectLeakedSqlLiteObjects() 
      .detectLeakedClosableObjects() 
      .penaltyLog() 
      .penaltyDeath() 
      .build()); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     x1=(TextView)findViewById(R.id.x1); // create X axis object 
     y1=(TextView)findViewById(R.id.y1); // create Y axis object 
     z1=(TextView)findViewById(R.id.z1); // create Z axis object 

     x2=(TextView)findViewById(R.id.x2); // create X axis object 
     y2=(TextView)findViewById(R.id.y2); // create Y axis object 
     z2=(TextView)findViewById(R.id.z2); // create Z axis object 

     sendAtATime = (Button)findViewById(R.id.sendAtATime); 
     startContinous = (Button)findViewById(R.id.startContinuous); 

     sendAtATime.setOnClickListener(buttonSendOnClickListener); 
     startContinous.setOnClickListener(buttonContinuousClickListener); 

     sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE); 
     // add listener. The listener will be HelloAndroid (this) class 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
       SensorManager.SENSOR_DELAY_NORMAL); 

     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    public void onAccuracyChanged(Sensor sensor,int accuracy){ 
    } 

    public void onSensorChanged(SensorEvent event) 
    { 
     // check sensor type 
     if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) 
     { 
      oldX1 = x1.getText().toString(); 
      oldY1 = y1.getText().toString(); 
      oldZ1 = z1.getText().toString(); 

      // assign directions/ 
      float x=event.values[0]; 
      float y=event.values[1]; 
      float z=event.values[2]; 

      x1.setText("X1: "+x); 
      y1.setText("Y1: "+y); 
      z1.setText("Z1: "+z); 

     } 
     if(event.sensor.getType()==Sensor.TYPE_ORIENTATION) 
     { 
      oldX2 = x2.getText().toString(); 
      oldY2 = y2.getText().toString(); 
      oldZ2 = z2.getText().toString(); 

      // assign directions/ 
      float x=event.values[0]; 
      float y=event.values[1]; 
      float z=event.values[2]; 

      x2.setText("X2: "+x); 
      y2.setText("Y2: "+y); 
      z2.setText("Z2: "+z); 
     } 

     if(x1.getText().toString().equals(oldX1) && y1.getText().toString().equals(oldY1) 
     && z1.getText().toString().equals(oldZ1) && x2.getText().toString().equals(oldX2) 
     && y2.getText().toString().equals(oldY2) && z2.getText().toString().equals(oldZ2)) 
     { 
      valueChanged = false; 
     } 
     else 
     { 
      valueChanged = true; 
     } 
     if(startStop && valueChanged) 
     { 

      Thread aThread = new Thread(new HelloAndroid(x1.getText().toString() 
                 ,y1.getText().toString() 
                 ,z1.getText().toString() 
                 ,x2.getText().toString() 
                 ,y2.getText().toString() 
                 ,z2.getText().toString())); 
      aThread.run(); 
     } 
    } 

    Button.OnClickListener buttonContinuousClickListener = new Button.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      if(startStop) 
      { 
       startStop = false; 
       startContinous.setText("Send Continous"); 
       return; 
      } 
      startStop = true; 
      startContinous.setText("StopContinous"); 
     } 
    }; 
    Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener() 
    { 
     public void onClick(View arg0) 
     { 
      Thread aThread = new Thread(new HelloAndroid(x1.getText().toString() 
                 ,y1.getText().toString() 
                 ,z1.getText().toString() 
                 ,x2.getText().toString() 
                 ,y2.getText().toString() 
                 ,z2.getText().toString())); 
      aThread.run(); 
     } 
    }; 
    public void run() 
    { 
     Socket socket = null; 
     DataOutputStream dataOutputStream = null; 
     DataInputStream dataInputStream = null; 

     try 
     { 
       socket = new Socket("192.168.1.107", 5000); 
       dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
       dataInputStream = new DataInputStream(socket.getInputStream()); 
       dataOutputStream.writeUTF("\nAcceleration Values :\n" 
             +x1Str+"\n" 
             +y1Str+"\n" 
             +z1Str+"\n" 
             +"Orientation Values :\n" 
             +x2Str+"\n" 
             +y2Str+"\n" 
             +z2Str+"\n"); 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
       if (socket != null) 
       { 
        try 
        { 
         socket.close(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
       if (dataOutputStream != null) 
       { 
         try 
         { 
         dataOutputStream.close(); 
         } 
         catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
       } 
       if (dataInputStream != null) 
       { 
        try 
        { 
          dataInputStream.close(); 
        } 
        catch (IOException e) 
        { 
          e.printStackTrace(); 
        } 
       } 
      } 
    }  
} 

這樣我能夠給我的傳感器將數據發送到從Android Wear服務器數據到服務器使用手機。但是,當我使用同樣的程序與Android Wear但它沒有連接到插座,因爲沒有互聯網連接的(因爲它沒有連接到WIFI)明顯!

我讀了幾計算器相關話題,但我仍然不知道如何做到這一點?

相關問題:Android wear doesn't start thread

我也看了http://developer.android.com/training/wearables/data-layer/index.html但仍試圖通過互聯網發送數據的最佳方式(不BLUETOOTH SOCKET - 因爲人可以出去側的範圍)

任何人都可以幫我這個問題。

回答

2

喜來做到這一點我不得不創建和使用Wearable.MessageApi使用GoogleApiClient

我已經張貼在Git的回購完整的代碼: - >https://github.com/mvyas85/Fall-Alarm-Wearable

由於耐磨只能使與手機藍牙連接,發送消息的主要方法是使用下面的類,它是一個線程,它使用Wearable.MessageApi從我的Android可穿戴設備發送消息給我的手機。然後手機上有Wifi連接到服務器的Socket。

/** 
* WearableMessageSender is responsible for sending messages 
* between apps and wearable devices. It manages this work 
* on its own thread. 
*/ 
public class WearableMessageSender extends Thread { 

    private static final String TAG = "WearableMessageSender"; 

    private String mPath; 
    private DeviceData mMessage; 
    private GoogleApiClient mGoogleApiClient; 
    /** 
    * Constructor to send a message to the data layer 
    * @param path Message path 
    * @param msg Message contents 
    * @param googleApiClient GoogleApiClient object 
    */ 
    public WearableMessageSender(String path, DeviceData msg, GoogleApiClient googleApiClient) { 
a 
     Log.i(TAG,"Google Api is connected"); 
     if (null == path || null == msg || null == googleApiClient) { 
      Log.e(TAG, "Invalid parameter(s) passed to WearableMessageSender"); 
      throw new IllegalArgumentException("Invalid parameter(s) passed to WearableMessageSender"); 
     } 
     mPath = path; 
     mMessage = msg; 
     mGoogleApiClient = googleApiClient; 
    } 

    public void run() { 
     // Broadcast message to call connected nodes 
     NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await(); 
     for (Node node : nodes.getNodes()) { 
      MessageApi.SendMessageResult result = null; 
      try { 
       result = Wearable.MessageApi.sendMessage(
         mGoogleApiClient, 
         node.getId(), 
         mPath, 
         DeviceData.serialize(mMessage) 
       ).await(); 
       Log.i(TAG,"Trying to send byte arr::"+DeviceData.serialize(mMessage)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      if (result.getStatus().isSuccess()) { 
       Log.d(TAG, "Message: {" + mMessage + "} successfully sent to: " + node.getDisplayName()); 
      } else { 
       Log.e(TAG, "Failed to send message to device"); 
      } 
     } 
    } 
} 
2

這是不可能的,不幸的是,由於Android Wear設備有沒有互聯網直接訪問(因此不能用插座,HttpURLConnection,或任何類似的)。參見例如:

唯一你提到的文章中描述獲取數據「出」可穿戴設備的使用數據或消息的API支持的方法( Data Layer)。

+0

是的,你是對的。我開始在我的代碼中使用數據層。不久我會在這裏發佈我的解決方案,以便其他人可以參考。 感謝matiash – Manisha 2014-12-03 02:09:36

+0

您可以實現自己的或使用現有的庫:https://github.com/takahirom/WearHttp – 2014-12-03 21:26:40

相關問題