BLE无法从设备获取配置

时间:2018-09-27 10:22:52

标签: android bluetooth-lowenergy

java,android studio中的代码没有什么多余的,除了如何与BLE上的传感器连接和通信,传感器本身正在工作并接受命令外,但由于某些原因,我无法从中获得答案他给onCharacteristicChanged处理程序,我尝试了很多,但没有收到传感器的答复,我确定传感器正在工作并发送响应

public class MainActivity extends AppCompatActivity {

private static String GROVE_SERVICE = "6e400001-b5a3-f393-e0a9";
private static String CHARACTERISTIC_TX = "6e400002-b5a3-f393-e0a9-";
private static String CHARACTERISTIC_RX = "6e400003-b5a3-f393-e0a9-";
private static final int REQUEST_ENABLE_BT = 1;
private static final String DEVICE_NAME = "TD_100196"; //display name for Grove BLE
private static List<BluetoothDevice> mDevices = new ArrayList<BluetoothDevice>();//discovered devices in range

BluetoothAdapter bluetoothAdapter;
private BluetoothDevice myDevice;
BluetoothGatt gatt;

BluetoothGattService _gattService;
Button b_scan, b_find;
EditText etext;

private TextView mainText;
Context ctx = this;

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

    ctx = this;
    etext = (EditText) findViewById(R.id.editText);
    mainText = (TextView) findViewById(R.id.mainText);
    b_scan = (Button) findViewById(R.id.button_scan);
    b_find = (Button) findViewById(R.id.button_find);
    b_scan.setOnClickListener(b_scan_click);
    b_find.setOnClickListener(b_find_click);

    final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    bluetoothAdapter = bluetoothManager.getAdapter();


    // Запрашиваем включение блютуз
    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }

}

OnClickListener b_scan_click = new OnClickListener() {
    @Override
    public void onClick(View v) {
        new Thread() {
            @Override
            public void run() {
                statusUpdate("Начался поиск устройств...");
                bluetoothAdapter.startLeScan(scanCallback);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                statusUpdate("Поиск устройств остановлен");
                bluetoothAdapter.stopLeScan(scanCallback);
                gatt = myDevice.connectGatt(ctx, true, gattCallback);
            }
        }.start();
        //bluetoothAdapter.startLeScan( scanCallback );
        // gatt = myDevice.connectGatt(this, true, gattCallback);
        //sendMsg(etext.getText().toString());
    }
};

OnClickListener b_find_click = new OnClickListener() {
    @Override
    public void onClick(View v) {
        sendMsg(etext.getText().toString());
    }
};

private BluetoothAdapter.LeScanCallback scanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
        if (device != null) {
            if (mDevices.indexOf(device) == -1)//to avoid duplicate entries
            {
                if (DEVICE_NAME.equals(device.getName())) {
                    myDevice = device; // we found our device!
                    statusUpdate("Нашли нужное устройство: " + device.getName());
                } else {
                    statusUpdate("Обнаруженное устройство: " + device.getName());
                }
                mDevices.add(device);
            }
        }
    }
};

BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (newState == BluetoothProfile.STATE_CONNECTED){
            statusUpdate("Связь с GATT - установлена, поиск устройств...");
            gatt.discoverServices();
        }
    }
    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status){
        if (status == BluetoothGatt.GATT_SUCCESS) {
            List<BluetoothGattService> gattServices = gatt.getServices();
            for(BluetoothGattService gattService : gattServices) {
                statusUpdate("Найден следующий сервис: " + gattService.getUuid());
                if(gattService.getUuid().toString().contains(GROVE_SERVICE))
                {
                    statusUpdate("Найден нужный нам сервис: " + gattService.getUuid());
                    _gattService = gattService;
                    String id = gattService.getUuid().toString().split("-")[4];
                    CHARACTERISTIC_TX += id;
                    CHARACTERISTIC_RX += id;
                    // Характеристика и подключение ее для получения сообщений от сервера-устройства
                    statusUpdate("Подключаем характеристику RX, для получений ответа от сервера (Нужно установить дескриптор)");
                    BluetoothGattCharacteristic characteristic = gattService.getCharacteristic(UUID.fromString(CHARACTERISTIC_RX));
                    for (BluetoothGattDescriptor descriptor : characteristic.getDescriptors()) {
                        statusUpdate("-Найденный дескриптор: " + descriptor.getUuid().toString());
                        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); // Возможно косяк тут, ENABLE_INDICATION_VALUE - было
                        gatt.writeDescriptor(descriptor);
                        statusUpdate("-Дескриптор установлен");
                    }
                    gatt.setCharacteristicNotification(characteristic, true);
                } else {
                    statusUpdate("Communication Service not finded, UUID: " + gattService.getUuid().toString() + ", GROVE_SERVICE: " + GROVE_SERVICE);
                }
            }
        } else {
            statusUpdate("Ошибка, статус [onServicesDiscovered]: " + status);
        }
    }
    @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status){
        statusUpdate("Дескриптор вызвал запись, статус: " + status);
        statusUpdate("Автоматическая отправка сообщения серверу (TX) 'GD\\r'...");
        BluetoothGattCharacteristic characteristic = _gattService.getCharacteristic(UUID.fromString(CHARACTERISTIC_TX));
        characteristic.setValue("GD\\r"); // Ввод команды
        gatt.writeCharacteristic(characteristic);
        statusUpdate("Сообщение(характеристика) 'GD\\r' отправлены");
    }
    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        statusUpdate("Сервер ответил: " + characteristic.getValue());
    }
};

private void sendMsg (final String msg) {
    BluetoothGattCharacteristic characteristic = _gattService.getCharacteristic(UUID.fromString(CHARACTERISTIC_TX));
    characteristic.setValue(msg); // Ввод команды
    gatt.writeCharacteristic(characteristic);
    statusUpdate("Сообщение(характеристика) '" + msg + "' отправлены");
}

private void statusUpdate (final String msg) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mainText.setText(mainText.getText() + "\r\n" + msg);
        }
    });
}

}

0 个答案:

没有答案