2014-12-02 34 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

相关问题