Android USB-хост обрабатывает данные непрерывно - PullRequest
0 голосов
/ 27 мая 2019

Я использую Arduino для получения данных с машин и отправки их в приложение для Android. Мое приложение запускается, когда устройство включено (устройство с одним приложением). Я хотел бы начать получать и обрабатывать данные, полученные от Arduino, когда приложение запускается, и не останавливаться, даже если пользователь находится в другой деятельности.

Я иду по пути создания объекта из класса BroadcastReceiver, но не уверен, является ли это наиболее подходящим решением, потому что, если моя MainActivity завершится, объект завершится сам.

AndroidManifest:

<receiver android:name="com.myapp.producao.ArduinoBroadcastReceiver"
  android:enabled="true">
  <intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
  </intent-filter>
</receiver>

ArduinoBroadcastReceiver:

public class ArduinoBroadcastReceiver extends BroadcastReceiver {

    long new_signal;
    long last_signal = System.currentTimeMillis();
    long countCycle;
    private String TAG = this.getClass().toString();
    private static final String ACTION_USB_PERMISSION = "com.myapp.producao.USB_PERMISSION";

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Log.d(TAG, "Started");
        Log.d(TAG, context.toString());
        Log.d(TAG, intent.toString());
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
                Log.d(TAG, "VendorID: " + device.getVendorId());
                Log.d(TAG, "DeviceName: " + device.getDeviceName());
                Log.d(TAG, "ProductID: " + device.getProductId());
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if (device != null) {
                        UsbManager UsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
                        UsbDeviceConnection connection = UsbManager.openDevice(device);
                        UsbSerialDevice serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);
                        if (serialPort != null) {
                            if (serialPort.open()) { 
                                serialPort.setBaudRate(9600);
                                serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
                                serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
                                serialPort.setParity(UsbSerialInterface.PARITY_NONE);
                                serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
                                serialPort.read(datareceived);
                                Log.d(TAG, "Ciclo");

                            } else {
                                Log.d(TAG, "PORT NOT OPEN");
                            }
                        } else {
                            Log.d(TAG, "PORT IS NULL");
                        }
                    } else {
                        Log.d(TAG, "PERM NOT GRANTED");
                    }
                }
            }
        } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            Log.d(TAG, "Attached");
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
            Log.d(TAG, "Detached");
            if (device != null) {

            }
        }


    UsbSerialInterface.UsbReadCallback datareceived = new UsbSerialInterface.UsbReadCallback() {
        @Override
        public void onReceivedData(byte[] arg0) {
                String data = new String(arg0, StandardCharsets.UTF_8);
                int pino = Integer.parseInt(data.substring(1,2));
                int estado = Integer.parseInt(data.substring(2,3));
                handleResult(pino, estado);
        }
    };
}

Возможно, я путаюсь с классом или с тем, как и когда создавать этот объект и поддерживать его в течение всего времени работы приложения. Есть идеи?

...