Untuk proyek profesional, saya harus menggunakan RPI4 sebagai perangkat pusat untuk terhubung ke perangkat periferal tertentu. Untuk pengujian, saya mengembangkan program untuk mensimulasikan periferal pada RPi (berkat modul bleno Node.js) dengan mengatur server GATT dan menggunakan RPi lain sebagai pusat saya dengan perpustakaan Python bluepy.

Semua berfungsi dengan baik tetapi ketika saya mengatur interval iklan lebih tinggi dari 4000ms di periferal saya, koneksi tidak berfungsi lagi (bahkan di server RPi GATT atau dengan yang produksi).

Saya mencoba menggunakan gatttool/hcitool di pusat saya, masalah yang sama, itu berfungsi dengan baik tetapi hanya jika interval iklan kurang dari 4000ms. Tetapi itu berfungsi ketika saya mencoba menghubungkan ke server GATT saya dengan telepon saya dengan aplikasi khusus (koneksi nRF).

Setelah beberapa penelitian, saya menemukan bahwa kernel Linux hanya memvalidasi nilai interval koneksi dalam kisaran 7.5ms - 4000ms (https://lkml.org/lkml/2019/8/2/358), yang sama persis dengan nilai eksperimen saya. Tetapi kecuali jika saya tidak mengerti sesuatu dengan BLE, interval koneksi dan interval iklan benar-benar independen dan seharusnya tidak menjadi masalah. Dalam dokumentasi Bluetooth, saya menemukan bahwa nilai interval iklan maksimum harus 10240ms. Ada sesuatu yang saya tidak mengerti.

Ini adalah server GATT saya yang berjalan pada satu RPi4 jika Anda ingin mereproduksinya. Saya memulainya menggunakan sudo BLENO_ADVERTISING_INTERVAL=xxxx node my_gatt_server.js dengan xxxx interval iklan yang saya inginkan dalam ms.

var bleno = require('bleno');

// Once bleno starts, begin advertising our BLE address
bleno.on('stateChange', function(state) {
    console.log('State change: ' + state);
    if (state === 'poweredOn') {
        bleno.startAdvertising('MyDevice',['6d79686561727473656e74696e656c10']);
    } else {
        bleno.stopAdvertising();
    }
});

// Notify the console that we've accepted a connection
bleno.on('accept', function(clientAddress) {
    console.log("Accepted connection from address: " + clientAddress);
});

// Notify the console that we have disconnected from a client
bleno.on('disconnect', function(clientAddress) {
    console.log("Disconnected from address: " + clientAddress);
});

// When we begin advertising, create a new service and characteristic
bleno.on('advertisingStart', function(error) {
    if (error) {
        console.log("Advertising start error: " + error);
    } else {
        console.log("Advertising start success");
        bleno.setServices([

            // Define a new service
            new bleno.PrimaryService({
                uuid : '6d79686561727473656e74696e656c10',
                characteristics : [

                    // ECG characteristic
                    new bleno.Characteristic({
                        value : 'hello!',
                        uuid : '6d79686561727473656e74696e656c11',
                        properties : ['read'],

                        // Send a message back to the client with the characteristic's value
                        onReadRequest : function(offset, callback) {
                            console.log("Read request received");
                            callback(this.RESULT_SUCCESS, new Buffer("Echo: " + this.value);
                        }
                    })
                ]
            }), 
        ]);
    }
});

Log paket HCI

Saat koneksi berhasil

Bluetooth monitor ver 5.50
= Note: Linux version 4.19.57-v7l+ (armv7l)                                                                                                                                                                                         0.501891
= Note: Bluetooth subsystem version 2.22                                                                                                                                                                                            0.501900
= New Index: xx:xx:xx:xx:xx:xx (Primary,UART,hci0)                                                                                                                                                                           [hci0] 0.501905
= Open Index: xx:xx:xx:xx:xx:xx                                                                                                                                                                                              [hci0] 0.501908
= Index Info: xx:xx:xx:xx:xx:xx (Cypress Semiconductor Corporation)                                                                                                                                                          [hci0] 0.501911
@ MGMT Open: bluetoothd (privileged) version 1.14                                                                                                                                                                          {0x0001} 0.501915
@ MGMT Open: btmon (privileged) version 1.14                                                                                                                                                                               {0x0002} 0.501989
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7                                                                                                                                                                #1 [hci0] 4.586280
        Type: Passive (0x00)
        Interval: 60.000 msec (0x0060)
        Window: 30.000 msec (0x0030)
        Own address type: Public (0x00)
        Filter policy: Ignore not in white list (0x01)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                               #2 [hci0] 4.586656
      LE Set Scan Parameters (0x08|0x000b) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2                                                                                                                                                                    #3 [hci0] 4.586717
        Scanning: Enabled (0x01)
        Filter duplicates: Enabled (0x01)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                               #4 [hci0] 4.587132
      LE Set Scan Enable (0x08|0x000c) ncmd 1
        Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 33                                                                                                                                                                                 #5 [hci0] 4.619942
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Connectable undirected - ADV_IND (0x00)
        Address type: Public (0x00)
        Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Data length: 21
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        128-bit Service UUIDs (partial): 1 entry
          Vendor specific (6d796865-6172-7473-656e-74696e656c10)
        RSSI: -31 dBm (0xe1)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2                                                                                                                                                                    #6 [hci0] 4.620014
        Scanning: Disabled (0x00)
        Filter duplicates: Disabled (0x00)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                               #7 [hci0] 4.621661
      LE Set Scan Enable (0x08|0x000c) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Create Connection (0x08|0x000d) plen 25                                                                                                                                                                 #8 [hci0] 4.621724
        Scan interval: 60.000 msec (0x0060)
        Scan window: 60.000 msec (0x0060)
        Filter policy: White list is not used (0x00)
        Peer address type: Public (0x00)
        Peer address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Own address type: Public (0x00)
        Min connection interval: 30.00 msec (0x0018)
        Max connection interval: 50.00 msec (0x0028)
        Connection latency: 0 (0x0000)
        Supervision timeout: 420 msec (0x002a)
        Min connection length: 0.000 msec (0x0000)
        Max connection length: 0.000 msec (0x0000)
> HCI Event: Command Status (0x0f) plen 4                                                                                                                                                                                 #9 [hci0] 4.622251
      LE Create Connection (0x08|0x000d) ncmd 1
        Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19                                                                                                                                                                                #10 [hci0] 4.726113
      LE Connection Complete (0x01)
        Status: Success (0x00)
        Handle: 64
        Role: Master (0x00)
        Peer address type: Public (0x00)
        Peer address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Connection interval: 48.75 msec (0x0027)
        Connection latency: 0 (0x0000)
        Supervision timeout: 420 msec (0x002a)
        Master clock accuracy: 0x00
@ MGMT Event: Device Connected (0x000b) plen 34                                                                                                                                                                     {0x0002} [hci0] 4.726162
        LE Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Flags: 0x00000000
        Data length: 21
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        128-bit Service UUIDs (partial): 1 entry
          Vendor specific (6d796865-6172-7473-656e-74696e656c10)
@ MGMT Event: Device Connected (0x000b) plen 34                                                                                                                                                                     {0x0001} [hci0] 4.726162
        LE Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Flags: 0x00000000
        Data length: 21
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        128-bit Service UUIDs (partial): 1 entry
          Vendor specific (6d796865-6172-7473-656e-74696e656c10)
< HCI Command: LE Read Remote Used Features (0x08|0x0016) plen 2                                                                                                                                                         #11 [hci0] 4.726356
        Handle: 64
> HCI Event: Command Status (0x0f) plen 4                                                                                                                                                                                #12 [hci0] 4.726943
      LE Read Remote Used Features (0x08|0x0016) ncmd 1
        Status: Success (0x00)
> HCI Event: Command Complete (0x0e) plen 14                                                                                                                                                                             #13 [hci0] 4.726951
      LE Read Remote Used Features (0x08|0x0016) ncmd 1
        Status: Success (0x00)
        00 00 00 00 00 00 00 00 00 00                    ..........      
> HCI Event: LE Meta Event (0x3e) plen 12                                                                                                                                                                                #14 [hci0] 4.881359
      LE Read Remote Used Features (0x04)
        Status: Success (0x00)
        Handle: 64
        Features: 0x3f 0x00 0x00 0x00 0x00 0x00 0x00 0x00
          LE Encryption
          Connection Parameter Request Procedure
          Extended Reject Indication
          Slave-initiated Features Exchange
          LE Ping
          LE Data Packet Length Extension
> HCI Event: LE Meta Event (0x3e) plen 11                                                                                                                                                                                #15 [hci0] 5.027630
      LE Data Length Change (0x07)
        Handle: 64
        Max TX octets: 251
        Max TX time: 2120
        Max RX octets: 251
        Max RX time: 2120

Saat koneksi gagal

Bluetooth monitor ver 5.50
= Note: Linux version 4.19.57-v7l+ (armv7l)                                                                                                                                                                                         0.114663
= Note: Bluetooth subsystem version 2.22                                                                                                                                                                                            0.114671
= New Index: xx:xx:xx:xx:xx:xx (Primary,UART,hci0)                                                                                                                                                                           [hci0] 0.114675
= Open Index: xx:xx:xx:xx:xx:xx                                                                                                                                                                                              [hci0] 0.114678
= Index Info: xx:xx:xx:xx:xx:xx (Cypress Semiconductor Corporation)                                                                                                                                                          [hci0] 0.114681
@ MGMT Open: bluetoothd (privileged) version 1.14                                                                                                                                                                          {0x0001} 0.114686
@ MGMT Open: btmon (privileged) version 1.14                                                                                                                                                                               {0x0002} 0.114760
< HCI Command: Disconnect (0x01|0x0006) plen 3                                                                                                                                                                            #1 [hci0] 5.864108
        Handle: 64
        Reason: Remote User Terminated Connection (0x13)
> HCI Event: Command Status (0x0f) plen 4                                                                                                                                                                                 #2 [hci0] 5.864469
      Disconnect (0x01|0x0006) ncmd 1
        Status: Success (0x00)
> HCI Event: Disconnect Complete (0x05) plen 4                                                                                                                                                                            #3 [hci0] 5.883803
        Status: Success (0x00)
        Handle: 64
        Reason: Remote User Terminated Connection (0x13)
@ MGMT Event: Device Disconnected (0x000c) plen 8                                                                                                                                                                   {0x0002} [hci0] 5.883848
        LE Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Reason: Connection terminated by remote host (0x03)
@ MGMT Event: Device Disconnected (0x000c) plen 8                                                                                                                                                                   {0x0001} [hci0] 5.883848
        LE Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Reason: Connection terminated by remote host (0x03)
< HCI Command: LE Set Scan Parameters (0x08|0x000b) plen 7                                                                                                                                                               #4 [hci0] 25.059876
        Type: Passive (0x00)
        Interval: 60.000 msec (0x0060)
        Window: 30.000 msec (0x0030)
        Own address type: Public (0x00)
        Filter policy: Ignore not in white list (0x01)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                              #5 [hci0] 25.060698
      LE Set Scan Parameters (0x08|0x000b) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2                                                                                                                                                                   #6 [hci0] 25.060762
        Scanning: Enabled (0x01)
        Filter duplicates: Enabled (0x01)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                              #7 [hci0] 25.061665
      LE Set Scan Enable (0x08|0x000c) ncmd 1
        Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 33                                                                                                                                                                                #8 [hci0] 39.473657
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Connectable undirected - ADV_IND (0x00)
        Address type: Public (0x00)
        Address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Data length: 21
        Flags: 0x06
          LE General Discoverable Mode
          BR/EDR Not Supported
        128-bit Service UUIDs (partial): 1 entry
          Vendor specific (6d796865-6172-7473-656e-74696e656c10)
        RSSI: -28 dBm (0xe4)
< HCI Command: LE Set Scan Enable (0x08|0x000c) plen 2                                                                                                                                                                   #9 [hci0] 39.473746
        Scanning: Disabled (0x00)
        Filter duplicates: Disabled (0x00)
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                             #10 [hci0] 39.475900
      LE Set Scan Enable (0x08|0x000c) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Create Connection (0x08|0x000d) plen 25                                                                                                                                                               #11 [hci0] 39.475956
        Scan interval: 60.000 msec (0x0060)
        Scan window: 60.000 msec (0x0060)
        Filter policy: White list is not used (0x00)
        Peer address type: Public (0x00)
        Peer address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Own address type: Public (0x00)
        Min connection interval: 30.00 msec (0x0018)
        Max connection interval: 50.00 msec (0x0028)
        Connection latency: 0 (0x0000)
        Supervision timeout: 420 msec (0x002a)
        Min connection length: 0.000 msec (0x0000)
        Max connection length: 0.000 msec (0x0000)
> HCI Event: Command Status (0x0f) plen 4                                                                                                                                                                               #12 [hci0] 39.476993
      LE Create Connection (0x08|0x000d) ncmd 1
        Status: Success (0x00)
< HCI Command: LE Create Connection Cancel (0x08|0x000e) plen 0                                                                                                                                                         #13 [hci0] 43.544123
> HCI Event: Command Complete (0x0e) plen 4                                                                                                                                                                             #14 [hci0] 43.546763
      LE Create Connection Cancel (0x08|0x000e) ncmd 1
        Status: Success (0x00)
> HCI Event: LE Meta Event (0x3e) plen 19                                                                                                                                                                               #15 [hci0] 43.546914
      LE Connection Complete (0x01)
        Status: Unknown Connection Identifier (0x02)
        Handle: 64
        Role: Master (0x00)
        Peer address type: Public (0x00)
        Peer address: xx:xx:xx:xx:xx:xx (OUI DC-A6-32)
        Connection interval: 48.75 msec (0x0027)
        Connection latency: 0 (0x0000)
        Supervision timeout: 420 msec (0x002a)
        Master clock accuracy: 0x00

Ketika gagal, kesalahan keluaran gatttool adalah Error: connect error: Transport endpoint is not connected (107)

1
Quentin Rozand 5 Agustus 2019, 17:22

1 menjawab

Jawaban Terbaik

4000 ms adalah interval iklan yang cukup besar. Bagaimanapun, bluepy menggunakan BlueZ, dan ketika BlueZ terhubung, pertama kali memindai dan ketika menemukan perangkat yang diinginkan, ia berhenti memindai dan memulai koneksi. Selama upaya koneksi ini, ada batas waktu sebelum memulai pemindaian lagi. Bisa jadi interval iklan 4000 ms ini lebih besar dari timeout. Ini biasanya 2 detik saya pikir.

Silakan mulai "sudo btmon" pada perangkat pusat Anda sebelum mencoba menghubungkan, biarkan ia menangkap dan mencetak paket HCI dan memposting hasilnya di sini.

Interval iklan dan Interval koneksi sepenuhnya independen.

0
Emil 5 Agustus 2019, 14:59