I am stuck in a particular problem (I think). For a training project, I have to make an Android application that can connect to a laser distance meter (Bosch GLM 50 C distortion). So far, I have gone through countless tutorials and tips here at Stackoverflow and other sources.
I am new to Android and a bit overloaded. The task is to create an application that reads the measured distance on the Bosch device and displays / saves it on the smartphone via Bluetooth.
Now my specific question: is it possible to read data (e.g. 2.083 m) sent from a Bluetooth device? Any suggestions for achieving it?
I can establish a connection to the device by following this guide I found:
package com.test.bluetooth; import java.io.DataInputStream; public class Main_Activity extends Activity implements OnItemClickListener { TextView measuredValue; 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(), "VERBUNDEN", 0).show(); String s = "Verbindung erfolgreich"; 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; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); if(btAdapter==null){ // Toast.makeText(getApplicationContext(), "Bluetooth nicht verfügbar", 0).show(); finish(); } else{ if(!btAdapter.isEnabled()){ turnOnBT(); } getPairedDevices(); startDiscovery(); } } private void startDiscovery() { // TODO Auto-generated method stub btAdapter.cancelDiscovery(); btAdapter.startDiscovery(); } private void turnOnBT() { // TODO Auto-generated method stub Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(intent, 1); } private void getPairedDevices() { // TODO Auto-generated method stub devicesArray = btAdapter.getBondedDevices(); if(devicesArray.size()>0){ for(BluetoothDevice device:devicesArray){ pairedDevices.add(device.getName()); } } } private void init() { // TODO Auto-generated method stub listView=(ListView)findViewById(R.id.listView); listView.setOnItemClickListener(this); listAdapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0); listView.setAdapter(listAdapter); btAdapter = BluetoothAdapter.getDefaultAdapter(); pairedDevices = new ArrayList<String>(); filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); devices = new ArrayList<BluetoothDevice>(); receiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(BluetoothDevice.ACTION_FOUND.equals(action)){ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); devices.add(device); String s = ""; for(int a = 0; a < pairedDevices.size(); a++){ if(device.getName().equals(pairedDevices.get(a))){ //append s = "Gekoppelt"; break; } } listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress()); } else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ // run some code } else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ // run some code } else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){ if(btAdapter.getState() == btAdapter.STATE_OFF){ turnOnBT(); } } } }; registerReceiver(receiver, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED); registerReceiver(receiver, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(receiver, filter); filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(receiver, filter); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); unregisterReceiver(receiver); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_CANCELED){ Toast.makeText(getApplicationContext(), "Bluetooth muss aktiviert sein", Toast.LENGTH_SHORT).show(); finish(); } } public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub if(btAdapter.isDiscovering()){ btAdapter.cancelDiscovery(); } if(listAdapter.getItem(arg2).contains("Gekoppelt")){ BluetoothDevice selectedDevice = devices.get(arg2); ConnectThread connect = new ConnectThread(selectedDevice); connect.start(); Log.i(tag, "in click listener"); } else{ // Toast.makeText(getApplicationContext(), "Gerät ist nicht gekoppelt", 0).show(); } } 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 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, "Verbindung - läuft"); try { // Connect the device through the socket. This will block // until it succeeds or throws an exception mmSocket.connect(); Log.i(tag, "Verbindung - erfolgreich"); } 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; } } } /* Call this from the main activity to send data to the remote device */ public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { } } /* Call this from the main activity to shutdown the connection */ public void cancel() { try { mmSocket.close(); } catch (IOException e) { } } } }
After that, I found this example, which should read the incoming data from the device, but it does not work:
try { Log.d((String) this.getTitle(), "Closing Server Socket....."); mmServerSocket.close();`` InputStream tmpIn = null; OutputStream tmpOut = null;