Page 1 of 1
关于wifi成品局域网产测的问题
Posted: 2024年 Nov 27日 11:56
by leslieli
Code: Select all
OPERATE_RET __app_product_test_mf_cb(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
TAL_PR_ERR("__app_product_test_mf_cb ,cmd: %d,len=%d", cmd, len);
TAL_PR_HEXDUMP_DEBUG("data:", data, len);
UINT32_T time_start = 0, timer_end = 0;
ty_cJSON *cmd_json = NULL;
ty_cJSON *cmd_type = NULL;
ty_cJSON *sensor_channel = NULL;
char send_data[50] = {0};
unsigned short length = 0;
unsigned char flag;
switch (cmd)
{
case 0x01:
switch (*data)
{
case 0:
tuya_hard_set_led(LED_ON_OFF, 0);
break;
case 1:
tuya_hard_set_led(LED_ON_OFF, 1);
break;
case 2:
tuya_hard_set_led(LED_FLASH, 500);
break;
}
*ret_len = strlen("{\"ret\":true}");
strcpy(ret_data, "{\"ret\":true}");
TAL_PR_ERR("ret_data=%s,ret_len=%d", ret_data, *ret_len);
break;
case 0x03:
time_start = tal_system_get_millisecond();
user_state.KEY_MF_FLAG=true;
*ret_len = strlen("{\"keyID\":0}");
strcpy(ret_data, "{\"keyID\":0}");
TAL_PR_DEBUG("ret_data=%s,ret_len=%d", ret_data, *ret_len);
user_state.KEY_MF_FLAG = false;
break;
case 0x35:
cmd_json = ty_cJSON_Parse(data);
if (NULL == cmd_json)
{
ty_cJSON_Delete(cmd_json);
return;
}
cmd_type = ty_cJSON_GetObjectItem(cmd_json, "testItem");
if (NULL == cmd_type)
{
ty_cJSON_Delete(cmd_type);
return;
}
sensor_channel = ty_cJSON_GetObjectItem(cmd_json, "type");
if (NULL == sensor_channel)
{
ty_cJSON_Delete(sensor_channel);
return;
}
TAL_PR_ERR("type=%s,channel=%s", cmd_type->valuestring, sensor_channel->valuestring);
if (strcmp(cmd_type->valuestring, "pid") == 0)
{
sprintf(ret_data,"{\"ret\":true,\"testItem\":\"pid\", \"type\":\"string\", \"value\":\"%s\"}",PID);
*ret_len=strlen(ret_data);
TAL_PR_ERR("ret_data=%s,ret_len=%d", ret_data,*ret_len);
}
break;
}
return OPRT_OK;
}
用成品产测的函数 做局域网产测 在进cmd回调侯 回复消息失败 我看了下产测那里的日志 是re_data没有成功上报上去 不知道是什么原因 用的是BK7231 3.9.0开成品产测的sdk 然后T3的这块成品局域网产测可以进 但是每次ret_data的时候会直接进user_hard_fault
Re: 关于wifi成品局域网产测的问题
Posted: 2024年 Nov 27日 14:43
by 卢台长
Hi,您好
进入user_hard_fault的原因是,错误的进行赋值了ret_data
- 当用户需要返回数据时,先进行Malloc申请,并将申请的内存指针赋值ret_data(由内部释放),长度赋值ret_len
- 错误则直接返回任何错误代码即可(除了OPRT_OK),内部会自动返回{\"ret\":false}
请参考如下代码进行回复
Code: Select all
OPERATE_RET __app_product_test_mf_cb(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
// ---------------成功处理---------------------
// 返回数据需要进行malloc
UCHAR_T *data = Malloc(128);
if (NULL == data) {
return OPRT_MALLOC_FAILED;
}
// 返回用户自定义数据
sprintf((char *)send_data, "user data");
*ret_data = send_data;
*ret_len = strlen(send_data);
// ---------------失败处理--------------------------------
// 直接返回错误代码即可,内部会自动返回{\"ret\":false}
return OPRT_COM_ERROR
}
Re: 关于wifi成品局域网产测的问题
Posted: 2024年 Nov 28日 15:52
by leslieli
卢台长 2024年 Nov 27日 14:43
Hi,您好
进入user_hard_fault的原因是,错误的进行赋值了ret_data
- 当用户需要返回数据时,先进行Malloc申请,并将申请的内存指针赋值ret_data(由内部释放),长度赋值ret_len
- 错误则直接返回任何错误代码即可(除了OPRT_OK),内部会自动返回{\"ret\":false}
请参考如下代码进行回复
Code: Select all
OPERATE_RET __app_product_test_mf_cb(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
// ---------------成功处理---------------------
// 返回数据需要进行malloc
UCHAR_T *data = Malloc(128);
if (NULL == data) {
return OPRT_MALLOC_FAILED;
}
// 返回用户自定义数据
sprintf((char *)send_data, "user data");
*ret_data = send_data;
*ret_len = strlen(send_data);
// ---------------失败处理--------------------------------
// 直接返回错误代码即可,内部会自动返回{\"ret\":false}
return OPRT_COM_ERROR
}
这个可以 但是如何一次性回复2条
Re: 关于wifi成品局域网产测的问题
Posted: 2024年 Nov 29日 14:09
by 卢台长
leslieli 2024年 Nov 28日 15:52
卢台长 2024年 Nov 27日 14:43
Hi,您好
进入user_hard_fault的原因是,错误的进行赋值了ret_data
- 当用户需要返回数据时,先进行Malloc申请,并将申请的内存指针赋值ret_data(由内部释放),长度赋值ret_len
- 错误则直接返回任何错误代码即可(除了OPRT_OK),内部会自动返回{\"ret\":false}
请参考如下代码进行回复
Code: Select all
OPERATE_RET __app_product_test_mf_cb(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
// ---------------成功处理---------------------
// 返回数据需要进行malloc
UCHAR_T *data = Malloc(128);
if (NULL == data) {
return OPRT_MALLOC_FAILED;
}
// 返回用户自定义数据
sprintf((char *)send_data, "user data");
*ret_data = send_data;
*ret_len = strlen(send_data);
// ---------------失败处理--------------------------------
// 直接返回错误代码即可,内部会自动返回{\"ret\":false}
return OPRT_COM_ERROR
}
这个可以 但是如何一次性回复2条
Hi,您好
您是什么场景,需要连续回复两条
Re: 关于wifi成品局域网产测的问题
Posted: 2024年 Nov 30日 09:10
by leslieli
卢台长 2024年 Nov 29日 14:09
leslieli 2024年 Nov 28日 15:52
卢台长 2024年 Nov 27日 14:43
Hi,您好
进入user_hard_fault的原因是,错误的进行赋值了ret_data
- 当用户需要返回数据时,先进行Malloc申请,并将申请的内存指针赋值ret_data(由内部释放),长度赋值ret_len
- 错误则直接返回任何错误代码即可(除了OPRT_OK),内部会自动返回{\"ret\":false}
请参考如下代码进行回复
Code: Select all
OPERATE_RET __app_product_test_mf_cb(USHORT_T cmd, UCHAR_T *data, UINT_T len, OUT UCHAR_T **ret_data, OUT USHORT_T *ret_len)
{
// ---------------成功处理---------------------
// 返回数据需要进行malloc
UCHAR_T *data = Malloc(128);
if (NULL == data) {
return OPRT_MALLOC_FAILED;
}
// 返回用户自定义数据
sprintf((char *)send_data, "user data");
*ret_data = send_data;
*ret_len = strlen(send_data);
// ---------------失败处理--------------------------------
// 直接返回错误代码即可,内部会自动返回{\"ret\":false}
return OPRT_COM_ERROR
}
这个可以 但是如何一次性回复2条
Hi,您好
您是什么场景,需要连续回复两条
跟产测对接了 有一个开关量传感 需要上报2次状态 现在没法报 我现在用通用数据对接替代了