#android #bluetooth-lowenergy #hc-05
#Android #bluetooth-lowenergy #hc-05
Вопрос:
В моем проекте я использую Android и Bluetooth HC-05. Мне нужно отправить сообщение на модуль HC-05, а затем отправить мне обратно некоторые данные.
Итак, я создаю такой проект :
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
{
Toast.makeText(this, "BLE not supported", Toast.LENGTH_SHORT).show();
finish();
}
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
if(bluetoothAdapter == null)
{
Toast.makeText(this, "Bluetooth not supported", Toast.LENGTH_SHORT).show();
finish();
return;
}
scanLeDevice();
}
private BluetoothLeScanner bluetoothLeScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();
private boolean mScanning;
private Handler handler = new Handler();
UUID u1 = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
private static final long SCAN_PERIOD = 2000;
private void scanLeDevice()
{
if(!mScanning)
{
handler.postDelayed(new Runnable()
{
@Override
public void run()
{
mScanning = false;
bluetoothLeScanner.stopScan(leScanCallBack);
}
}, SCAN_PERIOD);
mScanning = true;
bluetoothLeScanner.startScan(leScanCallBack);
}
else
{
mScanning = false;
bluetoothLeScanner.stopScan(leScanCallBack);
}
}
private String Device_name = "";
private String Device_address;
private ScanCallback leScanCallBack = new ScanCallback()
{
@Override
public void onScanResult(int callbackType, ScanResult result)
{
super.onScanResult(callbackType, result);
if(result.getDevice().getName() != null amp;amp; result.getDevice().getName().contains("ETNA") amp;amp; result.getDevice().getName() != Device_name)
{
Device_name = String.valueOf(result.getDevice().getName());
Device_address = String.valueOf(result.getDevice().getAddress());
result.getDevice().connectGatt(MainActivity.this, false, bluetoothGattCallback);
Log.e("Device Name : ", Device_name);
Log.e("Device address", Device_address);
Button button = findViewById(R.id.button);
button.setText(Device_name);
//bluetoothLeScanner.stopScan(leScanCallBack);
//Log.e("Scan", "STOP");
}
}
};
BluetoothGattCallback bluetoothGattCallback =
new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i("Message", "Connected to" Device_name);
gatt.discoverServices();
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i("Message", "Disconnected from GATT server.");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status)
{
super.onServicesDiscovered(gatt, status);
Log.i("Message", "Discover");
if(status == BluetoothGatt.GATT_SUCCESS)
{
List<BluetoothGattService> services = gatt.getServices();
for(BluetoothGattService service : services)
{
List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
for(BluetoothGattCharacteristic characteristic : characteristics)
{
if(characteristic.getUuid().compareTo(u1) == 0)
{
characteristic.setValue("up2" 'r' 'n');
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
gatt.writeCharacteristic(characteristic);;
Log.d("Message", "Write done");
}
}
}
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
{
super.onCharacteristicWrite(gatt, characteristic, status);
Log.d("Message","Characteristic " characteristic.getValue() " written");
gatt.readCharacteristic(characteristic);
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicRead(gatt, characteristic, status);
byte[] value = characteristic.getValue();
for(int i = 0; i < value.length; i )
{
Log.d("Size : ", String.valueOf(value.length));
Log.d("Variable : " i, String.valueOf(value[i]));
}
}
};}
Я отправляю в свой модуль HC-05 строковый код «up2» для функции ServicesDiscovered
characteristic.setValue("up2" 'r' 'n');
Проблема в том, что я получил только 1 номер… вы можете видеть, что переменная = 11
I / Bluetooth-устройство: connectGatt E / Имя устройства :: ETNA 1-11234 E / Адрес устройства: 6C: EC: EB: 22:37: 8D I / Сообщение: Подключено к ETNA 1-11234 I / Сообщение: Обнаружение D / Сообщение: Запись выполнена D / Сообщение: Характеристика [B @ 66005a2 записано D / Размер:: 1 D / Переменная: 0: 11
Мой код C на моем HC-05 :
if (buffUART[0] == 'u' amp;amp; buffUART[1] == 'p' amp;amp; buffUART[2] == '2')
{
uint8_t string[30]={0, };
string[0] = (uint8_t)(nb_up->value >> 24);
string[1] = (uint8_t)(nb_up->value >> 16);
string[2] = (uint8_t)(nb_up->value >> 8);
string[3] = (uint8_t)(nb_up->value >> 0);
string[4] = (uint8_t)(nb_down->value >> 24);
string[5] = (uint8_t)(nb_down->value >> 16);
string[6] = (uint8_t)(nb_down->value >> 8);
string[7] = (uint8_t)(nb_down->value >> 0);
string[8] = (uint8_t)(nb_reset->value >> 24);
string[9] = (uint8_t)(nb_reset->value >> 16);
string[10] = (uint8_t)(nb_reset->value >> 8);
string[11] = (uint8_t)(nb_reset->value >> 0);
string[12] = (uint8_t)(nb_stop_lvl_0->value >> 24);
string[13] = (uint8_t)(nb_stop_lvl_0->value >> 16);
string[14] = (uint8_t)(nb_stop_lvl_0->value >> 8);
string[15] = (uint8_t)(nb_stop_lvl_0->value >> 0);
string[16] = (uint8_t)(nb_stop_lvl_1->value >> 24);
string[17] = (uint8_t)(nb_stop_lvl_1->value >> 16);
string[18] = (uint8_t)(nb_stop_lvl_1->value >> 8);
string[19] = (uint8_t)(nb_stop_lvl_1->value >> 0);
string[20] = (uint8_t)(nb_stop_lvl_2->value >> 24);
string[21] = (uint8_t)(nb_stop_lvl_2->value >> 16);
string[22] = (uint8_t)(nb_stop_lvl_2->value >> 8);
string[23] = (uint8_t)(nb_stop_lvl_2->value >> 0);
string[24] = (uint8_t)(nb_stop_lvl_3->value >> 24);
string[25] = (uint8_t)(nb_stop_lvl_3->value >> 16);
string[26] = (uint8_t)(nb_stop_lvl_3->value >> 8);
string[27] = (uint8_t)(nb_stop_lvl_3->value >> 0);
string[16] = 'r';
string[17] = 'n';
HAL_UART_Transmit(amp;husart3, string, 18, HAL_MAX_DELAY);
buffUART[0] = '0';
buffUART[1] = '0';
}
Я не знаю, где я ошибаюсь. И сколько данных я могу отправить на свой телефон, например, 8,16,32 или более бит.
Ответ №1:
Согласно спецификации HC-05, он использует Bluetooth версии 2.0 (Bluetooth Classic), пока вы пытаетесь получить к нему доступ с помощью Bluetooth Low Energy (BLE), который был представлен в версии Bluetooth 4.0. Вы должны использовать другой модуль или записывать в него с помощью классического Bluetooth.
Комментарии:
1. Модуль HC-06 также не является модулем BLE. Посмотрите на классический способ поиска и подключения к устройствам по Bluetooth: developer.android.com/guide/topics/connectivity /…
2. Модуль HM-10, похоже, является модулем BLE mdoule и может работать для вас. Или вы можете переключить свой микроконтроллер на esp32, который также предлагает BLE из коробки
3. Если устройство работает только по Bluetooth Classic, к какому устройству подключен код Android BLE?
4. Я никогда не пробовал подключаться через BLE к устройству classics, поэтому я не уверен в этом. Я могу только предположить, что ему удалось подключиться к правильному устройству, просто запись и чтение работают по-разному
5. Вы можете использовать сканер BLE, такой как nRF Connect, для поиска устройств BLE рядом с вами