Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.

class TransferThread extends Thread {
private static final String TAG = "MainActivity";
private static int TIMEOUT = 5000;
private static int BUFFER_LENGTH = 32768;
private byte[] buffer = new byte[BUFFER_LENGTH];
UsbDeviceConnection connection;
UsbEndpoint endpoint;
TransferThread(UsbDeviceConnection connection, UsbEndpoint endpoint) {
this.connection = connection;
this.endpoint = endpoint;
}
public void run() {
Log.v(TAG, "New thread started");
UsbRequest usbRequest = new UsbRequest();
if(usbRequest.initialize(connection, endpoint)) {
Log.v(TAG, "USB request successfully initialised");
}
final ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFER_LENGTH);
if(usbRequest.queue(byteBuffer)) {
Log.v(TAG, "USB request successfully queued");
}
if(connection.requestWait() == usbRequest) {
Log.v(TAG, "Successfully returned USB request result");
Log.v(TAG, "Has array: " + byteBuffer.hasArray());
Log.v(TAG, "Data: " + Arrays.toString(byteBuffer.array()));
Log.v(TAG, "Data: " + byteBuffer.toString());
}
else {
Log.v(TAG, "Failed to return USB request");
}
Log.v(TAG, "byteBuffer.ToString(): " + byteBuffer.toString());
/* int numBytesTransferred = connection.bulkTransfer(endpoint, buffer, buffer.length, TIMEOUT);
if(numBytesTransferred >= 0) {
Log.v(TAG, "Bulk transfer successful");
}
else {
Log.v(TAG, "Bulk transfer failed");
}*/
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if(device != null){
Log.v(TAG,"Permission granted for device");
}
}
else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "Running Main activity onCreate");
// Enumerate USB devices
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
Log.v(TAG, String.format("%d device(s) found by UsbManager", deviceList.size()));
for (HashMap.Entry<String, UsbDevice> entry : deviceList.entrySet()) {
String key = entry.getKey();
Log.v(TAG, "Device name: " + key);
}
UsbDevice device = deviceList.get("/dev/bus/usb/002/002");
Log.v(TAG, "Device info: " + device.toString());
Log.v(TAG, String.format("Device has %d configuration(s)", device.getConfigurationCount()));
Log.v(TAG, String.format("Device has %d interface(s)", device.getInterfaceCount()));
// Obtain permission to communicate with a device
PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), PendingIntent.FLAG_MUTABLE);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);
manager.requestPermission(device, permissionIntent);
int interfaceNumber = 0;
int endpointNumber = 0;
UsbInterface usbInterface = device.getInterface(interfaceNumber);
Log.v(TAG, String.format("Got interface %d", interfaceNumber));
Log.v(TAG, "Interface name: " + usbInterface.getName());
Log.v(TAG, "Interface class: Vendor specific " + usbInterface.getInterfaceClass());
UsbEndpoint endpoint = usbInterface.getEndpoint(endpointNumber);
Log.v(TAG, String.format("Got endpoint %d", endpointNumber));
int endpointType = endpoint.getType();
if(endpointType == UsbConstants.USB_ENDPOINT_XFER_CONTROL) {
Log.v(TAG, "Endpoint type: endpoint zero");
}
if(endpointType == UsbConstants.USB_ENDPOINT_XFER_ISOC) {
Log.v(TAG, "Endpoint type: isochronous endpoint");
}
if(endpointType == UsbConstants.USB_ENDPOINT_XFER_BULK) {
Log.v(TAG, "Endpoint type: bulk endpoint");
}
if(endpointType == UsbConstants.USB_ENDPOINT_XFER_INT) {
Log.v(TAG, "Endpoint type: interrupt endpoint");
}
int endpointDir = endpoint.getDirection();
if(endpointDir == UsbConstants.USB_DIR_IN) {
Log.v(TAG, "Endpoint direction: IN (device to host)");
}
if(endpointDir == UsbConstants.USB_DIR_OUT) {
Log.v(TAG, "Endpoint direction: OUT (host to device)");
}
UsbDeviceConnection connection = manager.openDevice(device);
connection.claimInterface(usbInterface, true);
TransferThread thread = new TransferThread(connection, endpoint);
thread.start();
}
}
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.content.Context;
import android.os.ParcelUuid;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class BLEConnection {
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mBluetoothLeScanner;
private String mTargetDeviceAddress;
private boolean mScanning;
private BLEConnectionListener mListener;
private BluetoothGatt mBluetoothGatt;
private Context mContext;
private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
// This callback is invoked when the connection state changes, e.g. from disconnected to connected.
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.e("bleee", "connected ");
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.e("bleee", "disconected");
}
}
};
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) { // This callback is invoked when a BLE advertisement is found.
Log.e("bleee", "scan result");
BluetoothDevice device = result.getDevice();
if (device.getAddress().equals(mTargetDeviceAddress)) {
Log.e("bleee", "device found 1");
mBluetoothLeScanner.stopScan(mScanCallback);
mScanning = false;
mListener.onDeviceFound(device);
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) { // This callback is invoked when multiple BLE advertisements are found at once.
Log.e("bleee", "scan result multiple");
for (ScanResult result : results) {
BluetoothDevice device = result.getDevice();
if (device.getAddress().equals(mTargetDeviceAddress)) {
Log.e("bleee", "batch scan multiple");
mBluetoothLeScanner.stopScan(mScanCallback);
mScanning = false;
mListener.onDeviceFound(device);
break;
}
}
}
@Override
public void onScanFailed(int errorCode) {
Log.e("bleee", "scan failed 1");
mScanning = false;
mListener.onScanFailed(errorCode);
}
};
public BLEConnection(Context context, String targetDeviceAddress, BLEConnectionListener listener) {
mTargetDeviceAddress = targetDeviceAddress;
mListener = listener;
BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
}
public void startScan() {
Log.e("bleee", "starting scan..................");
if (mScanning) {
return;
}
List<ScanFilter> filters = new ArrayList<>();
ScanFilter filter = new ScanFilter.Builder()
.setDeviceAddress(mTargetDeviceAddress)
.build();
filters.add(filter);
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
.setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT)
.setReportDelay(0L)
.build();
mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
mScanning = true;
Log.e("bleee", "finished?");
}
public void stopScan() {
Log.e("bleee", "something stopped the scan");
if (mScanning) {
mBluetoothLeScanner.stopScan(mScanCallback);
mScanning = false;
}
}
public void writeMessage(byte[] message) {
Log.e("bleee", "writing message...............");
if (mBluetoothGatt == null) {
return;
}
BluetoothGattService service = mBluetoothGatt.getService(UUID.fromString("4fafc201-1fb5-459e-8fcc-c5c9c331914b"));
if (service == null) {
return;
}
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString("beb5483e-36e1-4688-b7f5-ea07361b26a8"));
if (characteristic == null) {
return;
}
characteristic.setValue(message);
mBluetoothGatt.writeCharacteristic(characteristic);
}
public interface BLEConnectionListener {
void onDeviceFound(BluetoothDevice device);
void onScanFailed(int errorCode);
}
public void connectToDevice(BluetoothDevice device) {
Log.e("bleee", "Trying connecting");
mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
}
public void disconnectFromDevice() {
if (mBluetoothGatt != null) {
mBluetoothGatt.disconnect();
mBluetoothGatt.close();
mBluetoothGatt = null;
}
}
}
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.util.Log;
//import com.welie.blessed.*;
public class SendNotifyService extends Service implements BLEConnection.BLEConnectionListener {
private volatile boolean shouldStopThread;
private volatile boolean oksend = false;
private String ESP32_MAC_ADDRESS = "84:F7:03:68:06:52";
private BLEConnection mBLEConnection;
public SendNotifyService() {}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
shouldStopThread = false;
mBLEConnection = new BLEConnection(this, ESP32_MAC_ADDRESS, this);
// Start scanning for the device
mBLEConnection.startScan();
new Thread(new Runnable() {
@Override
public void run() {
while (!shouldStopThread) {
//-----------------------------------------------------------------------------------------------------
if(oksend == true){
byte[] message = "Hello, device!".getBytes();
mBLEConnection.writeMessage(message);
}
Log.e("Service Ard_OS", "Service is running...");
Log.e("Service Ard_OS", mac);
pause(4000);
//-----------------------------------------------------------------------------------------------------
}}
public void pause(int millis){ try { Thread.sleep(millis); } catch (InterruptedException e) { e.printStackTrace(); } }
}).start();
return START_STICKY;
}
@Override
public void onDeviceFound(BluetoothDevice device) {
Log.e("bleee", "device found 2");
oksend = true;
mBLEConnection.connectToDevice(device);
}
@Override
public void onScanFailed(int errorCode) {
Log.e("bleee", "scan failed, i think...");
}
}
So the problem is that i don't get nothing else, not in the BluetoothGattCallback and not even in the ScanCallback. It doesn't connect to the device... If I was not clear about something I will answer!------------------ PROCESS STARTED (9353) for package com.example.ard_os ------------------
2023-01-03 22:52:02.993 9353-9353 bleee com.example.ard_os E starting scan..................
2023-01-03 22:52:03.012 9353-9353 bleee com.example.ard_os E finished?