2014-12-02 2 views
4

이 프로그램은 소켓 프로그래밍을 사용하여 자이로 스코프 및 가속도계 정보 ​​(6 자리)를 서버에 전송하는 프로그램입니다.소켓 장착 및 Android Wear에서 서버로 데이터 전송

내 질문은 소켓 연결을하고

다음

이 완료 프로그램 ::

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에 연결되지 않았기 때문에) 분명히 !!

나는 stackoverflow에 관한 몇 가지 관련 주제를 읽었지만 여전히 어떻게 해야할지 잘 모르겠다 ??

관련 질문 : 나는 또한 http://developer.android.com/training/wearables/data-layer/index.html하지만 여전히 인터넷을 통해 데이터를 전송하는 가장 좋은 방법은 시도 읽어 Android wear doesn't start thread

(NOT 블루투스 소켓 - 사람이 측면 범위를 갈 수 있기 때문에)

는 사람이 질문을 좀 도와 줄래 .

답변

2

안녕 내가 망할 놈의 repo에 게시 된 전체 코드를 내가 만들어야했습니다이 작업을 수행하고 GoogleApiClient

사용 Wearable.MessageApi 사용하기 ->https://github.com/mvyas85/Fall-Alarm-Wearable

착용은 전화와 블루투스 연결을 만들 수 있기 때문에, main 메소드는 msg를 쓰고있는 클래스 인 다음 클래스를 사용합니다.이 클래스는 Wearable.MessageApi를 사용하여 Android 웨어러블에서 내 전화기로 msg를 보냅니다. 그리고 휴대 전화에 Wifi에서 서버에 연결되는 소켓이 있습니다.

/** 
* 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를 사용하고 착용 할 수있는 장치의 "OUT"데이터를 가져 오는

지원되는 유일한 방법은 (Data Layer).

+0

네 말이 맞습니다. 내 코드에서 데이터 레이어를 사용하기 시작했습니다. 곧 다른 사람이 참조를 얻을 수 있도록 여기에 내 솔루션을 게시 할 것입니다. 감사합니다. matiash – Manisha

+0

직접 구현하거나 기존 라이브러리를 사용할 수 있습니다 (https://github.com/takahirom/WearHttp). –

관련 문제