Return-Path: MIME-Version: 1.0 In-Reply-To: References: <1b8c74ef5fafaca3c75fb87249d728f8@labapart.com> <1c0a0d7a4270d7dcb457523e8fbbc244@labapart.com> <7e78e5e8a8340ee2b459d0cd2f645712@labapart.com> From: Barry Byford <31baz66@gmail.com> Date: Fri, 14 Apr 2017 19:31:39 +0100 Message-ID: Subject: Re: GATT Server: DBus GATT Services not advertised/exported To: Olivier MARTIN Cc: Bluez mailing list Content-Type: text/plain; charset=UTF-8 Sender: linux-bluetooth-owner@vger.kernel.org List-ID: 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 >>>>> >>>>> >>>>> >>>>> >>> >