Support multiple connections (5+) on central

Hi,

I am working on a project where we need to connect to multiple peripherals which also include mobile devices. (up-to 10) on BLE central.

We need to measure the distance with individual devices in regular intervals.

We are referring to nrf_dm example to do so and we are currently observing connection issue on the central.

When we try to connect with more than 2/3 devices central is not scanning anymore, we confirm other peripherals are advertising and yet the central did not scanned the device.

Below is our prj.conf file 

CONFIG_BT=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_CTLR_PHY_CODED=y
# CONFIG_BT_PHY_UPDATE=y
CONFIG_BT_USER_PHY_UPDATE=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_CTLR_ADV_EXT=y

CONFIG_BT_SCAN=y
CONFIG_BT_SCAN_FILTER_ENABLE=n
CONFIG_BT_MAX_CONN=6

# Allow to read RSSI for the connected peripheral

CONFIG_BT_CTLR_CONN_RSSI=y
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_MIN_REQUIRED_HEAP_SIZE=1024

# Use internal clock source
CONFIG_CLOCK_CONTROL_NRF=y
CONFIG_CLOCK_CONTROL=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y

# PERIPHERAL
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_PER_ADV=y
CONFIG_SETTINGS=y
CONFIG_BT_SETTINGS=y

# Distance Measurement
CONFIG_DM_MODULE=y
CONFIG_MPSL=y
CONFIG_MPSL_TIMESLOT_SESSION_COUNT=3
CONFIG_MPSL_WORK_STACK_SIZE=8192

CONFIG_DM_GPIO_DEBUG=y
CONFIG_NCS_SAMPLES_DEFAULTS=y

CONFIG_BT_DEVICE_NAME="Notify"
CONFIG_DM_INITIATOR_DELAY_US=2000
CONFIG_DM_MIN_TIME_BETWEEN_TIMESLOTS_US=10000
CONFIG_DM_TIMESLOT_QUEUE_COUNT_SAME_PEER=3

CONFIG_BT_GATT_CACHING=n
CONFIG_SETTINGS_NONE=y

CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_DEBUG_LOG=y
CONFIG_LOG_MAX_LEVEL=4
CONFIG_PRINTK=n
CONFIG_DM_HIGH_PRECISION_CALC=y

# Enable PWM buzzer module
CONFIG_PWM=y
CONFIG_NRFX_GPIOTE0=y
CONFIG_NRFX_PDM=y
CONFIG_NRFX_PWM0=y
CONFIG_NRFX_PWM1=y
CONFIG_NRFX_PWM2=y
CONFIG_DEBUG=y
CONFIG_DEBUG_OPTIMIZATIONS=y
CONFIG_DEBUG_THREAD_INFO=y

# Enable ADC
CONFIG_ADC=y

# Enable NVS
CONFIG_NVS=y
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y
CONFIG_DM_RANGING_OFFSET_US=100000
CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=50
CONFIG_BT_PERIPHERAL_PREF_MIN_INT=120
CONFIG_BT_PERIPHERAL_PREF_MAX_INT=160
CONFIG_BT_CTLR_TX_PWR_PLUS_8=y

CONFIG_REBOOT=y

# Below configurations to enable DFU
# Enable mcumgr.

CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU_SPEEDUP=y
CONFIG_BOOTLOADER_MCUBOOT=y
CONFIG_SIGN_IMAGES=y
CONFIG_SECURE_BOOT=y
CONFIG_SB_SIGNING_KEY_FILE="priv_key.pem"
CONFIG_BT_L2CAP_TX_MTU=252
CONFIG_BT_BUF_ACL_RX_SIZE=256
CONFIG_PPI_TRACE=y

# Some command handlers require a large stack.
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096

# power management
CONFIG_UART_ASYNC_API=y
CONFIG_BOARD_ENABLE_DCDC=y
CONFIG_PM_DEVICE=y

We also tried restart scanning on dm intervals and no use.

We are using nrf52840 device and SDK v2.6.0

Please guide us on any config we are missing or if our method is wrong.

Thank you in advance.

Parents
  • Let me share some logs for further information.

    GATT Write...
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    GATT Write Successful
    
    write resp cb
    0: Dev seed: 0
    GATT Write Successful
    
    write resp cb
    0: Dev seed: 0
    [0]: RSSI: -34, Average: -6
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -32, Average: -13
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -32, Average: -19
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -31, Average: -25
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -32, Average: -32
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -33, Average: -32
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -33, Average: -32
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -32, Average: -32
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [Device]: D5:15:8F:AF:80:B1 (random) [AD]: 7 data_len 16
    [Device]: D5:15:8F:AF:80:B1 (random) [AD]: 7 data_len 16
    [0]: RSSI: -33, Average: -32
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    
    GATT Write...
    GATT Write Successful
    
    write resp cb
    [Device]: E8:E5:B7:3C:88:53 (random) [AD]: 7 data_len 16
    [0]: RSSI: -33, Average: -32
    
    GATT Write...
    GATT Write Successful
    
    write resp cb
    1: Dev seed: 0
    [0]: RSSI: -31, Average: -32
    [1]: RSSI: -50, Average: -10
    [0]: RSSI: -33, Average: -32
    [1]: RSSI: -31, Average: -29
    [0]: RSSI: -32, Average: -32
    [1]: RSSI: -32, Average: -35
    [0]: RSSI: -33, Average: -32
    [1]: RSSI: -31, Average: -32
    [0]: RSSI: -33, Average: -32
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -35, Average: -33
    [1]: RSSI: -32, Average: -31
    [0]: RSSI: -33, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -33, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -34, Average: -33
    [1]: RSSI: -32, Average: -32
    [0]: RSSI: -33, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -33, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -32, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -33, Average: -33
    [1]: RSSI: -33, Average: -32
    [0]: RSSI: -32, Average: -32
    [1]: RSSI: -32, Average: -32

    As you can observe from the logs, the device is scanning for peripherals and when any new device is scanned, we are printing as [Device]
    As soon as the 2nd device connected, the scanning stopped.

    We do not know what is happening or why it happened. We cannot debug as when we try to debug, the device automatically disconnects and restart/halt.

  • Hi, 

    Could you try to enable the CONFIG_DM_TIMESLOT_RESCHEDULE option? The device will try to range the same peer again if the previous ranging was successful.

    -Amanda H.

  • Hi Amanda,

    Thank you for the response, I see the ranging is not the issue. We get the DM and RSSI for the connected devices at regular intervals.

    Whereas we are not able to connect any new device or reconnect paired devices. As we observed the central is not scanning for any devices at all after 2/3 devices are connected.

    Let me also try your solution and get back to you.

  • Hi Amanda,

    Sorry for late reply.

    We made a lot of changes on prj conf which also include your suggestion and also to stable the DM module and it is working.

    Sorry I cannot pinpoint the fix to the issue as we had lot of changes on the project. Let me share the final prj file which is working for us so if anyone looking for suggestion can refer to the file and compare.

    # CENTRAL
    CONFIG_BT=y
    CONFIG_BT_CENTRAL=y
    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=n
    CONFIG_BT_MAX_CONN=5
    # Allow to read RSSI for the connected peripheral
    CONFIG_BT_CTLR=y
    CONFIG_BT_CTLR_CONN_RSSI=y
    
    # PERIPHERAL
    CONFIG_BT_PERIPHERAL=y
    CONFIG_BT_PER_ADV=y
    CONFIG_BT_SETTINGS=y
    CONFIG_BT_GATT_CLIENT=y
    CONFIG_BT_GATT_CACHING=n
    CONFIG_BT_L2CAP_TX_MTU=252
    CONFIG_BT_BUF_ACL_RX_SIZE=256
    CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=600
    CONFIG_BT_PERIPHERAL_PREF_MIN_INT=120
    CONFIG_BT_PERIPHERAL_PREF_MAX_INT=160
    CONFIG_BT_PERIPHERAL_PREF_LATENCY=2
    CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
    CONFIG_BT_CTLR_ADVANCED_FEATURES=y
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    
    # PHY Coded enable for long range
    # CONFIG_BT_PHY_UPDATE=y
    CONFIG_BT_CTLR_PHY_CODED=y
    CONFIG_BT_USER_PHY_UPDATE=y
    CONFIG_BT_CTLR_ADV_EXT=y
    CONFIG_BT_EXT_ADV=y
    
    # Distance Measurement
    CONFIG_DM_MODULE=y
    CONFIG_DM_GPIO_DEBUG=y
    CONFIG_DM_HIGH_PRECISION_CALC=y
    CONFIG_DM_TIMESLOT_RESCHEDULE=y
    CONFIG_DM_INITIATOR_DELAY_US=2000
    CONFIG_DM_RANGING_OFFSET_US=100000
    CONFIG_DM_MIN_TIME_BETWEEN_TIMESLOTS_US=100000
    CONFIG_DM_TIMESLOT_QUEUE_COUNT_SAME_PEER=3
    CONFIG_MPSL=y
    CONFIG_MPSL_TIMESLOT_SESSION_COUNT=3
    CONFIG_MPSL_WORK_STACK_SIZE=8192
    
    CONFIG_SETTINGS_NONE=y
    CONFIG_SETTINGS=y
    
    CONFIG_NEWLIB_LIBC=y
    CONFIG_NEWLIB_LIBC_MIN_REQUIRED_HEAP_SIZE=1024
    
    # Use internal clock source
    CONFIG_CLOCK_CONTROL_NRF=y
    CONFIG_CLOCK_CONTROL=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
    
    # Enable PWM buzzer module
    CONFIG_PWM=y
    CONFIG_NRFX_PWM1=y
    CONFIG_NRFX_PWM2=y
    
    # Enable ADC
    CONFIG_ADC=y
    
    # Enable NVS
    CONFIG_NVS=y
    
    CONFIG_FLASH=y
    CONFIG_FLASH_PAGE_LAYOUT=y
    CONFIG_MPU_ALLOW_FLASH_WRITE=y
    
    CONFIG_REBOOT=y
    
    # Below configurations to enable DFU
    # Enable mcumgr.
    CONFIG_NCS_SAMPLES_DEFAULTS=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU_SPEEDUP=y
    CONFIG_BOOTLOADER_MCUBOOT=y
    CONFIG_SIGN_IMAGES=y
    CONFIG_SECURE_BOOT=y
    CONFIG_SB_SIGNING_KEY_FILE="priv_key.pem"
    
    # Some command handlers require a large stack.
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
    
    # power management
    CONFIG_PM_DEVICE=y
    
    # Disable system logs
    CONFIG_LOG_MAX_LEVEL=4
    

Reply
  • Hi Amanda,

    Sorry for late reply.

    We made a lot of changes on prj conf which also include your suggestion and also to stable the DM module and it is working.

    Sorry I cannot pinpoint the fix to the issue as we had lot of changes on the project. Let me share the final prj file which is working for us so if anyone looking for suggestion can refer to the file and compare.

    # CENTRAL
    CONFIG_BT=y
    CONFIG_BT_CENTRAL=y
    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=n
    CONFIG_BT_MAX_CONN=5
    # Allow to read RSSI for the connected peripheral
    CONFIG_BT_CTLR=y
    CONFIG_BT_CTLR_CONN_RSSI=y
    
    # PERIPHERAL
    CONFIG_BT_PERIPHERAL=y
    CONFIG_BT_PER_ADV=y
    CONFIG_BT_SETTINGS=y
    CONFIG_BT_GATT_CLIENT=y
    CONFIG_BT_GATT_CACHING=n
    CONFIG_BT_L2CAP_TX_MTU=252
    CONFIG_BT_BUF_ACL_RX_SIZE=256
    CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=600
    CONFIG_BT_PERIPHERAL_PREF_MIN_INT=120
    CONFIG_BT_PERIPHERAL_PREF_MAX_INT=160
    CONFIG_BT_PERIPHERAL_PREF_LATENCY=2
    CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
    CONFIG_BT_CTLR_ADVANCED_FEATURES=y
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    
    # PHY Coded enable for long range
    # CONFIG_BT_PHY_UPDATE=y
    CONFIG_BT_CTLR_PHY_CODED=y
    CONFIG_BT_USER_PHY_UPDATE=y
    CONFIG_BT_CTLR_ADV_EXT=y
    CONFIG_BT_EXT_ADV=y
    
    # Distance Measurement
    CONFIG_DM_MODULE=y
    CONFIG_DM_GPIO_DEBUG=y
    CONFIG_DM_HIGH_PRECISION_CALC=y
    CONFIG_DM_TIMESLOT_RESCHEDULE=y
    CONFIG_DM_INITIATOR_DELAY_US=2000
    CONFIG_DM_RANGING_OFFSET_US=100000
    CONFIG_DM_MIN_TIME_BETWEEN_TIMESLOTS_US=100000
    CONFIG_DM_TIMESLOT_QUEUE_COUNT_SAME_PEER=3
    CONFIG_MPSL=y
    CONFIG_MPSL_TIMESLOT_SESSION_COUNT=3
    CONFIG_MPSL_WORK_STACK_SIZE=8192
    
    CONFIG_SETTINGS_NONE=y
    CONFIG_SETTINGS=y
    
    CONFIG_NEWLIB_LIBC=y
    CONFIG_NEWLIB_LIBC_MIN_REQUIRED_HEAP_SIZE=1024
    
    # Use internal clock source
    CONFIG_CLOCK_CONTROL_NRF=y
    CONFIG_CLOCK_CONTROL=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
    
    # Enable PWM buzzer module
    CONFIG_PWM=y
    CONFIG_NRFX_PWM1=y
    CONFIG_NRFX_PWM2=y
    
    # Enable ADC
    CONFIG_ADC=y
    
    # Enable NVS
    CONFIG_NVS=y
    
    CONFIG_FLASH=y
    CONFIG_FLASH_PAGE_LAYOUT=y
    CONFIG_MPU_ALLOW_FLASH_WRITE=y
    
    CONFIG_REBOOT=y
    
    # Below configurations to enable DFU
    # Enable mcumgr.
    CONFIG_NCS_SAMPLES_DEFAULTS=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU_SPEEDUP=y
    CONFIG_BOOTLOADER_MCUBOOT=y
    CONFIG_SIGN_IMAGES=y
    CONFIG_SECURE_BOOT=y
    CONFIG_SB_SIGNING_KEY_FILE="priv_key.pem"
    
    # Some command handlers require a large stack.
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
    
    # power management
    CONFIG_PM_DEVICE=y
    
    # Disable system logs
    CONFIG_LOG_MAX_LEVEL=4
    

Children
No Data
Related