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);
}
});
}
}