Cómo hacer conexión de Socket y enviar datos al servidor desde Android Wear

Este programa es para enviar información de Giroscopio y Acelerómetro (6 dígitos) al servidor usando la programación de Socket.

Mi pregunta es Cómo hacer la conexión de Socket y enviar datos al servidor desde Android Wear (con Socket Connection)

Aquí está el programa completo ::

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(); } } } } } 

De esta manera pude enviar los datos del sensor al servidor usando el teléfono móvil . Pero mientras estoy usando el mismo programa con Android Wear, pero su no conexión a socket y debido a la conexión NO INTERNET (porque no está conectado a WIFI) obvio!

He leído algunos temas relacionados en stackoverflow, pero todavía no estoy seguro de cómo hacer esto ??

Pregunta relacionada: desgaste de Android no inicia subproceso

También he leído http://developer.android.com/training/wearables/data-layer/index.html pero todavía está intentando la mejor manera de enviar datos sobre internet (NO BLUETOOTH SOCKET – puesto que la persona puede ir hacia fuera la gama lateral)

Puede alguien ayudarme con esta pregunta.

Esto no es posible, por desgracia, porque los dispositivos Android Wear no tienen acceso directo a Internet (y por lo tanto no pueden usar sockets, HttpURLConnection o cualquiera de los similares). Véase, por ejemplo:

  • ¿Soporta Android Wear HttpURLConnection – obtener EOFException
  • ¿Conexión directa a Internet en Android Wear?

La única forma admitida de obtener datos "fuera" del dispositivo Wearable es usar los datos o mensajes APis como se describe en el artículo que menciona ( capa de datos ).

Hola para hacer esto tuve que crear y usar Wearable.MessageApi con GoogleApiClient

Tengo código completo publicado en el reporte de Git: -> https://github.com/mvyas85/Fall-Alarm-Wearable

Ya que Wearable sólo puede hacer conexión Bluetooth con el teléfono, método principal para enviar msg está usando la siguiente clase que es un hilo y que usa Wearable.MessageApi para enviar msg de mi Android portátil a mi teléfono. Y luego el teléfono tiene Socket que en Wifi se conecta al servidor.

 /** * 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"); } } } } 
  • ¿El método ArrayList.clear () libera memoria?
  • Uso de Google Guava con Android 1.6
  • Daga 2 - dos proporciona el método que proporcionan la misma interfaz
  • Wakelock y wifilock no funcionan
  • Buscar la vista de padre por id
  • Establecer el límite inferior del número de estrellas que se muestran en RatingBar Android
  • Android ClassNotFoundException: No encontró la clase en el path
  • Android EditText con word-wrap pero sin devoluciones duras
  • Vista de cuadrícula personalizada con rango de fila y extensión de columna
  • Patrón de Android AsyncTask / doInBackground
  • Problema al asignar una instancia de calendario a otra
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.