2014-02-19 3 views
3

В настоящее время я пытаюсь подключить модуль Bluetooth HC-05 с Android, чтобы он отправил байты через модуль на устройство Android. Я обокрал некоторый код почти непосредственно со страницы разработчика Android: http://developer.android.com/guide/topics/connectivity/bluetooth.html#ManagingAConnectionУправление подключением Bluetooth Android

Адрес Main. Проблема, с которой я сталкиваюсь, заключается в том, что mhandler не получает случай MESSAGE_READ, а это значит, что я не получаю данные из моего модуля. Мне было интересно, что мне нужно сделать, чтобы отправить данные для запуска этого случая MESSAGE_READ? Пока программа соединяет устройство и отправляет «успешно подключен» к моему arduino.

Здесь также задан вопрос, который, вероятно, сформулировал его лучше меня, на который не ответил, поэтому я думаю, что я не единственный.

https://stackoverflow.com/questions/20088856/no-data-buffered-from-bluetooth-module

Различие я вижу в нашем коде в основном в том, что он не заводится() его connectedThread(). Спасибо за помощь!

public class Main_Activity extends Activity implements OnItemClickListener { 

ArrayAdapter<String> listAdapter; 

ListView listView; 
BluetoothAdapter btAdapter; 
Set<BluetoothDevice> devicesArray; 
ArrayList<String> pairedDevices; 
ArrayList<BluetoothDevice> devices; 
public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
protected static final int SUCCESS_CONNECT = 0; 
protected static final int MESSAGE_READ = 1; 
IntentFilter filter; 
BroadcastReceiver receiver; 
String tag = "debugging"; 
Handler mHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     // TODO Auto-generated method stub 
     Log.i(tag, "in handler"); 
     super.handleMessage(msg); 
     switch(msg.what){ 
     case SUCCESS_CONNECT: 
      // DO something 
      ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj); 
      //Toast.makeText(getApplicationContext(), "CONNECT", 0).show(); 
      String s = "successfully connected"; 
      connectedThread.write(s.getBytes());     
      Log.i(tag, "connected"); 

      break; 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[])msg.obj; 
      String string = new String(readBuf); 
      Toast.makeText(getApplicationContext(), string, 0).show();    
      break; 

     } 
    } 

}; 

Вот код, который должен послать обработчик вверх:

private class ConnectThread extends Thread { 

     private final BluetoothSocket mmSocket; 
     private final BluetoothDevice mmDevice; 

     public ConnectThread(BluetoothDevice device) { 
      // Use a temporary object that is later assigned to mmSocket, 
      // because mmSocket is final 
      BluetoothSocket tmp = null; 
      mmDevice = device; 
      Log.i(tag, "construct"); 
      // Get a BluetoothSocket to connect with the given BluetoothDevice 
      try { 
       // MY_UUID is the app's UUID string, also used by the server code 
       tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 
      } catch (IOException e) { 
       Log.i(tag, "get socket failed"); 

      } 
      mmSocket = tmp; 
     } 

     public void run() { 
      // Cancel discovery because it will slow down the connection 
      btAdapter.cancelDiscovery(); 
      Log.i(tag, "connect - run"); 
      try { 
       // Connect the device through the socket. This will block 
       // until it succeeds or throws an exception 
       mmSocket.connect(); 
       Log.i(tag, "connect - succeeded"); 
      } catch (IOException connectException) { Log.i(tag, "connect failed"); 
       // Unable to connect; close the socket and get out 
       try { 
        mmSocket.close(); 
       } catch (IOException closeException) { } 
       return; 
      } 

      // Do work to manage the connection (in a separate thread) 

      mHandler.obtainMessage(SUCCESS_CONNECT, mmSocket).sendToTarget(); 
     } 



     /** Will cancel an in-progress connection, and close the socket */ 
     public void cancel() { 
      try { 
       mmSocket.close(); 
      } catch (IOException e) { } 
     } 
    } 

    private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 

     public ConnectedThread(BluetoothSocket socket) { 
      mmSocket = socket; 
      InputStream tmpIn = null; 
      OutputStream tmpOut = null; 

      // Get the input and output streams, using temp objects because 
      // member streams are final 
      try { 
       tmpIn = socket.getInputStream(); 
       tmpOut = socket.getOutputStream(); 
      } catch (IOException e) { } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 
     } 

     public void run() { 
      byte[] buffer; // buffer store for the stream 
      int bytes; // bytes returned from read() 

      // Keep listening to the InputStream until an exception occurs 
      while (true) { 


       try { 

        // Read from the InputStream 
        buffer = new byte[1024]; 
        bytes = mmInStream.read(buffer); 
        // Send the obtained bytes to the UI activity 
        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget(); 

       } catch (IOException e) { 
        break; 
       } 
      } 
     } 

ответ

0

Я помню, что аналогичная проблема с обработчиком. это было давно, поэтому я не помню всех подробностей, но это было связано с mHandler.sendToTarget. Я думаю, что есть метод mHandler.dispatchMessage (или что-то вроде этого - я не на своем программном ПК, поэтому я не могу проверить это прямо сейчас). Вам следует попробовать.

0

Вы уверены, что строка «успешно подключена» действительно принимает ардуино? Фрагмент кода не выводит метод записи связанного потока. Обратитесь к исходному коду bluetoothchat, доступному в android sdk.

Пара областей для вас, чтобы искать:

1) на соединение резьбы не закрывается до уставившись подключен нить.

2) Определение констант SUCCESS_CONNECT & MESSAGE_READ. Они являются частными, но доступны из другого класса. В источнике bluetoothchat они определяются как общедоступные.

Кроме того, ссылаясь эти константы из другого класса, мы должны относиться к классу, где они определены, то есть направлять их, как показано ниже:

Main_Activity.SUCCESS_CONNECT 
Main_Activity.MESSAGE_READ. 
1

Использование нитей просто неправильно.

Создание объекта потока не запускает физическую нить!

Следовательно, как и вы, потенциально медленная функция создателя сокета в , конструктор объекта потока снова ошибочен.

И, поскольку вы не запустили() - отредактировали свою нить, сокет connect() никогда не вызывается!

Пожалуйста, попробуйте что-то вдоль этих линий:

class ConnectThread extends Thread { 

    public ConnectThread(BluetoothDevice device) { 
      // nothing long running here! 
    } 

    public void run() { 
     device.createRfcommSocketToServiceRecord(MY_UUID); 

     // followed by connect() etc. 
    } 
} 

Не забудьте активировать поток, не вызывая

connectedThread.start(); 

Иначе ничего не произойдет.

Смежные вопросы