Commit 6d145874 authored by 陈伟灿's avatar 陈伟灿

Merge branch 'cwc' into 'master'

【修改内容】1,增加场景对于LIGHT和CURTAIN设备类型的支持;2,增加CCU主机版本号定义;3,其他细节修改

See merge request chenweican/k-sdk!75
parents 524d27d1 965f71af
......@@ -50,6 +50,7 @@ static int mqtt_start(void)
//INFO_PRINT("i am send now\n");
//KK_MQTT_SendMsg(TOPIC,"hello my world",2);
}
//INFO_PRINT(" %s \n",testStr);
}
INFO_PRINT("MQTTAsync_destroy\n");
......
......@@ -264,6 +264,7 @@ int KK_MQTT_SendMsg(char *topicName,const char *payload)
pubmsg.qos = QOS;
pubmsg.retained = 0;
//cJSON_Minify(payload);
INFO_PRINT("mqtt send payload :%s.\n",payload);
if ((rc = MQTTAsync_sendMessage(s_Client, topicName, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
......
#ifndef _KK_CCU_VER_H_
#define _KK_CCU_VER_H_
#define KK_CCU_VERSION "1.1.0"
#endif
......@@ -27,7 +27,8 @@ typedef enum {
IPC_PLAT2MID,
IPC_UNDEF
} ipc_type;
#define MSG_COMMON_MSGID "msgId"
#define MSG_TYPE_STR "msgtype"
#define MSG_PRODUCT_TYPE_STR "productType"
#define MSG_PRODUCT_CODE_STR "productCode"
......
......@@ -11,7 +11,8 @@
#include <sys/types.h>
#include <string.h>
#include "com_api.h"
#include "kk_log.h"
#define CCU_TCP_PORT 16565
#define BUFFER_SIZE 1024
#define MAX_LISTEN_NUM 10
......@@ -44,7 +45,7 @@ static void *_MutexCreate(void)
}
if (0 != (err_num = pthread_mutex_init(mutex, NULL))) {
printf("create mutex failed");
INFO_PRINT("create mutex failed");
free(mutex);
return NULL;
}
......@@ -57,11 +58,11 @@ static void _MutexDestroy(void *mutex)
int err_num;
if (!mutex) {
printf("mutex want to destroy is NULL!");
INFO_PRINT("mutex want to destroy is NULL!");
return;
}
if (0 != (err_num = pthread_mutex_destroy((pthread_mutex_t *)mutex))) {
printf("destroy mutex failed");
INFO_PRINT("destroy mutex failed");
}
free(mutex);
......@@ -71,7 +72,7 @@ static void _MutexLock(void *mutex)
{
int err_num;
if (0 != (err_num = pthread_mutex_lock((pthread_mutex_t *)mutex))) {
printf("lock mutex failed: - '%s' (%d)", strerror(err_num), err_num);
INFO_PRINT("lock mutex failed: - '%s' (%d)", strerror(err_num), err_num);
}
}
......@@ -79,7 +80,7 @@ static void _MutexUnlock(void *mutex)
{
int err_num;
if (0 != (err_num = pthread_mutex_unlock((pthread_mutex_t *)mutex))) {
printf("unlock mutex failed - '%s' (%d)", strerror(err_num), err_num);
INFO_PRINT("unlock mutex failed - '%s' (%d)", strerror(err_num), err_num);
}
}
......@@ -182,7 +183,7 @@ static char* __do_spilt(char* buf, int buflen,ipc_cb* cb, char* deviceCode){
while (buflen > 0){
pInx += slen + 1;
slen = strlen(pInx);
printf("read_cb slen ====================================slen[%d] \n",slen);
INFO_PRINT("read_cb slen ====================================slen[%d] \n",slen);
if (cb != NULL){
cb(pInx,slen,deviceCode);
}
......@@ -222,14 +223,14 @@ static void kk_gw_list_load(void)
fp = fopen("gwlist.txt", "r");
if (!fp) {
printf("open gatewaylist.txt failed! \n");
INFO_PRINT("open gatewaylist.txt failed! \n");
goto error1;
}
char buf[1024] = {0};
retLen = fread(g_tcp_ctrl, readLen, 1, fp);
printf("read gatewaylist.txt retLen= %d, readLen=%d ! \n", retLen,readLen);
INFO_PRINT("read gatewaylist.txt retLen= %d, readLen=%d ! \n", retLen,readLen);
if (retLen != readLen ){
printf("read gatewaylist.txt failed! \n");
INFO_PRINT("read gatewaylist.txt failed! \n");
}
fclose(fp);
......@@ -237,7 +238,7 @@ static void kk_gw_list_load(void)
// Set the rest of the device table to null.
error1:
for (i=0; i < MAX_LISTEN_NUM; i++) {
printf("deviceCode ip sock [%s] [%s] [%d] \n",g_tcp_ctrl[i].deviceCode,
INFO_PRINT("deviceCode ip sock [%s] [%s] [%d] \n",g_tcp_ctrl[i].deviceCode,
g_tcp_ctrl[i].ip==NULL?"":g_tcp_ctrl[i].ip, g_tcp_ctrl[i].sock);
g_tcp_ctrl[i].sock = -1;
}
......@@ -282,10 +283,10 @@ static kk_tcp_ctrl_t* get_channel_by_ip(char ip[MAX_IP_LEN]){
return NULL;
}
printf("[%s] ip=%s \n", __FUNCTION__,ip);
INFO_PRINT("[%s] ip=%s \n", __FUNCTION__,ip);
for(;i < MAX_LISTEN_NUM; i++){
if(strcmp(ip, g_tcp_ctrl[i].ip) == 0){
printf("[%s] idx=%d ip=%s sock=%d\n", __FUNCTION__,i, ip, g_tcp_ctrl[i].sock);
INFO_PRINT("[%s] idx=%d ip=%s sock=%d\n", __FUNCTION__,i, ip, g_tcp_ctrl[i].sock);
return &g_tcp_ctrl[i];
}
}
......@@ -333,17 +334,17 @@ static int set_sock_by_ip(char ip[MAX_IP_LEN], int sock){
if (ip == NULL || strlen(ip) == 0){
return -1;
}
printf("[%s] ip=%s \n", __FUNCTION__,ip);
INFO_PRINT("[%s] ip=%s \n", __FUNCTION__,ip);
for(;i < MAX_LISTEN_NUM; i++){
if(strcmp(ip, g_tcp_ctrl[i].ip) == 0){
g_tcp_ctrl[i].sock = sock;
printf("[%s] idx=%d ip=%s sock=%d\n", __FUNCTION__,i, ip, g_tcp_ctrl[i].sock);
INFO_PRINT("[%s] idx=%d ip=%s sock=%d\n", __FUNCTION__,i, ip, g_tcp_ctrl[i].sock);
//create mutex
if (g_tcp_ctrl[i].mutex == NULL){
g_tcp_ctrl[i].mutex = _MutexCreate();
if (g_tcp_ctrl[i].mutex == NULL) {
printf("[%s] _MutexCreate failed \n", __FUNCTION__);
INFO_PRINT("[%s] _MutexCreate failed \n", __FUNCTION__);
return -1;
}
}
......@@ -378,7 +379,7 @@ int kk_set_tcp_channel_by_idx(int idx, char devCode[DEVICE_CODE_LEN], char ip[MA
int i = 0;
if(idx >= MAX_LISTEN_NUM){
printf("kk_set_tcp_channel_by_idx idx[] need less than %d \n", idx, MAX_LISTEN_NUM);
INFO_PRINT("kk_set_tcp_channel_by_idx idx[] need less than %d \n", idx, MAX_LISTEN_NUM);
return - 1;
}
......@@ -398,7 +399,7 @@ int kk_set_tcp_channel(char devCode[DEVICE_CODE_LEN], char ip[MAX_IP_LEN]){
int isEmptyIdx = -1;
if (devCode == NULL || strlen(devCode) == 0 || ip == NULL || strlen(ip) == 0){
printf("paramenter error \n");
INFO_PRINT("paramenter error \n");
return -1;
}
......@@ -406,7 +407,7 @@ int kk_set_tcp_channel(char devCode[DEVICE_CODE_LEN], char ip[MAX_IP_LEN]){
if(strcmp(devCode, g_tcp_ctrl[i].deviceCode) == 0){
strncpy(g_tcp_ctrl[i].ip, ip, strlen(ip));
printf("find and replace it [%d][%s][%s] \n",i, g_tcp_ctrl[i].ip, devCode);
INFO_PRINT("find and replace it [%d][%s][%s] \n",i, g_tcp_ctrl[i].ip, devCode);
//kk_gw_list_save();
break;
}
......@@ -424,7 +425,7 @@ int kk_set_tcp_channel(char devCode[DEVICE_CODE_LEN], char ip[MAX_IP_LEN]){
strncpy(g_tcp_ctrl[isEmptyIdx].ip, ip, strlen(ip));
strncpy(g_tcp_ctrl[isEmptyIdx].deviceCode, devCode, strlen(devCode));
printf("idx deviceCode ip[%d][%s][%s]",isEmptyIdx, g_tcp_ctrl[isEmptyIdx].deviceCode, g_tcp_ctrl[isEmptyIdx].ip);
INFO_PRINT("idx deviceCode ip[%d][%s][%s]",isEmptyIdx, g_tcp_ctrl[isEmptyIdx].deviceCode, g_tcp_ctrl[isEmptyIdx].ip);
//kk_gw_list_save();
return 0;
}
......@@ -442,18 +443,18 @@ static int server_socket_init(int *sd, char *ipaddr, uint16_t port)
//创建socket
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock){
printf("error socket \n");
INFO_PRINT("error socket \n");
goto err1;
}
//设置立即释放端口并可以再次使用
int reuse = 1;
if (-1 == setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))){
printf("error setsockopt \n");
INFO_PRINT("error setsockopt \n");
goto err2;
}
//设置为非阻塞
if (-1 == fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK)){
printf("================== fcntl \n");
INFO_PRINT("================== fcntl \n");
goto err2;
}
struct sockaddr_in addr;
......@@ -467,11 +468,11 @@ static int server_socket_init(int *sd, char *ipaddr, uint16_t port)
}
//绑定监听
if (-1 == bind(sock, (struct sockaddr *)&addr, sizeof(addr))){
printf("error bind \n");
INFO_PRINT("error bind \n");
goto err2;
}
if (-1 == listen(sock, MAX_LISTEN_NUM)){
printf("error listen \n");
INFO_PRINT("error listen \n");
goto err2;
}
*sd = sock;
......@@ -485,10 +486,10 @@ err1:
/*读回调*/
static void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
printf("================== read_cb [%d]\n", revents);
INFO_PRINT("================== read_cb [%d]\n", revents);
char buffer[BUFFER_SIZE] = {0};
if (EV_ERROR & revents) {
printf("read got invalid event...\r\n");
INFO_PRINT("read got invalid event...\r\n");
return;
}
int res = 0;
......@@ -509,7 +510,7 @@ again:
}
if (0 != res) {
//关闭事件循环并释放watcher
printf("TCP CLOSE\r\n");
INFO_PRINT("TCP CLOSE\r\n");
reset_by_sock(watcher->fd);
ev_io_stop(loop,watcher);
free(watcher);
......@@ -526,7 +527,7 @@ again:
offset = bytes + offset - (retpst - buffer);
memmove(buffer, retpst, offset);
memset(buffer + offset, 0, sizeof(buffer) - offset);
printf("====read not complete, need again offset=%d \n",offset);
INFO_PRINT("====read not complete, need again offset=%d \n",offset);
goto again;
}
}
......@@ -537,7 +538,7 @@ again:
offset = bytes + offset - (retpst - buffer);
memmove(buffer, retpst, offset);
memset(buffer + offset, 0, sizeof(buffer) - offset);
printf("====read not complete, need again offset=%d \n",offset);
INFO_PRINT("====read not complete, need again offset=%d \n",offset);
goto again;
}
......@@ -571,11 +572,11 @@ again:
/*accept回调函数*/
static void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
printf("================== accept_cb \n");
INFO_PRINT("================== accept_cb \n");
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
if (EV_ERROR & revents) {
printf("accept got invalid event...\r\n");
INFO_PRINT("accept got invalid event...\r\n");
return;
}
//accept连接
......@@ -591,17 +592,17 @@ static void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
if(set_sock_by_ip(inet_ntoa(client_addr.sin_addr),sock) < 0){
//ip无效,reject it
printf("This ip[%s][%u] is invaild, reject it! \r\n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
INFO_PRINT("This ip[%s][%u] is invaild, reject it! \r\n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
close(sock);
return;
}
printf("Successfully connected with client: %s:%u\r\n", \
INFO_PRINT("Successfully connected with client: %s:%u\r\n", \
inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
//加入事件循环
struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));
if (w_client == NULL){
printf("malloc w_client failed \r\n");
INFO_PRINT("malloc w_client failed \r\n");
return;
}
......@@ -633,23 +634,23 @@ static void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
}*/
static void loop_tcp_thread(void *arg){
printf("loop_tcp_thread start!\r\n");
INFO_PRINT("loop_tcp_thread start!\r\n");
int sd;
g_loop = ev_loop_new(EVBACKEND_EPOLL);
if (NULL == g_loop) {
printf("loop create failed\r\n");
INFO_PRINT("loop create failed\r\n");
return -1;
}
if (server_socket_init(&sd, NULL, CCU_TCP_PORT) < 0) {
printf("server init failed\r\n");
INFO_PRINT("server init failed\r\n");
return -1;
}
ev_io_init(&w_accept, accept_cb, sd, EV_READ);
ev_io_start(g_loop, &w_accept);
ev_run (g_loop, 0);
close(sd);
printf("loop_tcp_thread================== end \n");
INFO_PRINT("loop_tcp_thread================== end \n");
}
......@@ -662,7 +663,7 @@ int kk_tcp_channel_ser_send(char* data, int len, char chalMark[DEVICE_CODE_LEN])
if (data != NULL){
kk_tcp_ctrl_t* chl_ctrl = get_channel_by_deviceCode(chalMark);
if (NULL == chl_ctrl){
printf("[%s] get_channel_by_deviceCode is NULL!!! \n",__FUNCTION__);
INFO_PRINT("[%s] get_channel_by_deviceCode is NULL!!! \n",__FUNCTION__);
return -1;
}
......@@ -673,10 +674,10 @@ int kk_tcp_channel_ser_send(char* data, int len, char chalMark[DEVICE_CODE_LEN])
{
case -1:
chl_ctrl->isConnect = 0;
printf(" [%s] select error ret=%d \n", __FUNCTION__, -1);
INFO_PRINT(" [%s] select error ret=%d \n", __FUNCTION__, -1);
break; //select错误 退出循环
case 0:
printf(" [%s] select skip=================== ret=%d \n", __FUNCTION__, 0);
INFO_PRINT(" [%s] select skip=================== ret=%d \n", __FUNCTION__, 0);
break; //再次轮询
default:
......@@ -687,10 +688,10 @@ int kk_tcp_channel_ser_send(char* data, int len, char chalMark[DEVICE_CODE_LEN])
_MutexUnlock(chl_ctrl->mutex);
if( ret <= 0){
printf("=================write error ret=%d \n",ret);
INFO_PRINT("=================write error ret=%d \n",ret);
if (errno != EINTR){
chl_ctrl->isConnect = 0;
printf("write error reconnect!! \n");
INFO_PRINT("write error reconnect!! \n");
break;
}
}
......@@ -718,7 +719,7 @@ int kk_TCP_channel_init(ipc_cb cb)
int sd;
if (g_init == 1){
printf("kk_TCP_channel_init has been inited \n");
INFO_PRINT("kk_TCP_channel_init has been inited \n");
return -1;
}
g_init = 1;
......@@ -730,7 +731,7 @@ int kk_TCP_channel_init(ipc_cb cb)
}
if (g_pTh ==NULL && 0 != pthread_create(&g_pTh, NULL, loop_tcp_thread, NULL)) {
printf("create pthread failed\r\n");
INFO_PRINT("create pthread failed\r\n");
return -1;
};
g_cb = cb;
......@@ -801,18 +802,18 @@ static int client_socket_init(int *sd, char *ipaddr, uint16_t port)
//创建socket
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock){
printf("error socket \n");
INFO_PRINT("error socket \n");
goto err1;
}
//设置立即释放端口并可以再次使用
int reuse = 1;
if (-1 == setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))){
printf("error setsockopt \n");
INFO_PRINT("error setsockopt \n");
goto err2;
}
//设置为非阻塞
if (-1 == fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK)){
printf("================== fcntl \n");
INFO_PRINT("================== fcntl \n");
goto err2;
}
struct sockaddr_in addr;
......@@ -834,11 +835,11 @@ static int client_socket_init(int *sd, char *ipaddr, uint16_t port)
sleep(1);
}
if (retry >= 3){
printf("==================connect failed \n");
INFO_PRINT("==================connect failed \n");
goto err2;
}
printf("==================[%s] ok sock=%d \n", __FUNCTION__, sock);
INFO_PRINT("==================[%s] ok sock=%d \n", __FUNCTION__, sock);
*sd = sock;
return 0;
err2:
......@@ -848,7 +849,7 @@ err1:
}
static void loop_tcp_client_thread(void *arg){
printf("loop_tcp_client_thread start!\r\n");
INFO_PRINT("loop_tcp_client_thread start!\r\n");
char buf[1024]= {0};
int ret = 0;
int offset = 0;
......@@ -857,7 +858,7 @@ static void loop_tcp_client_thread(void *arg){
while(1){
if(-1 == client_socket_init(&g_client_ctrl.sd,g_client_ctrl.ip, g_client_ctrl.port)){
printf("connect failed \n");
INFO_PRINT("connect failed \n");
sleep(1);
g_client_ctrl.retry++;
continue;
......@@ -872,7 +873,7 @@ static void loop_tcp_client_thread(void *arg){
{
case -1:
g_client_ctrl.isConnect = 0;
printf(" [%s] select error ret=%d \n", __FUNCTION__, ret);
INFO_PRINT(" [%s] select error ret=%d \n", __FUNCTION__, ret);
break; //select错误 退出循环
case 0:
break; //再次轮询
......@@ -889,10 +890,10 @@ static void loop_tcp_client_thread(void *arg){
_MutexUnlock(g_client_ctrl.mutex);
if( ret <= 0){
printf("=================read error ret=%d \n",ret);
INFO_PRINT("=================read error ret=%d \n",ret);
if (errno != EINTR){
g_client_ctrl.isConnect = 0;
printf("read error reconnect!! \n");
INFO_PRINT("read error reconnect!! \n");
break;
}
}else if(ret > 0){
......@@ -908,7 +909,7 @@ static void loop_tcp_client_thread(void *arg){
offset = ret + offset - (retpst - buf);
memmove(buf, retpst, offset);
memset(buf + offset, 0, sizeof(buf) - offset);
printf("====read not complete, need again offset=%d \n",offset);
INFO_PRINT("====read not complete, need again offset=%d \n",offset);
goto clientRead;
}
#endif
......@@ -920,10 +921,10 @@ static void loop_tcp_client_thread(void *arg){
//usleep(100000);
}
printf("network error, try connect again! \n");
INFO_PRINT("network error, try connect again! \n");
close(g_client_ctrl.sd);
}
printf("loop_tcp_client_thread================== end \n");
INFO_PRINT("loop_tcp_client_thread================== end \n");
}
......@@ -943,12 +944,12 @@ int kk_tcp_client_send(char* data, int len){
if ( data != NULL){
while(g_client_ctrl.sd == -1 && cnt < 5){
printf("[%s] tcp don't connect, sleep 1s !!!! \n",__FUNCTION__);
INFO_PRINT("[%s] tcp don't connect, sleep 1s !!!! \n",__FUNCTION__);
sleep(1);
cnt++;
}
if (g_client_ctrl.sd < 0){
printf("[%s] The tcp socket created fialid !!!! \n",__FUNCTION__);
INFO_PRINT("[%s] The tcp socket created fialid !!!! \n",__FUNCTION__);
return -1;
}
......@@ -958,10 +959,10 @@ int kk_tcp_client_send(char* data, int len){
{
case -1:
g_client_ctrl.isConnect = 0;
printf(" [%s] select error ret=%d \n", __FUNCTION__, ret);
INFO_PRINT(" [%s] select error ret=%d \n", __FUNCTION__, ret);
break; //select错误 退出循环
case 0:
printf(" [%s] select error ret=%d \n", __FUNCTION__, 0);
INFO_PRINT(" [%s] select error ret=%d \n", __FUNCTION__, 0);
break; //再次轮询
default:
......@@ -974,10 +975,10 @@ int kk_tcp_client_send(char* data, int len){
_MutexUnlock(g_client_ctrl.mutex);
if( ret <= 0){
printf("=================send error ret=%d \n",ret);
INFO_PRINT("=================send error ret=%d \n",ret);
if (errno != EINTR){
g_client_ctrl.isConnect = 0;
printf("send error reconnect!! \n");
INFO_PRINT("send error reconnect!! \n");
break;
}
}
......@@ -1005,7 +1006,7 @@ int kk_tcp_client_init(char ip[MAX_IP_LEN], int port, ipc_cb cb)
g_client_ctrl.port = port;
memcpy(g_client_ctrl.ip, ip, strlen(ip));
if (g_pTh ==NULL && 0 != pthread_create(&g_pTh, NULL, loop_tcp_client_thread, NULL)) {
printf("create pthread failed\r\n");
INFO_PRINT("create pthread failed\r\n");
return -1;
};
g_client_ctrl.cb = cb;
......
......@@ -28,7 +28,7 @@
#include <time.h>
#include <signal.h>
#include "kk_product.h"
//#include "iot_import.h"
#include "ccu_ver.h"
char g_product_type[PRODUCT_TYPE_LEN]={0};
char g_product_code[PRODUCT_CODE_LEN]={0};
......@@ -295,10 +295,9 @@ int HAL_GetDevice_Code(_OU_ char *device_code)
}
int HAL_GetVersion(_OU_ char *version)
{
char *ver = "test-1.0.0";
int len = strlen(ver);
int len = strlen(KK_CCU_VERSION);
memset(version, 0x0, VERSION_MAXLEN);
strncpy(version, ver, len);
strncpy(version, KK_CCU_VERSION, len);
version[len] = '\0';
return strlen(version);
}
......
......@@ -738,7 +738,7 @@ int dm_msg_thing_property_set_reply(char deviceCode[DEVICE_CODE_MAXLEN],char *pa
dm_msg_response(&request, &response, "{}", strlen("{}"), NULL);
return SUCCESS_RETURN;
}
int dm_msg_thing_event_post(const char *deviceCode, const char *identifier)
int dm_msg_thing_event_post(const char *deviceCode, const char *identifier,const char *msgId)
{
int res = 0;
int nums = 0;
......@@ -774,7 +774,13 @@ int dm_msg_thing_event_post(const char *deviceCode, const char *identifier)
ERROR_PRINT("dm_msg_thing_event_post failed\n");
return FAIL_RETURN;
}
dm_mgr_upstream_thing_event_post(node->devid, identifier, strlen(identifier), method, payload, strlen(payload));
if(msgId != NULL){
dm_mgr_upstream_thing_event_post_ex(node->devid, identifier, strlen(identifier), method, payload, strlen(payload),msgId);
}else
{
dm_mgr_upstream_thing_event_post(node->devid, identifier, strlen(identifier), method, payload, strlen(payload));
}
free(method);
method = NULL;
free(payload);
......
/*
* Copyright (C) 2020-2020 ikonke
*/
/************************************************************
*版权所有 (C)2020,公司(或个人)名称
*
*文件名称: kk_linkkit.c
*内容摘要: 收到云端数据后的回调处理
*其他说明:
*当前版本:
*************************************************************/
/*************************************************************
头文件引用
*************************************************************/
//#include "iotx_dm_internal.h"
#include "kk_tsl_common.h"
#include "klist.h"
#include "cJSON.h"
......@@ -67,7 +75,13 @@ static iotx_linkkit_ctx_t *_iotx_linkkit_get_ctx(void)
{
return &g_iotx_linkkit_ctx;
}
/************************************************************
*功能描述:本模块互斥锁,加锁处理
*输入参数:无
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
static void _iotx_linkkit_mutex_lock(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -76,6 +90,13 @@ static void _iotx_linkkit_mutex_lock(void)
}
}
/************************************************************
*功能描述:本模块互斥锁,解锁处理
*输入参数:无
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
static void _iotx_linkkit_mutex_unlock(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -84,23 +105,14 @@ static void _iotx_linkkit_mutex_unlock(void)
}
}
static int _impl_copy(_IN_ void *input, _IN_ int input_len, _OU_ void **output, _IN_ int output_len)
{
if (input == NULL || output == NULL || *output != NULL) {
return INVALID_PARAMETER;
}
*output = malloc(output_len);
if (*output == NULL) {
return MEMORY_NOT_ENOUGH;
}
memset(*output, 0, output_len);
memcpy(*output, input, input_len);
return SUCCESS_RETURN;
}
#if 1
/************************************************************
*功能描述:互斥锁,添加topo关系时加锁处理
*输入参数:无
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
static void _iotx_linkkit_upstream_mutex_lock(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -108,7 +120,13 @@ static void _iotx_linkkit_upstream_mutex_lock(void)
HAL_MutexLock(ctx->upstream_mutex);
}
}
/************************************************************
*功能描述:互斥锁,添加topo关系时解锁处理
*输入参数:无
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
static void _iotx_linkkit_upstream_mutex_unlock(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -117,7 +135,15 @@ static void _iotx_linkkit_upstream_mutex_unlock(void)
}
}
/************************************************************
*功能描述:添加topo关系时添加消息同步队列
*输入参数:msgid:消息Id
semaphore:同步用的信号量
*输出参数:node:添加的队列节点
*返 回 值: 0:成功;其他:失败
*其他说明:此消息队列只有MSG_NEED_RESP被定义了才使用到,如添加topo.add时,只
有服务器回reply或者超时10秒后才往下执行
*************************************************************/
static int _iotx_linkkit_upstream_sync_callback_list_insert(int msgid, void *semaphore,
iotx_linkkit_upstream_sync_callback_node_t **node)
{
......@@ -148,7 +174,13 @@ static int _iotx_linkkit_upstream_sync_callback_list_insert(int msgid, void *sem
*node = search_node;
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:删除消息同步队列
*输入参数:msgid:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:此消息队列只有MSG_NEED_RESP被定义了才使用到
*************************************************************/
static int _iotx_linkkit_upstream_sync_callback_list_remove(int msgid)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -167,6 +199,13 @@ static int _iotx_linkkit_upstream_sync_callback_list_remove(int msgid)
return FAIL_RETURN;
}
/************************************************************
*功能描述:根据msgid查询对应节点
*输入参数:msgid:消息Id
*输出参数:node:查询到的节点
*返 回 值: 0:成功;其他:失败
*其他说明:此消息队列只有MSG_NEED_RESP被定义了才使用到
*************************************************************/
int _iotx_linkkit_upstream_sync_callback_list_search(int msgid,
iotx_linkkit_upstream_sync_callback_node_t **node)
......@@ -190,7 +229,13 @@ int _iotx_linkkit_upstream_sync_callback_list_search(int msgid,
return FAIL_RETURN;
}
/************************************************************
*功能描述:删除整个消息同步队列
*输入参数:无
*输出参数:无
*返 回 值: 无
*其他说明:此消息队列只有MSG_NEED_RESP被定义了才使用到
*************************************************************/
static void _iotx_linkkit_upstream_sync_callback_list_destroy(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -204,7 +249,14 @@ static void _iotx_linkkit_upstream_sync_callback_list_destroy(void)
}
}
/************************************************************
*功能描述:释放对应的同步信号量
*输入参数:msgid:消息Id
code:错误码值
*输出参数:无
*返 回 值: 无
*其他说明:此消息队列只有MSG_NEED_RESP被定义了才使用到
*************************************************************/
static void _iotx_linkkit_upstream_callback_remove(int msgid, int code)
{
INFO_PRINT("_iotx_linkkit_upstream_callback_remove : [%d] ,code= %d \n",msgid, code );
......@@ -228,13 +280,34 @@ static void _iotx_linkkit_upstream_callback_remove(int msgid, int code)
static int s_CloudStatus = 0;
static int s_CloudStatusRecv = 0;
/************************************************************
*功能描述:获取连云状态
*输入参数:无
*输出参数:无
*返 回 值: 1,已连上;0:未连上
*其他说明:
*************************************************************/
int kk_get_cloudstatus(void){
return s_CloudStatus;
}
/************************************************************
*功能描述:获取是否有连云状态的通知
*输入参数:无
*输出参数:无
*返 回 值: 1,有;0:未通知
*其他说明:
*************************************************************/
int kk_get_cloud_recv_status(void){
return s_CloudStatusRecv;
}
/************************************************************
*功能描述:手机端主动删除设备处理函数
*输入参数:payload:云端传下来数据
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_topo_delete_handle(cJSON *payload)
{
if(payload == NULL){
......@@ -259,6 +332,14 @@ int kk_topo_delete_handle(cJSON *payload)
}
/************************************************************
*功能描述:添加房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含房间名称
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_addRoom_handle(const char *deviceCode, cJSON *params)
{
dm_mgr_dev_node_t *node = NULL;
......@@ -286,6 +367,13 @@ static int kk_service_addRoom_handle(const char *deviceCode, cJSON *params)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:删除房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含房间ID
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_deleteRoom_handle(cJSON *params)
{
if(params == NULL){
......@@ -300,6 +388,13 @@ static int kk_service_deleteRoom_handle(cJSON *params)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:添加设备到房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含房间ID和设备deviceCode
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_addDeviceToRoom_handle(cJSON *params)
{
char epNumStr[10] = {0};
......@@ -324,6 +419,13 @@ static int kk_service_addDeviceToRoom_handle(cJSON *params)
kk_room_dev_add(roomId->valuestring,deviceCode->valuestring,epNumStr);
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:删除设备从房间处理函数
*输入参数:params:云端传下来JSON数据,主要包含设备deviceCode
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_removeDeviceFromRoom_handle(cJSON *params)
{
char epNumStr[10] = {0};
......@@ -345,6 +447,15 @@ static int kk_service_removeDeviceFromRoom_handle(cJSON *params)
kk_room_dev_remove(deviceCode->valuestring,epNumStr);
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:执行房间设备处理
*输入参数:action:具体动作
node:设备节点
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_execute_action(cJSON *action,dm_mgr_dev_node_t *node)
{
int idx = 0;
......@@ -372,6 +483,13 @@ static int kk_service_execute_action(cJSON *action,dm_mgr_dev_node_t *node)
}
/************************************************************
*功能描述:批量执行房间设备处理
*输入参数:params:云端下发数据,包含房间号,productCode等
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_executeRoom_handle(cJSON *params)
{
int res = 0;
......@@ -412,6 +530,7 @@ static int kk_service_executeRoom_handle(cJSON *params)
kk_free_room_dev_list();
return SUCCESS_RETURN;
}
#if 0
static int kk_service_setLocalTimer_handle(cJSON *params,const char *deviceCode)
{
int res = 0;
......@@ -624,7 +743,15 @@ static int kk_service_deleteKey_handle(const char *deviceCode,cJSON *param)
return SUCCESS_RETURN;
}
#endif
/************************************************************
*功能描述:添加场景处理
*输入参数:params:云端下发数据,包含场景名称,场景类型,场景使能等
msgId:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_addScene_handle(cJSON *param,cJSON *msgId)
{
int res = 0;
......@@ -637,6 +764,14 @@ static int kk_service_addScene_handle(cJSON *param,cJSON *msgId)
return res;
}
/************************************************************
*功能描述:编辑场景处理
*输入参数:params:云端下发数据,包含场景名称,场景类型,场景使能,场景Id等
msgId:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_updateScene_handle(cJSON *param,cJSON *msgId)
{
int res = 0;
......@@ -654,7 +789,14 @@ static int kk_service_updateScene_handle(cJSON *param,cJSON *msgId)
res = kk_scene_parse_updatescene(param,sceneId->valuestring);
return res;
}
/************************************************************
*功能描述:删除场景处理
*输入参数:params:云端下发数据,包含场景Id等
msgId:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_deleteScene_handle(cJSON *param,cJSON *msgId)
{
int res = 0;
......@@ -686,6 +828,14 @@ static int kk_service_deleteScene_handle(cJSON *param,cJSON *msgId)
}
return res;
}
/************************************************************
*功能描述:执行场景处理
*输入参数:params:云端下发数据,包含场景Id等
msgId:消息Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int kk_service_executeScene_handle(cJSON *param,cJSON *msgId)
{
int res = 0;
......@@ -700,7 +850,14 @@ static int kk_service_executeScene_handle(cJSON *param,cJSON *msgId)
return res;
}
/************************************************************
*功能描述:收到云端数据后的回调处理
*输入参数:type:数据类型
data:具体数据
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
{
char *out;
......@@ -800,15 +957,17 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
}else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_REBOOT) == 0){
INFO_PRINT(" reboot called!!!\n");
dm_msg_thing_event_post(deviceCode->valuestring,MSG_REBOOT_REBOOTNOTIFICATION);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
dm_msg_thing_event_post(deviceCode->valuestring,MSG_REBOOT_REBOOTNOTIFICATION,msgId->valuestring);
sleep(3);
HAL_Reboot();
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDROOM) == 0){
INFO_PRINT(" add room!!!\n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_addRoom_handle(deviceCode->valuestring,paramStr);
dm_msg_thing_event_post(deviceCode->valuestring,MSG_AREA_ADDROOM_NOTIFICATION);
dm_msg_thing_event_post(deviceCode->valuestring,MSG_AREA_ADDROOM_NOTIFICATION,msgId->valuestring);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_DELETEROOM) == 0){
INFO_PRINT(" delete room \n");
......@@ -878,25 +1037,25 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_ADDSCENC) == 0){
INFO_PRINT(" add scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_SCENE_MSGID);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_addScene_handle(paramStr,msgId);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_UPDATESCENC) == 0){
INFO_PRINT(" update scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_SCENE_MSGID);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_updateScene_handle(paramStr,msgId);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_DELETESCENC) == 0){
INFO_PRINT("delete scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_SCENE_MSGID);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_deleteScene_handle(paramStr,msgId);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_EXECUTESCENE) == 0){
INFO_PRINT("execute scene \n");
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_SCENE_MSGID);
cJSON *msgId = cJSON_GetObjectItem(payload, MSG_COMMON_MSGID);
kk_service_executeScene_handle(paramStr,msgId);
}
else if(strcmp(typeJson->valuestring,KK_THING_SERVICE_NEGATIVE) == 0){
......@@ -933,7 +1092,15 @@ directReturn:
cJSON_Delete(json);
}
int kk_init_dmproc(){
/************************************************************
*功能描述:模块初始化,包括回调注册
*输入参数:无
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_init_dmproc(void)
{
int res = 0;
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -979,7 +1146,13 @@ int kk_init_dmproc(){
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:子设备连接处理,主要是topo add
*输入参数:devid:设备ID
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int _iotx_linkkit_slave_connect(int devid)
{
int res = 0, msgid = 0, code = 0;
......@@ -1007,6 +1180,13 @@ int _iotx_linkkit_slave_connect(int devid)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:子设备删除处理,
*输入参数:devid:设备ID
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _iotx_linkkit_subdev_delete_topo(int devid)
{
int res = 0, msgid = 0, code = 0;
......@@ -1064,7 +1244,13 @@ static int _iotx_linkkit_subdev_delete_topo(int devid)
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:主模块释放处理
*输入参数:无
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _iotx_linkkit_master_close(void)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -1088,7 +1274,14 @@ static int _iotx_linkkit_master_close(void)
return SUCCESS_RETURN;
}
#if 1//DEVICE_MODEL_GATEWAY
/************************************************************
*功能描述:子模块释放处理
*输入参数:devid:设备Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _iotx_linkkit_slave_close(int devid)
{
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
......@@ -1106,70 +1299,14 @@ static int _iotx_linkkit_slave_close(int devid)
return SUCCESS_RETURN;
}
#endif
/*int IOT_Linkkit_Open(iotx_linkkit_dev_type_t dev_type, iotx_linkkit_dev_meta_info_t *meta_info)
{
int res = 0;
if (dev_type < 0 || dev_type >= IOTX_LINKKIT_DEV_TYPE_MAX || meta_info == NULL) {
dm_log_err("Invalid Parameter");
return FAIL_RETURN;
}
switch (dev_type) {
case IOTX_LINKKIT_DEV_TYPE_MASTER: {
res = _iotx_linkkit_master_open(meta_info);
if (res == SUCCESS_RETURN) {
res = IOTX_DM_LOCAL_NODE_DEVID;
}
}
break;
case IOTX_LINKKIT_DEV_TYPE_SLAVE: {
#if 1//DEVICE_MODEL_GATEWAY
res = _iotx_linkkit_slave_open(meta_info);
#else
res = FAIL_RETURN;
#endif
}
break;
default: {
dm_log_err("Unknown Device Type");
res = FAIL_RETURN;
}
break;
}
return res;
}*/
/*int IOT_Linkkit_Connect(int devid)
{
int res = 0;
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
if (devid < 0) {
dm_log_err("Invalid Parameter");
return FAIL_RETURN;
}
if (ctx->is_opened == 0) {
return FAIL_RETURN;
}
_iotx_linkkit_mutex_lock();
if (devid == IOTX_DM_LOCAL_NODE_DEVID) {
res = _iotx_linkkit_master_connect();
} else {
res = _iotx_linkkit_slave_connect(devid);
}
_iotx_linkkit_mutex_unlock();
return res;
}*/
/************************************************************
*功能描述:消息处理主任务
*输入参数:timeout_ms:超时时间
*输出参数:无
*返 回 值: 无
*其他说明:
*************************************************************/
void IOT_Linkkit_Yield(int timeout_ms)
{
......@@ -1192,6 +1329,13 @@ void IOT_Linkkit_Yield(int timeout_ms)
#endif
}
/************************************************************
*功能描述:模块释放处理
*输入参数:devid:设备Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int IOT_Linkkit_Close(int devid)
{
int res = 0;
......@@ -1217,7 +1361,13 @@ int IOT_Linkkit_Close(int devid)
return res;
}
#if 1//DEVICE_MODEL_GATEWAY
/************************************************************
*功能描述:子设备注册,topo add 后的在线上报
*输入参数:devid:设备Id
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
static int _iotx_linkkit_subdev_login(int devid)
{
int res = 0, msgid = 0, code = 0;
......@@ -1278,287 +1428,18 @@ static int _iotx_linkkit_subdev_login(int devid)
return res;
}
static int _iotx_linkkit_subdev_logout(int devid)
{
int res = 0, msgid = 0, code = 0;
iotx_linkkit_upstream_sync_callback_node_t *node = NULL;
void *semaphore = NULL;
res = iotx_dm_subdev_logout(devid);
if (res < SUCCESS_RETURN) {
return FAIL_RETURN;
}
msgid = res;
semaphore = HAL_SemaphoreCreate();
if (semaphore == NULL) {
return FAIL_RETURN;
}
_iotx_linkkit_upstream_mutex_lock();
res = _iotx_linkkit_upstream_sync_callback_list_insert(msgid, semaphore, &node);
if (res != SUCCESS_RETURN) {
HAL_SemaphoreDestroy(semaphore);
_iotx_linkkit_upstream_mutex_unlock();
return FAIL_RETURN;
}
_iotx_linkkit_upstream_mutex_unlock();
res = HAL_SemaphoreWait(semaphore, IOTX_LINKKIT_SYNC_DEFAULT_TIMEOUT_MS);
if (res < SUCCESS_RETURN) {
_iotx_linkkit_upstream_mutex_lock();
_iotx_linkkit_upstream_sync_callback_list_remove(msgid);
_iotx_linkkit_upstream_mutex_unlock();
return FAIL_RETURN;
}
_iotx_linkkit_upstream_mutex_lock();
code = node->code;
_iotx_linkkit_upstream_sync_callback_list_remove(msgid);
if (code != SUCCESS_RETURN) {
_iotx_linkkit_upstream_mutex_unlock();
return FAIL_RETURN;
}
_iotx_linkkit_upstream_mutex_unlock();
return res;
}
#endif
/*int IOT_Linkkit_Report(int devid, iotx_linkkit_msg_type_t msg_type, unsigned char *payload, int payload_len)
{
int res = 0;
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
if (devid < 0 || msg_type < 0 || msg_type >= IOTX_LINKKIT_MSG_MAX) {
dm_log_err("Invalid Parameter");
return FAIL_RETURN;
}
if (ctx->is_opened == 0 || ctx->is_connected == 0) {
return FAIL_RETURN;
}
_iotx_linkkit_mutex_lock();
switch (msg_type) {
#if !defined(DEVICE_MODEL_RAWDATA_SOLO)
case ITM_MSG_POST_PROPERTY: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_post_property(devid, (char *)payload, payload_len);
#ifdef LOG_REPORT_TO_CLOUD
if (1 == report_sample) {
send_permance_info(NULL, 0, "4", 1);
}
#endif
}
break;
#ifdef DEVICE_MODEL_SHADOW
case ITM_MSG_PROPERTY_DESIRED_GET: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_property_desired_get(devid, (char *)payload, payload_len);
}
break;
case ITM_MSG_PROPERTY_DESIRED_DELETE: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_property_desired_delete(devid, (char *)payload, payload_len);
}
break;
#endif
case ITM_MSG_DEVICEINFO_UPDATE: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_deviceinfo_update(devid, (char *)payload, payload_len);
}
break;
case ITM_MSG_DEVICEINFO_DELETE: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_deviceinfo_delete(devid, (char *)payload, payload_len);
}
break;
#endif
case ITM_MSG_POST_RAW_DATA: {
if (payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
res = iotx_dm_post_rawdata(devid, (char *)payload, payload_len);
}
break;
case ITM_MSG_LOGIN: {
#if 1//DEVICE_MODEL_GATEWAY
res = _iotx_linkkit_subdev_login(devid);
if (res != SUCCESS_RETURN) {
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
#else
res = FAIL_RETURN;
#endif
}
break;
case ITM_MSG_LOGOUT: {
#if 1//DEVICE_MODEL_GATEWAY
res = _iotx_linkkit_subdev_logout(devid);
if (res != SUCCESS_RETURN) {
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
#else
res = FAIL_RETURN;
#endif
}
break;
case ITM_MSG_DELETE_TOPO: {
#if 1//DEVICE_MODEL_GATEWAY
res = _iotx_linkkit_subdev_delete_topo(devid);
if (res != SUCCESS_RETURN) {
_iotx_linkkit_mutex_unlock();
return FAIL_RETURN;
}
#else
res = FAIL_RETURN;
#endif
}
break;
#if 1//DEVICE_MODEL_GATEWAY
#ifdef DEVICE_MODEL_SUBDEV_OTA
case ITM_MSG_REPORT_SUBDEV_FIRMWARE_VERSION: {
res = iotx_dm_send_firmware_version(devid, (const char *)payload);
}
break;
#endif
#endif
default: {
dm_log_err("Unknown Message Type");
res = FAIL_RETURN;
}
break;
}
_iotx_linkkit_mutex_unlock();
return res;
}
int IOT_Linkkit_Query(int devid, iotx_linkkit_msg_type_t msg_type, unsigned char *payload, int payload_len)
{
int res = 0;
#if 1
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
if (devid < 0 || msg_type < 0 || msg_type >= IOTX_LINKKIT_MSG_MAX) {
dm_log_err("Invalid Parameter");
return FAIL_RETURN;
}
if (ctx->is_opened == 0 || ctx->is_connected == 0) {
return FAIL_RETURN;
}
_iotx_linkkit_mutex_lock();
switch (msg_type) {
#if !defined(DEVICE_MODEL_RAWDATA_SOLO)
case ITM_MSG_QUERY_TIMESTAMP: {
res = iotx_dm_qurey_ntp();
}
break;
#endif
case ITM_MSG_QUERY_TOPOLIST: {
#if 1//DEVICE_MODEL_GATEWAY
res = iotx_dm_query_topo_list();
#else
res = FAIL_RETURN;
#endif
}
break;
case ITM_MSG_QUERY_FOTA_DATA: {
res = iotx_dm_fota_perform_sync((char *)payload, payload_len);
}
break;
case ITM_MSG_QUERY_COTA_DATA: {
res = iotx_dm_cota_perform_sync((char *)payload, payload_len);
}
break;
case ITM_MSG_REQUEST_COTA: {
res = iotx_dm_cota_get_config("product", "file", "");
}
break;
case ITM_MSG_REQUEST_FOTA_IMAGE: {
res = iotx_dm_fota_request_image((const char *)payload, payload_len);
}
break;
default: {
dm_log_err("Unknown Message Type");
res = FAIL_RETURN;
}
break;
}
_iotx_linkkit_mutex_unlock();
return res;
}
int IOT_Linkkit_TriggerEvent(int devid, char *eventid, int eventid_len, char *payload, int payload_len)
{
#if !defined(DEVICE_MODEL_RAWDATA_SOLO)
int res = 0;
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
if (devid < 0 || eventid == NULL || eventid_len <= 0 || payload == NULL || payload_len <= 0) {
dm_log_err("Invalid Parameter");
return FAIL_RETURN;
}
if (ctx->is_opened == 0 || ctx->is_connected == 0) {
return FAIL_RETURN;
}
_iotx_linkkit_mutex_lock();
res = iotx_dm_post_event(devid, eventid, eventid_len, payload, payload_len);
_iotx_linkkit_mutex_unlock();
return res;
#else
return -1;
#endif
#endif
return -1;
}*/
#if 0//DEVICE_MODEL_GATEWAY
int iot_linkkit_subdev_query_id(char product_key[IOTX_PRODUCT_KEY_LEN + 1], char device_name[IOTX_DEVICE_NAME_LEN + 1])
{
int res = -1;
iotx_linkkit_ctx_t *ctx = _iotx_linkkit_get_ctx();
if (ctx->is_opened == 0) {
return res;
}
iotx_dm_subdev_query(product_key, device_name, &res);
return res;
}
#endif /* #ifdef DEVICE_MODEL_GATEWAY */
/************************************************************
*功能描述:子设备添加到设备队列和数据库中处理函数
*输入参数:devType:设备类型
productCode:产品Id
deviceCode:设备Id
mac:设备MAC
fatherDeviceCode:父设备DeviceCode
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
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]){
int res = 0;
int devid = 0;
......@@ -1602,6 +1483,18 @@ int kk_mid_subdev_add(int devType, char productCode[PRODUCT_CODE_MAXLEN], char d
return SUCCESS_RETURN;
}
/************************************************************
*功能描述:批量子设备添加到设备队列和数据库中处理函数
*输入参数:productCode:产品Id
deviceCode:设备Id
mac:设备MAC
fatherDeviceCode:父设备DeviceCode
*输出参数:无
*返 回 值: 0:成功;其他:失败
*其他说明:
*************************************************************/
int kk_mid_subdev_batch_add( char productCode[PRODUCT_CODE_MAXLEN], char deviceCode[DEVICE_CODE_MAXLEN],char mac[DEVICE_MAC_MAXLEN],char fatherDeviceCode[DEVICE_CODE_MAXLEN]){
int res = 0;
int devid = 0;
......
......@@ -573,76 +573,91 @@ int kk_subDev_set_action_by_productType(const char *productType,const char *scen
int idx = 0;
int gw_support_scene = 0;
kk_tsl_data_t *property = NULL;
int k = 0,count = 0;
char typeArray[10][32] = {0};
if(productType == NULL){
ERROR_PRINT("ERROR [%s][%d]\n",__FUNCTION__,__LINE__);
return INVALID_PARAMETER;
}
sqlCmd = sqlite3_mprintf(searchCmd,productType); //switch jsut for test
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
//INFO_PRINT("total_column = %d\n", sqlite3_column_count(stmt));
while(sqlite3_step(stmt) == SQLITE_ROW){
pDeviceCode = sqlite3_column_text(stmt, DB_DEVICECODE);
res = dm_mgr_get_device_by_devicecode(pDeviceCode,&node);
if (res != SUCCESS_RETURN) {
continue;
}
if(kk_subDev_check_scene_support(node->fatherDeviceCode) == 1){
gw_support_scene = 1;
}
else{
gw_support_scene = 0;
}
if(!strcmp(productType,"switch")){
for(idx = 0; idx < node->dev_shadow->property_number; idx++){
property = (kk_tsl_data_t *)(node->dev_shadow->properties + idx);
if(property == NULL){
continue;
}
if(strstr(property->identifier,"PowerSwitch") != NULL){
if(gw_support_scene){
kk_scene_action_detail_t info = {0};
memcpy(info.deviceCode,node->deviceCode,strlen(node->deviceCode));
memcpy(info.propertyName,property->identifier,strlen(property->identifier));
memcpy(info.propertyValue,propertyValue,strlen(propertyValue));
info.epNum = 1;
info.delay = 0;
kk_scene_action_add(node->fatherDeviceCode,sceneId,info);
INFO_PRINT("kk_subDev_set_action_by_productType called!!!\n");
if(!strcmp(productType,"CURTAIN")){
memcpy(typeArray[0],"curtain",strlen("curtain"));
count = 1;
}
else if(!strcmp(productType,"LIGHT")){
memcpy(typeArray[0],"switch",strlen("switch"));
memcpy(typeArray[1],"light",strlen("light"));
count = 2;
}
else{
INFO_PRINT("kk_subDev_set_action_by_productType wrong type!!!\n");
}
for(k = 0; k < count; k++){
sqlCmd = sqlite3_mprintf(searchCmd,typeArray[k]); //curtain type
sqlite3_prepare_v2(ctx->pDb, sqlCmd, strlen(sqlCmd), &stmt, NULL);
//INFO_PRINT("total_column = %d\n", sqlite3_column_count(stmt));
while(sqlite3_step(stmt) == SQLITE_ROW){
pDeviceCode = sqlite3_column_text(stmt, DB_DEVICECODE);
res = dm_mgr_get_device_by_devicecode(pDeviceCode,&node);
if (res != SUCCESS_RETURN) {
continue;
}
if(kk_subDev_check_scene_support(node->fatherDeviceCode) == 1){
gw_support_scene = 1;
}
else{
gw_support_scene = 0;
}
if(!strcmp(typeArray[k],"switch")){
for(idx = 0; idx < node->dev_shadow->property_number; idx++){
property = (kk_tsl_data_t *)(node->dev_shadow->properties + idx);
if(property == NULL){
continue;
}
if(strstr(property->identifier,"PowerSwitch") != NULL){
if(gw_support_scene){
kk_scene_action_detail_t info = {0};
memcpy(info.deviceCode,node->deviceCode,strlen(node->deviceCode));
memcpy(info.propertyName,property->identifier,strlen(property->identifier));
memcpy(info.propertyValue,propertyValue,strlen(propertyValue));
info.epNum = 1;
info.delay = 0;
kk_scene_action_add(node->fatherDeviceCode,sceneId,info);
}
res = kk_scene_insert_scene_action(type,node->deviceCode,1,
property->identifier,propertyValue,0,sceneId,node->fatherDeviceCode);
if(res != SUCCESS_RETURN){
INFO_PRINT("kk_subDev_set_action_by_productType fail!!!\n");
//return res;
continue;
}
}
res = kk_scene_insert_scene_action(type,node->deviceCode,1,
property->identifier,propertyValue,0,sceneId,node->fatherDeviceCode);
if(res != SUCCESS_RETURN){
INFO_PRINT("kk_subDev_set_action_by_productType fail!!!\n");
//return res;
continue;
}
}
}
}
else{
if(gw_support_scene){
kk_scene_action_detail_t info = {0};
memcpy(info.deviceCode,node->deviceCode,strlen(node->deviceCode));
memcpy(info.propertyName,propertyName,strlen(propertyName));
memcpy(info.propertyValue,propertyValue,strlen(propertyValue));
info.epNum = 1;
info.delay = 0;
kk_scene_action_add(node->fatherDeviceCode,sceneId,info);
}
res = kk_scene_insert_scene_action(type,node->deviceCode,1,
propertyName,propertyValue,0,sceneId,node->fatherDeviceCode);
if(res != SUCCESS_RETURN){
INFO_PRINT("kk_subDev_set_action_by_productType fail!!!\n");
//return res;
continue;
}
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
else{
if(gw_support_scene){
kk_scene_action_detail_t info = {0};
memcpy(info.deviceCode,node->deviceCode,strlen(node->deviceCode));
memcpy(info.propertyName,propertyName,strlen(propertyName));
memcpy(info.propertyValue,propertyValue,strlen(propertyValue));
info.epNum = 1;
info.delay = 0;
kk_scene_action_add(node->fatherDeviceCode,sceneId,info);
}
res = kk_scene_insert_scene_action(type,node->deviceCode,1,
propertyName,propertyValue,0,sceneId,node->fatherDeviceCode);
if(res != SUCCESS_RETURN){
INFO_PRINT("kk_subDev_set_action_by_productType fail!!!\n");
//return res;
continue;
}
}
}
sqlite3_finalize(stmt);
sqlite3_free(sqlCmd);
}
return SUCCESS_RETURN;
}
......
......@@ -22,7 +22,7 @@
全局变量定义
*************************************************************/
extern sqlite3 *g_kk_pDb;
#define KK_HISTORY_MAX_COUNT 200
#define KK_HISTORY_MAX_COUNT 100
/*************************************************************
函数实现
*************************************************************/
......@@ -138,6 +138,36 @@ int kk_history_delete_by_recordtime(const char *table,time_t time)
return SUCCESS_RETURN;
}
/*查找数据个数*/
int sqlite_find_count(void)
{
kk_history_ctx_t *ctx = _kk_history_get_ctx();
char *sql = "select count(recordtime) from SensorHistoryInfo;";
sqlite3_stmt *stmt = NULL;
/*将sql语句转换为sqlite3可识别的语句,返回指针到stmt*/
int res = sqlite3_prepare_v2(ctx->pDb, sql, strlen(sql), &stmt, NULL);
if (SQLITE_OK != res || NULL == stmt) {
goto err1;
}
/*执行准备好的sqlite3语句*/
res = sqlite3_step(stmt);
if (res != SQLITE_ROW) {
goto err2;
}
int count = sqlite3_column_int(stmt, 0);
if (count < 0) {
goto err2;
}
INFO_PRINT("count = %d\n", count);
sqlite3_finalize(stmt);
return count;
err2:
sqlite3_finalize(stmt);
err1:
return -1;
}
/************************************************************
*功能描述: 插入传感器警告类信息到数据库
*输入参数: deviceCode:设备deviceCode
......@@ -156,6 +186,7 @@ int kk_history_insert_sensor_info(const char* deviceCode,const char* identifier,
char *zErrMsg = 0;
sqlite3_stmt *stmt;
time_t rtime = 0;
int count = 0;
const char *insertCmd = "insert into SensorHistoryInfo (deviceCode, identifier,value,recordtime) \
values ('%s','%s','%s','%d');";
......@@ -172,18 +203,21 @@ int kk_history_insert_sensor_info(const char* deviceCode,const char* identifier,
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);
count = sqlite_find_count();
if(count > KK_HISTORY_MAX_COUNT)
{
/*按时间删除超过最大数量的记录*/
const char *selectCmd = "select * from SensorHistoryInfo order by recordtime desc";
sqlite3_prepare_v2(ctx->pDb, selectCmd, strlen(selectCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
rtime = sqlite3_column_int(stmt, DB_SENSOR_RECORDTIME);
kk_history_delete_by_recordtime("SensorHistoryInfo",rtime);
INFO_PRINT("delete rtime:%d\n",rtime);
break;
}
sqlite3_finalize(stmt);
}
_kk_history_unlock();
return SUCCESS_RETURN;
}
......@@ -208,6 +242,7 @@ int kk_history_insert_Outlet_info(const char* deviceCode,const char* power,const
char *zErrMsg = 0;
sqlite3_stmt *stmt;
time_t rtime = 0;
int count = 0;
const char *insertCmd = "insert into OutletHistoryInfo (deviceCode, power,metering,recordtime) \
values ('%s','%s','%s','%d');";
......@@ -224,18 +259,19 @@ int kk_history_insert_Outlet_info(const char* deviceCode,const char* power,const
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);
count = sqlite_find_count();
if(count > KK_HISTORY_MAX_COUNT){
/*按时间删除超过最大数量的记录*/
//const char *selectCmd = "select * from OutletHistoryInfo order by recordtime desc limit (select count(recordtime) from OutletHistoryInfo) offset %d";
const char *selectCmd = "select * from OutletHistoryInfo order by recordtime desc";
sqlite3_prepare_v2(ctx->pDb, selectCmd, strlen(selectCmd), &stmt, NULL);
while(sqlite3_step(stmt) == SQLITE_ROW){
rtime = sqlite3_column_int(stmt, DB_OUTLET_RECORDTIME);
kk_history_delete_by_recordtime("OutletHistoryInfo",rtime);
break;
}
sqlite3_finalize(stmt);
}
_kk_history_unlock();
return SUCCESS_RETURN;
}
......
......@@ -428,7 +428,6 @@ void kk_platMsg_handle(void* data, char* chalMark){
ERROR_PRINT("info or payload params error\n");
goto error;
}
msgType = cJSON_GetObjectItem(info, MSG_TYPE_STR);
info_dcode = cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
if (msgType == NULL || info_dcode == NULL){
......@@ -489,7 +488,10 @@ void kk_platMsg_handle(void* data, char* chalMark){
if(jsonPay == NULL) goto error;
char* outstr = cJSON_Print(payload);
dm_mgr_dev_node_t *search_node = NULL;
dm_mgr_get_device_by_devicecode(info_dcode->valuestring,&search_node);
res = dm_mgr_get_device_by_devicecode(info_dcode->valuestring,&search_node);
if (res < SUCCESS_RETURN) {
goto error;
}
if(search_node->isOffline){
/*如果是离线状态,上报在线给云端*/
dm_mgr_set_dev_onoffline(search_node,0);
......@@ -606,7 +608,7 @@ void kk_platMsg_handle(void* data, char* chalMark){
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);
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier,NULL);
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
......@@ -622,7 +624,7 @@ void kk_platMsg_handle(void* data, char* chalMark){
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);
dm_msg_thing_event_post(info_dcode->valuestring,eventItem->identifier,NULL);
}
}
......
......@@ -662,18 +662,50 @@ static int kk_scene_parse_repeatday(cJSON *repeatday)
if(repeatday == NULL){
return INVALID_PARAMETER;
}
int array_size = cJSON_GetArraySize (repeatday);
INFO_PRINT("array_size:%d\n",array_size);
if(array_size == 0){
weekflag = 0;
}else{
for(iCnt = 0; iCnt < array_size; iCnt++){
cJSON * pSub = cJSON_GetArrayItem(repeatday, iCnt);
if(pSub != NULL){
weekflag = weekflag|(1<<(pSub->valueint-1));
if(repeatday->type == cJSON_Array){
int array_size = cJSON_GetArraySize (repeatday);
INFO_PRINT("array_size:%d\n",array_size);
if(array_size == 0){
weekflag = 0;
}else{
for(iCnt = 0; iCnt < array_size; iCnt++){
cJSON * pSub = cJSON_GetArrayItem(repeatday, iCnt);
if(pSub != NULL){
weekflag = weekflag|(1<<(pSub->valueint-1));
}
}
}
}
else if(repeatday->type == cJSON_String){
if(strlen(repeatday->valuestring) == 0){
weekflag = 0;
}
else{
if(strstr(repeatday->valuestring,",") == NULL){
weekflag = 1<<(atoi(repeatday->valuestring)-1);
}
else{
char *tmp = repeatday->valuestring;
char *ptmp = NULL;
char weekStr[4] = {0};
while(1){
memset(weekStr,0x0,sizeof(weekStr));
ptmp = strstr(tmp,",");
if(ptmp != NULL){
strncpy(weekStr,tmp,ptmp-tmp);
weekflag = weekflag|(1<<(atoi(weekStr)-1));
}
else{
strncpy(weekStr,tmp,1);
weekflag = weekflag|(1<<(atoi(weekStr)-1));
break;
}
tmp = ptmp + 1;
}
}
}
}
INFO_PRINT("kk_scene_parse_repeatday weekflag:%d!!!\n",weekflag);
return weekflag;
......
......@@ -7,7 +7,7 @@
"cluster":"0x0500",
"attribute":"0x0002",
"iasStatusMask":"0x0001",
"reportFunc":"kk_tsl_report_iasZoneStatus",
"reportFunc":"",
"controlFunc":""
},{
"identity":"Battery",
......@@ -17,14 +17,6 @@
"iasStatusMask":"0x0008",
"reportFunc":"kk_tsl_report_battery",
"controlFunc":""
},{
"identity":"motionAlarm",
"endpoint":1,
"cluster":"0x0500",
"attribute":"0x0002",
"iasStatusMask":"0x0001",
"reportFunc":"",
"controlFunc":""
},{
"identity":"BatteryAlarm",
"endpoint":1,
......
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