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
该函数用于获取数据表的节点数量。
函数原型
quint32_t Ql_iotTtlvCountGet(const void *ttlvHead)
参数说明
- 输入参数
- const void *
ttlvHead
: 数据表。
- const void *
返回值
数据表的节点数量。
备注
- 2.3.3及以上版本支持
调用示例
quint32_t count = Ql_iotTtlvCountGet(ttlvHead);
Ql_iotTtlvNodeGet
该函数用于从数据表中提取数据节点。
函数原型
void *Ql_iotTtlvNodeGet(const void *ttlvHead, quint16_t index, quint16_t *id, QIot_dpDataType_e
*type)
参数说明
输入参数
- const void *
ttlvHead
: 数据表。 - quint16_t
index
: 数据节点索引。
- const void *
输出参数
- quint16_t *
id
: 数据节点 ID。 - QIot_dpDataType_e *
type
: 数据节点类型。详情请参考数据节点类型。
- quint16_t *
返回值
数据节点指针;若为NULL则表示获取失败。
备注
- 2.3.3及以上版本支持
调用示例
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 节点并处理完成后,需调用该函数释放数据表资源。
函数原型
void Ql_iotTtlvFree(void **ttlvHead)
参数说明
- 输入参数
- void **
ttlvHead
: 数据表。
- void **
返回值
无。
备注
- 2.3.3及以上版本支持
调用示例
void *ttlvHead = NULL;
Ql_iotTtlvIdAddInt(&ttlvHead, 1, 100);
Ql_iotCmdBusPhymodelReport(1, ttlvHead);
Ql_iotTtlvFree(&ttlvHead); //释放指针
Ql_iotTtlvNodeGetType
该函数用于获取节点数据的类型。
函数原型
qbool Ql_iotTtlvNodeGetType(const void *ttlvNode, QIot_dpDataType_e *type)
参数说明
输入参数
- const void *
ttlvNode
: 数据节点。
- const void *
输出参数
- QIot_dpDataType_e *
type
:数据节点的类型。详情请参考数据节点类型。
- QIot_dpDataType_e *
返回值
True
:函数执行成功。False
: 函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
void *ttlvNode = NULL;
QIot_dpDataType_e type;
qbool ret = Ql_iotTtlvNodeGetType(&ttlvNode,&type);
Ql_iotTtlvNodeGetBool
该函数用于获取节点数据-Bool 类型。
函数原型
qbool Ql_iotTtlvNodeGetBool(const void *ttlvNode, qbool *value)
参数说明
输入参数
- const void *
ttlvNode
:数据节点。
- const void *
输出参数
- qbool *
value
:节点数据。
- qbool *
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvNodeGetInt
该函数用于获取节点数据-Int 类型。
函数原型
qbool Ql_iotTtlvNodeGetInt(const void *ttlvNode, int *value)
参数说明
输入参数
- const void *
ttlvNode
:数据节点。
- const void *
输出参数
- int *
value
:数据节点内容。
- int *
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvNodeGetFloat
该函数用于获取节点数据-浮点 类型。
函数原型
qbool Ql_iotTtlvNodeGetFloat(const void *ttlvNode, double *value)
参数说明
输入参数
- const void *
ttlvNode
:数据节点。
- const void *
输出参数
- double *
value
:数据节点内容。
- double *
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.6.1及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvNodeGetString
该函数用于获取节点数据-String 类型。
函数原型
char *Ql_iotTtlvNodeGetString(const void *ttlvNode)
参数说明
- 输入参数
- const void *
ttlvNode
: 数据节点。
- const void *
返回值
NULL
: 获取失败。其他
: 数据节点内容。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvNodeGetByte
该函数用于获取节点数据-Byte 类型。
函数原型
quint32_t Ql_iotTtlvNodeGetByte(const void *ttlvNode, quint8_t **value)
参数说明
输入参数
- const void *
ttlvNode
:数据节点。
- const void *
输出参数
- quint8_t **
value
:数据节点内容。
- quint8_t **
返回值
0
: 数据读取失败。>0
: 实际读取到的固件数据长度。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvNodeGetStruct
该函数用于获取节点数据-Struct 类型。
函数原型
void *Ql_iotTtlvNodeGetStruct(const void *ttlvNode)
参数说明
- 输入参数
- const void *
ttlvNode
:数据节点。
- const void *
返回值
数据表指针。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 获取节点数据示例。
Ql_iotTtlvIdGetType
该函数用于获取指定 ID 节点数据的类型。
函数原型
qbool Ql_iotTtlvIdGetType(const void *ttlvHead, quint16_t id, QIot_dpDataType_e *type)
参数说明
输入参数
- const void *
ttlvHead
:数据表。 - quint16_t
id
:数据节点 ID。
- const void *
输出参数
- QIot_dpDataType_e *
type
:数据节点内容。详情请参考数据节点类型。
- QIot_dpDataType_e *
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
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 类型。
函数原型
qbool Ql_iotTtlvIdGetBool(const void *ttlvHead, quint16_t id, qbool *value)
参数说明
输入参数
- const void *
ttlvHead
: 数据表。 - quint16_t
id
:数据节点 ID。
- const void *
输出参数
- qbool *
value
:数据节点内容。
- qbool *
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
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 类型。
函数原型
qbool Ql_iotTtlvIdGetInt(const void *ttlvHead, quint16_t id, int *value)
参数说明
输入参数
- const void *
ttlvHead
: 数据表。 - quint16_t
id
: 数据节点 ID。
- const void *
输出参数
- int *
value
:数据节点内容。
- int *
返回值
True
:函数执行成功。False
: 函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
void *ttlvHead = Ql_iotTtlvUnformat(payload, payloadLen);
if (NULL == ttlvHead)
{
return;
}
double increment;
Ql_iotTtlvIdGetFloat(modelInfoHead, 1,&increment);
Ql_iotTtlvFree(&ttlvHead);
Ql_iotTtlvIdGetFloat
该函数用于获取指定 ID 节点数据-浮点 类型
函数原型
Qbool Ql_iotTtlvIdGetFloat(const void *ttlvHead, quint16_t id, double *value)
参数说明
输入参数
- const void *
ttlvHead
:数据表。 - quint16_t
id
:数据节点 ID。
- const void *
输出参数
- double *
value
:数据节点内容。
- double *
返回值
True
:函数执行成功。False
: 函数执行失败。
备注
- 2.6.1及以上版本支持
调用示例
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 类型。
函数原型
char *Ql_iotTtlvIdGetString(const void *ttlvHead, quint16_t id)
参数说明
- 输入参数
- const void *
ttlvHead
:数据表。 - quint16_t
id
:数据节点 ID。
- const void *
返回值
NULL
: 获取失败。其他
:数据节点内容。
备注
- 2.3.3及以上版本支持
调用示例
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 类型。
函数原型
quint32_t Ql_iotTtlvIdGetByte(const void *ttlvHead, quint16_t id, quint8_t **value)
参数说明
输入参数
- const void *
ttlvHead
:数据表。 - quint16_t
id
:数据节点 ID。
- const void *
输出参数
- quint8_t **
value
:数据节点内容。
- quint8_t **
返回值
0
: 数据读取失败。>0
: 实际读取到的固件数据长度。
备注
- 2.3.3及以上版本支持
调用示例
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 类型。
函数原型
void *Ql_iotTtlvIdGetStruct(const void *ttlvHead, quint16_t id)
参数说明
- 输入参数
- const void *
ttlvHead
:数据表。 - quint16_t
id
:数据节点 ID。
- const void *
返回值
数据表指针。
备注
- 2.3.3及以上版本支持
调用示例
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 类型。
函数原型
qbool Ql_iotTtlvIdAddBool(void **ttlvHead, quint16_t id, qbool value)
参数说明
- 输入参数
- void **
ttlvHead
: 数据表。 - quint16_t
id
:数据节点 ID。 - qbool
value
:数据节点内容。
- void **
返回值
True
: 函数执行成功。False
:函数执行失败。
调用示例
详情示例请参考 添加节点数据示例。
Ql_iotTtlvIdAddInt
该函数用于添加节点数据-int 类型。
函数原型
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 类型。
函数原型
qbool Ql_iotTtlvIdAddFloat(void **ttlvHead, quint16_t id, double num)
参数说明
- 输入参数
- void **
ttlvHead
: 数据表。 - quint16_t
id
:数据节点 ID。 - double
num
:数据节点内容。
- void **
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.6.1及以上版本支持
调用示例
详情示例请参考 添加节点数据示例。
Ql_iotTtlvIdAddString
该函数用于添加节点数据-字符串 类型。
函数原型
qbool Ql_iotTtlvIdAddString(void **ttlvHead, quint16_t id, const char *data)
参数说明
- 输入参数
- void **
ttlvHead
: 数据表。 - quint16_t
id
:数据节点 ID。 - quint8_t *
data
:数据节点内容。
- void **
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 添加节点数据示例。
Ql_iotTtlvIdAddByte
该函数用于添加节点数据-Byte 类型。
函数原型
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
:数据节点内容长度。
- void **
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 添加节点数据示例。
Ql_iotTtlvIdAddStruct
该函数用于添加节点数据-Struct 类型。
函数原型
qbool Ql_iotTtlvIdAddStruct(void **ttlvHead, quint16_t id, void *vStruct)
参数说明
- 输入参数
- void **
ttlvHead
: 数据表。 - quint16_t
id
:数据节点 ID。 - void *
vStruct
:数据节点内容。
- void **
返回值
True
: 函数执行成功。False
:函数执行失败。
备注
- 2.3.3及以上版本支持
调用示例
详情示例请参考 添加节点数据示例。
数据节点类型
枚举定义
ctypedef 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 结构体类型
获取节点数据示例
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;
}
}
}
}
添加节点数据示例
/**************************************************************************
** 功能 @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;
}
}