Page 1 of 1
BLE disconnect event??
Posted: Mon Jul 31, 2017 2:09 pm
by Trialblazer47
Hi,
I want to know is there any Event called in BLE when peer device disconnects or disconnects on power off or some things?
Particulary I want to know this for gattc or gatt client. Currently I am getting ESP_GATTC_CLOSE_EVENT which is called after a long time of disconnection(after a min or so).
Code: Select all
.[0;32mI (7372) GATTC_DEMO: REG FOR NOTIFY: status 0.[0m
.[0;32mI (7372) GATTC_DEMO: REG FOR_NOTIFY: srvc_id = 941e, char_id = 941e.[0m
.[0;32mI (7382) GATTC_DEMO: EVT 35, gattc if 3.[0m
.[0;31mE (7392) BT: No pending command.[0m
.[0;31mE (41982) BT: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0008.[0m
.[0;31mE (41982) BT: btm_sec_disconnected clearing pending flag handle:0 reason:8
.[0m
.[0;32mI (41982) GATTC_DEMO: EVT 5, gattc if 3.[0m
.[0;32mI (41992) GATTC_DEMO: ESP_GATTC_CLOSE_EVENT.[0m
I want to restart scanning just after the device disconnects. So I want to know immediately that device has disconnect of lost connect.
Re: BLE disconnect event??
Posted: Mon Jul 31, 2017 3:27 pm
by kolban
If a peer explicitly disconnects, I have seen that CLOSE event arrive immediately. I am guessing that if the peer doesn't disconnect but just gets lost or disappears ... then there will be a timeout before the disconnection as ping missed would be sent and not responded to.
It is likely that the time for a disconnection detection can be configured but if made too short, then you would end up with false disconnects when the response is just slow or sporadic.
If we think about TCP/IP, if a peer goes off network, it can also take a while before the connection is considered abandoned. This is the nature of connectionless protocols. (me thinks).
Re: BLE disconnect event??
Posted: Mon Jul 31, 2017 6:31 pm
by Trialblazer47
kolban wrote:If a peer explicitly disconnects, I have seen that CLOSE event arrive immediately. I am guessing that if the peer doesn't disconnect but just gets lost or disappears ... then there will be a timeout before the disconnection as ping missed would be sent and not responded to.
It is likely that the time for a disconnection detection can be configured but if made too short, then you would end up with false disconnects when the response is just slow or sporadic.
If we think about TCP/IP, if a peer goes off network, it can also take a while before the connection is considered abandoned. This is the nature of connectionless protocols. (me thinks).
Thats exactly what I think well I am developing code between NRF51 and ESP32. I think I will test GATT client on NRF51 and check how fast it responds. Thanks but I would like to see some EVENT which handles disconnection.
Re: BLE disconnect event??
Posted: Tue Aug 01, 2017 6:50 pm
by Trialblazer47
Yes it takes time for even the peer device to disconnect if I power of ESP32 while it is connected.
Another issue arised. Regarding Connection.
what I want is to start scaning and once connected stop scaning(this is done with in demo) but then After I am done with my device I want to disconnect and start scanning again. which I am able to do anyway. But once the scan duration is complete I don't get any event regarding it and so I am not able to start scanning.
I want to keep scanning for devices until I dont get any. this should always be scanning, or stop only when connected and then restart scaning after disconnected.
here is the serial output from my code after it disconnects its starts scan but after its scan period is finished I don't get any event of it. what should be the event after finish of scan ?
Code: Select all
.[0m
.[0;32mI (48272) GATTC_DEMO: EVT 10, gattc if 3.[0m
.[0;32mI (48272) GATTC_DEMO: NOTIFY: len 3, value 00646e65.[0m
.[0;32mI (48272) BLE_CMD: Commander Here.
.[0m
.[0;32mI (48282) BLE_CMD: data: 101 e .[0m <---my device sends this to indicate end of sending
.[0;32mI (48282) BLE_CMD: data: 110 n .[0m
.[0;32mI (48282) BLE_CMD: data: 100 d .[0m
.[0;32mI (48292) BLE_CMD: Finished Data Tansfer.[0m <-- now here I disconnect with in ESP32
.[0;31mE (48652) BT: gatt_disc_cmpl_cback() - Register for service changed indication failure.[0m
.[0;31mE (48652) BT: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016.[0m
.[0;32mI (48652) GATTC_DEMO: EVT 5, gattc if 3.[0m
.[0;32mI (48662) GATTC_DEMO: ESP_GATTC_CLOSE_EVENT.[0m
.[0;32mI (48662) DEV: Disconnected.[0m
.[0;32mI (48852) GATTC_DEMO: GAP CB EVT: 7.[0m <-- this is SCAN_START_COMPLETE_EVT
.[0;31mE (50272) BT: btm_sec_disconnected clearing pending flag handle:0 reason:22
.[0m
.[0;32mI (50272) GATTC_DEMO: GAP CB EVT: 8.[0m <--ESP_GAP_BLE_AUTH_CMPL_EVT (NRF51 has just works auth)
.[0;32mI (50272) GATTC_DEMO: GAP CB EVT: 8.[0m
.[0;31mE (78852) BT: btc_search_callback BLE observe complete. Num Resp 1 <-- I think its end of Scan duration and it stops
.[0m
.[0;32mI (78852) GATTC_DEMO: GAP CB EVT: 3.[0m
Re: BLE disconnect event??
Posted: Tue Aug 01, 2017 7:35 pm
by kolban
It seems to me that if we start a scan at time T for d seconds then the scan will be completed at T+d and we don't need an event to tell us that. If you need an asynchronous indication, then you could create a task that delays "d" and then indicates.
If you explicitly request that scanning stop, then you do receive an event (ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT).
I believe a major part of the philosophy of BLE is to minimize energy consumption. This would seem to say that we would want to avoid continuously scanning for new BLE devices. Are you 100% sure that you want to scan 100% of the time when not connected? If you are, could you not set the scan interval to be MAXINT and then explicitly stop scanning when you find what you want?
For my curiosity, would you be able to describe your project so that I may better appreciate the idea of continually scanning?
Re: BLE disconnect event??
Posted: Wed Aug 02, 2017 9:51 am
by Trialblazer47
Yes I understand that, but I am making something like a hub for BLE devices and it will be powered. those devices might advertise DATA at any time, Although those devices have the capabilities to store data if it fails to connect to hub. What do you think should the approach be ?
A sync time when devices come to relay data ? that may cause problem as(no Real time, all devices might advertise togather and only one will be served)
I will keep a task that flags after certain time and restart scan.
But I believe there should be an even when scanning is finished.
Re: BLE disconnect event??
Posted: Wed Aug 23, 2017 12:31 pm
by Trialblazer47
is there anyway we can know scanning is done? I tried with a task that starts scanning after scan interval. but adding that task breaks the app.
Code: Select all
void ticker(void *params)
{
vTaskDelay( (Scanning_duration+5)*1000 / portTICK_RATE_MS);
ESP_LOGI(GATTC_TAG,"Ticker");
// dev.scanning=false;
}
void app_main()
{
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
esp_bt_controller_init(&bt_cfg);
esp_bt_controller_enable(ESP_BT_MODE_BTDM);
dev_init();//Bytelens init dev struct.
xTaskCreate(&task_gpio_handler,"Task_IO",1024,NULL,1,NULL);
gattc_client_test();
vTaskDelay( 200 / portTICK_RATE_MS );
// dev.scanning=true;
// esp_ble_gap_start_scanning(Scanning_duration);
xTaskCreate(&bytelens_task,"Task_BLE",2048,NULL,2,NULL);
xTaskCreate(&ticker,"Task_ticker",1024,NULL,3,NULL);
gpioController.LED_Control = color_white;
}
and this is the error
Code: Select all
[0;32mI (30502) GATTC_DEMO: GAP CB EVT: 3.[0m
.[0;32mI (30502) GATTC_DEMO: Searched Device Name Len 0.[0m
.[0;31mE (30562) BT: btc_search_callback BLE observe complete. Num Resp 3
.[0m
.[0;32mI (30562) GATTC_DEMO: GAP CB EVT: 3.[0m
.[0;32mI (35742) GATTC_DEMO: Ticker.[0m
Guru Meditation Error of type IllegalInstruction occurred on core 0. Exception was unhandled.
Register dump:
PC : 0x400dde54 PS : 0x00060830 A0 : 0x00000000 A1 : 0x3ffd58a0
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800dde54 A9 : 0x3ffd5850
A10 : 0x400d6460 A11 : 0x3ffc3248 A12 : 0x3f402f10 A13 : 0x0000001f
A14 : 0x00000001 A15 : 0x00000005 SAR : 0x00000004 EXCCAUSE: 0x00000000
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xfffffffd
Backtrace: 0x400dde54:0x3ffd58a0 0x00000000:0x3ffd58c0
Rebooting...
Re: BLE disconnect event??
Posted: Wed Aug 23, 2017 12:50 pm
by kolban
Howdy my friend,
My guess is that your puzzle isn't related to BLE but rather to task management. When you create a FreeRTOS task, it is essential that when the task ends, it deletes itself. In your code you have:
Code: Select all
void ticker(void *params) {
// do something
}
This is (I believe) an error because when the ticker() function ends, you haven't deleted the task. Can you try the following:
Code: Select all
void ticker(void *params) {
// do something
vTaskDelete(NULL);
}
Re: BLE disconnect event??
Posted: Wed Aug 23, 2017 1:04 pm
by Trialblazer47
thanks for quick reply. I don't know How I missed that ?
anyways I want to keep that task to periodically check flags(that device is connected to other BLE device, or scanning is on ) if not than start scanning again.
Code: Select all
void ticker(void *params)
{
while(1){
vTaskDelay( (Scanning_duration+5)*1000 / portTICK_RATE_MS);
ESP_LOGI(GATTC_TAG,"Ticker");
if(!dev.Connected && !dev.notify && !dev.scanning)
{
dev.scanning=true;
esp_ble_gap_start_scanning(Scanning_duration);
}
}
}
however I am not able to reset the flag for scanning when it stops because its does not give any callback event as I mentioned before .. is there any function to check scanning state???
Re: BLE disconnect event??
Posted: Wed Aug 23, 2017 1:22 pm
by Trialblazer47
later the issue was this
Code: Select all
[0;31mE (30562) BT: btc_search_callback BLE observe complete. Num Resp 5
.[0m
.[0;32mI (30562) GATTC_DEMO: GAP CB EVT: 3.[0m
.[0;32mI (35742) GATTC_DEMO: Ticker.[0m
***ERROR*** A stack overflow in task Task_ticker has been detected.
abort() was called at PCGuru Meditation Error of type LoadProhibited occurred on core 1. Exception was unhandled.
Register dump:
PC : 0x400856ad PS : 0x00060033 A0 : 0x40086a7b A1 : 0x3ffcc250
A2 : 0x00050023 A3 : 0x00000001 A4 : 0x3ffc300c A5 : 0x3ffc300c
A6 : 0x00000001 A7 : 0x00060420 A8 : 0x00000002 A9 : 0x00000002
A10 : 0x00000000 A11 : 0x00000000 A12 : 0x3ffc303c A13 : 0x00060220
A14 : 0x00000000 A15 : 0x00000001 SAR : 0x0000001c EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000048 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
now increasing stack size and issue is gone. But this isn't good I am not sure what to size would be optimal.. next I am going to put MQTT Client and I would require more RAM, this way I will lose lot of ram..
Also on completion of scanning ESP_GAP_SEARCH_INQ_CMPL_EVT event is generated which resolved my other problem of knowing scanning is complete.
thanks. you Rock. Have a great day.