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

标签 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 中使用相同的程序,但它没有连接到套接字并且因为没有互联网连接(因为它没有连接到 WIFI)很明显!!

我阅读了一些关于 stackoverflow 的相关主题,但我仍然不确定该怎么做??

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

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

谁能帮我解答这个问题。

最佳答案

不幸的是,这是不可能的,因为 Android Wear 设备不能直接访问互联网(因此不能使用套接字、HttpURLConnection 或任何类似的东西)。参见示例:

从可穿戴设备“输出”数据的唯一受支持方法是使用您提到的文章 (Data Layer) 中所述的数据或消息 API。

关于java - 如何从Android Wear进行Socket连接并向服务器发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260618/

相关文章:

java - 表格不绘制以下行

java - Android MediaPlayer 不会通过单击另一个按钮而停止

java - 检查 Java 中的 "nested"null 属性

java - HibernateForeignKey映射注释

java - LibGDX ScrollPane 显示黑屏

android - 在android中裁剪图像

c++ - 从 DLL 中建立 tcp 连接

Python 套接字被绞死 - 有时(客户端与闪存连接) - python 3.2

Java Socket 接收和发送数据 (JSON-RPC 2.0)

java - 开始播放多播流时 VideoView 延迟(只是有时)