【问题标题】:send sensor's raw data using network socket on Android在 Android 上使用网络套接字发送传感器的原始数据
【发布时间】:2017-07-25 08:37:28
【问题描述】:

我正在尝试制作一个应用程序来读取传感器(陀螺仪)原始数据并将其实时发送到使用套接字的其他设备。 我已经通过在 AsyncTask 中使用 Java Socket 类实现了双方之间的简单通信,它可以很好地处理虚拟数据。

我不确定如何将传感器部分的整个读取原始数据与套接字部分集成。

按钮点击应该触发传感器读取的开始,从那一刻起,每 10 毫秒应该进行一次采样,并且采样数据应该通过套接字发送。

我应该使用另一个 asyncTask 从传感器读取数据吗?如何在执行时将从传感器采样的数据发送到套接字的 AsyncTask?这种情况下的最佳做法是什么?

这是我已经拥有的代码(只有套接字处理,没有传感器) 主要活动:

public class MainActivity extends AppCompatActivity {

Button btnConnect, btnCloseSocket;
EditText etIP;
EditText etPort;
boolean isConnected = false;
ConnectToServerAsyncTask connectToServerAsyncTask = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnConnect = (Button) findViewById(R.id.btn_connect);
    btnCloseSocket = (Button) findViewById(R.id.btn_closeSocket);
}

public void socketOperationRequest(View view) {

    if (!isConnected) {
        connectToServerAsyncTask = new ConnectToServerAsyncTask(MainActivity.this);
    }
    switch (view.getId()) {
        case R.id.btn_connect:
        {
            isConnected = true;
            etIP = (EditText) findViewById(R.id.et_ip);
            etPort = (EditText) findViewById(R.id.et_port);
            String IP = etIP.getText().toString();
            String port = etPort.getText().toString();
            connectToServerAsyncTask.execute(IP, port);
            btnConnect.setEnabled(false);
            btnCloseSocket.setEnabled(true);
            break;
        }
        case R.id.btn_closeSocket:
        {
            isConnected = false;
            connectToServerAsyncTask.cancel(true);
            btnCloseSocket.setEnabled(false);
            btnConnect.setEnabled(true);
            break;
        }
    }

}

}

异步任务:

public class ConnectToServerAsyncTask extends AsyncTask<String,String,String> {

Context context;
Socket socket;
OutputStream os;
//boolean running = true;

public ConnectToServerAsyncTask(Context ctx) {
    this.context = ctx;
}

@Override
protected String doInBackground(String... strings) {
    String IP = strings[0];
    String port = strings[1];
    InputStream is = null;
    int data = 1;
    try {
        InetAddress inetIP = InetAddress.getByName(IP);
        socket = new Socket(inetIP, Integer.parseInt(port));
        os = socket.getOutputStream();
        publishProgress("test");
        while(!this.isCancelled()){
            os.write(data);
            Thread.sleep(2);
        }

    } catch (UnknownHostException e) {
        publishProgress("Exception");
        e.printStackTrace();
    } catch (IOException e) {
        publishProgress("Exception2");
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    String message = values[0];
    Toast.makeText(this.context, message, Toast.LENGTH_LONG).show();
}
@Override
protected void onCancelled() {
    super.onCancelled();
    try {
        os.flush();
        os.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

对不起,我的英语不好, 谢谢

【问题讨论】:

  • 请贴出你已有的代码。
  • @Nulano 已编辑。

标签: java android android-asynctask android-sensors


【解决方案1】:

首先,您应该在SensorManager 中找到您的传感器。例如(用这个替换你的 os.write 循环,然后像你一样添加一个无限睡眠循环):

SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor gyro = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
sensorManager.registerListener(new MySensorListener(), gyro, SensorManager.SENSOR_DELAY_FASTEST);

然后你应该实现监听器,从它的onSensorChanged 方法写入操作系统。

确保在关闭流之前取消注册该侦听器 (unregisterListener)。

有关更多信息,请参阅 Android 文档:https://developer.android.com/reference/android/hardware/SensorManager.html

【讨论】:

  • 谢谢。我应该在哪里实现监听器?在我当前的 AsyncTask 中?
  • @Noam 当然可以。您只需要确保它可以访问 OutputStream,但您可以通过它的构造函数将其传入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2010-11-05
  • 1970-01-01
  • 2012-12-07
  • 2011-02-06
相关资源
最近更新 更多