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 <stdlib.h>
#include <string.h>
......@@ -44,9 +57,16 @@ const char DM_MSG_TO_MIDDWARE[] = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\"
static char *s_split_product[] = {
"85", //三路面板
"97", //双路面板
"3003" //三路面板
"98" //三路面板
};
/************************************************************
*功能描述:灯控面板需要分开上报属性
*输入参数: info:所上报数据
*输出参数: 无
*返 回 值: 1:需要拆分;0:不需要
*其他说明:
*************************************************************/
static int kk_check_need_split(cJSON * info)
{
//return 0;//暂时不用拆分处理
......@@ -71,6 +91,15 @@ static int kk_check_need_split(cJSON * info)
return 0;
#endif
}
/************************************************************
*功能描述:灯控面板拆分具体的属性并逐个上报
*输入参数: pData:所上报数据
topic:主题
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_split_send_data(cJSON *pData,const char* topic)
{
cJSON *pParam = NULL;
......@@ -122,6 +151,13 @@ static int kk_split_send_data(cJSON *pData,const char* topic)
return RETURN_SUCCESS;
}
/************************************************************
*功能描述:上报数据给云端
*输入参数: root:所上报数据
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int _kk_sendto_cloud(cJSON *root)
{
cJSON *info,*pData;
......@@ -193,6 +229,14 @@ int _kk_sendto_cloud(cJSON *root)
return RETURN_SUCCESS;
}
/************************************************************
*功能描述:获取midware上报的数据
*输入参数: str:所上报数据
len:数据长度
*输出参数: 无
*返 回 值: 无
*其他说明:
*************************************************************/
void KK_Data_FromDev(void* str,int len)
{
......@@ -215,6 +259,14 @@ void KK_Data_FromDev(void* str,int len)
cJSON_Delete(root);
}
/************************************************************
*功能描述:无效主题过滤
*输入参数: topic:主题
*输出参数: 无
*返 回 值: 1:过滤;0:不过滤
*其他说明:
*************************************************************/
static int _check_invalid_topic(const char* topic)
{
if(strstr(topic, KK_FILTER_TOPO_TOPIC) != NULL && \
......@@ -252,7 +304,14 @@ static int _check_invalid_topic(const char* topic)
}
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)
{
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
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,
_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,
return RETURN_SUCCESS;
}
/************************************************************
*功能描述:topo change消息处理
*输入参数: payload:具体数据
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:此接口主要手机端主动删除设备时调用
*************************************************************/
static int _kk_topo_change_handle(cJSON *payload)
{
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
......@@ -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)
{
cJSON *root;
......@@ -372,11 +457,19 @@ static char * _kk_data_create(const char *topic,const char *data)
cJSON_Delete(root);
free(msgStr);
free(infoStr);
INFO_PRINT("[%s][%d]%s\n",__FUNCTION__,__LINE__,out);
INFO_PRINT("[out]%s\n",out);
return out;
//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\"}";
int KK_Send_CloudState(int state)
{
......@@ -419,6 +512,15 @@ int KK_Send_CloudState(int state)
free(out);
return RETURN_SUCCESS;
}
/************************************************************
*功能描述:发送数据给Midware
*输入参数: topic:主题;
data:具体数据
*输出参数: 无
*返 回 值: 无
*其他说明:
*************************************************************/
void KK_Sendto_DevData(const char *topic,const char *data)
{
if(_check_invalid_topic(topic))
......
......@@ -66,18 +66,27 @@ static void watcher_cb (struct ev_loop *loop ,struct ev_io *w, int revents)
uint8_t *chlMark = NULL;
uint32_t bytes =0;
uint32_t validLen =0;
char *dat_bak = NULL;
if (loop_ctrl->type == IPC_PLAT2MID){
bytes = nn_recv(loop_ctrl->ab.n, &dat, NN_MSG, NN_DONTWAIT);
}else{
bytes = nn_recv(loop_ctrl->ba.n, &dat, NN_MSG, NN_DONTWAIT);
}
if (bytes <= 0 || dat == NULL) {
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(" 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 ()));
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;
//if sub, need filter sbuscribe str
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)
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_ACK, strlen(MAGIC_ACK)) == 0){
......@@ -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){//
loop_ctrl->isconnect =0;
}
if (loop_ctrl->cb != NULL){
loop_ctrl->cb((void *)validDat, validLen, chlMark);
}
......
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_dm_heartbeat.c
*内容摘要: 设备心跳处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <string.h>
#include <stdlib.h>
#include "klist.h"
......@@ -6,6 +20,10 @@
#include "kk_dm_mng.h"
/*************************************************************
全局变量定义
*************************************************************/
typedef struct {
void *mutex;
......@@ -20,8 +38,13 @@ typedef struct {
char deviceCode[DEVICE_CODE_MAXLEN];
struct list_head linked_list;
} 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 *_kk_heartbeat_get_ctx(void)
{
return &s_kk_heartbeat_ctx;
......@@ -41,8 +64,14 @@ static void _kk_heartbeat_unlock(void)
HAL_MutexUnlock(ctx->mutex);
}
}
uint64_t s_start_time = 0;
/************************************************************
*功能描述: 心跳处理主任务
*输入参数: args:传入参数,暂未使用
*输出参数: 无
*返 回 值:
*其他说明:
*************************************************************/
void *kk_heartbeat_yield(void *args)
{
kk_heartbeat_ctx_t *ctx = _kk_heartbeat_get_ctx();
......@@ -95,7 +124,13 @@ void *kk_heartbeat_yield(void *args)
}
return NULL;
}
/************************************************************
*功能描述: 心跳模块初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_heartbeat_init(void)
{
int res = 0;
......@@ -122,7 +157,13 @@ int kk_heartbeat_init(void)
// INIT_LIST_HEAD(&ctx->dev_list);
}
/************************************************************
*功能描述: 上电把需要查询状态的网关加入队列,load设备的时候调用此函数
*输入参数: deviceCode:网关deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_dm_gw_status_check_push(const char *deviceCode)
{
kk_gw_status_ctx_t *gw = NULL;
......@@ -148,6 +189,13 @@ int kk_dm_gw_status_check_push(const char *deviceCode)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 收到网关反馈后更新网关在线标记,收到网关消息后调用此函数
*输入参数: deviceCode:网关deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_dm_gw_status_update_online(const char *deviceCode)
{
kk_gw_status_ctx_t *gw = NULL;
......
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_property_db.c
*内容摘要: 设备属性数据表处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <stdio.h>
#include "kk_tsl_api.h"
#include "sqlite3.h"
......@@ -5,6 +19,10 @@
#include "kk_dm_mng.h"
#include "kk_property_db.h"
/*************************************************************
全局变量定义
*************************************************************/
extern sqlite3 *g_kk_pDb;
typedef struct {
void *mutex;
......@@ -52,6 +70,14 @@ static void _kk_property_db_unlock(void)
HAL_MutexUnlock(ctx->mutex);
}
}
/************************************************************
*功能描述: 属性数据表初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_property_db_Init(void)
{
kk_property_db_ctx_t *ctx = _kk_property_db_get_ctx();
......@@ -107,6 +133,14 @@ static int kk_property_db_Init(void)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 属性模块初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_init(void)
{
int res = 0;
......@@ -126,6 +160,14 @@ int kk_property_db_init(void)
//_kk_load_subDevice();
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: check属性是否重复
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: 无
*返 回 值: 1:已经存在;0:不存在
*其他说明:
*************************************************************/
static int _kk_check_property_exist(const char* deviceCode,const char* identifier)
{
int isExist = 0;
......@@ -151,6 +193,16 @@ static int _kk_check_property_exist(const char* deviceCode,const char* identifie
_kk_property_db_unlock();
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)
{
......@@ -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)
{
//WARNING_PRINT("[%s][%d] DATA ALREADY EXIST!!!\n",__FUNCTION__,__LINE__);
return SUCCESS_RETURN;
}
_kk_property_db_lock();
......@@ -181,6 +232,15 @@ int kk_property_db_insert(const char *deviceCode,const char *identifier,kk_tsl_d
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 更新属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
value:属性值
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_update_value(const char *deviceCode,const char *identifier,const char* value)
{
char *sqlCmd = NULL;
......@@ -205,6 +265,14 @@ int kk_property_db_update_value(const char *deviceCode,const char *identifier,co
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 获取属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: value:属性值,返回的是字串
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_get_value_directly(const char *deviceCode,const char *identifier,char* value)
{
char *sqlCmd = NULL;
......@@ -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);
while(sqlite3_step(stmt) == SQLITE_ROW){
valueStr = sqlite3_column_text(stmt, DB_VALUE);
printf("valueStr:%s\n",valueStr);
memcpy(value,valueStr, strlen(valueStr));
printf("value:%s\n",value);
}
sqlite3_free(sqlCmd);
_kk_property_db_unlock();
......@@ -229,7 +295,14 @@ int kk_property_db_get_value_directly(const char *deviceCode,const char *identif
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 获取属性值
*输入参数: deviceCode:设备deviceCode
identifier:属性名称
*输出参数: value:属性值,根据物模型中数据类型返回对应的类型
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_get_value(const char *deviceCode,const char *identifier,void* value)
{
char *sqlCmd = NULL;
......@@ -243,7 +316,6 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void*
_kk_property_db_lock();
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);
......@@ -277,6 +349,15 @@ int kk_property_db_get_value(const char *deviceCode,const char *identifier,void*
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)
{
char *sqlCmd = NULL;
......@@ -293,7 +374,6 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro
_kk_property_db_lock();
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);
......@@ -315,7 +395,13 @@ int kk_property_db_get_rawdata(const char *identifier,const int dev_type, kk_pro
return SUCCESS_RETURN;
}
/************************************************************
*功能描述: 更新设备下所有的属性值
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_db_update(const char *deviceCode)
{
int res = 0;
......@@ -361,7 +447,13 @@ int kk_property_db_update(const char *deviceCode)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:同步数据库里的数据到内存中,开机调用
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_sync_values(const char *deviceCode)
{
char *sqlCmd = NULL;
......@@ -423,6 +515,13 @@ int kk_property_sync_values(const char *deviceCode)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:通过deviceCode删除设备属性
*输入参数: deviceCode:设备deviceCode
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN])
{
const char *deleteCmd = "delete from PropertiesInfo where deviceCode = '%s';";
......@@ -447,30 +546,6 @@ int kk_property_delete_by_dcode(char deviceCode[DEVICE_CODE_MAXLEN])
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)
{
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
CFLAGS += -I$(TOP_DIR)/common/ev/include
CFLAGS += -I$(TOP_DIR)/common/api
CFLAGS += -I$(TOP_DIR)/common/sqlite
CFLAGS += -I$(TOP_DIR)/common/zlog
CFLAGS += -I$(TOP_DIR)/src/tsl/tsl_handle
LDFLAGS += -lapi_com -liot_cjson -lkk_tsl
LDFLAGS += -lm -lkk_hal
......
......@@ -87,17 +87,19 @@ static int _kk_filter_to_plat(const char* msgtype)
*其他说明:
*************************************************************/
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");
return;
}
INFO_PRINT("start to send data to gw!!!\n");
INFO_PRINT("data:%s!!!\n",data);
cJSON_Minify((char*)data);
newLen = strlen(data);
INFO_PRINT("start to send data to gw:%s!!!\n",data);
if (kk_is_tcp_channel(chalMark) > -1){
kk_tcp_channel_ser_send(data, len, chalMark);
kk_tcp_channel_ser_send(data, newLen, chalMark);
}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){
if (res != SUCCESS_RETURN) {
free(queue_msg);
free(buf);
buf = NULL;
return ;
}
......@@ -462,6 +465,15 @@ void kk_platMsg_handle(void* data, char* chalMark){
/*如果是离线状态,上报在线给云端*/
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);
dm_msg_thing_property_post_by_identify(info_dcode->valuestring,jsonPay);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
......@@ -480,7 +492,9 @@ void kk_platMsg_handle(void* data, char* chalMark){
int idx = 0;
kk_tsl_event_t *eventItem =NULL;
char tmpStr[128] = {0};
char valueBuf[32] = {0};
cJSON * itemStr = NULL;
int sensorDev = 0;
jsonPay = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
if(jsonPay == NULL) goto error;
res = dm_mgr_get_device_by_devicecode(info_dcode->valuestring,&node);
......@@ -491,6 +505,10 @@ void kk_platMsg_handle(void* data, char* chalMark){
/*如果是离线状态,上报在线给云端*/
dm_mgr_set_dev_onoffline(node,0);
}
/*如果是传感器类设备,事件上报的同时需要记录数据到数据库*/
if(strcmp(node->productType ,"sensor") == 0){
sensorDev = 1;
}
INFO_PRINT("kk_platMsg_handle event post enters \n");
for(idx = 0; idx < node->dev_shadow->event_number; idx++){
eventItem = node->dev_shadow->events + idx;
......@@ -502,6 +520,7 @@ void kk_platMsg_handle(void* data, char* chalMark){
for(index = 0; index < eventItem->output_data_number;index++){
itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier);
itemData = eventItem->output_datas + index;
#if 0
if(itemStr != NULL){
memset(tmpStr,0x0,sizeof(tmpStr));
......@@ -509,22 +528,30 @@ void kk_platMsg_handle(void* data, char* chalMark){
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_BOOL){
sprintf(valueBuf,"%d",itemStr->valueint);
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 ||
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);
}
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT ||
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);
}
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);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
else{
else
#endif
cJSON * itemDataIdentifier = cJSON_GetObjectItem(jsonPay, itemData->identifier);
if(itemDataIdentifier != NULL){
memset(tmpStr,0x0,sizeof(tmpStr));
......@@ -532,30 +559,39 @@ void kk_platMsg_handle(void* data, char* chalMark){
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_BOOL){
sprintf(valueBuf,"%d",itemDataIdentifier->valueint);
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 ||
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);
}
else if(itemData->data_value.type == KK_TSL_DATA_TYPE_TEXT ||
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);
}
if(sensorDev){
kk_history_insert_sensor_info(info_dcode->valuestring,eventItem->identifier,valueBuf,HAL_GetTime());
}
INFO_PRINT("kk_platMsg_handle data: event post\n");
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
}
}
}
else if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 &&
eventItem->output_data_number == 0){
itemStr = cJSON_GetObjectItem(jsonPay, eventItem->identifier);
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);
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier);
}
......@@ -989,10 +1025,9 @@ int main(const int argc, const char **argv)
kk_init_dmproc();
kk_heartbeat_init();
kk_subDb_init();
kk_area_init();
kk_history_db_init();
kk_scene_init();
g_timezone = HAL_Get_TimeZone();
mid_ctx->g_mid_dispatch_thread_running = 1;
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);
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_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_ctx_t s_kk_scene_ctx = {NULL};
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