Thursday, March 23, 2017

Hack for changing Min and Max connection interval for Bluez stack using kernel interface .

I tried this on Raspberry Pi(RPI) setup.  I configured Bluez as a LE peripheral . by default Bluez keeps Min connection interval as approximately 60ms and max as 80ms which is pretty high, as a result BLE throughput I was getting was very less (~= 28kbps).

Bluez does not provide any API to change connection interval when Bluez is acting in peripheral role.So for experimental purpose I figured out a way to change min and max connection interval . Bluez provides sys debug interface to change these parameters . here is the method to do that:

1) browse through /sys/kernel directory.
pi@raspberrypi:/sys/kernel $ ls -la
total 0
drwxr-xr-x  8 root root    0 Jan  1  1970 .
dr-xr-xr-x 12 root root    0 Jan  1  1970 ..
drwxr-xr-x  3 root root    0 Jan  1  1970 config
drwx------ 24 root root    0 Jan  1  1970 debug
drwxr-xr-x  2 root root    0 Mar 23 22:32 fscache
-r--r--r--  1 root root 4096 Mar 23 22:32 fscaps
drwxr-xr-x  2 root root    0 Jan  1  1970 mm
-r--r--r--  1 root root   36 Mar 23 22:32 notes
-rw-r--r--  1 root root 4096 Mar 23 22:32 profiling
-rw-r--r--  1 root root 4096 Mar 23 22:32 rcu_expedited
drwxr-xr-x 81 root root    0 Mar 23 00:04 slab
dr-xr-xr-x  2 root root    0 Mar 23 22:32 tracing
-rw-r--r--  1 root root 4096 Mar 23 22:32 uevent_helper
-r--r--r--  1 root root 4096 Mar 23 22:32 uevent_seqnum



2) RPI does not let you access debug folder without root permission.
pi@raspberrypi:/sys/kernel $ cd debug/
bash: cd: debug/: Permission denied

So change made for debug folder as follows

pi@raspberrypi:/sys/kernel $ sudo chmod 777  debug/

3) browse debug folder :
pi@raspberrypi:/sys/kernel $ cd debug/

pi@raspberrypi:/sys/kernel/debug/bluetooth/hci0 $ ls
adv_channel_map             features                       remote_oob
adv_max_interval            force_static_address           rpa_timeout
adv_min_interval            hardware_error                 sc_only_mode
auto_accept_delay           hci_revision                   sniff_max_interval
blacklist                   hci_version                    sniff_min_interval
conn_info_max_age           identity                       ssp_debug_mode
conn_info_min_age           identity_resolving_keys        static_address
conn_latency                idle_timeout                   supervision_timeout
conn_max_interval           inquiry_cache                  use_debug_keys
conn_min_interval           link_keys                      uuids
dev_class                   long_term_keys                 voice_setting
device_id                   manufacturer                   white_list
device_list                 quirk_simultaneous_discovery   white_list_size
discov_interleaved_timeout  quirk_strict_duplicate_filter
dut_mode                    random_address



4) Now change conn_max_interval and conn_max_interval parameters as follows:

pi@raspberrypi:/sys/kernel/debug/bluetooth/hci0 $ echo 6  > conn_min_interval

pi@raspberrypi:/sys/kernel/debug/bluetooth/hci0 $ echo 12  > conn_max_interval


after these modifications whatver central device your RPI connects to it would get allocated connection interval between the range of (6* 1.25ms ) to (12 * 1.25ms).

2 comments: