为什么我的程序使用.connect()连接到Arduino的蓝牙模块时遇到麻烦?

时间:2017-07-31 14:04:28

标签: android sockets bluetooth

我目前正在努力在Arduino(HC-06蓝牙模块)和Android手机之间实施蓝牙通信。我已经创建了许多textView.setText(...)命令,以便了解程序在运行时的反应方式。 我现在的目标是从Arduino中获取一些原始数据(仅限某些字符),并且在获取时,屏幕上会发生一些反应(就像textView更改一样)。这就是我在下面的代码中尝试实现的内容。

在目前的状态下,我遇到了以下问题:

  1. 有时mmSocket.connect();如果运行正常,Arduino蓝牙模块上的红色LED常亮显示闪烁,表示两个设备之间建立了连接。这是相当随机的,通常情况并非如此。相反,由于连接异常,我得到一个" Socket关闭。"回答,即try {}块由于某种原因没有运行。

  2. 当意外连接建立时,红色LED指示灯亮起,我的手机屏幕上看不到任何内容。通常它应该输出4个textViews,每个textViews提供有关代码不同部分的信息。我怎样才能让它实时反应?似乎.connect()使程序暂时停止,尽管我不明白为什么。

  3. 我很感激任何帮助,我对此很陌生。

    import android.bluetooth.BluetoothSocket;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.Intent;
    import android.widget.TextView;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Set;
    import java.util.UUID;
    
    public class MainActivity extends AppCompatActivity {
    
    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothDevice mDevice;
    private ConnectThread mConnectThread;
    private Thread workerThread;
    private String MAC = "30:14:10:17:06:93";
    private boolean stopWorker;
    private int readBufferPosition;
    private byte readBuffer[];
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        TextView supportsBTorNot = (TextView) findViewById(R.id.supportsBTorNot);
        TextView listPairedDevices = (TextView) findViewById(R.id.listPairedDevices);
    
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    
        if (mBluetoothAdapter == null) {
            supportsBTorNot.setText("The device does not support bluetooth.");
        }
        else{
            if (!mBluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, 1);
            }
            else{
                supportsBTorNot.setText("The device supports bluetooth.");
            }
        }
    
        Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
        listPairedDevices.setText(pairedDevices.toString());
        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                if(device.getAddress().equals(MAC)) {
                    mDevice = device;
                    break;
                }
            }
        }
        if (mDevice == null) {
            //Device is not paired yet
            //Need to initiate a connection request
        }
    
        mConnectThread = new ConnectThread(mDevice);
        mConnectThread.start();
    }
    
    
    private class ConnectThread extends Thread {
    
        private final BluetoothSocket mmSocket;
        private ConnectedThread mConnectedThread;
        private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    
        TextView socketConnected = (TextView) findViewById(R.id.socketConnected);
    
        public ConnectThread(BluetoothDevice device) {
            BluetoothSocket tmp = null;
            try {
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) {
                socketConnected.setText("Socket's create() method failed");
            }
            mmSocket = tmp;
            run();                                                                                          }
    
        public void run() {
            mBluetoothAdapter.cancelDiscovery();
    
            try {
                mmSocket.connect();                                                                             } catch (IOException connectException) {                                                                socketConnected.setText("Socket closed due to connect exception."); 
                try {                                                                                                   mmSocket.close();
                } catch (IOException closeException) {
                    socketConnected.setText("Could not close the client socket.");
                }
                return;
            }
            if (mmSocket.toString() != null) {
                socketConnected.setText("The socket is established successfully.");
            }
            else {
                socketConnected.setText("The socket could not be stablished.");
            }
    
            mConnectedThread = new ConnectedThread(mmSocket);
            mConnectedThread.start();
        }
    
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                socketConnected.setText("Could not close the client socket.");
            }
        }
    }
    
    
    private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final OutputStream mmOutStream;
        TextView socketReadyForDataAquisition = (TextView) findViewById(R.id.socketReadyForDataAquisition);
    
        public ConnectedThread(BluetoothSocket socket) {
    
            mmSocket = socket;
            InputStream tmpIn = null;
    
            try {
                socketReadyForDataAquisition.setText("Querying the input stream has started.");
                tmpIn = socket.getInputStream();
            } catch (IOException e) {
                socketReadyForDataAquisition.setText("Querying of input suspended due to IOException!");
            }
    
            beginListenForData(tmpIn);
        }
    
        public void beginListenForData(InputStream iStream)
        {
            final Handler handler = new Handler();
            final InputStream mmInputStream = iStream;
    
            stopWorker = false;
            readBufferPosition = 0;
            readBuffer = new byte[1024];
    
            workerThread = new Thread(new Runnable()
            {
                public void run()
                {
                    while(!Thread.currentThread().isInterrupted() && !stopWorker)
                    {
                        try
                        {
                            int bytesAvailable = mmInputStream.available();
                            if(bytesAvailable > 0)
                            {
                                final byte[] packetBytes = new byte[bytesAvailable];
                                mmInputStream.read(packetBytes);
                                if(packetBytes != null) {
                                    socketReadyForDataAquisition.setText("DATA ARRIVED");
                                }
                            }
    
    
                        }
                        catch (IOException ex)
                        {
                            stopWorker = true;
                        }
                    }
                }
            });
    
            workerThread.start();
    
    
        }
    
        public void write(byte[] bytes) {
            try {
                mmOutStream.write(bytes);
            } catch (IOException e) { }
        }
    
        public void cancel() {
            try{
                mmSocket.close();
            } catch (IOException e) { }
        }
    
    }
    

    }

1 个答案:

答案 0 :(得分:0)

通常查看你的代码没有什么明显的弹出,但阅读你的问题似乎也许Arduino没有关闭其套接字,即使你认为你已经断开手机。我不是Arduino的专家,所以这是一个更普遍的建议,因为我在使用Raspberry Pi并将其连接到Android手机时遇到了类似的问题。

特别针对您的Android代码,我建议您查看本指南: https://developer.android.com/guide/topics/connectivity/bluetooth.html

如果您打算从Arduino发送回电话,您应该考虑将电话设置为服务器和客户端,以便它可以发送和接收数据。

开发者指南非常有用,可以帮助您查看问题。另外,您可以考虑在我自己的线程中更新UI,因为我看到它也会导致问题。

我对Android开发相当陌生,但是,我不得不与英国电信合作,这个指南可以节省生命。