簡體   English   中英

如何進行Socket連接並將數據從Android Wear發送到服務器

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

該程序使用套接字編程將陀螺儀和加速度計信息(6位數字)發送到服務器。

我的問題是如何進行Socket連接並將數據從Android Wear發送到服務器(使用Socket Connection)

這是完整的程序::

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();
                     }
                }
            }   
    }    
}

這樣,我可以使用Mobile Phone將Sensor數據發送到服務器。 但是,雖然我在與Android Wear一起使用同一程序,但是它沒有連接到套接字,並且由於沒有互聯網連接(因為它沒有連接到WIFI),所以很明顯!

我閱讀了關於stackoverflow的一些相關主題,但是我仍然不確定如何做到這一點?

相關問題: Android Wear無法啟動線程

我也閱讀了http://developer.android.com/training/wearables/data-layer/index.html,但仍在嘗試通過Internet發送數據的最佳方法(不要藍牙襪子-因為人可以超出范圍)

誰能幫助我解決這個問題。

不幸的是,這是不可能的,因為Android Wear設備無法直接訪問Internet(因此不能使用套接字, HttpURLConnection或任何類似方法)。 參見例如:

支持數據從“可穿戴設備”中取出的唯一方法是使用數據或消息AP,如您提到的文章所述( 數據層 )。

嗨,要做到這一點,我必須使用GoogleApiClient創建並使用Wearable.MessageApi

我已經在Git倉庫上發布了完整的代碼:-> https://github.com/mvyas85/Fall-Alarm-Wearable

由於Wearable只能與Phone建立藍牙連接,因此發送msg的主要方法是使用以下類,該類是線程,並使用Wearable.MessageApi從Android可穿戴設備向手機發送msg。 然后手機具有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");
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM