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)
- Utilizar el mismo fragmento varias veces en la misma actividad / diseño
- Android: EditText causando una pérdida de memoria
- Superponiendo un lienzo en la parte superior de una vista de superficie, Flashes
- Cómo agregar iconos a elementos en un cajón de navegación
- Selector xml de Android para diseños
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.
- Android: SMSManager - Intento de obtener longitud de matriz nula
- Cómo mostrar el pin de ubicación de la parte visible de un mapview en android?
- Excluyendo archivos .class de Gradle dependecy
- GetChildDrawingOrder llamado / utilizado de forma errática?
- Manejador o temporizador android
- Lectura de un archivo de texto línea por línea en android
- Android (JSONObject) ¿Cómo puedo recorrer un objeto JSON plano para obtener cada clave y cada valor
- Cómo tomar una captura de pantalla dentro de mi aplicación Android
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"); } } } }
- Añadir RxJava Observer en cadena dependiendo de una condición
- SignalR android SDK sólo funciona en conexión WiFi