【问题标题】:How to send constantly changing sensor data using bluetooth?如何使用蓝牙发送不断变化的传感器数据?
【发布时间】:2018-04-14 16:11:56
【问题描述】:

我正在尝试使用 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
            }
        }
    });
}

【问题讨论】:

    标签: java android bluetooth sensors


    【解决方案1】:

    您的代码在这里发生了很多事情,所以让我试着解释一下目前正在发生的事情。当您获得一个新的光值时,您更改开始按钮的点击侦听器以开始通过蓝牙发送该值。但是,由于您将 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
            }
    
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多