Адаптер Android Bluetooth для чтения btrs232

#android

#Android

Вопрос:

Я пишу простую программу связи между устройством Android 2.2 и адаптером Bluetooth RS232.

Мне удалось успешно подключиться и отправить текст, но при чтении с адаптера приложение вылетает.

Я действительно ценю любую помощь и совет. Спасибо

main.xml файл:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
 android:id="@ id/text_messages"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button android:text="Button" android:id="@ id/button_listen" 
android:layout_width="wrap_content" android:layout_height="wrap_content">
</Button>
</LinearLayout>
  

MyActivity.java

 package com.epostech.bt232test;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;
import java.util.Vector;

import android.app.Activity;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
//import android.widget.ArrayAdapter;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MyActivity extends Activity {
    private static final int REQUEST_ENABLE_BT = 3;
    private String mac = "";
    private static final UUID MY_UUID_INSECURE = UUID
            .fromString("00001101-0000-1000-8000-00805F9B34FB");
    private BluetoothSocket clientSocket;
    // private ArrayAdapter<String> mArrayAdapter;
    private Vector<String> deviceMacs = new Vector<String>();
    private Vector<String> deviceNames = new Vector<String>();
    @SuppressWarnings("unused")
    private Handler handler = new Handler();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TextView messageText = (TextView) findViewById(R.id.text_messages);

        // messageText.setVisibility(View.VISIBLE);
        setContentView(R.layout.main);

        Button listenButton = (Button) findViewById(R.id.button_listen);
        listenButton.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // closeSocket();
                sendMessage(clientSocket, "Prn");
                // testing(mac);
            }
        });
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
        String toastText = "";
        /*
         * if(bluetooth.isEnabled()){ String address= bluetooth.getAddress();
         * String name=bluetooth.getName(); toastText=name " : " address;
         * 
         * } else
         */
        if (!bluetooth.isEnabled()) {
            toastText = "Bluetooth is not Enabled!";
            Toast.makeText(this, toastText, Toast.LENGTH_LONG).show();
            Intent enableBtIntent = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            Toast.makeText(this, "BlueTooth Enabled", Toast.LENGTH_LONG).show();
        }

        Set<BluetoothDevice> pairedDevices = bluetooth.getBondedDevices();
        // Toast.makeText(this,"Size=" pairedDevices.size(),
        // Toast.LENGTH_LONG).show();

        // If there are paired devices

        if (pairedDevices.size() > 0) {
            // Loop through paired devices
            for (BluetoothDevice device : pairedDevices) {
                // Add the name and address to an array adapter to show in a
                // ListView
                deviceMacs.add(device.getAddress());
                deviceNames.add(device.getName());

            }
        } else {
            Toast.makeText(this, "Size="   pairedDevices.size(),
                    Toast.LENGTH_LONG).show();
        }

        mac = deviceMacs.get(deviceNames.indexOf("M7705B0125"));
        BluetoothDevice device = bluetooth.getRemoteDevice(mac);
        try {
            clientSocket = device
                    .createRfcommSocketToServiceRecord(MY_UUID_INSECURE);
            clientSocket.connect();
            // TODO Transfer data using the Bluetooth Socket

        } catch (IOException e) {
            Log.d("BLUETOOTH", e.getMessage());

        }

        BluetoothSocketListener bsl = new BluetoothSocketListener(clientSocket, handler, messageText);
        Thread messageListener = new Thread(bsl);
        messageListener.start();
    }

    private void closeSocket() {
        try {
            clientSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void sendMessage(BluetoothSocket socket, String msg) {
        OutputStream outStream;
        try {
            outStream = socket.getOutputStream();
            byte[] byteString = msg.getBytes();
            byteString[byteString.length - 1] = 0;
            outStream.write(byteString);
        } catch (IOException e) {
            Log.d("BLUETOOTH_COMMS", e.getMessage());
        }
    }

    // The Handler that gets information back from the BluetoothChatService

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        closeSocket();
    }

}
  

BluetoothSocketListener.java

 package com.epostech.bt232test;

import java.io.IOException;
import java.io.InputStream;

import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;


public class BluetoothSocketListener implements Runnable {

      private BluetoothSocket socket;
      private TextView textView;
      private Handler handler;

      public BluetoothSocketListener(BluetoothSocket socket, 
                                     Handler handler, TextView textView) {
        this.socket = socket;
        this.textView = textView;
        this.handler = handler;
      }
      public void run() { 

          byte[] buffer = new byte[1024]; 
          int bytes; 
          InputStream instream=null;
        try {
            instream = socket.getInputStream();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
          String message = "";
          // Keep listening to the InputStream while connected 
          while (true) { 
              try { 
                  // Read from the InputStream 
                  bytes = instream.read(buffer); 
                  message = message   new String(buffer, 0, bytes); 
                  // Send the obtained bytes to the UI Activity 
                  handler.post(new MessagePoster(textView, message));

              } catch (IOException e) { 

                  break; 
              } 
          } 
      } 


      /*  
  public void run() {
    int bufferSize = 256;
    byte[] buffer = new byte[bufferSize];      
    try {
      InputStream instream = socket.getInputStream();
      int bytesRead = -1;
      String message = "";
      while (true) {
        message = "";
        bytesRead = instream.read(buffer);
        if (bytesRead != -1) {
          while ((bytesRead==bufferSize)amp;amp;(buffer[bufferSize-1] != 0)) {
            message = message   new String(buffer, 0, bytesRead);
            bytesRead = instream.read(buffer);
          }
          message = message   new String(buffer, 0, bytesRead - 1); 

          handler.post(new MessagePoster(textView, message));              
          //socket.getInputStream();
        }
      }
    } catch (IOException e) {
      Log.d("BLUETOOTH_COMMS", e.getMessage());
    } 
  }
  */
}
  

MessagePoster.java

 package com.epostech.bt232test;

import android.widget.TextView;

public class MessagePoster implements Runnable {
    private TextView textView;
    private String message;

    public MessagePoster(TextView textView, String message) {
        this.textView = textView;
        this.message = message;
    }

    public void run() {
        textView.setText(message);
    }
}
  

Ответ №1:

Проблема решена, я могу читать и записывать на RS232 и отображать результат в TextView, используя обработчик для связи с пользовательским интерфейсом и потоком сокета.

Это было трудное упражнение, но я сделал это с помощью простой программы следующим образом:

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // messageText.setVisibility(View.VISIBLE);
        setContentView(R.layout.main);

        messageText = (TextView) findViewById(R.id.text_messages);
        Button listenButton = (Button) findViewById(R.id.button_listen);
        listenButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // closeSocket();

                sendData(clientSocket, "Prn");

            }
        });

        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
        String toastText = "";
        /*
         * if(bluetooth.isEnabled()){ String address= bluetooth.getAddress();
         * String name=bluetooth.getName(); toastText=name " : " address;
         * 
         * } else
         */
        if (!bluetooth.isEnabled()) {
            toastText = "Bluetooth is not Enabled!";
            Toast.makeText(this, toastText, Toast.LENGTH_LONG).show();
            Intent enableBtIntent = new Intent(
                    BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            Toast.makeText(this, "BlueTooth Enabled", Toast.LENGTH_LONG).show();
        }

        Set<BluetoothDevice> pairedDevices = bluetooth.getBondedDevices();
        // Toast.makeText(this,"Size=" pairedDevices.size(),
        // Toast.LENGTH_LONG).show();

        // If there are paired devices

        if (pairedDevices.size() > 0) {
            // Loop through paired devices
            for (BluetoothDevice device : pairedDevices) {
                // Add the name and address to an array adapter to show in a
                // ListView
                deviceMacs.add(device.getAddress());
                deviceNames.add(device.getName());

            }
        } else {
            Toast.makeText(this, "Size="   pairedDevices.size(),
                    Toast.LENGTH_LONG).show();
        }

        mac = deviceMacs.get(deviceNames.indexOf("M7705B0125"));
        BluetoothDevice device = bluetooth.getRemoteDevice(mac);
        try {
            clientSocket = device
                    .createRfcommSocketToServiceRecord(MY_UUID_INSECURE);
            clientSocket.connect();

            // TODO Transfer data using the Bluetooth Socket

        } catch (IOException e) {
            Log.d("BLUETOOTH", e.getMessage());

        }
        BluetoothSocketListener bsl = new BluetoothSocketListener(clientSocket,
                handler, messageText);
        Thread messageListener = new Thread(bsl);
        messageListener.start();
    }// end of onCreate()code
        // The Handler that gets information back from the BluetoothChatService

    private final Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            byte[] readBuf = (byte[]) msg.obj;
            // construct a string from the valid bytes in the buffer
            String readMessage = new String(readBuf, 0, msg.arg1);
            messageText.setText(readMessage);

        }

    };

    private void closeSocket() {
        try {
            clientSocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // The Handler that gets information back from the BluetoothChatService

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        closeSocket();
    }

        private class BluetoothSocketListener implements Runnable {

        private BluetoothSocket socket;
        private TextView textView;
        private Handler handler;
        private InputStream inStream;
        private OutputStream outStream;

        public BluetoothSocketListener(BluetoothSocket socket, Handler handler,
                TextView textView) {
            this.socket = socket;
            this.textView = textView;
            this.handler = handler;
            try {
                outStream = socket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        public void run() {
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            int data;
            try {
                inStream = socket.getInputStream();
                int bytesRead = -1;
                String message = "";
                // Keep listening to the InputStream while connected
                int len= 0;



                while (true) {
                    try {
                        // Read from the InputStream

                        bytesRead = inStream.read(buffer);
                        message= message new String(buffer,0,bytesRead);
                        // Send the obtained bytes to the UI Activity
                        byte[] byteString = message .getBytes();
                        byteString[byteString.length - 1] = 0;
                        outStream.write(byteString);
                        handler.post(new MessagePoster(textView,"Text="  message " " "Bytes read=" bytesRead));

                    } catch (IOException e) {
                        Log.e(TAG, "disconnected", e);

                        break;
                    }
                }


            } catch (IOException e) {
                Log.d("BLUETOOTH_COMMS", e.getMessage());
            }
        }
    }

    private class MessagePoster implements Runnable {
        private TextView textView;
        private String message;

        public MessagePoster(TextView textView, String message) {
            this.textView = textView;
            this.message = message;
        }

        public void run() {
            textView.setText(message);
        }
    }

    private void sendData(BluetoothSocket socket, String msg) {
        OutputStream outStream;
        try {
            outStream = socket.getOutputStream();
            byte[] byteString = msg.getBytes();
            //byteString[byteString.length - 1] = 0;
            outStream.write(byteString);
        } catch (IOException e) {
            Log.d("BLUETOOTH_COMMS", e.getMessage());
        }
    }
}
  

Ответ №2:

Не забудьте добавить разрешение в манифест

 <uses-permission
    android:name="android.permission.BLUETOOTH" />
  

Ответ №3:

Я обнаружил одну вещь, используя последовательный адаптер BT, подключенный к микроконтроллеру. Часто данные, отправляемые на последовательный порт, представляют собой строку, заканчивающуюся на [].

Я использовал последовательный адаптер Bluetooth в одном из своих проектов, отправляя строки данных, заканчивающиеся на a, и обнаружил, что обработка данных с помощью сканера, а не стандартного буфера, действительно работает лучше. Пример измененного чата Bluetooth:

 Scanner scan = new Scanner(new InputStreamReader(mmInStream));
        String line;
        // Keep listening to the InputStream while connected
        while (true) {
            try {
                    // Read from the InputStream  
                //Send the obtained bytes to the UI Activity
                line = scan.next();
                mHandler.obtainMessage(CalibrationS2PActivity.MESSAGE_READ, line.length(), -1, line).sendToTarget();
            } catch (Exception e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
}