Commit be4b4048 authored by chen.weican's avatar chen.weican

【修改内容】增加批量删除和批量添加的功能接口和相关逻辑处理,以备后用

【提交人】陈伟灿
parent 35084464
......@@ -23,6 +23,11 @@
#define KK_FILTER_STATUS_ONLINE_REPLY "/thing/status/online_reply"
#define KK_FILTER_STATUS_OFFLINE "/thing/status/offline"
#define KK_FILTER_STATUS_OFFLINE_REPLY "/thing/status/offline_reply"
#define KK_FILTER_TOPO_BATCH_ADD "/thing/topo/batch_add"
#define KK_FILTER_TOPO_BATCH_ADD_REPLY "/thing/topo/batch_add_reply"
#define KK_FILTER_TOPO_BATCH_DELETE "/thing/topo/batch_delete"
#define KK_FILTER_TOPO_BATCH_DELETE_REPLY "/thing/topo/batch_delete_reply"
#define KK_FILTER_TOPO_CHANEG_REPLY "/thing/topo/change_reply"
#define KK_CLOUDSTATE_MSG "/thing/ccu/cloudstate"
......@@ -122,7 +127,6 @@ int _kk_sendto_cloud(cJSON *root)
{
cJSON *info,*pData;
char *topic = NULL;
char *payload = NULL;
cJSON *msgTypeStr = NULL;
info = cJSON_GetObjectItem(root, MSG_INFO_STR);
if(info == NULL){
......@@ -148,6 +152,24 @@ int _kk_sendto_cloud(cJSON *root)
return RETURN_SUCCESS;
}
else if(strstr(msgTypeStr->valuestring,KK_FILTER_TOPO_BATCH_DELETE) != NULL){
cJSON *params = NULL;
params = cJSON_GetObjectItem(pData, MSG_PARAMS_STR);
if(params != NULL){
cJSON * devices = cJSON_GetObjectItem(params, MSG_TOPO_CHANGE_DEVICES_STR);
if(devices != NULL){
cJSON * item = devices->child;
while(item != NULL){
char *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR)->valuestring;
char *productCode = cJSON_GetObjectItem(item,MSG_PRODUCT_CODE_STR)->valuestring;
KK_Subdev_UnSubscribe_By_DeviceCode(deviceCode,productCode);
item = item->next;
}
}
}
free(topic);
return RETURN_SUCCESS;
}
else if(strstr(msgTypeStr->valuestring,KK_CLOUDSTATE_MSG) != NULL){
KK_Send_CloudState(kk_get_cloud_status());
free(topic);
......@@ -224,6 +246,14 @@ static int _check_invalid_topic(const char* topic)
strstr(topic,KK_FILTER_STATUS_OFFLINE_REPLY) == NULL){
return 1;
}
else if(strstr(topic, KK_FILTER_TOPO_BATCH_ADD) != NULL && \
strstr(topic,KK_FILTER_TOPO_BATCH_ADD_REPLY) == NULL){
return 1;
}
else if(strstr(topic, KK_FILTER_TOPO_BATCH_DELETE) != NULL && \
strstr(topic,KK_FILTER_TOPO_BATCH_DELETE_REPLY) == NULL){
return 1;
}
return 0;
}
......
......@@ -152,7 +152,7 @@ static void onOptSuccess(void* context, MQTTAsync_successData* response)
}
else if(strcmp((char *)context,OPT_SUB)==0)
{
INFO_PRINT("MQTTAsync_subscribe success,return token:%d \n",response->token);
//INFO_PRINT("MQTTAsync_subscribe success,return token:%d \n",response->token);
}
else if(strcmp((char *)context,OPT_UNSUB)==0)
{
......
......@@ -39,6 +39,9 @@ typedef enum {
#define MSG_IOTClOUDSTATE_STR "IOTCloudState"
#define MSG_TOPO_CHANGE_TYPE_STR "changeType"
#define MSG_TOPO_CHANGE_DEVICES_STR "devices"
#define MSG_DEVICE_MAC "mac"
#define MSG_DEVICE_PARENTCODE "parentCode"
typedef void ipc_cb(void* data, int len, char* chalMark);
int kk_ipc_init(ipc_type type, ipc_cb cb, char* chalMark, char* ip);
......
......@@ -50,8 +50,10 @@ const char DM_MSG_INFO[] DM_READ_ONLY;
#define KK_THING_OTA_DEVICE_UPGRADE "/ota/device/upgrade"
#define KK_THING_CLOUDSTATE_MSG "/thing/ccu/cloudstate_reply"
#define KK_THING_TOPO_ADD_MSG "/thing/topo/add"
#define KK_THING_TOPO_BATCH_ADD_MSG "/thing/topo/batch_add"
#define KK_THING_PROPERTY_POST "property/post"
#define KK_THING_TOPO_DELETE_MSG "/thing/topo/delete"
#define KK_THING_TOPO_BATCH_DELETE_MSG "/thing/topo/batch_delete"
#define KK_THING_TOPO_CHANGE_MSG "/thing/topo/change"
......
......@@ -1764,4 +1764,34 @@ int kk_mid_subdev_add(int devType, char productCode[PRODUCT_CODE_MAXLEN], char d
return SUCCESS_RETURN;
}
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;
res = dm_mgr_subdev_create(KK_DM_DEVICE_SUBDEV,productCode,deviceCode,mac,fatherDeviceCode,0,&devid);
if (res != SUCCESS_RETURN && TSL_ALREADY_EXIST != res) {
ERROR_PRINT("subdev create Failed\n");
return FAIL_RETURN;
}
INFO_PRINT("subdev open susseed, devid = %d\n", devid);
if (TSL_ALREADY_EXIST == res){
//todo
}else{
res = kk_subDev_insert_db(KK_DM_DEVICE_SUBDEV,productCode,deviceCode,fatherDeviceCode,mac,"1.1.0");
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
}
res = _iotx_linkkit_subdev_login(devid);
if (res != SUCCESS_RETURN) {
return FAIL_RETURN;
}
_iotx_linkkit_mutex_unlock();
return SUCCESS_RETURN;
}
......@@ -220,6 +220,19 @@ void kk_platMsg_handle(void* data, char* chalMark){
kk_mid_subdev_add(KK_DM_DEVICE_SUBDEV,proCode->valuestring,devCode->valuestring, mac->valuestring,info_dcode->valuestring);
}
}else if (strstr(msgType->valuestring, KK_THING_TOPO_BATCH_ADD_MSG) != NULL){
kk_ipc_send(IPC_MID2APP,data,strlen(data));
cJSON *devices = cJSON_GetObjectItem(jsonPay, MSG_TOPO_CHANGE_DEVICES_STR);
cJSON * item = devices->child;
while(item != NULL){
char *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR)->valuestring;
char *productCode = cJSON_GetObjectItem(item,MSG_PRODUCT_CODE_STR)->valuestring;
char *mac_s = cJSON_GetObjectItem(item,MSG_DEVICE_MAC)->valuestring;
char *fatherMac = cJSON_GetObjectItem(item,MSG_DEVICE_PARENTCODE)->valuestring;
kk_mid_subdev_batch_add(productCode,deviceCode,mac_s,fatherMac);
item = item->next;
}
}else if (strstr(msgType->valuestring, KK_THING_PROPERTY_POST) != NULL){
INFO_PRINT("save property and send to cloud \n");
char* outstr = cJSON_Print(payload);
......@@ -235,6 +248,16 @@ void kk_platMsg_handle(void* data, char* chalMark){
kk_ipc_send(IPC_MID2APP,data,strlen(data)+1);
dm_mgr_subdev_delete(devCode->valuestring);
}else if(strstr(msgType->valuestring, KK_THING_TOPO_BATCH_DELETE_MSG) != NULL){
kk_ipc_send(IPC_MID2APP,data,strlen(data));
cJSON *devices = cJSON_GetObjectItem(jsonPay, MSG_TOPO_CHANGE_DEVICES_STR);
cJSON * item = devices->child;
while(item != NULL){
char *deviceCode = cJSON_GetObjectItem(item,MSG_DEVICE_CODE_STR)->valuestring;
dm_mgr_subdev_delete(deviceCode);
item = item->next;
}
}else{
INFO_PRINT("kk_platMsg_handle data: don't handle it [%s]\n",data);
......
......@@ -292,6 +292,7 @@ APPLICATION_FILES= \
./ZB/kk_rgb_hsl_convert.c\
./ZB/kk_color_space.c\
./ZB/sub_device_manage.c\
./ZB/kk_topo_batch_handle.c\
./kk_test.c\
./rpc_api/src/rpc_common.c\
./rpc_api/src/rpc_onoff.c\
......
......@@ -42,6 +42,16 @@ static void kk_msg_report(cJSON *data,char *msgtype,char *method,EmberEUI64 mac)
rpc_cJSON_Delete(root);
}
void kk_msg_report_batch_joined(cJSON *data,EmberEUI64 mac)
{
kk_msg_report(data,KK_REPORT_DEVICE_BATCH_JOINED_TYPE,KK_REPORT_DEVICE_BATCH_JOINED_METHOD,mac);
}
void kk_msg_report_batch_leave(cJSON *data,EmberEUI64 mac)
{
kk_msg_report(data,KK_REPORT_DEVICE_BATCH_LEFT_TYPE,KK_REPORT_DEVICE_BATCH_LEAVE_METHOD,mac);
}
static void kk_msg_report_joined(cJSON *data,EmberEUI64 mac)
{
kk_msg_report(data,KK_REPORT_DEVICE_JOINED_TYPE,KK_REPORT_DEVICE_JOINED_METHOD,mac);
......
......@@ -10,14 +10,18 @@
#define KK_IPC_VERSION "1.0"
#define KK_REPORT_DEVICE_BATCH_JOINED_METHOD "thing.topo.batchAdd"
#define KK_REPORT_DEVICE_JOINED_METHOD "thing.topo.add"
#define KK_REPORT_DEVICE_LEAVE_METHOD "thing.topo.delete"
#define KK_REPORT_DEVICE_BATCH_LEAVE_METHOD "thing.topo.batchDelete"
#define KK_REPORT_ATTRIBUTE_METHOD "thing.event.property.post"
#define KK_READ_ATTRIBUTE_METHOD "thing.service.property.get"
#define KK_REPORT_DEVICE_BATCH_JOINED_TYPE "/thing/topo/batch_add"
#define KK_REPORT_DEVICE_JOINED_TYPE "/thing/topo/add"
#define KK_REPORT_DEVICE_LEFT_TYPE "/thing/topo/delete"
#define KK_REPORT_DEVICE_BATCH_LEFT_TYPE "/thing/topo/batch_delete"
#define KK_REPORT_ATTRIBUTE_TYPE "/thing/event/property/post"
#define GW2CCU_PROTOCOL "tcp"
......
#include <stdio.h>
#include "klist.h"
#include "kk_tsl_common.h"
#include ".././jsonrpc/jsonrpc-c.h"
#include ".././jsonrpc/rpccJSON.h"
#include "kk_zb_com.h"
typedef struct {
char productCode[PRODUCT_CODE_MAXLEN];
char deviceCode[DEVICE_CODE_MAXLEN];
char mac[DEVICE_MAC_MAXLEN];
struct list_head linked_list;
} kk_topo_dev_node_t;
typedef struct {
void *mutex;
void *semaphore;
int num;
void *g_batch_handle_thread;
struct list_head dev_add_list;
struct list_head dev_del_list;
} kk_topo_batch_handle_ctx;
static kk_topo_batch_handle_ctx g_kk_topo_batch_handle = {0};
static kk_topo_batch_handle_ctx *_kk_topo_batch_handle_ctx(void)
{
return &g_kk_topo_batch_handle;
}
static void _kk_topo_batch_handle_mutex_lock(void)
{
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
if (ctx->mutex) {
HAL_MutexLock(ctx->mutex);
}
}
static void _kk_topo_batch_handle_mutex_unlock(void)
{
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
if (ctx->mutex) {
HAL_MutexUnlock(ctx->mutex);
}
}
void kk_topo_batch_handle_semaphone_post(void)
{
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
if(ctx->semaphore){
HAL_SemaphorePost(ctx->semaphore);
}
}
#define PLATFORM_WAIT_INFINITE (~0)
int kk_topo_batch_handle_semaphone_wait(void)
{
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
if(ctx->semaphore){
HAL_SemaphoreWait(ctx->semaphore,PLATFORM_WAIT_INFINITE);
}
return 0;
}
void *kk_topo_batch_handle(void *args)
{
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
cJSON* root_add = NULL;
cJSON* root_del = NULL;
cJSON* array_add = NULL;
cJSON* device= NULL;
cJSON* array_del = NULL;
kk_topo_dev_node_t *node = NULL;
EmberEUI64 gwEui64 = {0};
char gw_macString[17] = {0};
emberAfGetEui64(gwEui64);
rpc_eui64ToString(gwEui64,gw_macString);
while (1) {
if(!kk_topo_batch_handle_semaphone_wait()){
array_add = rpc_cJSON_CreateArray();
if(array_add == NULL){
continue;
}
root_add = rpc_cJSON_CreateObject();
if(root_add == NULL){
continue;
}
array_del = rpc_cJSON_CreateArray();
if(array_del == NULL){
continue;
}
root_del = rpc_cJSON_CreateObject();
if(root_del == NULL){
continue;
}
if(!list_empty(&ctx->dev_add_list)){
while(!list_empty(&ctx->dev_add_list)){
device = rpc_cJSON_CreateObject();
_kk_topo_batch_handle_mutex_lock();
node = list_first_entry(&ctx->dev_add_list, kk_topo_dev_node_t, linked_list);
if(node != NULL){
rpc_cJSON_AddStringToObject(device, "productCode",node->productCode);
rpc_cJSON_AddStringToObject(device, "deviceCode",node->deviceCode);
rpc_cJSON_AddStringToObject(device, "mac",node->mac);
rpc_cJSON_AddStringToObject(device, "parentCode",gw_macString);
rpc_cJSON_AddItemToArray(array_add, device);
list_del(&node->linked_list);
free(node);
node = NULL;
}
_kk_topo_batch_handle_mutex_unlock();
}
rpc_cJSON_AddItemToObject(root_add, "devices", array_add);
kk_msg_report_batch_joined(root_add,gwEui64);
}
if(!list_empty(&ctx->dev_del_list)){
while(!list_empty(&ctx->dev_del_list)){
device = rpc_cJSON_CreateObject();
_kk_topo_batch_handle_mutex_lock();
node = list_first_entry(&ctx->dev_del_list, kk_topo_dev_node_t, linked_list);
if(node != NULL){
rpc_cJSON_AddStringToObject(device, "productCode",node->productCode);
rpc_cJSON_AddStringToObject(device, "deviceCode",node->deviceCode);
rpc_cJSON_AddItemToArray(array_del, device);
list_del(&node->linked_list);
free(node);
node = NULL;
}
_kk_topo_batch_handle_mutex_unlock();
}
rpc_cJSON_AddItemToObject(root_del, "devices", array_del);
kk_msg_report_batch_leave(root_del,gwEui64);
}
}
}
return NULL;
}
int kk_topo_batch_handle_init(void)
{
int res = 0;
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
ctx->mutex = HAL_MutexCreate();
if (ctx->mutex == NULL) {
return FAIL_RETURN;
}
INIT_LIST_HEAD(&ctx->dev_add_list);
INIT_LIST_HEAD(&ctx->dev_del_list);
ctx->semaphore = HAL_SemaphoreCreate();
if (ctx->semaphore == NULL) {
return FAIL_RETURN;
}
res = pthread_create(&ctx->g_batch_handle_thread, NULL, kk_topo_batch_handle, NULL);
if (res < 0) {
printf("HAL_ThreadCreate kk_topo_batch_handle Failed\n");
//IOT_Linkkit_Close(mid_ctx->master_devid);
return -1;
}
return SUCCESS_RETURN;
}
static int _kk_topo_batch_check_exist(const char *deviceCode)
{
kk_topo_dev_node_t *search_node = NULL;
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
if(deviceCode == NULL){
return INVALID_PARAMETER;
}
list_for_each_entry(search_node, &ctx->dev_add_list, linked_list, kk_topo_dev_node_t) {
if ( (strlen(search_node->deviceCode) == strlen(deviceCode)) &&
(memcmp(search_node->deviceCode, deviceCode, strlen(deviceCode)) == 0)) {
/* dm_log_debug("Device Found, Product Key: %s, Device Name: %s", product_key, device_name); */
return SUCCESS_RETURN;
}
}
return FAIL_RETURN;
}
int _kk_topo_batch_handle_add_dev(const char *productCode,const char *deviceCode,const char *macString)
{
kk_topo_dev_node_t *node = NULL;
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
int res = 0;
if(productCode == NULL || deviceCode == NULL || macString == NULL)
{
return INVALID_PARAMETER;
}
//rpc_eui64ToString(device_mac,macString);
if(_kk_topo_batch_check_exist(deviceCode) == SUCCESS_RETURN){
return SUCCESS_RETURN;
}
node = malloc(sizeof(kk_topo_dev_node_t));
if (node == NULL) {
return MEMORY_NOT_ENOUGH;
}
_kk_topo_batch_handle_mutex_lock();
memset(node,0,sizeof(kk_topo_dev_node_t) );
memcpy(node->deviceCode, deviceCode, strlen(deviceCode));
memcpy(node->productCode, productCode, strlen(productCode));
memcpy(node->mac, macString, strlen(macString));
INIT_LIST_HEAD(&node->linked_list);
list_add_tail(&node->linked_list, &ctx->dev_add_list);
_kk_topo_batch_handle_mutex_unlock();
return SUCCESS_RETURN;
}
int _kk_topo_batch_handle_del_dev(const char *productCode,const char *deviceCode)
{
kk_topo_dev_node_t *node = NULL;
kk_topo_batch_handle_ctx *ctx = _kk_topo_batch_handle_ctx();
int res = 0;
if(productCode == NULL || deviceCode == NULL)
{
return INVALID_PARAMETER;
}
node = malloc(sizeof(kk_topo_dev_node_t));
if (node == NULL) {
return MEMORY_NOT_ENOUGH;
}
_kk_topo_batch_handle_mutex_lock();
memset(node,0,sizeof(kk_topo_dev_node_t) );
memcpy(node->deviceCode, deviceCode, strlen(deviceCode));
memcpy(node->productCode, productCode, strlen(productCode));
INIT_LIST_HEAD(&node->linked_list);
list_add_tail(&node->linked_list, &ctx->dev_del_list);
_kk_topo_batch_handle_mutex_unlock();
return SUCCESS_RETURN;
}
......@@ -544,7 +544,7 @@ int emberAfMain(MAIN_FUNCTION_PARAMETERS)
emberAfPrintBigEndianEui64(eui64);
kk_network_check();
kk_topo_batch_handle_init();
kk_device_gateway_add(eui64);
pthread_t tid;
......
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