Skip to content

TTLV数据处理 相关接口

API 列表

函数说明
Ql_iotTtlvCountGet()获取数据表的节点数量
Ql_iotTtlvNodeGet()从数据表中提取数据节点
Ql_iotTtlvFree()释放数据表资源
Ql_iotTtlvNodeGetType()获取节点数据的类型
Ql_iotTtlvNodeGetBool()获取节点数据-Bool 类型
Ql_iotTtlvNodeGetInt()获取节点数据-Int 类型
Ql_iotTtlvNodeGetFloat()获取节点数据-浮点 类型
Ql_iotTtlvNodeGetString()获取节点数据-String 类型
Ql_iotTtlvNodeGetByte()获取节点数据-Byte类型
Ql_iotTtlvNodeGetStruct()获取节点数据-Struct 类型
Ql_iotTtlvIdGetType()获取指定ID节点数据的类型
Ql_iotTtlvIdGetBool()获取指定 ID 节点数据-Bool 类型
Ql_iotTtlvIdGetInt()获取指定 ID 节点数据-Int 类型
Ql_iotTtlvIdGetFloat()获取指定 ID 节点数据-浮点 类型
Ql_iotTtlvIdGetString()获取指定 ID 节点数据-String 类型
Ql_iotTtlvIdGetByte()获取指定 ID 节点数据-Byte 类型
Ql_iotTtlvIdGetStruct()获取指定 ID 节点数据-Struct 类型
Ql_iotTtlvIdAddBool()添加节点数据-Bool 类型
Ql_iotTtlvIdAddInt()添加节点数据-Int 类型
Ql_iotTtlvIdAddFloat()添加节点数据-浮点 类型
Ql_iotTtlvIdAddString()添加节点数据-字符串 类型
Ql_iotTtlvIdAddByte()添加节点数据-Byte 类型
Ql_iotTtlvIdAddStruct()添加节点数据-Struct 类型

API 详情

Ql_iotTtlvCountGet

该函数用于获取数据表的节点数量。

函数原型

c
quint32_t Ql_iotTtlvCountGet(const void *ttlvHead)

参数说明

  • 输入参数
    • const void *ttlvHead: 数据表。

返回值

数据表的节点数量。

备注

  • 2.3.3及以上版本支持

调用示例

c
quint32_t count = Ql_iotTtlvCountGet(ttlvHead);

Ql_iotTtlvNodeGet

该函数用于从数据表中提取数据节点。

函数原型

c
void *Ql_iotTtlvNodeGet(const void *ttlvHead, quint16_t index, quint16_t *id, QIot_dpDataType_e 
*type)

参数说明

  • 输入参数

    • const void *ttlvHead: 数据表。
    • quint16_tindex: 数据节点索引。
  • 输出参数

    • quint16_t *id: 数据节点 ID。
    • QIot_dpDataType_e *type: 数据节点类型。详情请参考数据节点类型

返回值

数据节点指针;若为NULL则表示获取失败。

备注

  • 2.3.3及以上版本支持

调用示例

c
quint32_t count = Ql_iotTtlvCountGet(ttlvHead);
quint32_t i;
for(i=0;i<count;i++)
{
    uint16_t id;
    QIot_dpDataType_e type;
    void *node = Ql_iotTtlvNodeGet(ttlvHead, i, &id, &type);
    if(node)
    {
        switch (id)
        {               
            case 1:
            {             
                /*Code*/
                break;
            }
                case 2:
            {             
                /*Code*/
                break;
            }
            default:break;
        }
    }
}

Ql_iotTtlvFree

该函数用于释放数据表资源。创建 TTLV 数据表或添加 TTLV 节点并处理完成后,需调用该函数释放数据表资源。

函数原型

c
void Ql_iotTtlvFree(void **ttlvHead)

参数说明

  • 输入参数
    • void **ttlvHead: 数据表。

返回值

无。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = NULL;     
Ql_iotTtlvIdAddInt(&ttlvHead, 1, 100);
Ql_iotCmdBusPhymodelReport(1, ttlvHead);
Ql_iotTtlvFree(&ttlvHead); //释放指针

Ql_iotTtlvNodeGetType

该函数用于获取节点数据的类型。

函数原型

c
qbool Ql_iotTtlvNodeGetType(const void *ttlvNode, QIot_dpDataType_e *type)

参数说明

  • 输入参数

    • const void *      ttlvNode: 数据节点。
  • 输出参数

    • QIot_dpDataType_e *type:数据节点的类型。详情请参考数据节点类型

返回值

  • True:函数执行成功。
  • False: 函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvNode = NULL; 
QIot_dpDataType_e type;
qbool ret = Ql_iotTtlvNodeGetType(&ttlvNode,&type);

Ql_iotTtlvNodeGetBool

该函数用于获取节点数据-Bool 类型。

函数原型

c
qbool Ql_iotTtlvNodeGetBool(const void *ttlvNode, qbool *value)

参数说明

  • 输入参数

    • const void *ttlvNode:数据节点。
  • 输出参数

    • qbool *     value:节点数据。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvNodeGetInt

该函数用于获取节点数据-Int 类型。

函数原型

c
qbool Ql_iotTtlvNodeGetInt(const void *ttlvNode, int *value)

参数说明

  • 输入参数

    • const void *ttlvNode:数据节点。
  • 输出参数

    • int *       value:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvNodeGetFloat

该函数用于获取节点数据-浮点 类型。

函数原型

c
qbool Ql_iotTtlvNodeGetFloat(const void *ttlvNode, double *value)

参数说明

  • 输入参数

    • const void *ttlvNode:数据节点。
  • 输出参数

    • double *    value:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.6.1及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvNodeGetString

该函数用于获取节点数据-String 类型。

函数原型

c
char *Ql_iotTtlvNodeGetString(const void *ttlvNode)

参数说明

  • 输入参数
    • const void *ttlvNode: 数据节点。

返回值

  • NULL:   获取失败。
  • 其他:  数据节点内容。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvNodeGetByte

该函数用于获取节点数据-Byte 类型。

函数原型

c
quint32_t Ql_iotTtlvNodeGetByte(const void *ttlvNode, quint8_t **value)

参数说明

  • 输入参数

    • const void *ttlvNode:数据节点。
  • 输出参数

    • quint8_t **   value:数据节点内容。

返回值

  • 0:  数据读取失败。
  • >0: 实际读取到的固件数据长度。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvNodeGetStruct

该函数用于获取节点数据-Struct 类型。

函数原型

c
void *Ql_iotTtlvNodeGetStruct(const void *ttlvNode)

参数说明

  • 输入参数
    • const void *ttlvNode:数据节点。

返回值

数据表指针。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 获取节点数据示例


Ql_iotTtlvIdGetType

该函数用于获取指定 ID 节点数据的类型。

函数原型

c
qbool Ql_iotTtlvIdGetType(const void *ttlvHead, quint16_t id, QIot_dpDataType_e *type)

参数说明

  • 输入参数

    • const void *     ttlvHead:数据表。
    • quint16_t       id:数据节点 ID。
  • 输出参数

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
QIot_dpDataType_e type;
qbool ret = Ql_iotTtlvIdGetType(ttlvHead, 1, &type);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetBool

该函数用于获取指定 ID 节点数据-Bool 类型。

函数原型

c
qbool Ql_iotTtlvIdGetBool(const void *ttlvHead, quint16_t id, qbool *value)

参数说明

  • 输入参数

    • const void *  ttlvHead: 数据表。
    • quint16_t    id:数据节点 ID。
  • 输出参数

    • qbool *     value:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
qbool reauth_flag = FALSE;
qbool ret = Ql_iotTtlvIdGetBool(ttlvHead, 1, &reauth_flag);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetInt

该函数用于获取指定 ID 节点数据的-Int 类型。

函数原型

c
qbool Ql_iotTtlvIdGetInt(const void *ttlvHead, quint16_t id, int *value)

参数说明

  • 输入参数

    • const void *  ttlvHead: 数据表。
    • quint16_t    id: 数据节点 ID。
  • 输出参数

    • int *        value:数据节点内容。

返回值

  • True:函数执行成功。
  • False: 函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
double increment;
Ql_iotTtlvIdGetFloat(modelInfoHead, 1,&increment);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetFloat

该函数用于获取指定 ID 节点数据-浮点 类型

函数原型

c
Qbool Ql_iotTtlvIdGetFloat(const void *ttlvHead, quint16_t id, double *value)

参数说明

  • 输入参数

    • const void *  ttlvHead:数据表。
    • quint16_t    id:数据节点 ID。
  • 输出参数

    • double *     value:数据节点内容。

返回值

  • True:函数执行成功。
  • False: 函数执行失败。

备注

  • 2.6.1及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
qint64_t componentType;
char *cfgData = Ql_iotTtlvIdGetString(ttlvHead, 1);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetString

该函数用于获取指定 ID 节点数据-String 类型。

函数原型

c
char *Ql_iotTtlvIdGetString(const void *ttlvHead, quint16_t id)

参数说明

  • 输入参数
    • const void *  ttlvHead:数据表。
    • quint16_t    id:数据节点 ID。

返回值

  • NULL: 获取失败。
  • 其他:数据节点内容。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
quint8_t *encryData = NULL;
quint32_t encryLen = Ql_iotTtlvIdGetByte(ttlvHead, 1,&encryData); 
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetByte

该函数用于获取指定 ID 节点数据-Byte 类型。

函数原型

c
quint32_t Ql_iotTtlvIdGetByte(const void *ttlvHead, quint16_t id, quint8_t **value)

参数说明

  • 输入参数

    • const void *  ttlvHead:数据表。
    • quint16_t    id:数据节点 ID。
  • 输出参数

    • quint8_t **    value:数据节点内容。

返回值

  • 0: 数据读取失败。
  • >0: 实际读取到的固件数据长度。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
qint64_t componentType;
void *dnsInfo = Ql_iotTtlvIdGetStruct(ttlvHead, 1);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdGetStruct

该函数用于获取指定 ID 节点数据-Struct 类型。

函数原型

c
void *Ql_iotTtlvIdGetStruct(const void *ttlvHead, quint16_t id)

参数说明

  • 输入参数
    • const void *  ttlvHead:数据表。
    • quint16_t    id:数据节点 ID。

返回值

数据表指针。

备注

  • 2.3.3及以上版本支持

调用示例

c
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
    return;
}
qint64_t componentType;
void *dnsInfo = Ql_iotTtlvIdGetStruct(ttlvHead, 1);
Ql_iotTtlvFree(&ttlvHead);

Ql_iotTtlvIdAddBool

该函数用于添加节点数据-Bool 类型。

函数原型

c
qbool Ql_iotTtlvIdAddBool(void **ttlvHead, quint16_t id, qbool value)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。
    • quint16_t   id:数据节点 ID。
    • qbool     value:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

调用示例

详情示例请参考 添加节点数据示例


Ql_iotTtlvIdAddInt

该函数用于添加节点数据-int 类型。

函数原型

c
qbool Ql_iotTtlvIdAddInt(void **ttlvHead, quint16_t id, qint64_t num)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。

    • quint16_t   id:数据节点 ID。

    • qint64_t   num:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.6.1及以上版本支持

调用示例

详情示例请参考 添加节点数据示例


Ql_iotTtlvIdAddFloat

该函数用于添加节点数据-float 类型。

函数原型

c
qbool Ql_iotTtlvIdAddFloat(void **ttlvHead, quint16_t id, double num)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。
    • quint16_t   id:数据节点 ID。
    • double     num:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.6.1及以上版本支持

调用示例

详情示例请参考 添加节点数据示例


Ql_iotTtlvIdAddString

该函数用于添加节点数据-字符串 类型。

函数原型

c
qbool Ql_iotTtlvIdAddString(void **ttlvHead, quint16_t id, const char *data)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。
    • quint16_t   id:数据节点 ID。
    • quint8_t *   data:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 添加节点数据示例


Ql_iotTtlvIdAddByte

该函数用于添加节点数据-Byte 类型。

函数原型

c
qbool Ql_iotTtlvIdAddByte(void **ttlvHead, quint16_t id, quint8_t *data, quint32_t len)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。
    • quint16_t   id:数据节点 ID。
    • quint8_t *   data:数据节点内容。
    • quint32_t    len:数据节点内容长度。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 添加节点数据示例


Ql_iotTtlvIdAddStruct

该函数用于添加节点数据-Struct 类型。

函数原型

c
qbool Ql_iotTtlvIdAddStruct(void **ttlvHead, quint16_t id, void *vStruct)

参数说明

  • 输入参数
    • void **     ttlvHead: 数据表。
    • quint16_t   id:数据节点 ID。
    • void *    vStruct:数据节点内容。

返回值

  • True:  函数执行成功。
  • False:函数执行失败。

备注

  • 2.3.3及以上版本支持

调用示例

详情示例请参考 添加节点数据示例


  • 数据节点类型

    枚举定义

    c
    typedef enum { 
        QIOT_DPDATA_TYPE_BOOL = 0, 
        QIOT_DPDATA_TYPE_NUM, 
        QIOT_DPDATA_TYPE_BYTE, 
        QIOT_DPDATA_TYPE_STRUCT, 
    } QIot_dpDataType_e;

    参数说明

    参数描述
    QIOT_DPDATA_TYPE_BOOL布尔类型
    QIOT_DPDATA_TYPE_NUM数值类型
    QIOT_DPDATA_TYPE_BYTE字节流类型
    QIOT_DPDATA_TYPE_STRUCT结构体类型

获取节点数据示例

c
void Ql_iotTtlvHandle(const void *ttlvHead)
{
    quint32_t count = Ql_iotTtlvCountGet(ttlvHead);
    quint32_t i;
    for(i=0;i<count;i++)
    {
        uint16_t id;
        QIot_dpDataType_e type;
        void *node = Ql_iotTtlvNodeGet(ttlvHead, i, &id, &type);
        if(node)
        {
            switch (type)
            {
            case QIOT_DPDATA_TYPE_BOOL:
            {
                qbool value;
                Ql_iotTtlvNodeGetBool(node, &value);
                printf("model id:%d data:%s\r\n",id,value?"TRUE":"FALSE");
                break;
            }
            case QIOT_DPDATA_TYPE_INT:
            {
                qint64_t num;
                Ql_iotTtlvNodeGetInt(node, &num);
                printf("model id:%d data:"PRINTF_S64"\r\n",id,num);
                break;
            }  
            case QIOT_DPDATA_TYPE_FLOAT:
            {
                double num;
                Ql_iotTtlvNodeGetFloat(node, &num);
                printf("model id:%d data:%lg\r\n",id,num);
                break;
            }               
            case QIOT_DPDATA_TYPE_BYTE:
            {
                quint8_t *value;
                quint32_t len = Ql_iotTtlvNodeGetByte(node, &value);
                printf("model id:%d data:%.*s\r\n",id,len,value);
                break;
            }
            case QIOT_DPDATA_TYPE_STRUCT:
                Ql_iotTtlvHandle(Ql_iotTtlvNodeGetStruct(node));
                break;
            default:
                break;
            }
        }
    }
}

添加节点数据示例

c
/**************************************************************************
** 功能   @brief : 事件处理回调
** 输入   @param : 
** 输出   @retval: 
***************************************************************************/
void Ql_iotSubEventCB(quint32_t event, qint32_t errcode, const char *subPk, const char *subDk, const void *value, quint32_t valLen)
{
    printf("subPk[%s] subDk[%s] valLen[%d]\r\n", subPk, subDk, valLen);
    switch (event)
    {
    /* 接收数据操作 */
    case QIOT_ATEVENT_TYPE_RECV:
        printf("data recv event,code:%d\r\n",errcode);
        /* 收到物模型请求数据 */
        if(QIOT_RECV_SUCC_PHYMODEL_REQ == errcode && value)
        {
            quint16_t PkgID = *(quint16_t *)value;
            quint16_t *ids = (quint16_t *)((quint8_t*)value+sizeof(quint16_t));
            void *ttlvHead = NULL;
            printf("model read event,PkgID:%d\r\n",PkgID);
            quint32_t i;
            for(i=0;i<valLen;i++)
            {
                quint16_t modelId = ids[i];
                printf("modelId:%d\r\n",modelId);
                /* id1:bool id2:int id3:string id4:int array id5:string array*/
                switch (modelId)
                {
                case 1:
                    Ql_iotTtlvIdAddBool(&ttlvHead, modelId, TRUE);
                    break;
                case 2:
                    Ql_iotTtlvIdAddInt(&ttlvHead, modelId, 1);
                    break;
                case 3:
                    Ql_iotTtlvIdAddString(&ttlvHead, modelId, "hello world");
                    break;
                case 4:
                    {
                        void *ttlvArrayHead = NULL;
                        Ql_iotTtlvIdAddInt(&ttlvArrayHead, 1, 1);
                        Ql_iotTtlvIdAddInt(&ttlvArrayHead, 2, 2);
                        Ql_iotTtlvIdAddInt(&ttlvArrayHead, 3, 3);
                        Ql_iotTtlvIdAddStruct(&ttlvHead, modelId, ttlvArrayHead);
                    }
                    break;
                case 5:
                    {
                        void *ttlvArrayHead = NULL;
                        Ql_iotTtlvIdAddString(&ttlvArrayHead, 1, "hello a");
                        Ql_iotTtlvIdAddString(&ttlvArrayHead, 2, "hello b");
                        Ql_iotTtlvIdAddString(&ttlvArrayHead, 3, "hello c");
                        Ql_iotTtlvIdAddStruct(&ttlvHead, modelId, ttlvArrayHead);
                    }
                    break;
                default:
                    break;
                }
            }
            Ql_iotSubDevTslAck(subPk, subDk, PkgID, ttlvHead);
            Ql_iotTtlvFree(&ttlvHead);
        }
        break;
    default:
        break;
    }
}