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

时间:2018-04-14 16:11:56

标签: java android bluetooth sensor

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

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

我尝试在设置启动标志后每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);
    }
}

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

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

1 个答案:

答案 0 :(得分:0)

这里的代码中有很多内容,所以让我试着解释一下目前发生了什么。当您获得新的灯光值时,您可以更改开始按钮的单击侦听器以开始通过蓝牙发送值。但是,由于您将lightTemp传递到implementListeners函数,因此当onSensorChanged再次触发时,它不会被更改。因此,每5秒运行一次计时器可能会有效,但不是发送新值,而是从之前发送旧值。因此,我们需要做的是在传感器值发生变化时发送数据,而不是在按下按钮时发送数据。

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

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
        }

    }
}

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