This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2652R:问题:当 OTA-Server 读取"ATTRID_OTA_upgrade_Server_ID"从 CC2652R 器件中读取时、cc2652R 将崩溃

Guru**** 2541290 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1019516/cc2652r-issue-when-ota-server-read-attrid_ota_upgrade_upgrade_server_id-form-cc2652r-device-cc2652r-will-crash

器件型号:CC2652R

SDK 版本:SDK 5.20.00.52

属性"ATTRID_OTA_upgrade_upgrade_Server_ID"是 "ZCL_datatype_BITMAP64"类型、 函数"zclGetDataTypeLength "无法支持此类型。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您可以添加代码来处理这种情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    uint8_t *zclSerializeData( uint8_t dataType, void *attrData, uint8_t *buf )
    {
      uint8_t *pStr;
      uint16_t len;
    
      if ( attrData == NULL )
      {
        return ( buf );
      }
    
      switch ( dataType )
      {
        case ZCL_DATATYPE_DATA8:
        case ZCL_DATATYPE_BOOLEAN:
        case ZCL_DATATYPE_BITMAP8:
        case ZCL_DATATYPE_INT8:
        case ZCL_DATATYPE_UINT8:
        case ZCL_DATATYPE_ENUM8:
          *buf++ = *((uint8_t *)attrData);
           break;
    
        case ZCL_DATATYPE_DATA16:
        case ZCL_DATATYPE_BITMAP16:
        case ZCL_DATATYPE_UINT16:
        case ZCL_DATATYPE_INT16:
        case ZCL_DATATYPE_ENUM16:
        case ZCL_DATATYPE_SEMI_PREC:
        case ZCL_DATATYPE_CLUSTER_ID:
        case ZCL_DATATYPE_ATTR_ID:
          *buf++ = LO_UINT16( *((uint16_t*)attrData) );
          *buf++ = HI_UINT16( *((uint16_t*)attrData) );
          break;
    
        case ZCL_DATATYPE_DATA24:
        case ZCL_DATATYPE_BITMAP24:
        case ZCL_DATATYPE_UINT24:
        case ZCL_DATATYPE_INT24:
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 0 );
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 1 );
          *buf++ = BREAK_UINT32( *((uint32_t*)attrData), 2 );
          break;
    
        case ZCL_DATATYPE_DATA32:
        case ZCL_DATATYPE_BITMAP32:
        case ZCL_DATATYPE_UINT32:
        case ZCL_DATATYPE_INT32:
        case ZCL_DATATYPE_SINGLE_PREC:
        case ZCL_DATATYPE_TOD:
        case ZCL_DATATYPE_DATE:
        case ZCL_DATATYPE_UTC:
        case ZCL_DATATYPE_BAC_OID:
          buf = zcl_buffer_uint32( buf, *((uint32_t*)attrData) );
          break;
    
        case ZCL_DATATYPE_DATA40:
        case ZCL_DATATYPE_BITMAP40:
        case ZCL_DATATYPE_UINT40:
        case ZCL_DATATYPE_INT40:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 5 );
          break;
    
        case ZCL_DATATYPE_DATA48:
        case ZCL_DATATYPE_BITMAP48:
        case ZCL_DATATYPE_UINT48:
        case ZCL_DATATYPE_INT48:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 6 );
          break;
    
        case ZCL_DATATYPE_DATA56:
        case ZCL_DATATYPE_BITMAP56:
        case ZCL_DATATYPE_UINT56:
        case ZCL_DATATYPE_INT56:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 7 );
          break;
    
        case ZCL_DATATYPE_DATA64:
        case ZCL_DATATYPE_BITMAP64:
        case ZCL_DATATYPE_DOUBLE_PREC:
        case ZCL_DATATYPE_IEEE_ADDR:
        case ZCL_DATATYPE_UINT64:
        case ZCL_DATATYPE_INT64:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, 8 );
          break;
    
        case ZCL_DATATYPE_CHAR_STR:
        case ZCL_DATATYPE_OCTET_STR:
          pStr = (uint8_t*)attrData;
          len = *pStr;
          buf = zcl_memcpy( buf, pStr, len+1 ); // Including length field
          break;
    
        case ZCL_DATATYPE_LONG_CHAR_STR:
        case ZCL_DATATYPE_LONG_OCTET_STR:
          pStr = (uint8_t*)attrData;
          len = BUILD_UINT16( pStr[0], pStr[1] );
          buf = zcl_memcpy( buf, pStr, len+2 ); // Including length field
          break;
    
        case ZCL_DATATYPE_128_BIT_SEC_KEY:
          pStr = (uint8_t*)attrData;
          buf = zcl_memcpy( buf, pStr, SEC_KEY_LEN );
          break;
    
        case ZCL_DATATYPE_NO_DATA:
        case ZCL_DATATYPE_UNKNOWN:
          // Fall through
    
        default:
          break;
      }
    
      return ( buf );
    }
    
    uint8_t zclGetDataTypeLength( uint8_t dataType )
    {
      uint8_t len;
    
      switch ( dataType )
      {
        case ZCL_DATATYPE_DATA8:
        case ZCL_DATATYPE_BOOLEAN:
        case ZCL_DATATYPE_BITMAP8:
        case ZCL_DATATYPE_INT8:
        case ZCL_DATATYPE_UINT8:
        case ZCL_DATATYPE_ENUM8:
          len = 1;
          break;
    
        case ZCL_DATATYPE_DATA16:
        case ZCL_DATATYPE_BITMAP16:
        case ZCL_DATATYPE_UINT16:
        case ZCL_DATATYPE_INT16:
        case ZCL_DATATYPE_ENUM16:
        case ZCL_DATATYPE_SEMI_PREC:
        case ZCL_DATATYPE_CLUSTER_ID:
        case ZCL_DATATYPE_ATTR_ID:
          len = 2;
          break;
    
        case ZCL_DATATYPE_DATA24:
        case ZCL_DATATYPE_BITMAP24:
        case ZCL_DATATYPE_UINT24:
        case ZCL_DATATYPE_INT24:
          len = 3;
          break;
    
        case ZCL_DATATYPE_DATA32:
        case ZCL_DATATYPE_BITMAP32:
        case ZCL_DATATYPE_UINT32:
        case ZCL_DATATYPE_INT32:
        case ZCL_DATATYPE_SINGLE_PREC:
        case ZCL_DATATYPE_TOD:
        case ZCL_DATATYPE_DATE:
        case ZCL_DATATYPE_UTC:
        case ZCL_DATATYPE_BAC_OID:
          len = 4;
          break;
    
        case ZCL_DATATYPE_DATA40:
        case ZCL_DATATYPE_BITMAP40:
        case ZCL_DATATYPE_UINT40:
        case ZCL_DATATYPE_INT40:
           len = 5;
           break;
    
        case ZCL_DATATYPE_DATA48:
        case ZCL_DATATYPE_BITMAP48:
        case ZCL_DATATYPE_UINT48:
        case ZCL_DATATYPE_INT48:
           len = 6;
           break;
    
        case ZCL_DATATYPE_DATA56:
        case ZCL_DATATYPE_BITMAP56:
        case ZCL_DATATYPE_UINT56:
        case ZCL_DATATYPE_INT56:
           len = 7;
           break;
    
        case ZCL_DATATYPE_DATA64:
        case ZCL_DATATYPE_BITMAP64:
        case ZCL_DATATYPE_UINT64:
        case ZCL_DATATYPE_INT64:
        case ZCL_DATATYPE_DOUBLE_PREC:
        case ZCL_DATATYPE_IEEE_ADDR:
          len = 8;
          break;
    
        case ZCL_DATATYPE_128_BIT_SEC_KEY:
         len = SEC_KEY_LEN;
         break;
    
        case ZCL_DATATYPE_NO_DATA:
        case ZCL_DATATYPE_UNKNOWN:
          // Fall through
    
        default:
          len = 0;
          break;
      }
    
      return ( len );
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Aries、

    感谢您提出此问题、我为软件开发团队创建了一个 TT 来解决。

    此致、
    Ryan