From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Date: Thu, 20 Apr 2017 01:20:56 +0200 From: Olivier MARTIN To: Barry Byford <31baz66@gmail.com> Cc: Bluez mailing list Subject: Re: GATT Server: DBus GATT Services not advertised/exported In-Reply-To: References: <1b8c74ef5fafaca3c75fb87249d728f8@labapart.com> <1c0a0d7a4270d7dcb457523e8fbbc244@labapart.com> <7e78e5e8a8340ee2b459d0cd2f645712@labapart.com> Message-ID: <122bd75a159578eee407a7ff2497fe68@labapart.com> Sender: linux-bluetooth-owner@vger.kernel.org List-ID: I am back on the thread. What I noticed last week when I tried on Android phone with both "BLE Scanner" and "Nordic Connect", discovering GATT services is really really slow (it takes 2 min to discover all `example-gatt-server` GATT services) on Nexus 4 with Android 5.1.1 and Ubuntu 16.04 with Bluez v5.44 for the GATT server. I am using the Asus USB-BT400 (Broadcom chipset). I did more investigation this evening but I have not done any progress. I tried with `example-gatt-server` started by the user and root and no change in the poor performance. I do not know what is taking so long but for instance it takes many seconds to execute this part: bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x005e end: 0x0061 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0060 end: 0x0061 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0061 end: 0x0061 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0062 end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0062 end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x006e end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0065 end: 0x0067 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0066 end: 0x0067 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0067 end: 0x0067 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x006a end: 0x006c bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x006b end: 0x006c bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x006c end: 0x006c bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x006f end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0070 end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0071 end: 0x0071 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0072 end: 0x0079 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0072 end: 0x0079 bluetoothd[12913]: src/device.c:gatt_debug() Read By Type - start: 0x0079 end: 0x0079 bluetoothd[12913]: src/device.c:gatt_debug() Find Info - start: 0x0077 end: 0x0077 On 14.04.2017 20:31, Barry Byford wrote: > Hello Olivier, > > On 14 April 2017 at 19:14, Olivier MARTIN wrote: >> Thanks Barry, setting 'ControllerMode = le' in >> /etc/bluetooth/main.conf >> fixed my issue. I can now see the GATT services. > > Good news! > >> But I guess my adapter now only works as BLE adapter and will ignore >> the >> non-LE devices. >> In the comment of /etc/bluetooth/main.conf it is written the adapter >> should >> be by default set as 'dual'. >> >> Is it a bug in Bluez? Why GATT services are not exposed while using >> the >> default value for 'ControllerMode'? > > This issue has come up before and was discuss here: > http://marc.info/?l=linux-bluetooth&m=146071596012263&w=2 > > > > >> On 14.04.2017 14:30, Barry Byford wrote: >>> >>> Hello Olivier, >>> >>> >>> On 14 April 2017 at 12:01, Olivier MARTIN >>> wrote: >>>> >>>> You are right Barry, `example-advertisement` seems to work well (I >>>> installed >>>> and tried Nordic nRF Connect and I can see the expected advertisemet >>>> data). >>> >>> >>> Excellent! >>> >>> >>>> But I cannot still manage to get `example-gatt-server` :-( >>>> I am sure I got it working last year with an older version of Bluez. >>>> But >>>> I >>>> cannot make it work with Bluez v5.44. >>> >>> >>> OK, I've taken a look at "example-gatt-server" and have it working... >>> >>>> >>>> My testing procedure: >>>> >>>> 1. [Laptop] First terminal: Start `sudo ./src/bluetoothd -E -n -d` >>>> 2. [Laptop] Second terminal: Start unmodified Bluez >>>> ./test/example-gatt-server >>>> 3. [Laptop] Third terminal: Ensure the adapter is "Powered: yes" and >>>> "Discoverable: yes" >>> >>> >>> OK, I've done this slightly different (details below). However, the >>> first thing I did was edit "/etc/bluetooth/main.conf" >>> I added the following line to the end of the file: >>> >>> ControllerMode = le >>> >>> Then I did the following: >>> 1. [SBC1:T1] sudo ./src/bluetoothd -E -n -d >>> 2. [SBC1:T2] ./example-gatt-server >>> 3. [SBC1:T3] ./example-advertisement >>> >>> >>>> >>>> 4. [Android] Connect using Nordic nRF Connect (I also tried with >>>> "BLE >>>> Scanner") and check I see the exposed GATT services by >>>> `example-gatt-server` >>>> Unfortunately, I can only see: >>>> - Generic Access Service (0x1800) >>>> - Generic Attribute Service (0x1801) >>>> >>> >>> I've used bluetoothctl on SBC2 to connect and read the battery values >>> that the GATT server is counting down. >>> >>> $ bluetoothctl >>> [NEW] Controller 00:00:00:00:5A:AD linaro-alip [default] >>> [bluetooth]# scan on >>> Discovery started >>> [CHG] Controller 00:00:00:00:5A:AD Discovering: yes >>> [NEW] Device B8:27:EB:22:57:E0 BluezeroLight >>> [bluetooth]# scan off >>> Discovery stopped >>> [CHG] Controller 00:00:00:00:5A:AD Discovering: no >>> [bluetooth]# connect B8:27:EB:22:57:E0 >>> Attempting to connect to B8:27:EB:22:57:E0 >>> [CHG] Device B8:27:EB:22:57:E0 Connected: yes >>> Connection successful >>> [...snip...] >>> [NEW] Primary Service >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a >>> 0000180f-0000-1000-8000-00805f9b34fb >>> Battery Service >>> [NEW] Characteristic >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b >>> 00002a19-0000-1000-8000-00805f9b34fb >>> Battery Level >>> [...snip...] >>> [CHG] Device B8:27:EB:22:57:E0 ServicesResolved: yes >>> [BluezeroLight]# select-attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b >>> [BluezeroLight:/service000a/char000b]# read >>> Attempting to read >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x46 >>> 46 F >>> [BluezeroLight:/service000a/char000b]# notify on >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Notifying: >>> yes >>> Notify started >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x46 >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x44 >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x42 >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x40 >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Value: >>> 0x3e >>> [BluezeroLight:/service000a/char000b]# notify off >>> [CHG] Attribute >>> /org/bluez/hci0/dev_B8_27_EB_22_57_E0/service000a/char000b Notifying: >>> no >>> Notify stopped >>> >>> >>> That seems to be working then. When I didn't have "ControllerMode = >>> le" set then I did see it be unpredictable if it successfully >>> connected or not. >>> This also worked connecting with the nRF app. >>> >>> >>> Does that work for you? >>> >>> >>> >>> >>>> If I had to suspect Bluez code, I will guess there is something >>>> missing >>>> around here: >>>> >>>> bluetoothd[20429]: src/device.c:gatt_server_init() # >>>> gatt_server_init >>>> bluetoothd[20429]: src/device.c:gatt_debug() Primary services found: >>>> 2 >>>> bluetoothd[20429]: src/device.c:gatt_debug() start: 0x0001, end: >>>> 0x0005, >>>> uuid: 00001801-0000-1000-8000-00805f9b34fb >>>> bluetoothd[20429]: src/device.c:gatt_debug() start: 0x0014, end: >>>> 0xffff, >>>> uuid: 00001800-0000-1000-8000-00805f9b34fb >>>> bluetoothd[20429]: src/device.c:gatt_debug() Registered handler for >>>> "Service >>>> Changed": 0 >>>> bluetoothd[20429]: src/device.c:gatt_client_ready_cb() status: >>>> success, >>>> error: 0 >>>> >>>> As Bluez daemon does not get the GATT services from Buez GATT >>>> Database. >>>> But >>>> it might be me who miss a step... >>>> >>>> >>>> On 14.04.2017 12:37, Barry Byford wrote: >>>>> >>>>> >>>>> example-advertisementHello Oliver, >>>>> >>>>> >>>>> On 14 April 2017 at 11:03, Olivier MARTIN >>>>> wrote: >>>>>> >>>>>> >>>>>> Thanks for replying my message Barry, >>>>>> >>>>>> Sorry, I forgot to mention but I start Bluez daemon with `sudo >>>>>> ./src/bluetoothd -E -n -d` (after stopping the bluetooth service). >>>>>> So I >>>>>> already run it with sudo and experimental option. >>>>>> >>>>>> I am not sure to understand what you mean by "this kind of error >>>>>> message". >>>>>> Because I do not see any error message in the log I provided. >>>>> >>>>> >>>>> >>>>> OK, that was bad on my part. I read it as complaining that there >>>>> were >>>>> too many advertisements. Looking again that wasn't what it was say. >>>>> Apologies. >>>>> >>>>>> >>>>>> Any other idea? >>>>> >>>>> >>>>> >>>>> I am by Linux Single Board Computers (SBC) today so I'm able to run >>>>> what you are running and can show you what I'm seeing. I'll focus >>>>> on >>>>> example-advertisement first as example-gatt-server doesn't change >>>>> the >>>>> advertisements. >>>>> >>>>> I've started the BlueZ daemon with "./src/bluetoothd -E -n -d" >>>>> >>>>> In another shell when I start "./example-advertisement" I see the >>>>> following in the output: >>>>> >>>>> bluetoothd[2325]: src/adapter.c:property_set_mode() sending Set >>>>> Powered command for index 0 >>>>> bluetoothd[2325]: src/adapter.c:property_set_mode_complete() >>>>> Success >>>>> (0x00) >>>>> bluetoothd[2325]: src/adapter.c:new_settings_callback() Settings: >>>>> 0x00000ad1 >>>>> bluetoothd[2325]: src/adapter.c:settings_changed() Changed >>>>> settings: >>>>> 0x00000001 >>>>> bluetoothd[2325]: src/adapter.c:adapter_start() adapter >>>>> /org/bluez/hci0 has been enabled >>>>> bluetoothd[2325]: src/adapter.c:trigger_passive_scanning() >>>>> bluetoothd[2325]: src/advertising.c:register_advertisement() >>>>> RegisterAdvertisement >>>>> bluetoothd[2325]: src/advertising.c:client_create() Adding proxy >>>>> for >>>>> /org/bluez/example/advertisement0 >>>>> bluetoothd[2325]: src/advertising.c:register_advertisement() >>>>> Registered advertisement at path /org/bluez/example/advertisement0 >>>>> bluetoothd[2325]: src/advertising.c:parse_service_uuids() Adding >>>>> ServiceUUID: 180D >>>>> bluetoothd[2325]: src/advertising.c:parse_service_uuids() Adding >>>>> ServiceUUID: 180F >>>>> bluetoothd[2325]: src/advertising.c:parse_manufacturer_data() >>>>> Adding >>>>> ManufacturerData for ffff >>>>> bluetoothd[2325]: src/advertising.c:parse_service_data() Adding >>>>> ServiceData for 9999 >>>>> bluetoothd[2325]: src/advertising.c:refresh_advertisement() >>>>> Refreshing >>>>> advertisement: /org/bluez/example/advertisement0 >>>>> bluetoothd[2325]: src/advertising.c:add_adv_callback() >>>>> Advertisement >>>>> registered: /org/bluez/example/advertisement0 >>>>> >>>>> >>>>> On a second SBC, at the command line I run "bluetoothctl" and do >>>>> "scan >>>>> on". Once my first SBC is found I do "scan off". I then do "info >>>>> B8:27:EB:22:57:E0" (this is the address of the first SBC) which >>>>> gives >>>>> the following output: >>>>> >>>>> [bluetooth]# info B8:27:EB:22:57:E0 >>>>> Device B8:27:EB:22:57:E0 >>>>> Alias: B8-27-EB-22-57-E0 >>>>> Paired: no >>>>> Trusted: no >>>>> Blocked: no >>>>> Connected: no >>>>> LegacyPairing: no >>>>> UUID: Heart Rate >>>>> (0000180d-0000-1000-8000-00805f9b34fb) >>>>> UUID: Battery Service >>>>> (0000180f-0000-1000-8000-00805f9b34fb) >>>>> ManufacturerData Key: 0xffff >>>>> ManufacturerData Value: 0x00 >>>>> ManufacturerData Value: 0x01 >>>>> ManufacturerData Value: 0x02 >>>>> ManufacturerData Value: 0x03 >>>>> ManufacturerData Value: 0x04 >>>>> ServiceData Key: 00009999-0000-1000-8000-00805f9b34fb >>>>> ServiceData Value: 0x00 >>>>> ServiceData Value: 0x01 >>>>> ServiceData Value: 0x02 >>>>> ServiceData Value: 0x03 >>>>> ServiceData Value: 0x04 >>>>> >>>>> >>>>> I've also done a scan from my Android phone (using the Nordic nRF >>>>> Connect app) and can see the advertisements also (just hard to >>>>> share >>>>> that information on here). >>>>> >>>>> Does that help? >>>>> >>>>> >>>>>> >>>>>> >>>>>> On 13.04.2017 19:59, Barry Byford wrote: >>>>>>> >>>>>>> >>>>>>> >>>>>>> Hello Olivier, >>>>>>> >>>>>>> >>>>>>> On 13 April 2017 at 12:14, Olivier MARTIN >>>>>>> wrote: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> Hi all, >>>>>>>> I am having issue to advertise/export GATT services exposed >>>>>>>> through >>>>>>>> DBus >>>>>>>> API. I tried `./test/example-gatt-server`. And I also tried to >>>>>>>> merge >>>>>>>> `./test/example-advertisement` into >>>>>>>> `./test/example-gatt-server`. But >>>>>>>> in >>>>>>>> both cases I only see the two compulsory GATT services: >>>>>>>> - Generic Access Service (0x1800) >>>>>>>> - Generic Attribute Service (0x1801) >>>>>>>> >>>>>>>> I am using Bluez v5.44. And I also tried Bluez v5.37. >>>>>>>> >>>>>>>> GATT Services seem to be discovered by Bluez (note: I added >>>>>>>> additional >>>>>>>> debug >>>>>>>> statement all prefixed with '#'): >>>>>>>> >>>>>>>> bluetoothd[16877]: src/gatt-database.c:manager_register_app() # >>>>>>>> manager_register_app >>>>>>>> bluetoothd[16877]: src/gatt-database.c:create_app() # create_app >>>>>>>> bluetoothd[16877]: src/gatt-database.c:manager_register_app() >>>>>>>> Registering >>>>>>>> application: :1.404:/ >>>>>>>> bluetoothd[16877]: src/advertising.c:register_advertisement() >>>>>>>> RegisterAdvertisement >>>>>>>> bluetoothd[16877]: src/advertising.c:client_create() Adding >>>>>>>> proxy for >>>>>>>> /org/bluez/example/advertisement0 >>>>>>>> bluetoothd[16877]: src/advertising.c:register_advertisement() >>>>>>>> Registered >>>>>>>> advertisement at path /org/bluez/example/advertisement0 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service0/char2, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char0/desc0, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char2/desc3, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char2, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service1/char0, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char1, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service0/char1, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char1/desc3, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char1/desc2, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service0/char0, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2, iface: org.bluez.GattService1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service1, iface: org.bluez.GattService1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service0, iface: org.bluez.GattService1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char0/desc1, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char2/desc2, iface: >>>>>>>> org.bluez.GattDescriptor1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:proxy_added_cb() Object >>>>>>>> received: >>>>>>>> /org/bluez/example/service2/char0, iface: >>>>>>>> org.bluez.GattCharacteristic1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:client_ready_cb() # >>>>>>>> client_ready_cb >>>>>>>> bluetoothd[16877]: src/gatt-database.c:create_service() # >>>>>>>> create_service >>>>>>>> from /org/bluez/example/service2 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:create_service() # >>>>>>>> create_service >>>>>>>> from /org/bluez/example/service1 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:create_service() # >>>>>>>> create_service >>>>>>>> from /org/bluez/example/service0 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_app() # >>>>>>>> database_add_app >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_service() # >>>>>>>> database_add_service >>>>>>>> bluetoothd[16877]: src/gatt-database.c:cep_write_cb() Stored CEP >>>>>>>> value >>>>>>>> in >>>>>>>> the database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_cep() >>>>>>>> Created CEP >>>>>>>> entry >>>>>>>> for characteristic >>>>>>>> bluetoothd[16877]: src/gatt-database.c:cep_write_cb() Stored CEP >>>>>>>> value >>>>>>>> in >>>>>>>> the database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_cep() >>>>>>>> Created CEP >>>>>>>> entry >>>>>>>> for characteristic >>>>>>>> bluetoothd[16877]: src/gatt-database.c:cep_write_cb() Stored CEP >>>>>>>> value >>>>>>>> in >>>>>>>> the database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_cep() >>>>>>>> Created CEP >>>>>>>> entry >>>>>>>> for characteristic >>>>>>>> bluetoothd[16877]: src/gatt-database.c:gatt_db_service_added() # >>>>>>>> gatt_db_service_added: GATT Service added to local database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_service() # >>>>>>>> database_add_service >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_ccc() >>>>>>>> Created CCC >>>>>>>> entry >>>>>>>> for characteristic >>>>>>>> bluetoothd[16877]: src/gatt-database.c:gatt_db_service_added() # >>>>>>>> gatt_db_service_added: GATT Service added to local database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_service() # >>>>>>>> database_add_service >>>>>>>> bluetoothd[16877]: src/gatt-database.c:database_add_ccc() >>>>>>>> Created CCC >>>>>>>> entry >>>>>>>> for characteristic >>>>>>>> bluetoothd[16877]: src/gatt-database.c:gatt_db_service_added() # >>>>>>>> gatt_db_service_added: GATT Service added to local database >>>>>>>> bluetoothd[16877]: src/gatt-database.c:client_ready_cb() GATT >>>>>>>> application >>>>>>>> registered: :1.404:/ >>>>>>>> bluetoothd[16877]: src/advertising.c:parse_service_uuids() >>>>>>>> Adding >>>>>>>> ServiceUUID: 180D >>>>>>>> bluetoothd[16877]: src/advertising.c:parse_service_uuids() >>>>>>>> Adding >>>>>>>> ServiceUUID: 180F >>>>>>>> bluetoothd[16877]: src/advertising.c:parse_manufacturer_data() >>>>>>>> Adding >>>>>>>> ManufacturerData for ffff >>>>>>>> bluetoothd[16877]: src/advertising.c:parse_service_data() Adding >>>>>>>> ServiceData >>>>>>>> for 9999 >>>>>>>> bluetoothd[16877]: src/advertising.c:refresh_advertisement() >>>>>>>> Refreshing >>>>>>>> advertisement: /org/bluez/example/advertisement0 >>>>>>>> bluetoothd[16877]: src/advertising.c:add_adv_callback() >>>>>>>> Advertisement >>>>>>>> registered: /org/bluez/example/advertisement0 >>>>>>>> >>>>>>>> I start `./test/example-gatt-server` as a normal user. But Bluez >>>>>>>> does >>>>>>>> not >>>>>>>> seem to have any permission issue with it. >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> Building from source I've seen something similar if I've used >>>>>>> sudo for >>>>>>> the >>>>>>> make. >>>>>>> >>>>>>> To compile and install I use sudo for the install only: >>>>>>> >>>>>>> make -j 4 && sudo make install >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> I am using 'BLE scanner' on Android to discover the GATT >>>>>>>> services. >>>>>>>> But >>>>>>>> I >>>>>>>> think the problem is coming from Bluez. When I connect the >>>>>>>> Android >>>>>>>> device >>>>>>>> to >>>>>>>> Bluez, I can see this log: >>>>>>>> >>>>>>>> bluetoothd[16877]: src/adapter.c:connected_callback() hci0 >>>>>>>> device >>>>>>>> 98:D6:F7:31:7B:0D connected eir_len 14 >>>>>>>> bluetoothd[16877]: src/gatt-database.c:connect_cb() New incoming >>>>>>>> BR/EDR >>>>>>>> ATT >>>>>>>> connection >>>>>>>> bluetoothd[16877]: attrib/gattrib.c:g_attrib_ref() 0x98cd908: >>>>>>>> g_attrib_ref=1 >>>>>>>> bluetoothd[16877]: src/device.c:load_gatt_db() # load_gatt_db: >>>>>>>> Restoring >>>>>>>> 98:D6:F7:31:7B:0D gatt database from file >>>>>>>> '/var/lib/bluetooth/5C:F3:70:6A:D9:3C/cache/98:D6:F7:31:7B:0D' >>>>>>>> bluetoothd[16877]: src/device.c:load_gatt_db_impl() # >>>>>>>> load_gatt_db_impl >>>>>>>> bluetoothd[16877]: src/device.c:load_service() # load_service: >>>>>>>> loading >>>>>>>> service: 0x0001, end: 0x0005, uuid: >>>>>>>> 00001801-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:load_service() # load_service: >>>>>>>> loading >>>>>>>> service: 0x0014, end: 0xffff, uuid: >>>>>>>> 00001800-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:load_chrc() loading >>>>>>>> characteristic >>>>>>>> handle: >>>>>>>> 0x0002, value handle: 0x0003, properties 0x0020 uuid: >>>>>>>> 00002a05-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:load_chrc() loading >>>>>>>> characteristic >>>>>>>> handle: >>>>>>>> 0x0015, value handle: 0x0016, properties 0x0002 uuid: >>>>>>>> 00002a00-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:load_chrc() loading >>>>>>>> characteristic >>>>>>>> handle: >>>>>>>> 0x0017, value handle: 0x0018, properties 0x0002 uuid: >>>>>>>> 00002a01-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:load_gatt_db() List GATT >>>>>>>> Primaries >>>>>>>> before >>>>>>>> being free: >>>>>>>> bluetoothd[16877]: src/device.c:print_primary() - Primary UUID: >>>>>>>> 00001801-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:print_primary() - Primary UUID: >>>>>>>> 00001800-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:add_primary() # add_primary >>>>>>>> bluetoothd[16877]: src/device.c:add_primary() # add_primary >>>>>>>> bluetoothd[16877]: profiles/gap/gas.c:gap_accept() GAP profile >>>>>>>> accept >>>>>>>> (98:D6:F7:31:7B:0D) >>>>>>>> bluetoothd[16877]: src/service.c:change_state() 0x98c98e0: >>>>>>>> device >>>>>>>> 98:D6:F7:31:7B:0D profile gap-profile state changed: >>>>>>>> disconnected -> >>>>>>>> connected (0) >>>>>>>> bluetoothd[16877]: src/gatt-client.c:btd_gatt_client_connected() >>>>>>>> Device >>>>>>>> connected. >>>>>>>> bluetoothd[16877]: src/device.c:gatt_server_init() # >>>>>>>> gatt_server_init >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() Primary services >>>>>>>> found: >>>>>>>> 2 >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() start: 0x0001, end: >>>>>>>> 0x0005, >>>>>>>> uuid: 00001801-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() start: 0x0014, end: >>>>>>>> 0xffff, >>>>>>>> uuid: 00001800-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() Registered handler >>>>>>>> for >>>>>>>> "Service >>>>>>>> Changed": 0 >>>>>>>> bluetoothd[16877]: src/device.c:gatt_client_ready_cb() status: >>>>>>>> success, >>>>>>>> error: 0 >>>>>>>> bluetoothd[16877]: src/device.c:register_gatt_services() # >>>>>>>> register_gatt_services >>>>>>>> bluetoothd[16877]: src/device.c:add_primary() # add_primary >>>>>>>> bluetoothd[16877]: src/device.c:add_primary() # add_primary >>>>>>>> bluetoothd[16877]: src/device.c:add_gatt_service() # >>>>>>>> add_gatt_service: >>>>>>>> UUID:00001801-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/gatt-client.c:btd_gatt_client_ready() >>>>>>>> GATT >>>>>>>> client >>>>>>>> ready >>>>>>>> bluetoothd[16877]: src/gatt-client.c:create_services() Exporting >>>>>>>> objects >>>>>>>> for >>>>>>>> GATT services: 98:D6:F7:31:7B:0D >>>>>>>> bluetoothd[16877]: src/gatt-client.c:service_create() Exported >>>>>>>> GATT >>>>>>>> service: >>>>>>>> /org/bluez/hci0/dev_98_D6_F7_31_7B_0D/service0001 >>>>>>>> bluetoothd[16877]: src/gatt-client.c:characteristic_create() >>>>>>>> Exported >>>>>>>> GATT >>>>>>>> characteristic: >>>>>>>> /org/bluez/hci0/dev_98_D6_F7_31_7B_0D/service0001/char0002 >>>>>>>> bluetoothd[16877]: src/device.c:device_svc_resolved() >>>>>>>> /org/bluez/hci0/dev_98_D6_F7_31_7B_0D err 0 >>>>>>>> bluetoothd[16877]: src/device.c:store_gatt_db() # store_gatt_db >>>>>>>> bluetoothd[16877]: src/device.c:store_service() # store_service >>>>>>>> bluetoothd[16877]: src/device.c:store_service() # store_service >>>>>>>> bluetoothd[16877]: profiles/gap/gas.c:read_device_name_cb() GAP >>>>>>>> Device >>>>>>>> Name: >>>>>>>> Nexus 4 >>>>>>>> bluetoothd[16877]: profiles/gap/gas.c:read_appearance_cb() GAP >>>>>>>> Appearance: >>>>>>>> 0x0000 >>>>>>>> >>>>>>>> I also reduced DBus 'TestAdvertisement' interface to only expose >>>>>>>> one >>>>>>>> GATT >>>>>>>> Service as many BLE adapter got a limitation in the size of the >>>>>>>> advertisement packet: >>>>>>>> class TestAdvertisement(Advertisement): >>>>>>>> >>>>>>>> def __init__(self, bus, index): >>>>>>>> Advertisement.__init__(self, bus, index, 'peripheral') >>>>>>>> #self.add_service_uuid('180D') # HeartRate >>>>>>>> self.add_service_uuid('180F') # Battery >>>>>>>> #self.add_manufacturer_data(0xffff, [0x00, 0x01, 0x02, >>>>>>>> 0x03, >>>>>>>> 0x04]) >>>>>>>> #self.add_service_data('9999', [0x00, 0x01, 0x02, 0x03, >>>>>>>> 0x04]) >>>>>>>> self.include_tx_power = True >>>>>>>> >>>>>>>> My concern is mainly these lines: >>>>>>>> >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() Primary services >>>>>>>> found: >>>>>>>> 2 >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() start: 0x0001, end: >>>>>>>> 0x0005, >>>>>>>> uuid: 00001801-0000-1000-8000-00805f9b34fb >>>>>>>> bluetoothd[16877]: src/device.c:gatt_debug() start: 0x0014, end: >>>>>>>> 0xffff, >>>>>>>> uuid: 00001800-0000-1000-8000-00805f9b34fb >>>>>>>> >>>>>>> >>>>>>> I've seen this kind of error message when I've had a failure of a >>>>>>> previous script and the Bluetooth daemon is in some unknown >>>>>>> state. At >>>>>>> this point it is worth restarting the bluetooth service with: >>>>>>> sudo service bluetooth restart >>>>>>> >>>>>>> You will see in the advertising DBus API documentation that it is >>>>>>> still in experimental mode in 5.44. >>>>>>> >>>>>>> >>>>>>> >>>>>>> https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/advertising-api.txt#n78 >>>>>>> >>>>>>> This means that you need to make sure bluetoothd is started in >>>>>>> experimental mode. Have you done this? >>>>>>> You can check with "sudo service bluetooth status" >>>>>>> >>>>>>> Experimental can be switched on by default in the >>>>>>> bluetooth.service >>>>>>> file >>>>>>> >>>>>>> Edit /lib/systemd/system/bluetooth.service file to add >>>>>>> --experimental >>>>>>> flag >>>>>>> e.g: >>>>>>> >>>>>>> sudo sed -i '/^ExecStart.*bluetoothd\s*$/ s/$/ --experimental/' >>>>>>> /lib/systemd/system/bluetooth.service >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> I have not found the code that export GATT Services from GATT >>>>>>>> Database >>>>>>>> to >>>>>>>> the BLE central. >>>>>>>> >>>>>>>> From my search on Internet, it looks I am not the only one who >>>>>>>> is >>>>>>>> having >>>>>>>> this issue >>>>>>>> I am happy to share/test anything that could help to make some >>>>>>>> progress. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Olivier >>>>>>>> -- >>>>>>>> To unsubscribe from this list: send the line "unsubscribe >>>>>>>> linux-bluetooth" >>>>>>>> in >>>>>>>> the body of a message to majordomo@vger.kernel.org >>>>>>>> More majordomo info at >>>>>>>> http://vger.kernel.org/majordomo-info.html >>>>>> >>>>>> >>>>>> >>>>>> >>>> >>