我目前正在努力在Arduino(HC-06蓝牙模块)和Android手机之间实施蓝牙通信。我已经创建了许多textView.setText(...)命令,以便了解程序在运行时的反应方式。 我现在的目标是从Arduino中获取一些原始数据(仅限某些字符),并且在获取时,屏幕上会发生一些反应(就像textView更改一样)。这就是我在下面的代码中尝试实现的内容。
在目前的状态下,我遇到了以下问题:
有时mmSocket.connect();如果运行正常,Arduino蓝牙模块上的红色LED常亮显示闪烁,表示两个设备之间建立了连接。这是相当随机的,通常情况并非如此。相反,由于连接异常,我得到一个" Socket关闭。"回答,即try {}块由于某种原因没有运行。
当意外连接建立时,红色LED指示灯亮起,我的手机屏幕上看不到任何内容。通常它应该输出4个textViews,每个textViews提供有关代码不同部分的信息。我怎样才能让它实时反应?似乎.connect()使程序暂时停止,尽管我不明白为什么。
我很感激任何帮助,我对此很陌生。
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) { }
}
}
}
答案 0 :(得分:0)
通常查看你的代码没有什么明显的弹出,但阅读你的问题似乎也许Arduino没有关闭其套接字,即使你认为你已经断开手机。我不是Arduino的专家,所以这是一个更普遍的建议,因为我在使用Raspberry Pi并将其连接到Android手机时遇到了类似的问题。
特别针对您的Android代码,我建议您查看本指南: https://developer.android.com/guide/topics/connectivity/bluetooth.html
如果您打算从Arduino发送回电话,您应该考虑将电话设置为服务器和客户端,以便它可以发送和接收数据。
开发者指南非常有用,可以帮助您查看问题。另外,您可以考虑在我自己的线程中更新UI,因为我看到它也会导致问题。
我对Android开发相当陌生,但是,我不得不与英国电信合作,这个指南可以节省生命。