对于专业项目,我必须使用 RPI4 作为中央设备来连接特定的外围设备。为了测试,我开发了一个程序来模拟 RPi 上的外围设备(感谢 bleno Node.js 模块),通过设置 GATT 服务器并使用另一个 RPi 作为我的中心和 bluepy Python 库。
一切正常,但是当我在外围设备上设置高于 4000 毫秒的广告间隔时,连接不再起作用(即使在 RPi GATT 服务器或生产服务器上)。
我尝试在我的中心使用 gatttool/hcitool,同样的问题,它运行良好,但前提是广告间隔小于 4000 毫秒。但是当我尝试使用带有专用应用程序(nRF 连接)的手机连接到我的 GATT 服务器时,它可以工作。
经过一番研究,我发现 Linux 内核仅验证 7.5ms - 4000ms ( https://lkml.org/lkml/2019/8/2/358 ) 范围内的连接间隔值,这与我的实验值完全匹配. 但除非我不了解 BLE,否则连接间隔和广告间隔是完全独立的,应该不是问题。在蓝牙文档中,我发现最大广播间隔值应该是 10240ms。有一点我不明白。
如果您想重现它,这是我在一个 RPi4 上运行的 GATT 服务器。我使用 xxxx 开始它sudo BLENO_ADVERTISING_INTERVAL=xxxx node my_gatt_server.js
,我想要以毫秒为单位的广告间隔。
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);
}
})
]
}),
]);
}
});
HCI 数据包日志
连接成功时
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
连接失败时
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
失败时,gatttool 输出错误为Error: connect error: Transport endpoint is not connected (107)