如何使用蓝牙发送不断变化的传感器数据?

How to send constantly changing sensor data using bluetooth?

我正在尝试在 Android Studio 中使用蓝牙从光传感器发送光数据。一旦用户按下按钮,传感器值应该不断更新并发送到另一个 phone.

我修改了网上找到的一些蓝牙代码;然而,光传感器值不会不断更新,它只是显示按下按钮时传感器的值。

我试过设置一个定时器,在设置开始标志后每 5 秒运行一次,以便不断发送来自光传感器的新值,但它不起作用。

有什么方法可以在按下按钮后对传感器进行采样并发送不断更新的传感器数据吗?提前致谢。

这是获取传感器读数并将其传递给按钮侦听器的代码:

@Override
public void onSensorChanged(SensorEvent sensorEvent) {

    Sensor sensor = sensorEvent.sensor;

    if (sensor.getType() == Sensor.TYPE_LIGHT) {
        lightText.setText("Light = " + sensorEvent.values[0]);

        float lightTemp = sensorEvent.values[0];
        implementListeners(lightTemp);
    }
}

按钮侦听器 - 侦听用户按下开始按钮,然后将传感器读数写入代码的蓝牙部分(然后发送到另一个 phone):

private void implementListeners(final float lightTemp) {
.
.
.
.
    startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int startFlag=1;
           checkStartFlag(startFlag);
        }

        private void checkStartFlag(int startFlag) {
            if (startFlag==1){
                Timer timer = new Timer ();
                TimerTask checkSec = new TimerTask () {
                    @Override
                    public void run () {
                        String string= String.valueOf(lightTemp);
                        sendReceive.write(string.getBytes());
                    }
                };
                timer.schedule (checkSec, 0l, 5000);   // Check every 1 sec
            }
        }
    });
}

您的代码中发生了很多事情,所以让我试着解释一下当前发生的事情。当您获得新的灯光值时,您可以更改开始按钮的点击侦听器以开始通过蓝牙发送该值。但是,由于您将 lightTemp 传递给 implementListeners 函数,因此当 onSensorChanged 再次触发时它不会改变。因此,每 5 秒设置一个计时器 运行 可能会起作用,但它不会发送新值,而是发送之前的旧值。因此,我们需要做的是在传感器值发生变化时发送数据,而不是在按下按钮时发送数据。

解决此问题的最佳方法可能是在您的 class 中设置一个状态变量,当您点击开始按钮时该变量会更新。

private boolean sendData = false;

//...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Your existing code in onCreate goes here

    startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sendData = !sendData; // Toggles whether we're sending data or not.
                                  // You can also just set it to true if you don't
                                  // want toggling behaviour.
        }
    });
}

现在,如果我们启用了数据发送,我们需要实际发送数据。我们可以更改您的 onSensorChanged 方法来检查我们之前定义的状态变量,然后如果我们的状态是 true:

则发送数据
@Override
public void onSensorChanged(SensorEvent sensorEvent) {

    Sensor sensor = sensorEvent.sensor;

    if (sensor.getType() == Sensor.TYPE_LIGHT) {
        lightText.setText("Light = " + sensorEvent.values[0]);

        if(sendData) { // check if we've enabed data sending
            String lightTemp = String.valueOf(sensorEvent.values[0]); // get the sensor value as a string
              sendReceive.write(lightTemp.getBytes()); // send the string over bluetooth
        }

    }
}

您的应用程序现在应该在您点击开始按钮后每次光传感器值更新时通过蓝牙发送数据。