Commit 5ea5d162 authored by 陈伟灿's avatar 陈伟灿

Merge branch 'cwc' into 'master'

【修改内容】增加历史数据的记录支持

See merge request chenweican/k-sdk!72
parents ddef1c32 f248754e
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kcloud_data_handle.c
*内容摘要: application层数据处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -44,9 +57,16 @@ const char DM_MSG_TO_MIDDWARE[] = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\" ...@@ -44,9 +57,16 @@ const char DM_MSG_TO_MIDDWARE[] = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\"
static char *s_split_product[] = { static char *s_split_product[] = {
"85", //三路面板 "85", //三路面板
"97", //双路面板 "97", //双路面板
"3003" //三路面板 "98" //三路面板
}; };
/************************************************************
*功能描述:灯控面板需要分开上报属性
*输入参数: info:所上报数据
*输出参数: 无
*返 回 值: 1:需要拆分;0:不需要
*其他说明:
*************************************************************/
static int kk_check_need_split(cJSON * info) static int kk_check_need_split(cJSON * info)
{ {
//return 0;//暂时不用拆分处理 //return 0;//暂时不用拆分处理
...@@ -71,6 +91,15 @@ static int kk_check_need_split(cJSON * info) ...@@ -71,6 +91,15 @@ static int kk_check_need_split(cJSON * info)
return 0; return 0;
#endif #endif
} }
/************************************************************
*功能描述:灯控面板拆分具体的属性并逐个上报
*输入参数: pData:所上报数据
topic:主题
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_split_send_data(cJSON *pData,const char* topic) static int kk_split_send_data(cJSON *pData,const char* topic)
{ {
cJSON *pParam = NULL; cJSON *pParam = NULL;
...@@ -122,6 +151,13 @@ static int kk_split_send_data(cJSON *pData,const char* topic) ...@@ -122,6 +151,13 @@ static int kk_split_send_data(cJSON *pData,const char* topic)
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/************************************************************
*功能描述:上报数据给云端
*输入参数: root:所上报数据
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int _kk_sendto_cloud(cJSON *root) int _kk_sendto_cloud(cJSON *root)
{ {
cJSON *info,*pData; cJSON *info,*pData;
...@@ -193,6 +229,14 @@ int _kk_sendto_cloud(cJSON *root) ...@@ -193,6 +229,14 @@ int _kk_sendto_cloud(cJSON *root)
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/************************************************************
*功能描述:获取midware上报的数据
*输入参数: str:所上报数据
len:数据长度
*输出参数: 无
*返 回 值: 无
*其他说明:
*************************************************************/
void KK_Data_FromDev(void* str,int len) void KK_Data_FromDev(void* str,int len)
{ {
...@@ -215,6 +259,14 @@ void KK_Data_FromDev(void* str,int len) ...@@ -215,6 +259,14 @@ void KK_Data_FromDev(void* str,int len)
cJSON_Delete(root); cJSON_Delete(root);
} }
/************************************************************
*功能描述:无效主题过滤
*输入参数: topic:主题
*输出参数: 无
*返 回 值: 1:过滤;0:不过滤
*其他说明:
*************************************************************/
static int _check_invalid_topic(const char* topic) static int _check_invalid_topic(const char* topic)
{ {
if(strstr(topic, KK_FILTER_TOPO_TOPIC) != NULL && \ if(strstr(topic, KK_FILTER_TOPO_TOPIC) != NULL && \
...@@ -252,7 +304,14 @@ static int _check_invalid_topic(const char* topic) ...@@ -252,7 +304,14 @@ static int _check_invalid_topic(const char* topic)
} }
return 0; return 0;
} }
/************************************************************
*功能描述:从主题解析出消息
*输入参数: topic:主题
start_deli:从第start_deli个'/'开始解析
*输出参数: msgTypeStr:消息类型
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _kk_topic_parse_msgType(_IN_ char *topic, _IN_ int start_deli,_OU_ char **msgTypeStr) static int _kk_topic_parse_msgType(_IN_ char *topic, _IN_ int start_deli,_OU_ char **msgTypeStr)
{ {
int res = 0, start = 0, len = 0, slice = 0; int res = 0, start = 0, len = 0, slice = 0;
...@@ -282,6 +341,16 @@ static int _kk_topic_parse_msgType(_IN_ char *topic, _IN_ int start_deli,_OU_ ch ...@@ -282,6 +341,16 @@ static int _kk_topic_parse_msgType(_IN_ char *topic, _IN_ int start_deli,_OU_ ch
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/************************************************************
*功能描述:从主题解析出productCode和deviceCode
*输入参数: topic:主题
start_deli:从第start_deli个'/'开始解析
*输出参数: productCode:产品ID
deviceCode:设备deviceCode
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _kk_topic_parse_pkdn(_IN_ char *topic, _IN_ int start_deli, static int _kk_topic_parse_pkdn(_IN_ char *topic, _IN_ int start_deli,
_OU_ char productCode[PRODUCT_CODE_LEN],_OU_ char deviceCode[DEVICE_CODE_LEN]) _OU_ char productCode[PRODUCT_CODE_LEN],_OU_ char deviceCode[DEVICE_CODE_LEN])
{ {
...@@ -309,6 +378,14 @@ static int _kk_topic_parse_pkdn(_IN_ char *topic, _IN_ int start_deli, ...@@ -309,6 +378,14 @@ static int _kk_topic_parse_pkdn(_IN_ char *topic, _IN_ int start_deli,
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/************************************************************
*功能描述:topo change消息处理
*输入参数: payload:具体数据
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:此接口主要手机端主动删除设备时调用
*************************************************************/
static int _kk_topo_change_handle(cJSON *payload) static int _kk_topo_change_handle(cJSON *payload)
{ {
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR); cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
...@@ -335,6 +412,14 @@ static int _kk_topo_change_handle(cJSON *payload) ...@@ -335,6 +412,14 @@ static int _kk_topo_change_handle(cJSON *payload)
} }
/************************************************************
*功能描述:从云端数据转化成业务协议数据
*输入参数: data:具体数据
topic:主题
*输出参数: 无
*返 回 值: NULL:失败;其他:具体协议数据
*其他说明:
*************************************************************/
static char * _kk_data_create(const char *topic,const char *data) static char * _kk_data_create(const char *topic,const char *data)
{ {
cJSON *root; cJSON *root;
...@@ -372,11 +457,19 @@ static char * _kk_data_create(const char *topic,const char *data) ...@@ -372,11 +457,19 @@ static char * _kk_data_create(const char *topic,const char *data)
cJSON_Delete(root); cJSON_Delete(root);
free(msgStr); free(msgStr);
free(infoStr); free(infoStr);
INFO_PRINT("[%s][%d]%s\n",__FUNCTION__,__LINE__,out); INFO_PRINT("[out]%s\n",out);
return out; return out;
//free(out); /* Print to text, Delete the cJSON, print it, release the string. */ //free(out); /* Print to text, Delete the cJSON, print it, release the string. */
} }
/************************************************************
*功能描述:通知midware是否连云成功
*输入参数: state:1,连上;0:未连上
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
const char DM_MSG_CLOUDSTATE[] = "{\"msgId\":\"1\",\"version\":\"1.0\",\"params\":{\"IOTCloudState\":\"%d\"},\"method\":\"thing.ccu.cloudstate_reply\"}"; const char DM_MSG_CLOUDSTATE[] = "{\"msgId\":\"1\",\"version\":\"1.0\",\"params\":{\"IOTCloudState\":\"%d\"},\"method\":\"thing.ccu.cloudstate_reply\"}";
int KK_Send_CloudState(int state) int KK_Send_CloudState(int state)
{ {
...@@ -419,6 +512,15 @@ int KK_Send_CloudState(int state) ...@@ -419,6 +512,15 @@ int KK_Send_CloudState(int state)
free(out); free(out);
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/************************************************************
*功能描述:发送数据给Midware
*输入参数: topic:主题;
data:具体数据
*输出参数: 无
*返 回 值: 无
*其他说明:
*************************************************************/
void KK_Sendto_DevData(const char *topic,const char *data) void KK_Sendto_DevData(const char *topic,const char *data)
{ {
if(_check_invalid_topic(topic)) if(_check_invalid_topic(topic))
......
...@@ -66,18 +66,27 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents) ...@@ -66,18 +66,27 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents)
uint8_t *chlMark = NULL; uint8_t *chlMark = NULL;
uint32_t bytes =0; uint32_t bytes =0;
uint32_t validLen =0; uint32_t validLen =0;
char *dat_bak = NULL;
if (loop_ctrl->type == IPC_PLAT2MID){ if (loop_ctrl->type == IPC_PLAT2MID){
bytes = nn_recv(loop_ctrl->ab.n, &dat, NN_MSG, NN_DONTWAIT); bytes = nn_recv(loop_ctrl->ab.n, &dat, NN_MSG, NN_DONTWAIT);
}else{ }else{
bytes = nn_recv(loop_ctrl->ba.n, &dat, NN_MSG, NN_DONTWAIT); bytes = nn_recv(loop_ctrl->ba.n, &dat, NN_MSG, NN_DONTWAIT);
} }
if (bytes <= 0 || dat == NULL) { if (bytes <= 0 || dat == NULL) {
ERROR_PRINT(" recived data is null or len is 0 \n"); //ERROR_PRINT(" recived data is null or len is 0 \n");
ERROR_PRINT("nn_recv failed with error code %d, %s \n", nn_errno(), nn_strerror(nn_errno ())); //ERROR_PRINT("nn_recv failed with error code %d, %s \n", nn_errno(), nn_strerror(nn_errno ()));
return; return;
} }
INFO_PRINT("watcher_cb:%s\n", (char *)dat); dat_bak = malloc(bytes+1);
if(dat_bak != NULL){
memset(dat_bak,0x0,bytes);
memcpy(dat_bak,dat,bytes);
cJSON_Minify((char *)dat_bak);
INFO_PRINT("watcher_cb:%s\n", (char*)dat_bak);
free(dat_bak);
dat_bak = NULL;
}
loop_ctrl->isconnect = 1; loop_ctrl->isconnect = 1;
//if sub, need filter sbuscribe str //if sub, need filter sbuscribe str
if (IPC_PLAT2MID == loop_ctrl->type || IPC_MID2PLAT == loop_ctrl->type){ if (IPC_PLAT2MID == loop_ctrl->type || IPC_MID2PLAT == loop_ctrl->type){
...@@ -87,15 +96,6 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents) ...@@ -87,15 +96,6 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents)
validLen = bytes; validLen = bytes;
} }
//for test ipc connect or not
/*if (loop_ctrl->isconnect == 0 ){
loop_ctrl->isconnect =1;
if (strncmp(validDat,MAGIC, strlen(MAGIC)) == 0){
kk_ipc_send_ex(loop_ctrl->type, validDat, bytes, chlMark);
nn_freemsg(dat);
return;
}
}*/
if (strncmp(validDat,MAGIC, strlen(MAGIC)) == 0){ if (strncmp(validDat,MAGIC, strlen(MAGIC)) == 0){
if (strncmp(validDat,MAGIC_ACK, strlen(MAGIC_ACK)) == 0){ if (strncmp(validDat,MAGIC_ACK, strlen(MAGIC_ACK)) == 0){
...@@ -109,7 +109,6 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents) ...@@ -109,7 +109,6 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents)
}else if (IPC_MID2PLAT == loop_ctrl->type){// }else if (IPC_MID2PLAT == loop_ctrl->type){//
loop_ctrl->isconnect =0; loop_ctrl->isconnect =0;
} }
if (loop_ctrl->cb != NULL){ if (loop_ctrl->cb != NULL){
loop_ctrl->cb((void *)validDat, validLen, chlMark); loop_ctrl->cb((void *)validDat, validLen, chlMark);
} }
......
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_dm_heartbeat.c
*内容摘要: 设备心跳处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "klist.h" #include "klist.h"
...@@ -6,6 +20,10 @@ ...@@ -6,6 +20,10 @@
#include "kk_dm_mng.h" #include "kk_dm_mng.h"
/*************************************************************
全局变量定义
*************************************************************/
typedef struct { typedef struct {
void *mutex; void *mutex;
...@@ -20,8 +38,13 @@ typedef struct { ...@@ -20,8 +38,13 @@ typedef struct {
char deviceCode[DEVICE_CODE_MAXLEN]; char deviceCode[DEVICE_CODE_MAXLEN];
struct list_head linked_list; struct list_head linked_list;
} kk_gw_status_ctx_t; } kk_gw_status_ctx_t;
time_t s_start_time = 0;
static kk_heartbeat_ctx_t s_kk_heartbeat_ctx = {0}; static kk_heartbeat_ctx_t s_kk_heartbeat_ctx = {0};
/*************************************************************
函数实现
*************************************************************/
static kk_heartbeat_ctx_t *_kk_heartbeat_get_ctx(void) static kk_heartbeat_ctx_t *_kk_heartbeat_get_ctx(void)
{ {
return &s_kk_heartbeat_ctx; return &s_kk_heartbeat_ctx;
...@@ -41,8 +64,14 @@ static void _kk_heartbeat_unlock(void) ...@@ -41,8 +64,14 @@ static void _kk_heartbeat_unlock(void)
HAL_MutexUnlock(ctx->mutex); HAL_MutexUnlock(ctx->mutex);
} }
} }
uint64_t s_start_time = 0;
/************************************************************
*功能描述: 心跳处理主任务
*输入参数: args:传入参数,暂未使用
*输出参数: 无
*返 回 值:
*其他说明:
*************************************************************/
void *kk_heartbeat_yield(void *args) void *kk_heartbeat_yield(void *args)
{ {
kk_heartbeat_ctx_t *ctx = _kk_heartbeat_get_ctx(); kk_heartbeat_ctx_t *ctx = _kk_heartbeat_get_ctx();
...@@ -95,7 +124,13 @@ void *kk_heartbeat_yield(void *args) ...@@ -95,7 +124,13 @@ void *kk_heartbeat_yield(void *args)
} }
return NULL; return NULL;
} }
/************************************************************
*功能描述: 心跳模块初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_heartbeat_init(void) int kk_heartbeat_init(void)
{ {
int res = 0; int res = 0;
...@@ -122,7 +157,13 @@ int kk_heartbeat_init(void) ...@@ -122,7 +157,13 @@ int kk_heartbeat_init(void)
// INIT_LIST_HEAD(&ctx->dev_list); // INIT_LIST_HEAD(&ctx->dev_list);
} }
/************************************************************
*功能描述: 上电把需要查询状态的网关加入队列,load设备的时候调用此函数
*输入参数: deviceCode:网关deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_dm_gw_status_check_push(const char *deviceCode) int kk_dm_gw_status_check_push(const char *deviceCode)
{ {
kk_gw_status_ctx_t *gw = NULL; kk_gw_status_ctx_t *gw = NULL;
...@@ -148,6 +189,13 @@ int kk_dm_gw_status_check_push(const char *deviceCode) ...@@ -148,6 +189,13 @@ int kk_dm_gw_status_check_push(const char *deviceCode)
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 收到网关反馈后更新网关在线标记,收到网关消息后调用此函数
*输入参数: deviceCode:网关deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_dm_gw_status_update_online(const char *deviceCode) int kk_dm_gw_status_update_online(const char *deviceCode)
{ {
kk_gw_status_ctx_t *gw = NULL; kk_gw_status_ctx_t *gw = NULL;
......
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_property_db.c
*内容摘要: 设备属性数据表处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <stdio.h> #include <stdio.h>
#include "kk_tsl_api.h" #include "kk_tsl_api.h"
#include "sqlite3.h" #include "sqlite3.h"
...@@ -5,6 +19,10 @@ ...@@ -5,6 +19,10 @@
#include "kk_dm_mng.h" #include "kk_dm_mng.h"
#include "kk_property_db.h" #include "kk_property_db.h"
/*************************************************************
全局变量定义
*************************************************************/
extern sqlite3 *g_kk_pDb; extern sqlite3 *g_kk_pDb;
typedef struct { typedef struct {
void *mutex; void *mutex;
...@@ -52,6 +70,14 @@ static void _kk_property_db_unlock(void) ...@@ -52,6 +70,14 @@ static void _kk_property_db_unlock(void)
HAL_MutexUnlock(ctx->mutex); HAL_MutexUnlock(ctx->mutex);
} }
} }
/************************************************************
*功能描述: 属性数据表初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_property_db_Init(void) static int kk_property_db_Init(void)
{ {
kk_property_db_ctx_t *ctx = _kk_property_db_get_ctx(); kk_property_db_ctx_t *ctx = _kk_property_db_get_ctx();
...@@ -107,6 +133,14 @@ static int kk_property_db_Init(void) ...@@ -107,6 +133,14 @@ static int kk_property_db_Init(void)
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 属性模块初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_init(void) int kk_property_db_init(void)
{ {
int res = 0; int res = 0;
...@@ -126,6 +160,14 @@ int kk_property_db_init(void) ...@@ -126,6 +160,14 @@ int kk_property_db_init(void)
//_kk_load_subDevice(); //_kk_load_subDevice();
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: check属性是否重复
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: 无
*返 回 值: 1:已经存在;0:不存在
*其他说明:
*************************************************************/
static int _kk_check_property_exist(const char* deviceCode,const char* identifier) static int _kk_check_property_exist(const char* deviceCode,const char* identifier)
{ {
int isExist = 0; int isExist = 0;
...@@ -151,6 +193,16 @@ static int _kk_check_property_exist(const char* deviceCode,const char* identifie ...@@ -151,6 +193,16 @@ static int _kk_check_property_exist(const char* deviceCode,const char* identifie
_kk_property_db_unlock(); _kk_property_db_unlock();
return isExist; return isExist;
} }
/************************************************************
*功能描述: 插入属性到数据库
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
valuetype:属性值类型
devtype:设备类型
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:属性的值插入的时候先置空,后续再update
*************************************************************/
int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_data_type_e valuetype,int devtype) int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_data_type_e valuetype,int devtype)
{ {
...@@ -163,7 +215,6 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d ...@@ -163,7 +215,6 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d
if(_kk_check_property_exist(deviceCode,identifier) == 1) if(_kk_check_property_exist(deviceCode,identifier) == 1)
{ {
//WARNING_PRINT("[%s][%d] DATA ALREADY EXIST!!!\n",__FUNCTION__,__LINE__);
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
_kk_property_db_lock(); _kk_property_db_lock();
...@@ -181,6 +232,15 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d ...@@ -181,6 +232,15 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 更新属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
value:属性值
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_update_value(const char *deviceCode,const char *identifier,const char* value) int kk_property_db_update_value(const char *deviceCode,const char *identifier,const char* value)
{ {
char *sqlCmd = NULL; char *sqlCmd = NULL;
...@@ -205,6 +265,14 @@ int kk_property_db_update_value(const char *deviceCode,const char *identifier,co ...@@ -205,6 +265,14 @@ int kk_property_db_update_value(const char *deviceCode,const char *identifier,co
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 获取属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: value:属性值,返回的是字串
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_get_value_directly(const char *deviceCode,const char *identifier,char* value) int kk_property_db_get_value_directly(const char *deviceCode,const char *identifier,char* value)
{ {
char *sqlCmd = NULL; char *sqlCmd = NULL;
...@@ -219,9 +287,7 @@ int kk_property_db_get_value_directly(const char *deviceCode,const char *identif ...@@ -219,9 +287,7 @@ int kk_property_db_get_value_directly(const char *deviceCode,const char *identif
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL); sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){ while(sqlite3_step(stmt) == SQLITE_ROW){
valueStr = sqlite3_column_text(stmt, DB_VALUE); valueStr = sqlite3_column_text(stmt, DB_VALUE);
printf("valueStr:%s\n",valueStr);
memcpy(value,valueStr, strlen(valueStr)); memcpy(value,valueStr, strlen(valueStr));
printf("value:%s\n",value);
} }
sqlite3_free(sqlCmd); sqlite3_free(sqlCmd);
_kk_property_db_unlock(); _kk_property_db_unlock();
...@@ -229,7 +295,14 @@ int kk_property_db_get_value_directly(const char *deviceCode,const char *identif ...@@ -229,7 +295,14 @@ int kk_property_db_get_value_directly(const char *deviceCode,const char *identif
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 获取属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: value:属性值,根据物模型中数据类型返回对应的类型
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_get_value(const char *deviceCode,const char *identifier,void* value) int kk_property_db_get_value(const char *deviceCode,const char *identifier,void* value)
{ {
char *sqlCmd = NULL; char *sqlCmd = NULL;
...@@ -243,7 +316,6 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void* ...@@ -243,7 +316,6 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void*
_kk_property_db_lock(); _kk_property_db_lock();
sqlCmd = sqlite3_mprintf("select * from PropertiesInfo WHERE deviceCode= '%s' and identifier = '%s'",deviceCode,identifier); sqlCmd = sqlite3_mprintf("select * from PropertiesInfo WHERE deviceCode= '%s' and identifier = '%s'",deviceCode,identifier);
DEBUG_PRINT("kk_property_db_get_value sqlCmd:%s\n",sqlCmd);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL); sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
...@@ -277,6 +349,15 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void* ...@@ -277,6 +349,15 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void*
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 获取属性值
*输入参数: dev_type:设备类型
identifier:属性名称
count: 最大获取个数
*输出参数: raw:属性相关结构
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_prop_raw_struct_t* raw, int count) int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_prop_raw_struct_t* raw, int count)
{ {
char *sqlCmd = NULL; char *sqlCmd = NULL;
...@@ -293,7 +374,6 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro ...@@ -293,7 +374,6 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro
_kk_property_db_lock(); _kk_property_db_lock();
sqlCmd = sqlite3_mprintf("select * from PropertiesInfo WHERE devType= '%d' and identifier = '%s'",dev_type,identifier); sqlCmd = sqlite3_mprintf("select * from PropertiesInfo WHERE devType= '%d' and identifier = '%s'",dev_type,identifier);
DEBUG_PRINT("kk_property_db_get_gw_value sqlCmd:%s\n",sqlCmd);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL); sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
...@@ -315,7 +395,13 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro ...@@ -315,7 +395,13 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述: 更新设备下所有的属性值
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_update(const char *deviceCode) int kk_property_db_update(const char *deviceCode)
{ {
int res = 0; int res = 0;
...@@ -361,7 +447,13 @@ int kk_property_db_update(const char *deviceCode) ...@@ -361,7 +447,13 @@ int kk_property_db_update(const char *deviceCode)
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述:同步数据库里的数据到内存中,开机调用
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_sync_values(const char *deviceCode) int kk_property_sync_values(const char *deviceCode)
{ {
char *sqlCmd = NULL; char *sqlCmd = NULL;
...@@ -423,6 +515,13 @@ int kk_property_sync_values(const char *deviceCode) ...@@ -423,6 +515,13 @@ int kk_property_sync_values(const char *deviceCode)
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
/************************************************************
*功能描述:通过deviceCode删除设备属性
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN]) int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN])
{ {
const char *deleteCmd = "delete from PropertiesInfo where deviceCode = '%s';"; const char *deleteCmd = "delete from PropertiesInfo where deviceCode = '%s';";
...@@ -447,30 +546,6 @@ int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN]) ...@@ -447,30 +546,6 @@ int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN])
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
int kk_property_delete_by_identify(char *identify)
{
const char *deleteCmd = "delete from PropertiesInfo where identifier = '%s';";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_property_db_ctx_t *ctx = _kk_property_db_get_ctx();
_kk_property_db_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,identify);
INFO_PRINT("Table delete data sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
INFO_PRINT("Table delete data successfully\n");
}
sqlite3_free(sqlCmd);
_kk_property_db_unlock();
return SUCCESS_RETURN;
}
static int _kk_check_lockkey_exist(const char* deviceCode,const char* keyId) static int _kk_check_lockkey_exist(const char* deviceCode,const char* keyId)
{ {
int isExist = 0; int isExist = 0;
......
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_history_db.c
*内容摘要: 记录传感器类设备和功率计量设备的历史数据模块
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <stdio.h>
#include "kk_tsl_api.h"
#include "sqlite3.h"
#include "kk_log.h"
#include "kk_history_db.h"
/*************************************************************
全局变量定义
*************************************************************/
extern sqlite3 *g_kk_pDb;
#define KK_HISTORY_MAX_COUNT 200
/*************************************************************
函数实现
*************************************************************/
typedef struct {
void *mutex;
sqlite3 *pDb;
} kk_history_ctx_t;
static kk_history_ctx_t s_kk_history_ctx = {NULL};
kk_history_ctx_t *_kk_history_get_ctx(void)
{
return &s_kk_history_ctx;
}
void _kk_history_lock(void)
{
kk_history_ctx_t *ctx = _kk_history_get_ctx();
if (ctx->mutex) {
HAL_MutexLock(ctx->mutex);
}
}
void _kk_history_unlock(void)
{
kk_history_ctx_t *ctx = _kk_history_get_ctx();
if (ctx->mutex) {
HAL_MutexUnlock(ctx->mutex);
}
}
/************************************************************
*功能描述: 历史记录数据库初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_history_db_init(void)
{
kk_history_ctx_t *ctx = _kk_history_get_ctx();
char *pcErr;
//eUtils_LockLock(&sLock);
ctx->pDb = g_kk_pDb;
INFO_PRINT("kk_history db Database opened\n");
/* Create Mutex */
ctx->mutex = HAL_MutexCreate();
if (ctx->mutex == NULL) {
return FAIL_RETURN;
}
_kk_history_lock();
const char *pSensorHistoryTable = "CREATE TABLE IF NOT EXISTS SensorHistoryInfo( \
deviceCode varchar(255), \
identifier varchar(255), \
value varchar(255), \
recordtime INTEGER)";
if (sqlite3_exec(ctx->pDb, pSensorHistoryTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_history_unlock();
return FAIL_RETURN;
}
const char *pOutletHistoryTable = "CREATE TABLE IF NOT EXISTS OutletHistoryInfo( \
deviceCode varchar(255), \
power varchar(32), \
metering varchar(32), \
recordtime INTEGER)";
if (sqlite3_exec(ctx->pDb, pOutletHistoryTable, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_history_unlock();
return FAIL_RETURN;
}
_kk_history_unlock();
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:删除历史数据
*输入参数:time:记录时间
*输出参数:无
*返 回 值:0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_history_delete_by_recordtime(const char *table,time_t time)
{
const char *deleteCmd = "delete from '%s' where recordtime = '%d';";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_history_ctx_t *ctx = _kk_history_get_ctx();
sqlCmd = sqlite3_mprintf(deleteCmd,table,time);
INFO_PRINT("Table delete data sqlCmd:%s\n",sqlCmd);
rc = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( rc != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
//INFO_PRINT("Table delete data successfully\n");
}
sqlite3_free(sqlCmd);
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 插入传感器警告类信息到数据库
*输入参数: deviceCode:设备deviceCode
identifier: 事件identifier
valueStr:事件数据
time: 当前时间
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_history_insert_sensor_info(const char* deviceCode,const char* identifier,const char* valueStr,time_t time)
{
int res = 0;
kk_history_ctx_t *ctx = _kk_history_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
sqlite3_stmt *stmt;
time_t rtime = 0;
const char *insertCmd = "insert into SensorHistoryInfo (deviceCode, identifier,value,recordtime) \
values ('%s','%s','%s','%d');";
INFO_PRINT("kk_history_insert_sensor_info,deviceCode:%s,identifier:%s,value:%s\n",deviceCode,identifier,valueStr);
_kk_history_lock();
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,identifier,valueStr,time);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_history_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
/*按时间删除超过最大数量的记录*/
const char *selectCmd = "select * from SensorHistoryInfo order by recordtime desc limit (select count(recordtime) from SensorHistoryInfo) offset %d";
sqlCmd = sqlite3_mprintf(selectCmd,KK_HISTORY_MAX_COUNT);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
rtime = sqlite3_column_int(stmt, DB_SENSOR_RECORDTIME);
kk_history_delete_by_recordtime("SensorHistoryInfo",rtime);
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
_kk_history_unlock();
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 插入插座类功率等信息到数据库
*输入参数: deviceCode:设备deviceCode
power: 功率
metering:计电量
time: 当前时间
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_history_insert_Outlet_info(const char* deviceCode,const char* power,const char* metering,time_t time)
{
int res = 0;
kk_history_ctx_t *ctx = _kk_history_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
sqlite3_stmt *stmt;
time_t rtime = 0;
const char *insertCmd = "insert into OutletHistoryInfo (deviceCode, power,metering,recordtime) \
values ('%s','%s','%s','%d');";
INFO_PRINT("kk_history_insert_Outlet_info,deviceCode:%s,power:%s,metering:%s\n",deviceCode,power,metering);
_kk_history_lock();
sqlCmd = sqlite3_mprintf(insertCmd,deviceCode,power,metering,time);
res = sqlite3_exec(ctx->pDb, sqlCmd, NULL, NULL, &zErrMsg);
if( res != SQLITE_OK ){
ERROR_PRINT("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
sqlite3_free(sqlCmd);
_kk_history_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
/*按时间删除超过最大数量的记录*/
const char *selectCmd = "select * from OutletHistoryInfo order by recordtime desc limit (select count(recordtime) from OutletHistoryInfo) offset %d";
sqlCmd = sqlite3_mprintf(selectCmd,KK_HISTORY_MAX_COUNT);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
rtime = sqlite3_column_int(stmt, DB_OUTLET_RECORDTIME);
kk_history_delete_by_recordtime("OutletHistoryInfo",rtime);
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
_kk_history_unlock();
return SUCCESS_RETURN;
}
#ifndef __KK_HISTORY_DB_H__
#define __KK_HISTORY_DB_H__
typedef enum{
DB_SENSOR_DEVICECODE = 0,
DB_SENSOR_IDENTIFIER,
DB_SENSOR_VALUE,
DB_SENSOR_RECORDTIME,
};
typedef enum{
DB_OUTLET_DEVICECODE = 0,
DB_OUTLET_POWER,
DB_OUTLET_METERING,
DB_OUTLET_RECORDTIME,
};
#endif
...@@ -8,7 +8,6 @@ CFLAGS += -I$(TOP_DIR)/common/nanomsg/include ...@@ -8,7 +8,6 @@ CFLAGS += -I$(TOP_DIR)/common/nanomsg/include
CFLAGS += -I$(TOP_DIR)/common/ev/include CFLAGS += -I$(TOP_DIR)/common/ev/include
CFLAGS += -I$(TOP_DIR)/common/api CFLAGS += -I$(TOP_DIR)/common/api
CFLAGS += -I$(TOP_DIR)/common/sqlite CFLAGS += -I$(TOP_DIR)/common/sqlite
CFLAGS += -I$(TOP_DIR)/common/zlog
CFLAGS += -I$(TOP_DIR)/src/tsl/tsl_handle CFLAGS += -I$(TOP_DIR)/src/tsl/tsl_handle
LDFLAGS += -lapi_com -liot_cjson -lkk_tsl LDFLAGS += -lapi_com -liot_cjson -lkk_tsl
LDFLAGS += -lm -lkk_hal LDFLAGS += -lm -lkk_hal
......
...@@ -87,17 +87,19 @@ static int _kk_filter_to_plat(const char* msgtype) ...@@ -87,17 +87,19 @@ static int _kk_filter_to_plat(const char* msgtype)
*其他说明: *其他说明:
*************************************************************/ *************************************************************/
void kk_sendData2gw(void* data, int len, char* chalMark){ void kk_sendData2gw(void* data, int len, char* chalMark){
if (chalMark== NULL || strlen(chalMark) == 0){ int newLen = 0;
if (data == NULL || chalMark== NULL || strlen(chalMark) == 0){
ERROR_PRINT(" chalMark is null"); ERROR_PRINT(" chalMark is null");
return; return;
} }
INFO_PRINT("start to send data to gw!!!\n"); cJSON_Minify((char*)data);
INFO_PRINT("data:%s!!!\n",data); newLen = strlen(data);
INFO_PRINT("start to send data to gw:%s!!!\n",data);
if (kk_is_tcp_channel(chalMark) > -1){ if (kk_is_tcp_channel(chalMark) > -1){
kk_tcp_channel_ser_send(data, len, chalMark); kk_tcp_channel_ser_send(data, newLen, chalMark);
}else{ }else{
kk_ipc_send_ex(IPC_MID2PLAT, data, len + 1, chalMark); kk_ipc_send_ex(IPC_MID2PLAT, data, newLen + 1, chalMark);
} }
} }
...@@ -340,6 +342,7 @@ void mid2p_cb(void* data, int len, char* chalMark){ ...@@ -340,6 +342,7 @@ void mid2p_cb(void* data, int len, char* chalMark){
if (res != SUCCESS_RETURN) { if (res != SUCCESS_RETURN) {
free(queue_msg); free(queue_msg);
free(buf); free(buf);
buf = NULL;
return ; return ;
} }
...@@ -462,6 +465,15 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -462,6 +465,15 @@ void kk_platMsg_handle(void* data, char* chalMark){
/*如果是离线状态,上报在线给云端*/ /*如果是离线状态,上报在线给云端*/
dm_mgr_set_dev_onoffline(search_node,0); dm_mgr_set_dev_onoffline(search_node,0);
} }
/*插座类设备保存功率历史记录*/
if(strcmp(search_node->productType ,"outlet") == 0){
cJSON *power = cJSON_GetObjectItem(jsonPay,"Power");
if(power != NULL){
char buf[16] = {0};
sprintf(buf,"%f",power->valuedouble);
kk_history_insert_Outlet_info(info_dcode->valuestring,buf,"",HAL_GetTime());
}
}
kk_tsl_property_set_by_shadow(search_node->dev_shadow, outstr, strlen(outstr)+1); kk_tsl_property_set_by_shadow(search_node->dev_shadow, outstr, strlen(outstr)+1);
dm_msg_thing_property_post_by_identify(info_dcode->valuestring,jsonPay); dm_msg_thing_property_post_by_identify(info_dcode->valuestring,jsonPay);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay); kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
...@@ -480,7 +492,9 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -480,7 +492,9 @@ void kk_platMsg_handle(void* data, char* chalMark){
int idx = 0; int idx = 0;
kk_tsl_event_t *eventItem =NULL; kk_tsl_event_t *eventItem =NULL;
char tmpStr[128] = {0}; char tmpStr[128] = {0};
char valueBuf[32] = {0};
cJSON * itemStr = NULL; cJSON * itemStr = NULL;
int sensorDev = 0;
jsonPay = cJSON_GetObjectItem(payload, MSG_PARAMS_STR); jsonPay = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
if(jsonPay == NULL) goto error; if(jsonPay == NULL) goto error;
res = dm_mgr_get_device_by_devicecode(info_dcode->valuestring,&node); res = dm_mgr_get_device_by_devicecode(info_dcode->valuestring,&node);
...@@ -491,6 +505,10 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -491,6 +505,10 @@ void kk_platMsg_handle(void* data, char* chalMark){
/*如果是离线状态,上报在线给云端*/ /*如果是离线状态,上报在线给云端*/
dm_mgr_set_dev_onoffline(node,0); dm_mgr_set_dev_onoffline(node,0);
} }
/*如果是传感器类设备,事件上报的同时需要记录数据到数据库*/
if(strcmp(node->productType ,"sensor") == 0){
sensorDev = 1;
}
INFO_PRINT("kk_platMsg_handle event post enters \n"); INFO_PRINT("kk_platMsg_handle event post enters \n");
for(idx = 0; idx < node->dev_shadow->event_number; idx++){ for(idx = 0; idx < node->dev_shadow->event_number; idx++){
eventItem = node->dev_shadow->events + idx; eventItem = node->dev_shadow->events + idx;
...@@ -502,6 +520,7 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -502,6 +520,7 @@ void kk_platMsg_handle(void* data, char* chalMark){
for(index = 0; index < eventItem->output_data_number;index++){ for(index = 0; index < eventItem->output_data_number;index++){
itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier); itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier);
itemData = eventItem->output_datas + index; itemData = eventItem->output_datas + index;
#if 0
if(itemStr != NULL){ if(itemStr != NULL){
memset(tmpStr,0x0,sizeof(tmpStr)); memset(tmpStr,0x0,sizeof(tmpStr));
...@@ -509,22 +528,30 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -509,22 +528,30 @@ void kk_platMsg_handle(void* data, char* chalMark){
if(itemData->data_value.type == KK_TSL_DATA_TYPE_INT|| if(itemData->data_value.type == KK_TSL_DATA_TYPE_INT||
itemData->data_value.type == KK_TSL_DATA_TYPE_ENUM|| itemData->data_value.type == KK_TSL_DATA_TYPE_ENUM||
itemData->data_value.type == KK_TSL_DATA_TYPE_BOOL){ itemData->data_value.type == KK_TSL_DATA_TYPE_BOOL){
sprintf(valueBuf,"%d",itemStr->valueint);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemStr->valueint,NULL); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemStr->valueint,NULL);
} }
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_FLOAT || else if(itemData->data_value.type == KK_TSL_DATA_TYPE_FLOAT ||
itemData->data_value.type == KK_TSL_DATA_TYPE_DOUBLE){ itemData->data_value.type == KK_TSL_DATA_TYPE_DOUBLE){
sprintf(valueBuf,"%f",itemStr->valuedouble);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemStr->valuedouble,NULL); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemStr->valuedouble,NULL);
} }
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT || else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT ||
itemData->data_value.type == KK_TSL_DATA_TYPE_DATE){ itemData->data_value.type == KK_TSL_DATA_TYPE_DATE){
sprintf(valueBuf,"%s",itemStr->valuestring);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,NULL,itemStr->valuestring); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,NULL,itemStr->valuestring);
} }
INFO_PRINT("kk_platMsg_handle data: event post\n"); INFO_PRINT("kk_platMsg_handle data: event post\n");
if(sensorDev){
kk_history_insert_sensor_info(info_dcode->valuestring,eventItem->identifier,valueBuf,HAL_GetTime());
}
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier); dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay); kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
} }
else{ else
#endif
cJSON * itemDataIdentifier = cJSON_GetObjectItem(jsonPay, itemData->identifier); cJSON * itemDataIdentifier = cJSON_GetObjectItem(jsonPay, itemData->identifier);
if(itemDataIdentifier != NULL){ if(itemDataIdentifier != NULL){
memset(tmpStr,0x0,sizeof(tmpStr)); memset(tmpStr,0x0,sizeof(tmpStr));
...@@ -532,30 +559,39 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -532,30 +559,39 @@ void kk_platMsg_handle(void* data, char* chalMark){
if(itemData->data_value.type == KK_TSL_DATA_TYPE_INT|| if(itemData->data_value.type == KK_TSL_DATA_TYPE_INT||
itemData->data_value.type == KK_TSL_DATA_TYPE_ENUM|| itemData->data_value.type == KK_TSL_DATA_TYPE_ENUM||
itemData->data_value.type == KK_TSL_DATA_TYPE_BOOL){ itemData->data_value.type == KK_TSL_DATA_TYPE_BOOL){
sprintf(valueBuf,"%d",itemDataIdentifier->valueint);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemDataIdentifier->valueint,NULL); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemDataIdentifier->valueint,NULL);
} }
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_FLOAT || else if(itemData->data_value.type == KK_TSL_DATA_TYPE_FLOAT ||
itemData->data_value.type == KK_TSL_DATA_TYPE_DOUBLE){ itemData->data_value.type == KK_TSL_DATA_TYPE_DOUBLE){
sprintf(valueBuf,"%f",itemDataIdentifier->valuedouble);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemDataIdentifier->valuedouble,NULL); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,&itemDataIdentifier->valuedouble,NULL);
} }
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT || else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT ||
itemData->data_value.type == KK_TSL_DATA_TYPE_DATE){ itemData->data_value.type == KK_TSL_DATA_TYPE_DATE){
sprintf(valueBuf,"%s",itemDataIdentifier->valuestring);
kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,NULL,itemDataIdentifier->valuestring); kk_tsl_set_value(kk_tsl_set_event_output_value,node->dev_shadow,tmpStr,NULL,itemDataIdentifier->valuestring);
} }
if(sensorDev){
kk_history_insert_sensor_info(info_dcode->valuestring,eventItem->identifier,valueBuf,HAL_GetTime());
}
INFO_PRINT("kk_platMsg_handle data: event post\n"); INFO_PRINT("kk_platMsg_handle data: event post\n");
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier); dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay); kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
} }
} }
}
} }
else if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 && else if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 &&
eventItem->output_data_number == 0){ eventItem->output_data_number == 0){
itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier); itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier);
if(itemStr != NULL){ if(itemStr != NULL){
if(sensorDev){
kk_history_insert_sensor_info(info_dcode->valuestring,eventItem->identifier,"",HAL_GetTime());
}
//kk_tsl_set_value(kk_tsl_set_event_output_value,dev_shadow,eventItem->identifier,&itemStr->valueint,NULL); //kk_tsl_set_value(kk_tsl_set_event_output_value,dev_shadow,eventItem->identifier,&itemStr->valueint,NULL);
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier); dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier);
} }
...@@ -989,10 +1025,9 @@ int main(const int argc, const char **argv) ...@@ -989,10 +1025,9 @@ int main(const int argc, const char **argv)
kk_init_dmproc(); kk_init_dmproc();
kk_heartbeat_init(); kk_heartbeat_init();
kk_subDb_init(); kk_subDb_init();
kk_area_init(); kk_area_init();
kk_history_db_init();
kk_scene_init(); kk_scene_init();
g_timezone = HAL_Get_TimeZone(); g_timezone = HAL_Get_TimeZone();
mid_ctx->g_mid_dispatch_thread_running = 1; mid_ctx->g_mid_dispatch_thread_running = 1;
res = pthread_create(&mid_ctx->g_mid_dispatch_thread, NULL, mid_dispatch_yield, NULL); res = pthread_create(&mid_ctx->g_mid_dispatch_thread, NULL, mid_dispatch_yield, NULL);
......
...@@ -32,7 +32,7 @@ static int kk_scene_parse_repeatday(cJSON *repeatday); ...@@ -32,7 +32,7 @@ static int kk_scene_parse_repeatday(cJSON *repeatday);
static kk_scene_action_delay_t *p_delay_action_list = NULL; static kk_scene_action_delay_t *p_delay_action_list = NULL;
static kk_scene_embed_delay_t *p_delay_embed_list = NULL; static kk_scene_embed_delay_t *p_delay_embed_list = NULL;
static kk_scene_timer_list_t *p_scene_timer_list = NULL; static kk_scene_timer_list_t *p_scene_timer_list = NULL;
extern uint64_t s_start_time; extern time_t s_start_time;
static kk_scene_action_t *p_kk_scene_action = NULL; static kk_scene_action_t *p_kk_scene_action = NULL;
static kk_scene_ctx_t s_kk_scene_ctx = {NULL}; static kk_scene_ctx_t s_kk_scene_ctx = {NULL};
int kk_scene_check_trigger_condition(const char *sceneId); int kk_scene_check_trigger_condition(const char *sceneId);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment