无法在Android上初始化UART服务



我正在开发与传感器一起使用的移动应用程序,该应用程序使用UART。官方GitHub页面的示例非常完美,但是从中提取的代码不起作用。我更改的唯一一件事是设备搜索,但是此代码可与Polar H7设备(仅发现设备名称和设备adress并发送到下一个活动)完美。关于此活动,我试图连接到UART设备,以下是代码:

public class UartRecordingActivity extends AppCompatActivity {
    private final static String TAG = UartRecordingActivity.class.getSimpleName();
    // BLE stuff
    public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
    public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";

    //private BleService bleService;
    private String deviceName;
    private String deviceAddress;
    //private BleServicesAdapter gattServiceAdapter;
    private boolean isConnected = false;

    private static final int REQUEST_SELECT_DEVICE = 1;
    private static final int REQUEST_ENABLE_BT = 2;
    private static final int UART_PROFILE_READY = 10;
    private static final int UART_PROFILE_CONNECTED = 20;
    private static final int UART_PROFILE_DISCONNECTED = 21;
    private static final int STATE_OFF = 10;
    private int mState = UART_PROFILE_DISCONNECTED;
    private UartService mService = null;
    private BluetoothDevice mDevice = null;
    private BluetoothAdapter mBtAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recording_uart);
        Log.i(TAG, "onCreate");
        final Intent intent = getIntent();
        deviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);
        deviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
        final Intent gattServiceIntent = new Intent(this, UartService.class);
        bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
    }
    @Override
    protected void onStart() {
        super.onStart();
        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        service_init();
        mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress);
        mService.connect(deviceAddress);
    }
    private void service_init() {
        Intent bindIntent = new Intent(this, UartService.class);
        bindService(bindIntent, mServiceConnection, BIND_AUTO_CREATE);
        LocalBroadcastManager.getInstance(this).registerReceiver(UARTStatusChangeReceiver,
                makeGattUpdateIntentFilter());
    }
    //UART service connected/disconnected
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder rawBinder) {
            mService = ((UartService.LocalBinder) rawBinder).getService();
            Log.d(TAG, "onServiceConnected mService= " + mService);
            if (!mService.initialize()) {
                Log.e(TAG, "Unable to initialize Bluetooth");
                finish();
            }
        }

        public void onServiceDisconnected(ComponentName classname) {
            mService = null;
        }
    };

    @Override
    public boolean onOptionsItemSelected(MenuItem menuItem) {
        if (menuItem.getItemId() == android.R.id.home) {
            Intent intent = new Intent(this, HomeActivity.class);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(menuItem);}
private final BroadcastReceiver UARTStatusChangeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        final Intent mIntent = intent;
        //*********************//
        if (action.equals(UartService.ACTION_GATT_CONNECTED)) {
            runOnUiThread(new Runnable() {
                public void run() {
                    String currentDateTimeString = DateFormat.getTimeInstance().format(new Date());
                    Log.d(TAG, "UART_CONNECT_MSG");
                    mState = UART_PROFILE_CONNECTED;
                }
            });
        }
        //*********************//
        if (action.equals(UartService.ACTION_GATT_DISCONNECTED)) {
            runOnUiThread(new Runnable() {
                public void run() {
                    String currentDateTimeString = DateFormat.getTimeInstance().format(new Date());
                    Log.d(TAG, "UART_DISCONNECT_MSG");
                    mState = UART_PROFILE_DISCONNECTED;
                    mService.close();
                }
            });
        }
        //*********************//
        if (action.equals(UartService.ACTION_GATT_SERVICES_DISCOVERED)) {
            mService.enableTXNotification();
        }
        //*********************//
        if (action.equals(UartService.ACTION_DATA_AVAILABLE)) {
            Log.i("data","received");
            final byte[] txValue = intent.getByteArrayExtra(UartService.EXTRA_DATA);
            //handle data
        }
        //*********************//
        if (action.equals(UartService.DEVICE_DOES_NOT_SUPPORT_UART)) {
        }
    }
};


    private static IntentFilter makeGattUpdateIntentFilter() {
        final IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(UartService.ACTION_GATT_CONNECTED);
        intentFilter.addAction(UartService.ACTION_GATT_DISCONNECTED);
        intentFilter.addAction(UartService.ACTION_GATT_SERVICES_DISCOVERED);
        intentFilter.addAction(UartService.ACTION_DATA_AVAILABLE);
        intentFilter.addAction(UartService.DEVICE_DOES_NOT_SUPPORT_UART);
        return intentFilter;
    }
}

错误是由此行引起的(导致NullPoInterException的MService):

mService.connect(deviceAddress);

方法可以保证您已通过绑定连接到服务。在OnStart回调中,您有NullPointer,因为当您致电BindService时,它需要一点时间才能建立连接。只需使您的代码类似:

public void onServiceConnected(ComponentName className, IBinder rawBinder) {
    mService = ((UartService.LocalBinder) rawBinder).getService();
    Log.d(TAG, "onServiceConnected mService= " + mService);
    if (!mService.initialize()) {
        Log.e(TAG, "Unable to initialize Bluetooth");
        finish();
    }
    mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress);
    mService.connect(deviceAddress);
}

最新更新