Модуль Bluetooth HM-10 - BLE 4.0 теряет связь
Кто -нибудь пробовал использовать модуль Bluetooth HM-10?
Я могу подключиться к нему с помощью устройства Android и передать предварительно определенный PIN-код. Основываясь на возврате UART, соединение успешно (модуль возвращает OK+CONN - означает, что соединение установлено)
Однако через несколько секунд (2-3) UART получает OK+LOST; означает, что связь была потеряна. Кроме того, светодиод начинает мигать (обычно, когда соединение активно, оно горит)
Это нормальное поведение для блютуса вообще или модуля HM-10.
Это веб-сайт продукта: http://www.jnhuamao.cn/bluetooth.asp?ID=1
2 ответа
Удалось ли вам решить эту проблему? Если нет, то я почти уверен, что проблема в версии прошивки.
Если вы отправите AT+VERS? на ваших модулях, с какой версией он отвечает?
Я не уверен, но HM -10 не поддерживает rfcom. Это означает, что вы должны использовать функциональность GATT для общения. Сущность BLE - это использование минимального пакета данных, насколько это возможно, поэтому BLE не поддерживает соединение все время и использует что-то вроде состояния (атрибутов). Итак, несколько строк кода, например, как работать с BLE:
1.
BluetoothAdapter mBluetoothAdapter = mBluetoothManager.getAdapter();
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(DEVICE_ADDR);
Это инициирование устройства, так же, как и с простым Bluetooth, где DEVICE_ADDR - это MAC вашего BLE(как найти этот адрес вы можете найти в Google или переполнении стека, это тривиально)
2.
BluetoothGattService mBluetoothGattService;
BluetoothGatt mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
mBluetoothGatt.discoverServices();
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
List<BluetoothGattService> gattServices = mBluetoothGatt.getServices();
for(BluetoothGattService gattService : gattServices) {
if("0000ffe0-0000-1000-8000-00805f9b34fb".equals(gattService.getUuid().toString()))
{
mBluetoothGattService = gattService;
}
}
} else {
Log.d(TAG, "onServicesDiscovered received: " + status);
}
}
};
Итак, что означает этот код: если вы видите из этой части кода, я опишу, как сервис GATT находит. Эта услуга нужна для "атрибутного" общения. gattService.getUuid() имеет несколько uuids для связи (4 в моем модуле), некоторые из них используются для RX, некоторые для TX и т. д. "0000ffe0-0000-1000-8000-00805f9b34fb", который является одним из uuid, который используется для связи. почему я это проверяю Последняя часть кода - отправка сообщения:
BluetoothGattCharacteristic gattCharacteristic = mBluetoothGattService.getCharacteristic(UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb"));
String msg = "HELLO BLE =)";
byte b = 0x00;
byte[] temp = msg.getBytes();
byte[] tx = new byte[temp.length + 1];
tx[0] = b;
for(int i = 0; i < temp.length; i++)
tx[i+1] = temp[i];
gattCharacteristic.setValue(tx);
mBluetoothGatt.writeCharacteristic(gattCharacteristic);
После отправки сообщения удерживайте и вы можете отправить другое сообщение или можете закрыть соединение. Более подробную информацию вы можете найти на https://developer.android.com/guide/topics/connectivity/bluetooth-le.html. PS: MAC-адрес вашего модуля можно найти с помощью кода сканера или с помощью AT cmd: на моей прошивке AT+ADDR или AT+LADDR Об использовании UUID: не уверен, но в моем случае я нахожу его с помощью следующего AT+UUID [Получить / Установить систему SERVER_UUID] -> Ответ +UUID=0xFFE0, AT+CHAR [Получить / установить систему CHAR_UUID] - Ответ +CHAR=0xFFE1. Вот почему я делаю вывод, что UUID, который я должен использовать, например: "0000[ffe0/ равно 0xFFE0 из ответа AT]-0000-1000-8000-00805f9b34fb"