Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
k-sdk
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈伟灿
k-sdk
Commits
5ea5d162
Commit
5ea5d162
authored
Nov 19, 2020
by
陈伟灿
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'cwc' into 'master'
【修改内容】增加历史数据的记录支持 See merge request chenweican/k-sdk!72
parents
ddef1c32
f248754e
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
585 additions
and
65 deletions
+585
-65
application/kcloud/kcloud_data_handle.c
application/kcloud/kcloud_data_handle.c
+105
-3
common/api/com_api.c
common/api/com_api.c
+13
-14
midware/midware/dm/kk_dm_heartbeat.c
midware/midware/dm/kk_dm_heartbeat.c
+52
-4
midware/midware/dm/kk_property_db.c
midware/midware/dm/kk_property_db.c
+107
-32
midware/midware/history/kk_history_db.c
midware/midware/history/kk_history_db.c
+244
-0
midware/midware/history/kk_history_db.h
midware/midware/history/kk_history_db.h
+18
-0
midware/midware/iot.mk
midware/midware/iot.mk
+0
-1
midware/midware/midware.c
midware/midware/midware.c
+45
-10
midware/midware/scene/kk_scene_handle.c
midware/midware/scene/kk_scene_handle.c
+1
-1
No files found.
application/kcloud/kcloud_data_handle.c
View file @
5ea5d162
/************************************************************
*版权所有 (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
))
...
...
common/api/com_api.c
View file @
5ea5d162
...
@@ -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
);
}
}
...
...
midware/midware/dm/kk_dm_heartbeat.c
View file @
5ea5d162
/************************************************************
*版权所有 (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
;
...
...
midware/midware/dm/kk_property_db.c
View file @
5ea5d162
/************************************************************
*版权所有 (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
;
...
...
midware/midware/history/kk_history_db.c
0 → 100644
View file @
5ea5d162
/************************************************************
*版权所有 (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
;
}
midware/midware/history/kk_history_db.h
0 → 100644
View file @
5ea5d162
#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
midware/midware/iot.mk
View file @
5ea5d162
...
@@ -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
...
...
midware/midware/midware.c
View file @
5ea5d162
...
@@ -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
,
l
en
,
chalMark
);
kk_tcp_channel_ser_send
(
data
,
newL
en
,
chalMark
);
}
else
{
}
else
{
kk_ipc_send_ex
(
IPC_MID2PLAT
,
data
,
l
en
+
1
,
chalMark
);
kk_ipc_send_ex
(
IPC_MID2PLAT
,
data
,
newL
en
+
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
);
...
...
midware/midware/scene/kk_scene_handle.c
View file @
5ea5d162
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment