CC2642 数据长度扩展(LE Data Length Extension)

本文介绍了蓝牙低功耗(LE)中的数据长度扩展功能,该功能允许在连接状态下发送最大251字节的PDU。不同于MTU,这是链路层的传输长度。文中列举了四个关键的HCI命令,包括读取和设置数据长度,以及读取最大数据长度,用于控制器交互。并提供了示例代码展示如何处理这些命令的完成事件。
摘要由CSDN通过智能技术生成

概要

数据长度扩展(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;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dear_Wally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值