Android应用程序无法连接蓝牙低功耗设备

时间:2015-07-08 20:34:00

标签: android bluetooth-lowenergy psoc

我从Android开发开始,我试图在我的Android手机和微控制器(PSoC4BLE)之间建立一个简单的蓝牙低能量连接,以便在其中一个微控制器特性中写入值。 / p>

由于我已经知道微控制器MAC,以及服务和特性UUID,我只想在我的Android应用程序打开时立即连接到微控制器而无需任何用户交互,当我按下按钮时,应用程序将值写入特征。

问题是当我运行它时我的应用程序崩溃,并且在调整代码的情况下我得到它的工作,它没有连接到微控制器,我做错了什么?

以下是代码:

public class MainActivity extends Activity {

// bluetooth variables
private BluetoothAdapter mBluetoothAdapter;
private BluetoothGatt mBluetoothGatt;
private BluetoothGattCharacteristic mMyCharacteristic;
private static final UUID CAR_SERVICE = UUID.fromString("00000000-0000-1000-1000-100000000000");
private static final UUID CAR_CHARACTERISTIC = UUID.fromString("00000000-0000-2000-2000-200000000000");
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // initialize bluetooth adapter
    final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();

    // create a device that represents the bluetooth device and assign it's known MAC address
    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("00:A0:50:0F:13:1C");

    // make the connection to the device
    mBluetoothGatt = device.connectGatt(MainActivity.this, false, mGattCallback);

    // get a reference to my user interface button
    Button btnWrite = (Button)findViewById(R.id.BtnWrite);

    // define the button behaviour
    btnWrite.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // create the characteristic variable
            byte[] value = new byte[1];
            value[0] = (byte) 1;
            mMyCharacteristic.setValue(value);
            // set the service UUID and the characteristic UUID
            mMyCharacteristic = mBluetoothGatt.getService(CAR_SERVICE).getCharacteristic(CAR_CHARACTERISTIC);
            // write the characteristic en the device
            mBluetoothGatt.writeCharacteristic(mMyCharacteristic);
        }
    });
}

}

更新1 最后我得到一个logcat,它说:

  

java.lang.RuntimeException:无法启动活动ComponentInfo {lenovo.car/lenovo.car.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法' android.bluetooth.BluetoothDevice android.bluetooth。 BluetoothAdapter.getRemoteDevice(java.lang.String中)' on null object reference由以下引起:java.lang.NullPointerException:尝试调用虚方法' android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice(java.lang.String)'在空对象引用上

拜托,有些想法?我发现应用程序崩溃了 final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("00:A0:50:0F:13:1C");

1 个答案:

答案 0 :(得分:1)

您实际上没有连接到远程设备。

// make the connection to the device
mBluetoothGatt = device.connectGatt(MainActivity.this, false, mGattCallback);

不需要获取BluetoothGatt实例,您需要在Gatt对象上调用mBluetoohGatt.connect()方法。

另请注意,mBluetoohGatt.connect()返回boolean,指示是否已发送连接请求。

此外,在下一步中,应更改连接状态。这是通过

通知的

mGattCallback.onConnectionStateChange()方法。

建立连接后,您应发送请求以获取设备服务。这可以通过

获得

mBluetoothGatt.discoverServices方法。

如果服务发现请求成功,您应该会收到设备的所有服务。

然后,您就可以获得设备的所有服务和特征。此时,您可以假设您已连接到远程设备,条件是设备不需要任何身份验证。

为了在特定特征下读取当前值,您必须

调用mBluetoothGatt.readCharacteristic()应用您要查找的值的特征。

插入值的特征应通过mGattCallback.onCharacteristicRead()通知。这适用于您要求的值具有特征的可读性。

为了在特定特征下写入当前值,您必须

调用mBluetoothGatt.writeCharacteristic()应用具有新值的特征。

作为对您的请求的确认,您应该通过mBluetoothGatt.onCharacteristicWrite()收到通知。如果您的特征是可写的,则可以使用。

希望有所帮助。