#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
я верю. Который, если вы используете