Commit 23b72caf authored by chen.weican's avatar chen.weican

【修改内容】增加窗帘绑定功能

【提交人】陈伟灿
parent 4ed8fa53
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "kk_scene_handle.h" #include "kk_scene_handle.h"
#include "kk_area_handle.h" #include "kk_area_handle.h"
#include "kk_sync_data.h" #include "kk_sync_data.h"
#include "kk_motor_bind_db.h"
//const char DM_URI_SYS_PREFIX[] DM_READ_ONLY = "/sys/%s/%s/"; //const char DM_URI_SYS_PREFIX[] DM_READ_ONLY = "/sys/%s/%s/";
...@@ -1715,6 +1716,12 @@ int dm_mgr_subdev_delete(_IN_ char deviceCode[DEVICE_CODE_MAXLEN]) ...@@ -1715,6 +1716,12 @@ int dm_mgr_subdev_delete(_IN_ char deviceCode[DEVICE_CODE_MAXLEN])
kk_scene_deleteall_panel_scene_info(deviceCode);//如果是情景面板,删除对应信息 kk_scene_deleteall_panel_scene_info(deviceCode);//如果是情景面板,删除对应信息
/*房间信息中删除对应的设备*/ /*房间信息中删除对应的设备*/
kk_room_dev_remove(deviceCode,NULL); kk_room_dev_remove(deviceCode,NULL);
res = kk_motor_bind_db_delete_by_deviceCode(deviceCode);
if (res != SUCCESS_RETURN) {
ERROR_PRINT("ERROR [%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
return FAIL_RETURN;
}
res = kk_subDev_delete_by_dcode(deviceCode);//delete sub db data res = kk_subDev_delete_by_dcode(deviceCode);//delete sub db data
if (res != SUCCESS_RETURN) { if (res != SUCCESS_RETURN) {
......
...@@ -565,7 +565,7 @@ int dm_msg_request (_IN_ dm_msg_request_t *request,_IN_ int isAsync) ...@@ -565,7 +565,7 @@ int dm_msg_request (_IN_ dm_msg_request_t *request,_IN_ int isAsync)
} }
payload_len = strlen(DM_MSG_REQUEST) + 10 + strlen(DM_MSG_VERSION) + request->params_len + strlen( payload_len = strlen(DM_MSG_REQUEST) + 10 + strlen(DM_MSG_VERSION) + request->params_len + strlen(
request->method) + 1 + 20 + strlen(request->msgid); request->method) + 1 + 50 + strlen(request->msgid);
payload = malloc(payload_len); payload = malloc(payload_len);
if (payload == NULL) { if (payload == NULL) {
return MEMORY_NOT_ENOUGH; return MEMORY_NOT_ENOUGH;
...@@ -1433,6 +1433,7 @@ int kk_msg_parse_productType(char *str,char *productType) ...@@ -1433,6 +1433,7 @@ int kk_msg_parse_productType(char *str,char *productType)
} }
int kk_msg_execute_scene_set(const char* params,const char *fatherDeviceCode,int isUpdate) int kk_msg_execute_scene_set(const char* params,const char *fatherDeviceCode,int isUpdate)
{ {
int res = 0; int res = 0;
......
...@@ -137,6 +137,14 @@ typedef struct { ...@@ -137,6 +137,14 @@ typedef struct {
#define KK_THING_SERVICE_CLIENTONLINEPUSH "/thing/service/clientOnlinePush" #define KK_THING_SERVICE_CLIENTONLINEPUSH "/thing/service/clientOnlinePush"
#define KK_THING_SERVICE_GETCLIENTINFO "/thing/service/getClientInfo" #define KK_THING_SERVICE_GETCLIENTINFO "/thing/service/getClientInfo"
#define KK_THING_SERVICE_GETCLIENTINFO_REPLY "/thing/service/getClientInfo_reply" #define KK_THING_SERVICE_GETCLIENTINFO_REPLY "/thing/service/getClientInfo_reply"
#define KK_THING_SERVICE_REBIND_MOTORS "/thing/service/rebindMotors"
#define KK_THING_SERVICE_REBIND_MOTORS_REPLY "/thing/service/rebindMotors_reply"
#define KK_THING_SERVICE_ADDBIND_MOTOR "/thing/service/addBindMotor"
#define KK_THING_SERVICE_ADDBIND_MOTOR_REPLY "/thing/service/addBindMotor_reply"
#define KK_THING_SERVICE_UNBIND_MOTORS "/thing/service/unBindMotors"
#define KK_THING_SERVICE_UNBIND_MOTORS_REPLY "/thing/service/unBindMotors_reply"
#define KK_THING_SERVICE_QUERY_BIND_MOTORS "/thing/service/queryBindMotors"
#define KK_THING_SERVICE_QUERY_BIND_MOTORS_REPLY "/thing/service/queryBindMotors_reply"
void kk_sendData2app(void *info, void *payload,int isAsync); void kk_sendData2app(void *info, void *payload,int isAsync);
int dm_msg_thing_sub_register(_IN_ char productCode[DEVICE_CODE_MAXLEN], _IN_ char deviceCode[DEVICE_CODE_MAXLEN], int dm_msg_thing_sub_register(_IN_ char productCode[DEVICE_CODE_MAXLEN], _IN_ char deviceCode[DEVICE_CODE_MAXLEN],
......
...@@ -497,7 +497,7 @@ static int kk_service_addRoom_handle(const char *deviceCode, cJSON *params,cJSON ...@@ -497,7 +497,7 @@ static int kk_service_addRoom_handle(const char *deviceCode, cJSON *params,cJSON
} }
return SUCCESS_RETURN; return SUCCESS_RETURN;
} }
static int kk_service_common_reply(cJSON *param,cJSON *msgId,char *msgType) int kk_service_common_reply(cJSON *param,cJSON *msgId,char *msgType)
{ {
int res = 0; int res = 0;
int i = 0,num = 0; int i = 0,num = 0;
...@@ -535,6 +535,45 @@ static int kk_service_common_reply(cJSON *param,cJSON *msgId,char *msgType) ...@@ -535,6 +535,45 @@ static int kk_service_common_reply(cJSON *param,cJSON *msgId,char *msgType)
cJSON_Delete(info); cJSON_Delete(info);
return res; return res;
} }
int kk_service_common_reply_ex(cJSON *param,cJSON *msgId,char *msgType,cJSON *Item)
{
int res = 0;
int i = 0,num = 0;
SensorType_t *pList = NULL;
if(param == NULL || msgId == NULL){
return INVALID_PARAMETER;
}
cJSON *deviceCode = cJSON_GetObjectItem(param, MSG_DEVICE_CODE_STR);
if(deviceCode == NULL){
return FAIL_RETURN;
}
cJSON *productCode = cJSON_GetObjectItem(param, MSG_PRODUCT_CODE_STR);
if(productCode == NULL){
return FAIL_RETURN;
}
cJSON *info = cJSON_CreateObject();
cJSON_AddStringToObject(info, MSG_TYPE_STR, msgType);
cJSON_AddStringToObject(info, MSG_DEVICE_CODE_STR, deviceCode->valuestring);
cJSON_AddStringToObject(info, MSG_PRODUCT_CODE_STR, productCode->valuestring);
char *infff=cJSON_Print(info);
cJSON *payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "desc", "success");
cJSON_AddStringToObject(payload, "version", "1.0");
cJSON_AddStringToObject(payload, "code", "0");
cJSON_AddStringToObject(payload, "msgId", msgId->valuestring);
cJSON_AddItemToObject(payload, "params", Item);
char *payload11=cJSON_Print(payload);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
cJSON_Delete(payload);
cJSON_Delete(info);
return res;
}
/************************************************************ /************************************************************
*功能描述:更新房间处理函数 *功能描述:更新房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含房间名称 *输入参数:params:云端传下来JSON数据,主要包含房间名称
......
...@@ -12,4 +12,7 @@ void IOT_Linkkit_Yield(int timeout_ms); ...@@ -12,4 +12,7 @@ void IOT_Linkkit_Yield(int timeout_ms);
int IOT_Linkkit_Close(int devid); int IOT_Linkkit_Close(int devid);
int kk_mid_subdev_add(int devType, char productCode[PRODUCT_CODE_MAXLEN], char deviceCode[DEVICE_CODE_MAXLEN],char mac[DEVICE_MAC_MAXLEN],char fatherDeviceCode[DEVICE_CODE_MAXLEN],char version[32]); int kk_mid_subdev_add(int devType, char productCode[PRODUCT_CODE_MAXLEN], char deviceCode[DEVICE_CODE_MAXLEN],char mac[DEVICE_MAC_MAXLEN],char fatherDeviceCode[DEVICE_CODE_MAXLEN],char version[32]);
int kk_service_arming_set(char *state); int kk_service_arming_set(char *state);
int kk_service_common_reply(cJSON *param,cJSON *msgId,char *msgType);
int kk_service_common_reply_ex(cJSON *param,cJSON *msgId,char *msgType,cJSON *Item);
#endif #endif
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_history_db.c
*内容摘要:窗帘面板绑定窗帘电机模块
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
#include <stdio.h>
#include "kk_tsl_api.h"
#include "sqlite3.h"
#include "kk_log.h"
#include "kk_hal.h"
#include "kk_motor_bind_db.h"
#include "kk_dm_mng.h"
/*************************************************************
全局变量定义
*************************************************************/
extern sqlite3 *g_kk_pDb;
/*************************************************************
函数实现
*************************************************************/
typedef struct {
void *mutex;
sqlite3 *pDb;
} kk_motor_bind_ctx_t;
static kk_motor_bind_ctx_t s_kk_motor_bind_ctx = {NULL};
kk_motor_bind_ctx_t *_kk_motor_bind_get_ctx(void)
{
return &s_kk_motor_bind_ctx;
}
void _kk_motor_bind_lock(void)
{
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
if (ctx->mutex) {
HAL_MutexLock(ctx->mutex);
}
}
void _kk_motor_bind_unlock(void)
{
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
if (ctx->mutex) {
HAL_MutexUnlock(ctx->mutex);
}
}
/************************************************************
*功能描述: 历史记录数据库初始化
*输入参数: 无
*输出参数: 无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_motor_bind_db_init(void)
{
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
char *pcErr;
ctx->pDb = g_kk_pDb;
INFO_PRINT("kk_motor_bind db Database opened\n");
/* Create Mutex */
ctx->mutex = HAL_MutexCreate();
if (ctx->mutex == NULL) {
return FAIL_RETURN;
}
_kk_motor_bind_lock();
const char *pPanelBindMotor = "CREATE TABLE IF NOT EXISTS PanelBindMotor( \
panelDCode varchar(255), \
panelEpNum INTEGER, \
motorDCode varchar(255), \
motorEpNum INTEGER, \
dummyId INTEGER)";
if (sqlite3_exec(ctx->pDb, pPanelBindMotor, NULL, NULL, &pcErr) != SQLITE_OK)
{
ERROR_PRINT("Error creating table (%s)\n", pcErr);
sqlite3_free(pcErr);
//eUtils_LockUnlock(&sLock);
_kk_motor_bind_unlock();
return FAIL_RETURN;
}
_kk_motor_bind_unlock();
return SUCCESS_RETURN;
}
static int kk_motor_bind_db_check(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum)
{
int isExist = 0;
sqlite3_stmt *stmt;
const unsigned char *panelDeviceCode = NULL;
const unsigned char *motorDeviceCode = NULL;
int panel_ep = 0;
int motor_ep = 0;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
const char *searchCmd = "select * from PanelBindMotor;";
_kk_motor_bind_lock();
sqlite3_prepare_v2(ctx->pDb, searchCmd, strlen(searchCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
panelDeviceCode = sqlite3_column_text(stmt, MOTOR_BIND_DB_PANEL_DEVICECODE);
panel_ep = sqlite3_column_int(stmt, MOTOR_BIND_DB_PANEL_EP);
motorDeviceCode = sqlite3_column_text(stmt, MOTOR_BIND_DB_PANEL_DEVICECODE);
motor_ep = sqlite3_column_int(stmt, MOTOR_BIND_DB_MOTOR_EP);
if(!strcmp(panelDCode,(const char *)panelDeviceCode) &&
!strcmp(motorDCode,(const char *)motorDeviceCode) &&
panel_ep==panelEpNum &&motor_ep==motorEpNum)
{
isExist = 1;
break;
}
}
sqlite3_finalize(stmt);
_kk_motor_bind_unlock();
return isExist;
}
int kk_motor_bind_db_insert(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum,int dummyId)
{
int res = 0;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
char *sqlCmd = NULL;
char *zErrMsg = 0;
sqlite3_stmt *stmt;
time_t rtime = 0;
int count = 0;
const char *insertCmd = "insert into PanelBindMotor (panelDCode, panelEpNum,motorDCode,motorEpNum,dummyId) \
values ('%s','%d','%s','%d','%d');";
if(kk_motor_bind_db_check(panelDCode,panelEpNum,motorDCode,motorEpNum)){
INFO_PRINT("already exist.--->panelDCode:%s,panelEpNum:%d,motorDCode:%s,motorEpNum=%d\n",panelDCode,panelEpNum,motorDCode,motorEpNum);
return SUCCESS_RETURN;
}
INFO_PRINT("kk_motor_bind_db_insert,panelDCode:%s,panelEpNum:%d,motorDCode:%s,motorEpNum=%d,dummyId=%d\n",panelDCode,panelEpNum,motorDCode,motorEpNum,dummyId);
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(insertCmd,panelDCode,panelEpNum,motorDCode,motorEpNum,dummyId);
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_motor_bind_unlock();
return FAIL_RETURN;
}
sqlite3_free(sqlCmd);
_kk_motor_bind_unlock();
return SUCCESS_RETURN;
}
int kk_motor_bind_db_delete(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum)
{
const char *deleteCmd = "delete from PanelBindMotor where panelDCode = '%s' and panelEpNum = '%d' and motorDCode = '%s' and motorEpNum = '%d' ;";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,panelDCode,panelEpNum,motorDCode,motorEpNum);
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_motor_bind_unlock();
return SUCCESS_RETURN;
}
int kk_motor_bind_db_delete_ex(const char* panelDCode)
{
const char *deleteCmd = "delete from PanelBindMotor where panelDCode = '%s' ;";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,panelDCode);
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_motor_bind_unlock();
return SUCCESS_RETURN;
}
int kk_motor_bind_db_find(const char* panelDCode,int panelEpNum,struct kk_motor_bind_info* info,int max)
{
int listSize = 0;
sqlite3_stmt *stmt;
char *sqlCmd = NULL;
const unsigned char *motorDeviceCode = NULL;
int motor_ep = 0;
int dummyId = -1;
struct kk_motor_bind_info* pInfo = info;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
const char *searchCmd = "select * from PanelBindMotor where panelDCode = '%s' and panelEpNum = '%d' ;";
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(searchCmd,panelDCode,panelEpNum);
INFO_PRINT("Table searchCmd:%s\n",sqlCmd);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
motorDeviceCode = sqlite3_column_text(stmt, MOTOR_BIND_DB_MOTOR_DEVICECODE);
motor_ep = sqlite3_column_int(stmt, MOTOR_BIND_DB_MOTOR_EP);
dummyId = sqlite3_column_int(stmt, MOTOR_BIND_DB_DUMMYID);
memset((char*)pInfo,0,sizeof(*pInfo));
snprintf(pInfo->deviceCode,sizeof(*pInfo),"%s",motorDeviceCode);
pInfo->epNum = motor_ep;
pInfo->dummyId = dummyId;
INFO_PRINT("listSize=%d,motorDeviceCode=%s,motor_ep=%d,dummyId=%d\n",listSize,motorDeviceCode,motor_ep,dummyId);
if(++listSize>=max){
break;
}
pInfo++;
}
sqlite3_finalize(stmt);
_kk_motor_bind_unlock();
return listSize;
}
int kk_motor_bind_db_find_ex(int dummyId,struct kk_motor_bind_info* info,int max)
{
int listSize = 0;
sqlite3_stmt *stmt;
char *sqlCmd = NULL;
const unsigned char *motorDeviceCode = NULL;
int motor_ep = 0;
struct kk_motor_bind_info* pInfo = info;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
const char *searchCmd = "select * from PanelBindMotor where dummyId = '%d' ;";
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(searchCmd,dummyId);
INFO_PRINT("Table searchCmd:%s\n",sqlCmd);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
motorDeviceCode = sqlite3_column_text(stmt, MOTOR_BIND_DB_MOTOR_DEVICECODE);
motor_ep = sqlite3_column_int(stmt, MOTOR_BIND_DB_MOTOR_EP);
memset((char*)pInfo,0,sizeof(*pInfo));
snprintf(pInfo->deviceCode,sizeof(*pInfo),"%s",motorDeviceCode);
pInfo->epNum = motor_ep;
INFO_PRINT("listSize=%d,motorDeviceCode=%s,motor_ep=%d\n",listSize,motorDeviceCode,motor_ep);
if(++listSize>=max){
break;
}
pInfo++;
}
sqlite3_finalize(stmt);
_kk_motor_bind_unlock();
return listSize;
}
int kk_motor_bind_db_find_dummyId(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum)
{
sqlite3_stmt *stmt;
char *sqlCmd = NULL;
int dummyId = -1;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
const char *searchCmd = "select * from PanelBindMotor where panelDCode = '%s' and panelEpNum = '%d' and motorDCode = '%s' and motorEpNum = '%d' ";
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(searchCmd,panelDCode,panelEpNum,motorDCode,motorEpNum);
INFO_PRINT("Table searchCmd:%s\n",sqlCmd);
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
dummyId = sqlite3_column_int(stmt, MOTOR_BIND_DB_DUMMYID);
INFO_PRINT("dummyId=%d\n",dummyId);
}
sqlite3_finalize(stmt);
_kk_motor_bind_unlock();
return dummyId;
}
int kk_motor_bind_db_delete_by_deviceCode(const char* deviceCode)
{
const char *deleteCmd = "delete from PanelBindMotor where motorDCode = '%s' ;";
char *sqlCmd = NULL;
int rc = 0;
char *zErrMsg = 0;
kk_motor_bind_ctx_t *ctx = _kk_motor_bind_get_ctx();
_kk_motor_bind_lock();
sqlCmd = sqlite3_mprintf(deleteCmd,deviceCode);
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_motor_bind_unlock();
kk_motor_bind_db_delete_ex(deviceCode);
return SUCCESS_RETURN;
}
#ifndef __KK_MOTOR_BIND_DB_H__
#define __KK_MOTOR_BIND_DB_H__
#include "cJSON.h"
enum{
MOTOR_BIND_DB_PANEL_DEVICECODE = 0,
MOTOR_BIND_DB_PANEL_EP,
MOTOR_BIND_DB_MOTOR_DEVICECODE,
MOTOR_BIND_DB_MOTOR_EP,
MOTOR_BIND_DB_DUMMYID,
};
struct kk_motor_bind_info{
int epNum;
int dummyId;
char deviceCode[32];
};
int kk_motor_bind_db_init(void);
int kk_motor_bind_db_insert(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum,int dummyId);
int kk_motor_bind_db_delete(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum);
int kk_motor_bind_db_delete_ex(const char* panelDCode);
int kk_motor_bind_db_find(const char* panelDCode,int panelEpNum,struct kk_motor_bind_info* info,int max);
int kk_motor_bind_db_find_ex(int dummyId,struct kk_motor_bind_info* info,int max);
int kk_motor_bind_db_find_dummyId(const char* panelDCode,int panelEpNum,const char* motorDCode,int motorEpNum);
int kk_motor_bind_db_delete_by_deviceCode(const char* deviceCode);
#endif
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "ccu_ver.h" #include "ccu_ver.h"
#include "kk_area_handle.h" #include "kk_area_handle.h"
#include "kk_property_get_handle.h" #include "kk_property_get_handle.h"
#include "kk_motor_bind_db.h"
int g_timezone = 8; int g_timezone = 8;
char * g_filerToPlatTable[] = char * g_filerToPlatTable[] =
...@@ -452,6 +453,344 @@ static int kk_property_set_data_check(cJSON * payload,const char *deviceCode){ ...@@ -452,6 +453,344 @@ static int kk_property_set_data_check(cJSON * payload,const char *deviceCode){
} }
#define KK_MOTOR_BIND_INFO_MAX 6
#define KK_SERVICE_REBIND_MOTORS 0
#define KK_SERVICE_ADDBIND_MOTORS 1
#define KK_SERVICE_UNBIND_MOTORS 2
static int kk_panel_bind_motor_delete(const char* deviceCode,int dummyId)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
dm_mgr_dev_node_t *gw_node = NULL;
char msgId[MSG_MAX_LEN] = {0};
char sceneId[33] = {0};
char tm[33] = {0};
cJSON *root = cJSON_CreateObject();
cJSON *info = cJSON_CreateObject();
cJSON *payload = cJSON_CreateObject();
cJSON *paras = cJSON_CreateObject();
if(SUCCESS_RETURN!=dm_mgr_get_device_by_devicecode((char*)deviceCode,&node)){
return -1;
}
if(SUCCESS_RETURN!=dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node)){
return -1;
}
cJSON_AddStringToObject(info,"msgtype",KK_THING_SERVICE_DELETESCENC);
cJSON_AddStringToObject(info,"productCode",gw_node->productCode);
cJSON_AddStringToObject(info,"deviceCode",gw_node->deviceCode);
cJSON_AddItemToObject(root, "info", info);
iotx_report_id(msgId);
cJSON_AddStringToObject(payload,"msgId",msgId);
cJSON_AddStringToObject(payload,"version","1.0");
memset(sceneId,0,sizeof(sceneId));
snprintf(sceneId,sizeof(sceneId),"%d",dummyId);
cJSON_AddStringToObject(paras,"sceneId",sceneId);
cJSON_AddItemToObject(payload, "params", paras);
snprintf(tm,sizeof(tm),"%d",time(NULL));
cJSON_AddStringToObject(payload,"time",tm);
cJSON_AddStringToObject(payload,"method",KK_THING_METHOD_DELETESCENC);
cJSON_AddItemToObject(root, "payload", payload);
char *data = cJSON_Print(root);
kk_sendData2gw(data,strlen(data), node->fatherDeviceCode);
cJSON_Delete(root);
free(data);
return 0;
}
static int kk_panel_bind_motor_add_actions(const char* deviceCode,cJSON* actions,int dummyId)
{
int res = 0;
dm_mgr_dev_node_t *node = NULL;
dm_mgr_dev_node_t *gw_node = NULL;
char msgId[MSG_MAX_LEN] = {0};
char sceneId[33] = {0};
char tm[33] = {0};
cJSON *root = cJSON_CreateObject();
cJSON *info = cJSON_CreateObject();
cJSON *payload = cJSON_CreateObject();
cJSON *paras = cJSON_CreateObject();
if(SUCCESS_RETURN!=dm_mgr_get_device_by_devicecode((char*)deviceCode,&node)){
return -1;
}
if(SUCCESS_RETURN!=dm_mgr_get_device_by_devicecode(node->fatherDeviceCode,&gw_node)){
return -1;
}
cJSON_AddStringToObject(info,"msgtype",KK_THING_SERVICE_ADDSCENC);
cJSON_AddStringToObject(info,"productCode",gw_node->productCode);
cJSON_AddStringToObject(info,"deviceCode",gw_node->deviceCode);
cJSON_AddItemToObject(root, "info", info);
iotx_report_id(msgId);
cJSON_AddStringToObject(payload,"msgId",msgId);
cJSON_AddStringToObject(payload,"version","1.0");
memset(sceneId,0,sizeof(sceneId));
snprintf(sceneId,sizeof(sceneId),"%d",dummyId);
cJSON_AddStringToObject(paras,"sceneId",sceneId);
cJSON_AddItemToObject(paras, "actions", actions);
cJSON_AddItemToObject(payload, "params", paras);
snprintf(tm,sizeof(tm),"%d",time(NULL));
cJSON_AddStringToObject(payload,"time",tm);
cJSON_AddStringToObject(payload,"method",KK_THING_METHOD_ADDSCENC);
cJSON_AddItemToObject(root, "payload", payload);
char *data = cJSON_Print(root);
kk_sendData2gw(data,strlen(data), node->fatherDeviceCode);
cJSON_Delete(root);
free(data);
return 0;
}
static int kk_panel_bind_motor_add(const char* deviceCode,int epNum,int dummyId)
{
cJSON *item = NULL;
struct kk_motor_bind_info *info = (struct kk_motor_bind_info *)malloc(sizeof(struct kk_motor_bind_info)*KK_MOTOR_BIND_INFO_MAX);
int info_size = kk_motor_bind_db_find_ex(dummyId,info,KK_MOTOR_BIND_INFO_MAX);
cJSON *actionsAry = cJSON_CreateArray();
item = cJSON_CreateObject();
cJSON_AddStringToObject(item,"deviceCode",deviceCode);
cJSON_AddNumberToObject(item,"epNum",epNum);
cJSON_AddStringToObject(item,"type","action/thing/group");
cJSON_AddItemToArray(actionsAry,item);
for(int i=0;i<info_size;i++){
item = cJSON_CreateObject();
cJSON_AddStringToObject(item,"deviceCode",info[i].deviceCode);
cJSON_AddNumberToObject(item,"epNum",info[i].epNum);
cJSON_AddStringToObject(item,"type","action/thing/group");
cJSON_AddItemToArray(actionsAry,item);
}
kk_panel_bind_motor_add_actions(deviceCode,actionsAry,dummyId);
free(info);
}
int kk_service_panel_bind_motor_handle(cJSON *deviceCode,cJSON *param,cJSON * msgId,int act)
{
int i;
int panel_ep = 1,motor_ep = 1;
int actionCnt;
cJSON *panel_dCode,*panelEpNum;
cJSON *motor_dCode,*motorEpNum;
cJSON *actions,*actionItem;
const char *motor_dCodeStr = NULL;
int dummyId = (int)time(NULL);
if(deviceCode==NULL||param==NULL||msgId==NULL){
return -1;
}
if(deviceCode->type!=cJSON_String||param->type!=cJSON_Object||msgId->type!=cJSON_String){
return -1;
}
panel_dCode = deviceCode;
if((panelEpNum = cJSON_GetObjectItem(param,"epNum"))!=NULL){
if(panelEpNum->type!=cJSON_String){
INFO_PRINT("[ERR] epNum \n");
return -1;
}else{
panel_ep = atoi(panelEpNum->valuestring);
}
}
if((actions = cJSON_GetObjectItem(param,"actions"))==NULL||
actions->type!=cJSON_Array){
INFO_PRINT("[ERR] actions \n");
return -1;
}
INFO_PRINT("\n\n\n\n**************************panel bind motor act [%d]**************************************\n\n\n\n",act);
if(act==KK_SERVICE_REBIND_MOTORS){
struct kk_motor_bind_info *info = (struct kk_motor_bind_info *)malloc(sizeof(struct kk_motor_bind_info)*KK_MOTOR_BIND_INFO_MAX);
int info_size = kk_motor_bind_db_find(panel_dCode->valuestring,panel_ep,info,KK_MOTOR_BIND_INFO_MAX);
for(int i=0;i<info_size;i++){
kk_panel_bind_motor_delete(panel_dCode->valuestring,info[i].dummyId);
}
free(info);
kk_motor_bind_db_delete_ex(panel_dCode->valuestring);
}
actionCnt = cJSON_GetArraySize(actions);
for(i=0;i<actionCnt;i++){
actionItem = cJSON_GetArrayItem(actions,i);
if(actionItem==NULL||actionItem->type!=cJSON_Object){
INFO_PRINT("[ERR] item \n");
continue;
}
motor_dCode = cJSON_GetObjectItem(actionItem,"deviceCode");
if(motor_dCode==NULL||motor_dCode->type!=cJSON_String){
INFO_PRINT("[ERR] motor_dCode \n");
continue;
}
if((motorEpNum = cJSON_GetObjectItem(actionItem,"epNum"))!=NULL){
if(motorEpNum->type!=cJSON_String){
INFO_PRINT("[ERR] motorEpNum \n");
continue;
}else{
motor_ep = atoi(motorEpNum->valuestring);
}
}
char *ptr = strrchr(motor_dCode->valuestring,'_');
if(ptr==NULL){
motor_dCodeStr = motor_dCode->valuestring;
}else{
motor_dCodeStr=ptr+1;
}
if(act==KK_SERVICE_REBIND_MOTORS||act==KK_SERVICE_ADDBIND_MOTORS){
dummyId = (int)time(NULL)+i;
kk_motor_bind_db_insert(panel_dCode->valuestring,panel_ep,motor_dCodeStr,motor_ep,dummyId);
kk_panel_bind_motor_add(panel_dCode->valuestring,panel_ep,dummyId);
}else if(act==KK_SERVICE_UNBIND_MOTORS){
int dummyId=kk_motor_bind_db_find_dummyId(panel_dCode->valuestring,panel_ep,motor_dCodeStr,motor_ep);
if(dummyId!=-1){
kk_panel_bind_motor_delete(panel_dCode->valuestring,dummyId);
}
kk_motor_bind_db_delete(panel_dCode->valuestring,panel_ep,motor_dCodeStr,motor_ep);
}
}
return 0;
}
int kk_service_query_bind_motor(cJSON *deviceCode,cJSON *param,struct kk_motor_bind_info *info,int max)
{
int panel_ep = 1;
int info_size = 0;
cJSON *panel_dCode,*panelEpNum;
INFO_PRINT("\n\n\n\n**************************query bind motor**************************************\n\n\n\n");
if(deviceCode==NULL||deviceCode->type!=cJSON_String){
return -1;
}
panel_dCode = deviceCode;
if(param!=NULL){
if(param->type!=cJSON_Object){
return -1;
}
if((panelEpNum = cJSON_GetObjectItem(param,"epNum"))!=NULL){
if(panelEpNum->type!=cJSON_String){
INFO_PRINT("[ERR] panelEpNum \n");
return -1;
}else{
panel_ep = atoi(panelEpNum->valuestring);
}
}
}
info_size = kk_motor_bind_db_find(panel_dCode->valuestring,panel_ep,info,max);
return info_size;
}
int kk_dm_device_subdev_filter(char *data)
{
char *out;
int res = 0;
cJSON *json;
cJSON *info_root;
cJSON *payload,*typeJson;
char *payload_Str = NULL;
cJSON *deviceCode = NULL;
if ((json=cJSON_Parse(data)) == NULL) {
WARNING_PRINT("Error before: [%s]\n","cJSON_Parse");
return -1;
}
if((info_root = cJSON_GetObjectItem(json, "info")) == NULL)
return -1;
if((typeJson = cJSON_GetObjectItem(info_root, "msgtype"))== NULL)
return -1;
if((payload = cJSON_GetObjectItem(json, "payload")) == NULL)
return -1;
payload_Str = cJSON_Print(payload);
if((deviceCode = cJSON_GetObjectItem(info_root, "deviceCode")) == NULL)
return -1;
if(strcmp(typeJson->valuestring,KK_THING_SERVICE_REBIND_MOTORS) == 0){
INFO_PRINT("REBIND_MOTORS \n");
cJSON *msgId = cJSON_GetObjectItem(payload, "msgId");
cJSON *paramStr = cJSON_GetObjectItem(payload,"params");
kk_service_panel_bind_motor_handle(deviceCode,paramStr,msgId,KK_SERVICE_REBIND_MOTORS);
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_REBIND_MOTORS_REPLY);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDBIND_MOTOR) == 0){
INFO_PRINT("ADDBIND_MOTOR \n");
deviceCode = cJSON_GetObjectItem(info_root, MSG_DEVICE_CODE_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_panel_bind_motor_handle(deviceCode,paramStr,msgId,KK_SERVICE_ADDBIND_MOTORS);
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_ADDBIND_MOTOR_REPLY);
}else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_UNBIND_MOTORS) == 0){
INFO_PRINT("UNBIND_MOTORS \n");
deviceCode = cJSON_GetObjectItem(info_root, MSG_DEVICE_CODE_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
kk_service_panel_bind_motor_handle(deviceCode,paramStr,msgId,KK_SERVICE_UNBIND_MOTORS);
kk_service_common_reply(info_root,msgId,KK_THING_SERVICE_UNBIND_MOTORS_REPLY);
}else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_QUERY_BIND_MOTORS) == 0){
INFO_PRINT("QUERY_BIND_MOTORS \n");
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
cJSON *paramStr = cJSON_GetObjectItem(payload,MSG_PARAMS_STR);
struct kk_motor_bind_info *info = (struct kk_motor_bind_info *)malloc(sizeof(struct kk_motor_bind_info)*KK_MOTOR_BIND_INFO_MAX);
int info_size = kk_service_query_bind_motor(deviceCode,paramStr,info,KK_MOTOR_BIND_INFO_MAX);
cJSON *ary = cJSON_CreateArray();
for(int i=0;i<info_size;i++){
cJSON *item = cJSON_CreateObject();
cJSON_AddStringToObject(item,"deviceCode",info[i].deviceCode);
cJSON_AddNumberToObject(item,"epNum",info[i].epNum);
cJSON_AddItemToArray(ary,item);
}
kk_service_common_reply_ex(info_root,msgId,KK_THING_SERVICE_QUERY_BIND_MOTORS_REPLY,ary);
free(info);
}else{
return -1;
}
return 0;
}
/************************************************************ /************************************************************
*功能描述:nanomsg数据回调,app to mid *功能描述:nanomsg数据回调,app to mid
*输入参数:data:从app 层发来的数据 *输入参数:data:从app 层发来的数据
...@@ -526,25 +865,29 @@ void mid_cb(void* data, int len){ ...@@ -526,25 +865,29 @@ void mid_cb(void* data, int len){
} }
kk_sendData2gw(data, strlen(data), deviceCode->valuestring);//send to gw itself kk_sendData2gw(data, strlen(data), deviceCode->valuestring);//send to gw itself
}else if(devType == KK_DM_DEVICE_SUBDEV){ }else if(devType == KK_DM_DEVICE_SUBDEV){
dm_mgr_dev_node_t *gw_node = NULL; if(kk_dm_device_subdev_filter(data)==0){
res = dm_mgr_get_device_by_devicecode(deviceCode->valuestring,&gw_node); ERROR_PRINT("\n\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n");
if (res != SUCCESS_RETURN) { //
ERROR_PRINT("res:%d\n",res); }else{
cJSON_Delete(json); dm_mgr_dev_node_t *gw_node = NULL;
return; res = dm_mgr_get_device_by_devicecode(deviceCode->valuestring,&gw_node);
if (res != SUCCESS_RETURN) {
ERROR_PRINT("res:%d\n",res);
cJSON_Delete(json);
return;
}
cJSON * rootData=cJSON_CreateObject();
char *info_rootS=cJSON_Print(info_root);
char *payloadS = cJSON_Print(payload);
cJSON_AddItemToObject(rootData,MSG_INFO_STR, cJSON_Parse(info_rootS));
cJSON_AddItemToObject(rootData,MSG_PAYLOAD_STR, cJSON_Parse(payloadS));
char *pnewout=cJSON_Print(rootData);
kk_sendData2gw(pnewout, strlen(pnewout), gw_node->fatherDeviceCode);//send to sub device
cJSON_Delete(rootData);
free(info_rootS);
free(payloadS);
free(pnewout);
} }
cJSON * rootData=cJSON_CreateObject();
char *info_rootS=cJSON_Print(info_root);
char *payloadS = cJSON_Print(payload);
cJSON_AddItemToObject(rootData,MSG_INFO_STR, cJSON_Parse(info_rootS));
cJSON_AddItemToObject(rootData,MSG_PAYLOAD_STR, cJSON_Parse(payloadS));
char *pnewout=cJSON_Print(rootData);
kk_sendData2gw(pnewout, strlen(pnewout), gw_node->fatherDeviceCode);//send to sub device
cJSON_Delete(rootData);
free(info_rootS);
free(payloadS);
free(pnewout);
} }
else{ else{
ERROR_PRINT("wrong type\n"); ERROR_PRINT("wrong type\n");
...@@ -1101,10 +1444,18 @@ void kk_platMsg_handle(void* data, char* chalMark){ ...@@ -1101,10 +1444,18 @@ void kk_platMsg_handle(void* data, char* chalMark){
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;
if(eventItem != NULL){ if(eventItem != NULL){
if(eventItem->identifier==NULL){
INFO_PRINT("eventItem->identifier = NULL\n");
continue ;
}
if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 && if(strcmp(eventItem->identifier,MSG_PROPERTY_STR) != 0 &&
eventItem->output_data_number > 0){ eventItem->output_data_number > 0){
int index = 0; int index = 0;
kk_tsl_data_t *itemData = NULL; kk_tsl_data_t *itemData = NULL;
if(strstr(msgType->valuestring, eventItem->identifier) == NULL){
continue ;
}
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;
...@@ -1567,6 +1918,7 @@ int main(const int argc, const char **argv) ...@@ -1567,6 +1918,7 @@ int main(const int argc, const char **argv)
kk_subDb_init(); kk_subDb_init();
kk_area_init(); kk_area_init();
kk_history_db_init(); kk_history_db_init();
kk_motor_bind_db_init();
kk_scene_init(); kk_scene_init();
g_timezone = HAL_Get_TimeZone(); g_timezone = HAL_Get_TimeZone();
......
{
"productCode":"3095",
"operateType":"15003",
"channel":1,
"syn_type":1,
"syn_opcode":"FAN_COIL_STATUS",
"newccu":[
{
"identifier":"PowerSwitch",
"opcodemap":"SWITCH",
"dataType":"int",
"channel":"1",
"valueRange":[0,1],
"value": 0
},{
"identifier":"WorkMode",
"opcodemap":"FAN_COIL_SET_RUN_MODEL",
"dataType":"int",
"channel":"1",
"valueRange":[1,2,3,4],
"value": 1
},{
"identifier":"WindSpeed",
"opcodemap":"FAN_COIL_SET_FUN_SPEED",
"dataType":"int",
"channel":"1",
"valueRange":[0,2,3,4],
"value": 1
},{
"identifier":"Temperature",
"opcodemap":"FAN_COIL_SET_TEMPERATURE",
"dataType":"double",
"channel":"1",
"valueRange":[],
"value": 16
},{
"identifier":"TimingOffTime",
"opcodemap":"FAN_COIL_SET_DELAY_SWITCH_TASK",
"dataType":"double",
"channel":"1",
"valueRange":[],
"value": 0
},{
"identifier":"ChildLockState",
"opcodemap":"FAN_COIL_SET_LOCK_STATUS",
"dataType":"int",
"channel":"1",
"valueRange":[0,1],
"value": 0
},{
"identifier":"CurrentTemperature",
"opcodemap":"room_temperature",
"dataType":"double",
"channel":"1",
"valueRange":[],
"value": 22
},{
"identifier":"smart_model_id",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": 0
},{
"identifier":"smart_model_time_index",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": 0
},{
"identifier":"system_time",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": "1970-01-01 00:00:00"
},{
"identifier":"week_day",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": 0
},{
"identifier":"total_work_time",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": 0
},{
"identifier":"timing_boot",
"opcodemap":"FAN_COIL_STATUS",
"dataType":"dummy",
"channel":"1",
"valueRange":[],
"value": {
"enable ": false,
"time": "00:00"
}
}
],
"oldccu":[
{
"opcode":"SWITCH",
"identifiermap":"PowerSwitch",
"dataType":"map",
"channel":"1",
"valueRange":["OFF","ON"],
"syn":"on",
"synType":"bool"
},{
"opcode":"FAN_COIL_SET_RUN_MODEL",
"identifiermap":"WorkMode",
"dataType":"map",
"channel":"1",
"valueRange":["COLD","HOT","WIND","DEHUMIDIFICATION"],
"syn":"run_model",
"synType":"map"
},{
"opcode":"FAN_COIL_SET_FUN_SPEED",
"identifiermap":"WindSpeed",
"dataType":"map",
"channel":"1",
"valueRange":["AUTO","LOW","MID","HIGH"],
"syn":"fan_speed",
"synType":"map"
},{
"opcode":"FAN_COIL_SET_TEMPERATURE",
"identifiermap":"Temperature",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"setting_temperature",
"synType":"double"
},{
"opcode":"FAN_COIL_SET_DELAY_SWITCH_TASK",
"identifiermap":"TimingOffTime",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"timing_shutdown",
"synType":"timing_shutdown"
},{
"opcode":"FAN_COIL_SET_LOCK_STATUS",
"identifiermap":"ChildLockState",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"",
"synType":"dummy"
},{
"opcode":"room_temperature",
"identifiermap":"CurrentTemperature",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"room_temperature",
"synType":"double"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"smart_model_id",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"smart_model_id",
"synType":"double"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"smart_model_time_index",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"smart_model_time_index",
"synType":"double"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"system_time",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"system_time",
"synType":"map"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"week_day",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"week_day",
"synType":"int"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"total_work_time",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"total_work_time",
"synType":"int"
},{
"opcode":"FAN_COIL_STATUS",
"identifiermap":"timing_boot",
"dataType":"double",
"channel":"1",
"valueRange":[],
"syn":"timing_boot",
"synType":"def"
}
]
}
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