Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do Socket connection and send data to server from Android Wear

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.

like image 577
Manisha Avatar asked Sep 29 '22 07:09

Manisha


2 Answers

This is not possible, unfortunately, because Android Wear devices have no direct access to the Internet (and hence cannot use sockets, HttpURLConnection, or any of the like). See for example:

  • Does Android Wear support HttpURLConnection - getting EOFException
  • Direct internet connection on Android Wear?

The only supported way of getting data "out" of the Wearable device is using the Data or Message APis as described in the article you mention (Data Layer).

like image 199
matiash Avatar answered Oct 03 '22 01:10

matiash


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");
            }
        }
    }
}
like image 30
Manisha Avatar answered Oct 03 '22 01:10

Manisha