How to do Socket connection and send data to server from Android Wear
android, java, sockets, wear-os
Solution
Hi to do this i had to create and use Wearable.MessageApi using GoogleApiClient
I have complete code posted on Git repo : --> https://github.com/mvyas85/Fall-Alarm-Wearable
Since Wearable can only make bluetooth connection with Phone, main method to send msg is using following class which is a thread and which uses Wearable.MessageApi to send msg from my Android wearable to my phone. and then phone has Socket which on Wifi connects to Server.
/**
* 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");
}
}
}
}
Problem
This program is to send Gyroscope and Accelerometer information (6 digits ) to server using Socket programing. My Question is How to do Socket connection and send data to server from Android Wear (using Socket Connection) Here is complete program :: ``` 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(); } } } } } ``` This way i was able to send Sensor data to server using Mobile phone. But while i am using same program with Android Wear but its not connecting to socket and because of NO INTERNET connection (Because its not connected to WIFI) obvious !! I read few related topics on stackoverflow but i am still not sure how to do this ?? Related question : Android wear doesn't start thread I also read http://developer.android.com/training/wearables/data-layer/index.html but still trying best way to send data over internet (NOT BLUETOOTH SOCKET - since person can go out side range) Can anyone help me with this question.