在安卓上使用网络套接字发送传感器的原始数据



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

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

单击按钮应读取传感器的启动,从那一刻,在每10ms中,应制作样品,并应通过插座发送采样数据。

我是否应该使用另一种asynctask来读取传感器的数据?在执行时,如何将传感器采样的数据从传感器发送到插座的异步?这种缝合的最佳实践是什么?

这是我已经hava的代码(只有插座处理,没有传感器)主动脉:

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

}

asynctask:

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

}

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

首先,您应该在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/android/hardware/sensormanager.html

最新更新