我从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");
答案 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()收到通知。如果您的特征是可写的,则可以使用。
希望有所帮助。