0%

CLI on GATT

利用 GATT 作为通道以实现 Command Line Interface 功能。

回显延迟

设备收到一个字符后要回送此字符,称之为回显。回显速度影响和用户体验,太慢会造成卡顿的感觉。

根据 Core_5.2 | Vol 6, Part B, 4.5.1 Connection events,BLE connection interval 最小为 7.5ms,也即一个字符来回需要 15ms,不会造成延迟感。

The connInterval shall be a multiple of 1.25 ms in the range 7.5 ms to 4.0 s.

Nagle 算法

由于 connection interval 和包头包尾的开销,payload 越长则速率越高,但让应用层来去考虑这个显然是不友好且不现实的。

比如要将 buf 中数据以 hex 方式输出:

1
2
3
4
5
for (int i=0; i<bufsize; i++)
{
cli_printf("%02x", buf[i]);
}
cli_printf("\r\n");

显然会输出多次 2 字节的数据。

nagle 算法的思想是:当收到上层的数据后,并不立即发送出去,而是稍等一会以期待可能更多的上层数据,合并后一起发送出去

最简单的方法就是将收到的上层数据缓存起来,有一个线程周期性的将缓存内的数据发送出去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* API called by upper layer */
int gatt_cli_send(uint8_t *buf, uint32_t len)
{
...
write_to_cache(buf, len);
...
}

/* Send thread */
void gatt_send_thread(void *arg)
{
...
while (1)
{
delay(10);
len = read_from_cache(buf, bufsize);
gatt_send(buf, len);
}
}

分片和重组

Notification 和 Write without response 一次发送的数据长度不能超过 MTU,因此需要分片和重组机制来收发长数据包。

使用 SIG Mesh Proxy PDU 的分片和重组机制,数据包格式如下:

Filed Name Size(bits) Notes
SAR 2 Message segmentation and reassembly information.
Message Type 6 Type of message contained in the PDU.
Data Variable Full message or message segment.

SAR 字段的含义如下:

Value Description
0b00 Data field contains a complete message.
0b01 Data field contains the first segment of a message.
0b10 Data field contains a continuation segment of a message.
0b11 Data field contains the last segment of a message.

Type 字段的含义如下:

Type Name Description
0x00 Command Line Interface This message contain Command Line Interface characteristics.
0x01 - 0x3F RFU Reversed for Future Use.

在 CLI 中,不需要分片和重组,因为 CLI 是基于数据流的应用,它需要一个一个处理字符,并且有回车换行结束符来定帧。

传输效率

影响传输效率的有两个因素:

  • ATT_MTU
  • Connection Interval

根据5.2 | Vol 6, Part B, 4.5.1 Connection events

The connInterval shall be a multiple of 1.25 ms in the range 7.5 ms to 4.0 s.

The connInterval is set by the Initiator’s Link Layer in the CONNECT_IND or AUX_CONNECT_REQ PDU from the range given by the Host and can be changed using the Connection Update procedure (see Section 5.1.1) or Connection Parameters Request procedure (see Section 5.1.7).

Connection Interval 由链路发起者(Master)设置,放在 CONNECT_IND 包中。

也可以在连接上后通过 Connection Update procedure 或者 Connection Parameters Request procedure 发起更新。

使用场景

无线模组一般通过串口或来调试,但已经组装到整机中的模组则很难调试。

比如在 VBS9010 项目中,经常需要知道一个灯的 mesh 地址,三元组,是否被重置等信息,但是目前没有方便的办法来获取。

GATT CLI 正是为解决这个问题,它基于 GATT 通道实现了 CLI 功能,设备端应用简单,消耗资源少,PC 端也只需要普通的串口终端即可。

随着 Wi-Fi&BT combo 模组的推广,GATT CLI 会极大的方便整机产品的调试和生产。

坚持原创技术分享,您的支持将鼓励我继续创作!