Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Android Wear进行套接字连接并向服务器发送数据_Java_Android_Sockets_Wear Os - Fatal编程技术网

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

Java 如何从Android Wear进行套接字连接并向服务器发送数据,java,android,sockets,wear-os,Java,Android,Sockets,Wear Os,该程序使用套接字编程将陀螺仪和加速度计信息(6位数字)发送到服务器 我的问题是如何进行套接字连接并从Android Wear向服务器发送数据(使用套接字连接) 以下是完整的程序: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; impo

该程序使用套接字编程将陀螺仪和加速度计信息(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设备无法直接访问互联网(因此无法使用套接字、
HttpURLConnection
,或任何类似功能)。例如,见:


从可穿戴设备获取数据的唯一受支持的方法是使用您提到的文章()中描述的数据或消息API。

嗨,要做到这一点,我必须使用GoogleAppClient创建并使用Wearable.MessageApi

我在Git repo上发布了完整的代码:-->

由于Wearable只能与手机建立蓝牙连接,发送消息的主要方法是使用以下类,该类是一个线程,使用Wearable.MessageApi将消息从我的Android Wearable发送到我的手机。然后,手机有一个插座,通过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");
            }
        }
    }
}

是的,你是对的。我开始在代码中使用数据层。不久,我将在这里发布我的解决方案,以便其他人可以获得参考。感谢您,您可以实现自己的或使用现有的库: