要根据蓝牙ble demo,修改出一个简单的蓝牙测试APP,实现写数据发指令,遇到个问题,请高手帮我解答下:写数据方法如下public void writeCharacteristic(String value,UUID uuid1,UUID uuid2) {
System.out.println(value+"/n"+uuid1.toString()+"/n"+uuid2.toString());
BluetoothGattService LumService = mBluetoothGatt
.getService(uuid1);

if (LumService == null) {
System.out.println("LumService null");
return;
}


BluetoothGattCharacteristic LumChar = LumService.getCharacteristic(uuid2);
if (LumChar == null) {
System.out.println("LumChar null");
return;
}
LumChar.setValue(value);
boolean status = mBluetoothGatt.writeCharacteristic(LumChar);
System.out.println("Write Status: " + status);
}
但是在调用的时候如果连接成功后写入
   public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.menu_connect:
            final EditText passwordEdit = new EditText(DeviceControlActivity.this);
             AlertDialog.Builder builder = new Builder(DeviceControlActivity.this);
               builder.setTitle("请输入");
               builder.setIcon(android.R.drawable.ic_dialog_info);
               builder.setView( passwordEdit);
               builder.setPositiveButton("确定" , new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Passwd = passwordEdit.getText().toString();
Toast.makeText(getApplicationContext(), Passwd, Toast.LENGTH_LONG).show();
 mBluetoothLeService.connect(mDeviceAddress);
 
 mBluetoothLeService.writeCharacteristic(Passwd, uuid, uuid);

就会打印LumChar null,
但是在
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
                mConnected = true;
                updateConnectionState(R.string.connected);
                invalidateOptionsMenu();
            } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
                mConnected = false;
                updateConnectionState(R.string.disconnected);
                invalidateOptionsMenu();
                clearUI();
            } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
                displayGattServices(mBluetoothLeService.getSupportedGattServices());
                mBluetoothLeService.writeCharacteristic(Passwd, uuid, uuid2);
            } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
                displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
            }
        }
    };
就能成功写入数据,还麻烦高手们指点一下,后续还要写数据发指令,我该怎么调用写数据的方法 

解决方案 »

  1.   

    错误的地方是mBluetoothLeService.connect(mDeviceAddress);后你直接写数据,这个时候不一定连接上了,因为connect不是你调用了马上就连接的。成功的地方是已经发现服务表明已经连接上了,这个时候再写数据就能够成功。理论上只要连接成功后,后续都能写数据
      

  2.   

    9楼正解!connect是个异步的方法,需要时间的。
      

  3.   

    mBluetoothLeService.connect(mDeviceAddress); 有返回的对象,判断一点是否为空。不为空才连接成功