如何进行Socket连接并从Android Wear向服务器发送数据

时间:2014-12-02 22:56:44

标签: java android sockets wear-os

该程序使用Socket编程将陀螺仪和加速度计信息(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 相同的程序,但它没有连接到套接字,因为没有INTERNET连接(因为它没有连接到WIFI)明显!!

我在stackoverflow上阅读了一些相关的主题,但我仍然不确定如何做到这一点?

相关问题:Android wear doesn't start thread

我还阅读了http://developer.android.com/training/wearables/data-layer/index.html,但仍然尝试通过互联网发送数据的最佳方式(不是蓝牙插座 - 因为人可以走出旁边范围)

任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

不幸的是,这是不可能的,因为Android Wear设备无法直接访问Internet(因此无法使用套接字,HttpURLConnection或任何类似的套接字)。例如见:

唯一受支持的数据获取方式" out"可穿戴设备正在使用数据或消息AP,如您提到的文章(Data Layer)中所述。

答案 1 :(得分:2)

您好,我必须使用GoogleApiClient创建和使用Wearable.MessageApi

我在Git repo上发布了完整的代码: - > https://github.com/mvyas85/Fall-Alarm-Wearable

由于Wearable只能与Phone进行蓝牙连接,因此发送msg的主要方法是使用以下类,这是一个线程,并使用Wearable.MessageApi将msg从我的Android可穿戴设备发送到我的手机。然后手机上有Socket,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");
            }
        }
    }
}