[英]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.