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