概要
数据长度扩展(LE Data Length Extension)功能允许LE控制器在连接状态下发送具有高达251字节的PDU。在连接期间的任何时刻,主从设备可以协商该PDU大小。
这个和MTU不同,MTU是应用层的数据传输长度,这个是链路层的长度,即空口传输的数据长度。如果MTU比这个长度大时,那么L2CAP会进行分包再发送
数据长度扩展HCI命令和事件
以下HCI命令可用于与数据长度扩展功能相关的控制器交互:
LE读取建议的默认数据长度命令,HCI_LE_ReadSuggestedDefaultDataLenCmd
LE写入建议的默认数据长度命令,HCI_LE_WriteSuggestedDefaultDataLenCmd
LE读取最大数据长度命令,HCI_LE_ReadMaxDataLenCmd
LE设置数据长度命令,HCI_LE_SetDataLenCmd
使用示例
1、调用HCI_LE_ReadSuggestedDefaultDataLenCmd接口,返回HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH事件
static uint8_t SimplePeripheral_processStackMsg(ICall_Hdr *pMsg)
{
// Always dealloc pMsg unless set otherwise
uint8_t safeToDealloc = TRUE;
switch (pMsg->event)
{
case HCI_GAP_EVENT_EVENT:
{
// Process HCI message
switch(pMsg->status)
{
// Process HCI Command Complete Events here
case HCI_COMMAND_COMPLETE_EVENT_CODE:
{
SimplePeripheral_processCmdCompleteEvt((hciEvt_CmdComplete_t *) pMsg);
}break;
}
}break;
}
return (safeToDealloc);
}
static void SimplePeripheral_processCmdCompleteEvt(hciEvt_CmdComplete_t *pMsg)
{
switch (pMsg->cmdOpcode)
{
case HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH:
{
u_printf("HCI_LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH\r\n");
// 0: Status
// 1: Initial Max Tx Octets LSB
// 2: Initial Max Tx Octets MSB
// 3: Initial Max Tx Time LSB
// 4: Initial Max Tx Time MSB
u_printf_hex((char *)pMsg->pReturnParam,5);
}break;
}
}
2、调用HCI_LE_ReadMaxDataLenCmd接口,返回HCI_LE_READ_MAX_DATA_LENGTH事件
static uint8_t SimplePeripheral_processStackMsg(ICall_Hdr *pMsg)
{
// Always dealloc pMsg unless set otherwise
uint8_t safeToDealloc = TRUE;
switch (pMsg->event)
{
case HCI_GAP_EVENT_EVENT:
{
// Process HCI message
switch(pMsg->status)
{
// Process HCI Command Complete Events here
case HCI_COMMAND_COMPLETE_EVENT_CODE:
{
SimplePeripheral_processCmdCompleteEvt((hciEvt_CmdComplete_t *) pMsg);
}break;
}
}break;
}
return (safeToDealloc);
}
static void SimplePeripheral_processCmdCompleteEvt(hciEvt_CmdComplete_t *pMsg)
{
switch (pMsg->cmdOpcode)
{
case HCI_LE_READ_MAX_DATA_LENGTH:
{
u_printf("HCI_LE_READ_MAX_DATA_LENGTH\r\n");
// 0: Status
// 1: Supported Max Tx Octets LSB
// 2: Supported Max Tx Octets MSB
// 3: Supported Max Tx Time LSB
// 4: Supported Max Tx Time MSB
// 5: Supported Max Rx Octets LSB
// 6: Supported Max Rx Octets MSB
// 7: Supported Max Rx Time LSB
// 8: Supported Max Rx Time MSB
u_printf_hex((char *)pMsg->pReturnParam,9);
}break;
}
}
3、调用HCI_LE_WriteSuggestedDefaultDataLenCmd接口,返回HCI_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH事件
static uint8_t SimplePeripheral_processStackMsg(ICall_Hdr *pMsg)
{
// Always dealloc pMsg unless set otherwise
uint8_t safeToDealloc = TRUE;
switch (pMsg->event)
{
case HCI_GAP_EVENT_EVENT:
{
// Process HCI message
switch(pMsg->status)
{
// Process HCI Command Complete Events here
case HCI_COMMAND_COMPLETE_EVENT_CODE:
{
SimplePeripheral_processCmdCompleteEvt((hciEvt_CmdComplete_t *) pMsg);
}break;
}
}break;
}
return (safeToDealloc);
}
static void SimplePeripheral_processCmdCompleteEvt(hciEvt_CmdComplete_t *pMsg)
{
switch (pMsg->cmdOpcode)
{
case HCI_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH:
{
u_printf("HCI_LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH\r\n");
// 0: Status
u_printf_hex((char *)pMsg->pReturnParam,1);
}break;
}
}
4、调用HCI_LE_SetDataLenCmd接口,返回HCI_LE_SET_DATA_LENGTH事件
static uint8_t SimplePeripheral_processStackMsg(ICall_Hdr *pMsg)
{
// Always dealloc pMsg unless set otherwise
uint8_t safeToDealloc = TRUE;
switch (pMsg->event)
{
case HCI_GAP_EVENT_EVENT:
{
// Process HCI message
switch(pMsg->status)
{
// Process HCI Command Complete Events here
case HCI_COMMAND_COMPLETE_EVENT_CODE:
{
SimplePeripheral_processCmdCompleteEvt((hciEvt_CmdComplete_t *) pMsg);
}break;
}
}break;
}
return (safeToDealloc);
}
static void SimplePeripheral_processCmdCompleteEvt(hciEvt_CmdComplete_t *pMsg)
{
switch (pMsg->cmdOpcode)
{
case HCI_LE_SET_DATA_LENGTH:
{
u_printf("HCI_LE_SET_DATA_LENGTH\r\n");
// 0: Status
// 1: Connection Handle LSB
// 2: Connection Handle MSB
u_printf_hex((char *)pMsg->pReturnParam,3);
}break;
}
}