Android 尝试通过蓝牙发送命令时,蓝牙连接失败

Android 尝试通过蓝牙发送命令时,蓝牙连接失败,android,android-studio,bluetooth,arduino,android-bluetooth,Android,Android Studio,Bluetooth,Arduino,Android Bluetooth,我正试图通过我自己的android studio应用程序使用加速计控制RC汽车 当按下按钮时,我通过调用函数使应用程序通过按钮工作 我试着用加速度计做同样的事情,说id,x的值小于这个,做这个,调用函数。但我无法连接到蓝牙第二次我包括我的前进功能或安迪功能发送蓝牙命令内的if语句 如果连接不成功“连接失败。是SPP蓝牙吗?请重试”。我一直收到这个消息 这是加速度计代码的一部分,我有if语句 @Override public void onSensorChanged(SensorEvent eve

我正试图通过我自己的android studio应用程序使用加速计控制RC汽车

当按下按钮时,我通过调用函数使应用程序通过按钮工作

我试着用加速度计做同样的事情,说id,x的值小于这个,做这个,调用函数。但我无法连接到蓝牙第二次我包括我的前进功能或安迪功能发送蓝牙命令内的if语句

如果连接不成功“连接失败。是SPP蓝牙吗?请重试”。我一直收到这个消息

这是加速度计代码的一部分,我有if语句

@Override
public void onSensorChanged(SensorEvent event) {

    // clean current values
    displayCleanValues();
    // display the current x,y,z accelerometer values
    displayCurrentValues();
    // display the max x,y,z accelerometer values
    displayMaxValues();

    // get the change of the x,y,z values of the accelerometer
    deltaX =(lastX - event.values[0]);
    deltaY = (lastY - event.values[1]);
    deltaZ = (lastZ - event.values[2]);

    // if the change is below 2, it is just plain noise
    if (deltaX < 2)
        DownArrow.setVisibility(View.VISIBLE);
    else
        DownArrow.setVisibility(View.INVISIBLE);

    if ((deltaZ > vibrateThreshold) || (deltaY > vibrateThreshold) || (deltaZ > vibrateThreshold)) {
        v.vibrate(50);
    }

    if (deltaX > -4) {
        UpArrow.setVisibility(View.VISIBLE);
        goForward();
    }

    if (deltaX < -4)
        UpArrow.setVisibility(View.INVISIBLE);


    if (deltaX < -7)
        DownArrow.setVisibility(View.VISIBLE);
        goBackward();

    if (deltaX > -7)
        DownArrow.setVisibility(View.INVISIBLE);
这是蓝牙代码

@Override
    protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
    {
        super.onPostExecute(result);

        if (!ConnectSuccess)
        {
            msg("Connection Failed. Is it a SPP Bluetooth? Try again.");
            finish();
        }
        else
        {
            msg("Connected.");
            isBtConnected = true;
        }
        progress.dismiss();
    }
我在我的按钮视图中也做了同样的事情,效果很好

btnUp.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                btnUp.setBackgroundResource(R.drawable.button_arrow_green_up_select);
                goForward();
                return true;
            }
            if (event.getAction() == MotionEvent.ACTION_UP) {
                btnUp.setBackgroundResource(R.drawable.button_arrow_green_up);
                Stop();
            }

            return false;
        }
    });

为什么总是失败?

我做了一个有趣的项目,当任何人晃动android手机时,打开led。我使用arduino和HC-05与android和LED进行通信。我认为问题在于,您正在通过蓝牙在UI线程中发送“F”和“8”值。因此,创建其他线程通过蓝牙发送值

我正在分享我的部分代码,我想这将是充分利用

 mmOutputstream=socket.getOutputStream();


@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        mGravity = event.values.clone();
        // Shake detection
        float x = mGravity[0];
        float y = mGravity[1];
        float z = mGravity[2];
        int check=0;
        mAccelLast = mAccelCurrent;
        mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z);
        float delta = mAccelCurrent - mAccelLast;
        mAccel = mAccel * 0.9f + delta;

        Log.d("TAG",data);
    // Make this higher or lower according to how much
            // motion you want to detect
       if(connection){
           if(mAccel<-2.0f)
           {
               check=10;
           }
           if(mAccel>-2.4f){
               check=0;
           }

       new arduinosend().execute(check);
       }
    }

}

class arduinosend extends AsyncTask<Integer, Integer, String>
{


    @Override
    protected String doInBackground(Integer... params) {
        // TODO Auto-generated method stub
        try {

            mmOutputstream.write(params[0]);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }





}
mmOutputstream=socket.getOutputStream();
@凌驾
传感器更改时的公共无效(传感器事件){
//TODO自动生成的方法存根
if(event.sensor.getType()==sensor.TYPE\u加速计){
mGravity=event.values.clone();
//震动检测
float x=mGravity[0];
浮动y=mGravity[1];
float z=mGravity[2];
整数检查=0;
mAccelLast=MaccellCurrent;
mAccelCurrent=FloatMath.sqrt(x*x+y*y+z*z);
浮动增量=mAccelCurrent-mAccelLast;
麦赛尔=麦赛尔*0.9f+三角洲;
Log.d(“标签”,数据);
//根据价格高低来决定价格
//要检测的运动
如果(连接){
如果(mAccel-2.4f){
检查=0;
}
新的结束()。执行(检查);
}
}
}
类结束扩展异步任务
{
@凌驾
受保护字符串doInBackground(整数…参数){
//TODO自动生成的方法存根
试一试{
mmOutputstream.write(参数[0]);
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
}

那么您的数据通信类型是什么?SPP还是BLE?我使用的是HC 06蓝牙模块,我认为它是一个BLE。我的按钮模式工作得很好。只有当我尝试在加速计的if语句中发送命令时,它才会失败。您好,很抱歉,我使用的是SPP。
 mmOutputstream=socket.getOutputStream();


@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
        mGravity = event.values.clone();
        // Shake detection
        float x = mGravity[0];
        float y = mGravity[1];
        float z = mGravity[2];
        int check=0;
        mAccelLast = mAccelCurrent;
        mAccelCurrent = FloatMath.sqrt(x*x + y*y + z*z);
        float delta = mAccelCurrent - mAccelLast;
        mAccel = mAccel * 0.9f + delta;

        Log.d("TAG",data);
    // Make this higher or lower according to how much
            // motion you want to detect
       if(connection){
           if(mAccel<-2.0f)
           {
               check=10;
           }
           if(mAccel>-2.4f){
               check=0;
           }

       new arduinosend().execute(check);
       }
    }

}

class arduinosend extends AsyncTask<Integer, Integer, String>
{


    @Override
    protected String doInBackground(Integer... params) {
        // TODO Auto-generated method stub
        try {

            mmOutputstream.write(params[0]);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }





}