Bluetooth Classic считывает значения мусора с последовательного порта Android (JAVA)

#java #android #android-studio #bluetooth

#Ява #Android #android-студия #блютус

Вопрос:

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

Код Java, который я использовал:

 public class MainActivity extends Activity  { private static final String UUID_SERIAL_PORT_PROFILE  = "00001101-0000-1000-8000-00805F9B34FB"; private BluetoothSocket mSocket = null; private BufferedReader mBufferedReader = null; TextView myLabel; EditText myTextbox,data_area; BluetoothAdapter mBluetoothAdapter; BluetoothSocket mmSocket; byte[] mmBuffer; BluetoothDevice mmDevice; OutputStream mmOutputStream; Button listen; InputStream mmInputStream; Thread workerThread; byte[] readBuffer; int readBufferPosition;  volatile boolean stopWorker;  @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   Button openButton = (Button)findViewById(R.id.open);  Button sendButton = (Button)findViewById(R.id.send);  Button closeButton = (Button)findViewById(R.id.close);  listen=(Button)findViewById(R.id.listen);  myLabel = (TextView)findViewById(R.id.label);  data_area = (EditText) findViewById(R.id.data_area);  myTextbox = (EditText)findViewById(R.id.entry);   //Open Button  openButton.setOnClickListener(new View.OnClickListener()  {  public void onClick(View v)  {  try  {  findBT();  openBT();  }  catch (IOException ex) { }  }  });    //Send Button  sendButton.setOnClickListener(new View.OnClickListener()  {  public void onClick(View v)  {  try  {  sendData();  }  catch (IOException ex) { }  }  });   //listen button  listen.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v)  {  try {  listenData();  } catch (IOException e) {  e.printStackTrace();  }  }   });   //Close button  closeButton.setOnClickListener(new View.OnClickListener()  {  public void onClick(View v)  {  try  {  closeBT();  }  catch (IOException ex) { }  }  }); }  void findBT() {  mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  if(mBluetoothAdapter == null)  {  myLabel.setText("No bluetooth adapter available");  }   if(!mBluetoothAdapter.isEnabled())  {  Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);  startActivityForResult(enableBluetooth, 0);  }   Setlt;BluetoothDevicegt; pairedDevices = mBluetoothAdapter.getBondedDevices();  if(pairedDevices.size() gt; 0)  {  for(BluetoothDevice device : pairedDevices)  {  if(device.getName().equals("Dual-SPP"))  {  mmDevice = device;  break;  }  }  }  myLabel.setText("Bluetooth Device Found"); }  void openBT() throws IOException {  UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID  mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);  mmSocket.connect();  mmOutputStream = mmSocket.getOutputStream();  mmInputStream = mmSocket.getInputStream();  beginListenForData();  myLabel.setText("Bluetooth Opened"); }  void beginListenForData()// not used this for listening data, used "listenData()" instead!!! {  final Handler handler = new Handler();  final String delimiter = String.valueOf(10); //This is the ASCII code for a newline character  stopWorker = false;  readBufferPosition = 0;  readBuffer = new byte[1024];  workerThread = new Thread(new Runnable()  {  public void run()  {  while(!Thread.currentThread().isInterrupted() amp;amp; !stopWorker)  {  try  {  int bytesAvailable = mmInputStream.available();   if(bytesAvailable gt; 0)  {  byte[] packetBytes = new byte[bytesAvailable];  mmInputStream.read(packetBytes);  for(int i=0;ilt;bytesAvailable;i  )  {  String b = String.valueOf(packetBytes[i]);  if(b == delimiter)  {  byte[] encodedBytes = new byte[readBufferPosition];  System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);  //final String data = String.format("X", encodedBytes);  final String data = new String(encodedBytes, "US-ASCII");   readBufferPosition = 0;   handler.post(new Runnable()  {  public void run()  {   data_area.setText(data);   }  });  }  else  {  readBuffer[readBufferPosition] = parseByte(b);  }  }  }  }  catch (IOException ex)  {  stopWorker = true;  }  }  }  });   workerThread.start(); }   public static byte[] hexStringToByteArray(String s) {  int len = s.length();  byte[] data = new byte[len / 2];  for (int i = 0; i lt; len; i  = 2)  {  data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) lt;lt; 4)   Character.digit(s.charAt(i 1), 16));  }  return data; }  void sendData() throws IOException {  byte[] msg =hexStringToByteArray("021700010025000000000000000003");//1 min data  //byte[] msg =hexStringToByteArray("021300050029000000000000000003");//5 min data  mmOutputStream.write(msg);  myLabel.setText("Data Sent"); }  void listenData() throws IOException {  InputStream aStream = null;  InputStreamReader aReader = null;  aStream=mmSocket.getInputStream();  aReader=new InputStreamReader(aStream);  mBufferedReader =new BufferedReader(aReader);  String aString= String.valueOf((mBufferedReader.read()));  runOnUiThread(new Runnable() {  @Override  public void run() {  data_area.append(aString);   }  });  try {  FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);  OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);  outputWriter.append( aString);  outputWriter.close();  //display file saved message  Toast.makeText(getBaseContext(), "File saved successfully!",  Toast.LENGTH_SHORT).show();  } catch (Exception e) {  e.printStackTrace();  } } public String readRawData(InputStream in) throws IOException {  byte b=0;  StringBuilder res =new StringBuilder();  while(true) {  b= (byte) in.read();  if (b == -1) {  break;  } }  char c = (char)b;    res.append(c); return res.toString();  } void closeBT() throws IOException {  stopWorker = true;  mmOutputStream.close();  mmInputStream.close();  mmSocket.close();  myLabel.setText("Bluetooth Closed"); } private UUID getSerialPortUUID() {  return UUID.fromString( UUID_SERIAL_PORT_PROFILE ); } private BluetoothSocket createBluetoothSocket(BluetoothDevice device)  throws IOException {  if(Build.VERSION.SDK_INT gt;= 10){  try {  final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });  return (BluetoothSocket) m.invoke(device, UUID_SERIAL_PORT_PROFILE);  } catch (Exception e) {  Log.e(TAG, "Could not create Insecure RFComm Connection",e);  }  }  return device.createRfcommSocketToServiceRecord(UUID.fromString(UUID_SERIAL_PORT_PROFILE)); }   }  

Я не использовал beginListenForData() для чтения данных . Вместо этого я использовал listenData() для чтения через Bluetooth. Но я получаю мусорные ценности. Есть ли способ решить эту проблему?

Комментарии:

1. Чтобы лучше разобраться в вашем garbage values устройстве, вам нужно взглянуть на такие вещи, как: Какая кодировка с устройства? Есть ли разделитель, в котором вам нужно подождать, прежде чем завершить сообщение? И т.д. Серийный номер Bluetooth по умолчанию r , и ascii я верю. Который, если вы используете