I am getting a issue to send Commands from my android device to Bluetooth device.
Bluetooth is associated with a micro-controller. My effort is below:
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_ENABLE_BT = 2;
private BluetoothAdapter mBluetoothAdapter;
public static final String TAG = "CustomPOC BLEEEEEEE";
private Button btn_send;
private BluetoothDevice mdevice;
private Handler mHandler;
private ConnectThread mConnectThread;
private ConnectedThread mConnectedThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
btn_send = (Button)findViewById(R.id.senddata);
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
finish();
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Log.i(TAG, "onClick - BT not enabled yet");
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
}
pairedOrNot();
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mConnectThread = new ConnectThread(mdevice);
mConnectThread.start();
// new ConnectAsynk(mdevice).execute();
}
});
}
private void pairedOrNot() {
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
List<String> s = new ArrayList<String>();
for(BluetoothDevice bt : pairedDevices) {
s.add(bt.getAddress());
s.add(bt.getName());
if("08:7C:BE:00:00:01".equals(bt.getAddress())) {
mdevice = bt;
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ENABLE_BT:
// When the request to enable Bluetooth returns
if (resultCode == Activity.RESULT_OK) {
Toast.makeText(this, "Bluetooth has turned on ", Toast.LENGTH_SHORT).show();
} else {
// User did not enable Bluetooth or an error occurred
Log.d(TAG, "BT not enabled");
Toast.makeText(this, "Problem in BT Turning ON ", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
Log.e(TAG, "wrong request code");
break;
}
}
private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
public ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp = null;
mmDevice = device;
try {
tmp = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
/*Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);*/
System.out.println("BTTTTTTTTTTT Address "+mmDevice.getAddress());
BluetoothDevice hxm = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress());
// Method m;
// m = hxm.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
// tmp = (BluetoothSocket)m.invoke(hxm, Integer.valueOf(1));
}
catch (Exception e){
e.printStackTrace();
}
mmSocket = tmp;
}
public void run() {
mBluetoothAdapter.cancelDiscovery();
try {
mmSocket.connect();
// Reset the ConnectThread because we're done
synchronized (MainActivity.this) {
mConnectThread = null;
}
// Cancel the thread that completed the connection
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {
mConnectedThread.cancel();
mConnectedThread = null;
}
ConnectedThread mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
} catch (IOException connectException) {
try {
connectException.printStackTrace();
mmSocket.close();
} catch (IOException closeException) { }
} catch (Exception ex){
ex.printStackTrace();
}
}
public void cancel(){
try {
mmSocket.close();
} catch (IOException e) { e.printStackTrace();}
}
}
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;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { e.printStackTrace();}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024];
int begin = 0;
int bytes = 0;
while (true) {
try {
bytes += mmInStream.read(buffer, bytes, buffer.length - bytes);
for(int i = begin; i < bytes; i++) {
if(buffer[i] == "1010101100000001000000100000000100001110".getBytes()[0]) {
mHandler.obtainMessage(1, begin, i, buffer).sendToTarget();
begin = i + 1;
if(i == bytes - 1) {
bytes = 0;
begin = 0;
}
}
}
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Few heads-up that when i check connection status by
tmp.isConnected()
I found that it is returning a
false
value.
I want to send this command(1010101100000001000000010000000100001110) to external Bluetooth. But i am getting issue. Log trace is below at time launch of application:
08-17 07:48:39.718: W/art(14551): Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.
drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList,
android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
When click on button btn_send, then i am getting below message in log trace:
08-17 07:51:32.046: W/BluetoothAdapter(14984): getBluetoothService() called with no BluetoothManagerCallback
08-17 07:51:38.448: W/System.err(14984): java.io.IOException: read failed, socket might closed or timeout, read ret: -1
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:573)
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:584)
08-17 07:51:38.449: W/System.err(14984): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:321)
08-17 07:51:38.449: W/System.err(14984): at com.mahmad.custompoc11aug.MainActivity$ConnectThread.run(MainActivity.java:164)
and after debug i observe that issue is in this line
mmSocket.connect();
All required permission are given in manifest file.Please help me get rid this issue. Thanks in advance.
AT commands mode is used to change default settings of Bluetooth module.. When if there some need like to change the BT device name, device role like master or slave, Password of device BT module need to set in AT Command mode and default setting can change.
Data is transmitted between Bluetooth-enabled devices in packets that are positioned in these slots. Frequency hopping takes place between the transmission or reception of packets, so the packets that make up one transmission may be sent over different frequencies within the ISM band.
I tried this library. You can try it also https://github.com/palaima/AndroidSmoothBluetooth
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With