Commit 7af7906d authored by chen.weican's avatar chen.weican

【修改内容】调整网关与主机的通讯协议,并统一格式。

【提交人】陈伟灿
parent f54206d2
......@@ -44,9 +44,11 @@ int _kk_sendto_cloud(cJSON *root)
free(topic);
return -1;
}
INFO_PRINT("[%s][%d] payload:%s\n",__FUNCTION__,__LINE__,pData->valuestring);
KK_MQTT_SendMsg(topic,(const char*)pData->valuestring);
char* out=cJSON_Print(pData);
INFO_PRINT("[%s][%d] payload:%s\n",__FUNCTION__,__LINE__,out);
KK_MQTT_SendMsg(topic,(const char*)out);
free(topic);
free(out);
return 0;
}
......@@ -190,8 +192,10 @@ static char * _kk_data_create(const char *topic,const char *data)
snprintf(infoStr,infoStr_len,DM_MSG_TO_MIDDWARE,msgStr,productType,productCode,deviceCode);
root=cJSON_CreateObject();
cJSON_AddStringToObject(root,MSG_INFO_STR,infoStr);
cJSON_AddStringToObject(root,MSG_PAYLOAD_STR,data);
cJSON* infoObj = cJSON_Parse(infoStr);
cJSON* payloadObj = cJSON_Parse(data);
cJSON_AddItemToObject(root, MSG_INFO_STR, infoObj);
cJSON_AddItemToObject(root, MSG_PAYLOAD_STR,payloadObj);
out=cJSON_Print(root);
cJSON_Delete(root);
free(msgStr);
......@@ -230,8 +234,10 @@ int KK_Send_CloudState(int state)
snprintf(payloadStr,payloadStr_len,DM_MSG_CLOUDSTATE,state);
root=cJSON_CreateObject();
cJSON_AddStringToObject(root,MSG_INFO_STR,infoStr);
cJSON_AddStringToObject(root,MSG_PAYLOAD_STR,payloadStr);
cJSON* infoObj = cJSON_Parse(infoStr);
cJSON* payloadObj = cJSON_Parse(payloadStr);
cJSON_AddItemToObject(root, MSG_INFO_STR, infoObj);
cJSON_AddItemToObject(root, MSG_PAYLOAD_STR,payloadObj);
out=cJSON_Print(root);
kk_ipc_send(IPC_APP2MID, out, strlen(out)+1);
cJSON_Delete(root);
......
......@@ -151,19 +151,24 @@ static int _kk_utils_topic(_IN_ const char *name, _IN_ char *product_code,
char* KK_Make_Topic(cJSON *info)
{
cJSON *type,*product_code,*device_code,*root;
cJSON *type,*product_code,*device_code;
char *topic = NULL;
root=cJSON_Parse((char*)info->valuestring);
//root=cJSON_Parse((char*)info->valuestring);
type = cJSON_GetObjectItem(root, MSG_TYPE_STR);
type = cJSON_GetObjectItem(info, MSG_TYPE_STR);
if(type == NULL){
goto errorreturn;
}
product_code = cJSON_GetObjectItem(root, MSG_PRODUCT_CODE_STR);
#if 0 //just for test
if(strstr(type->valuestring,"/thing/topo/add") != NULL){
KK_MQTT_SubTopic("/sys/kk/2/1122334455667788/#");
}
#endif
product_code = cJSON_GetObjectItem(info, MSG_PRODUCT_CODE_STR);
if(product_code == NULL){
goto errorreturn;
}
device_code = cJSON_GetObjectItem(root, MSG_DEVICE_CODE_STR);
device_code = cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
if(device_code == NULL){
goto errorreturn;
}
......@@ -257,10 +262,8 @@ char* KK_Make_Topic(cJSON *info)
}
#endif
INFO_PRINT("[%s][%d] TOPIC:%s\n",__FUNCTION__,__LINE__,topic);
cJSON_Delete(root);
return topic;
errorreturn:
cJSON_Delete(root);
return NULL;
}
......
......@@ -13,13 +13,14 @@ const char DM_MSG_INFO[] DM_READ_ONLY = "{\"msgtype\":\"%s\",\"productType\":\"%
void kk_sendData2app(void *info, void *payload){
cJSON *root=cJSON_CreateObject();
cJSON_AddStringToObject(root, "info", info);
cJSON_AddStringToObject(root, "payload", payload);
cJSON* infoObj = cJSON_Parse(info);
cJSON* payloadObj = cJSON_Parse(payload);
cJSON_AddItemToObject(root, "info", infoObj);
cJSON_AddItemToObject(root, "payload",payloadObj);
void *buf = cJSON_Print(root);
kk_ipc_send(IPC_MID2APP, buf, strlen(buf) + 1);
free(buf);
cJSON_Delete(root);
}
const char DM_MSG_THING_SUB_REGISTER_METHOD[] = "thing.sub.register";
......
......@@ -230,24 +230,25 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
char *out;
int res = 0;
cJSON *json;
cJSON *info_root,*info;
cJSON *info_root;
cJSON *payload,*typeJson;
char *payload_Str = NULL;
json=cJSON_Parse(data);
if (json == NULL) {
WARNING_PRINT("Error before: [%s]\n","cJSON_Parse");
return;
}
info_root = cJSON_GetObjectItem(json, MSG_INFO_STR);
info = cJSON_Parse(info_root->valuestring);
typeJson = cJSON_GetObjectItem(info, MSG_TYPE_STR);
typeJson = cJSON_GetObjectItem(info_root, MSG_TYPE_STR);
payload = cJSON_GetObjectItem(json, MSG_PAYLOAD_STR);
payload_Str = cJSON_Print(payload);
if (strstr(typeJson->valuestring,KK_REGISTER_TOPIC_REPLY)){
//====todo======
//get devicececret and save it
INFO_PRINT(" topic:register_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
res = dm_msg_response_parse((char *)payload_Str, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
goto directReturn;
}
......@@ -261,7 +262,7 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
//
INFO_PRINT(" topic:add_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
res = dm_msg_response_parse((char *)payload_Str, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
goto directReturn;
}
......@@ -275,7 +276,7 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
//
INFO_PRINT(" topic:login_reply \n");
dm_msg_response_payload_t response;
res = dm_msg_response_parse((char *)payload->valuestring, strlen(payload->valuestring)+1, &response);
res = dm_msg_response_parse((char *)payload_Str, strlen(payload->valuestring)+1, &response);
if (res != SUCCESS_RETURN) {
goto directReturn;
}
......@@ -285,13 +286,12 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
_iotx_linkkit_upstream_mutex_unlock();
}else if (strstr(typeJson->valuestring,KK_THING_SERVICE_PROPERTY_SET)){
INFO_PRINT("property set \n");
cJSON *deviceCode = cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
dm_msg_thing_property_set_reply(deviceCode->valuestring,payload->valuestring, strlen(payload->valuestring), NULL);
cJSON *deviceCode = cJSON_GetObjectItem(info_root, MSG_DEVICE_CODE_STR);
dm_msg_thing_property_set_reply(deviceCode->valuestring,payload_Str, strlen(payload_Str), NULL);
//kk_tsl_service_property_set(topic->valuestring, payload->valuestring, strlen(payload->valuestring), NULL);
}else if (strstr(typeJson->valuestring,KK_THING_CLOUDSTATE_MSG)){
INFO_PRINT("cloud state notify \n");
cJSON *payloadStr = cJSON_Parse(payload->valuestring);
cJSON *paramStr = cJSON_GetObjectItem(payloadStr, MSG_PARAMS_STR);
cJSON *paramStr = cJSON_GetObjectItem(payload, MSG_PARAMS_STR);
cJSON *state = cJSON_GetObjectItem(paramStr, "IOTCloudState");
int state_int = atoi(state->valuestring);
res = kk_tsl_set_value(kk_tsl_set_property_value,0,KK_TSL_CCU_WANSTATE_IDENTIFIER,&state_int,NULL);
......@@ -304,7 +304,6 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
{
ERROR_PRINT("[%s][%d] res:%d\n",__FUNCTION__,__LINE__,res);
}
cJSON_Delete(payloadStr);
}else if (strstr(typeJson->valuestring,KK_THING_OTA_DEVICE_UPGRADE)){
INFO_PRINT("ota upgrade... \n");
kk_dm_ota_send(data, strlen(data)+1);
......@@ -315,8 +314,8 @@ static void _iotx_linkkit_event_callback(iotx_dm_event_types_t type, char *data)
}
directReturn:
free(payload_Str);
cJSON_Delete(json);
cJSON_Delete(info);
......
......@@ -33,7 +33,8 @@ char * g_filerToPlatTable[] =
static int _kk_filter_to_plat(const char* msgtype)
{
int i = 0,num = 0;
num = sizeof(g_filerToPlatTable);
num = sizeof(g_filerToPlatTable)/sizeof(char *);
for(i =0; i < num; i++){
if(strstr(msgtype,g_filerToPlatTable[i]))
{
......@@ -66,19 +67,19 @@ void mid_cb(void* data, int len){
else
{
info_root = cJSON_GetObjectItem(json, MSG_INFO_STR);
info = cJSON_Parse(info_root->valuestring);
deviceCode = cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
type = cJSON_GetObjectItem(info, MSG_TYPE_STR);
deviceCode = cJSON_GetObjectItem(info_root, MSG_DEVICE_CODE_STR);
type = cJSON_GetObjectItem(info_root, MSG_TYPE_STR);
if(_kk_filter_to_plat(type->valuestring)){
cJSON_Delete(json);
cJSON_Delete(info);
return;
}
int DevType = dm_mgr_get_deviceType_by_mac(deviceCode->valuestring);
if(DevType == KK_DM_DEVICE_GATEWAY){
int devType = 0;
dm_mgr_get_deviceType_by_mac(deviceCode->valuestring,&devType);
if(devType == KK_DM_DEVICE_GATEWAY){
kk_ipc_send_ex(IPC_MID2PLAT, data, strlen(data), deviceCode->valuestring);//send to gw itself
}else if(DevType == KK_DM_DEVICE_SUBDEV){
}else if(devType == KK_DM_DEVICE_SUBDEV){
dm_mgr_dev_node_t *gw_node = NULL;
res = dm_mgr_get_device_by_mac(deviceCode->valuestring,&gw_node);
if (res != SUCCESS_RETURN) {
......
......@@ -28,32 +28,6 @@ typedef enum {
IPC_UNDEF
} ipc_type;
typedef enum{
/******MIDDWARE TO APP**************/
MSG_REGISTER = 0,
MSG_UNREGISTER,
MSG_TOPOADD,
MSG_TOPODELETE,
MSG_TOPOGET,
MSG_LISTFOUND,
MSG_LOGIN,
MSG_LOGOUT,
MSG_PROPERTYPOST,
MSG_EVENTPOST,
MSG_SERVICERESPONSE,
MSG_SETREPLY,
MSG_OTA_PROCESS,
MSG_OTA_INFORM,
/*******APP TO MIDDWARE**************/
MSG_REGISTER_REPLY,
MSG_TOPOADD_REPLY,
MSG_OFFLINE_REPLY,
MSG_LOGIN_REPLY,
MSG_PROPERTYSET,
MSG_OTA_UPGRADE,
MSG_INVALID,
}kk_msg_type_t;
#define MSG_TYPE_STR "msgtype"
#define MSG_PRODUCT_TYPE_STR "productType"
......
......@@ -105,15 +105,14 @@ int kk_tsl_init(void)
//kk_test();
return SUCCESS_RETURN;
}
int kk_sub_tsl_add(EmberEUI64 device_mac,const char *product_type)
int kk_sub_tsl_add(EmberEUI64 device_mac,const char *productCode)
{
sub_dev_node_t *node = NULL;
kk_sub_dev_ctx_t *ctx = _sub_dev_get_ctx();
char name[TSL_PATH_MAXLEN] = {0};
char *tsl_str = NULL;
int res = 0;
char macString[19] = {0};
if(product_type == NULL)
if(productCode == NULL)
{
return INVALID_PARAMETER;
}
......@@ -128,7 +127,7 @@ int kk_sub_tsl_add(EmberEUI64 device_mac,const char *product_type)
_sub_dev_mutex_lock();
memset(node,0,sizeof(sub_dev_node_t) );
memcpy(node->device_mac, macString, strlen(macString));
memcpy(node->product_type, product_type, strlen(product_type));
memcpy(node->productCode, productCode, strlen(productCode));
node->devid = _sub_tsl_next_devid();
INIT_LIST_HEAD(&node->linked_list);
......@@ -162,7 +161,7 @@ const char DM_MSG_REQUEST[] = "{\"LightStatus\":\"1\"}";
int kk_test(void)
{
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
kk_test_fuc("112233445566",DM_MSG_REQUEST);
//kk_test_fuc("112233445566",DM_MSG_REQUEST);
//kk_get_Identity_Num(0);
return 0;
......
......@@ -5,7 +5,7 @@
typedef struct {
int devid;
char product_type[PRODUCT_KEY_MAXLEN];
char productCode[PRODUCT_TYPE_MAXLEN];
char device_mac[DEVICE_MAC_MAXLEN];
struct list_head linked_list;
} sub_dev_node_t;
......
......@@ -4,33 +4,44 @@
extern kk_tsl_zigbee_map_t g_tsl_zigbee_map [];
static void kk_rpc_send_message(cJSON *data,char *method,EmberEUI64 mac)
static void kk_rpc_send_message(cJSON *data,char *msgtype,char *method,EmberEUI64 mac)
{
static uint16_t msgid;
cJSON *item = rpc_cJSON_CreateObject();
char msgIdString[10];
sprintf(msgIdString,"%d",++msgid);
rpc_cJSON_AddStringToObject(item, "msgId",msgIdString);
rpc_cJSON_AddStringToObject(item, "version", KK_IPC_VERSION);
if(mac!=NULL){
rpc_cJSON_AddMACToObject(item,mac);
}
rpc_cJSON_AddStringToObject(item, "method",method);
rpc_cJSON_AddItemToObject(item, "params", data);
cJSON *info = rpc_cJSON_CreateObject();
if(info != NULL){
rpc_cJSON_AddStringToObject(info, "msgType",msgtype);
rpc_cJSON_AddStringToObject(info, "productCode","");
rpc_cJSON_AddStringToObject(info, "deviceCode","");
}
cJSON *payload = rpc_cJSON_CreateObject();
if(payload != NULL){
sprintf(msgIdString,"%d",++msgid);
rpc_cJSON_AddStringToObject(payload, "msgId",msgIdString);
rpc_cJSON_AddStringToObject(payload, "version", KK_IPC_VERSION);
rpc_cJSON_AddStringToObject(payload, "method",method);
rpc_cJSON_AddItemToObject(payload, "params", data);
}
cJSON *root = rpc_cJSON_CreateObject();
if(root != NULL){
rpc_cJSON_AddItemToObject(root, "info", info);
rpc_cJSON_AddItemToObject(root, "payload", payload);
}
char* p = rpc_cJSON_Print(item);
char* p = rpc_cJSON_Print(root);
emberAfAppPrintln("send json:\n%s\n",p);
free(p);
jrpc_send_msg(item);
jrpc_send_msg(root);
rpc_cJSON_Delete(root);
}
void kk_rpc_report_devices(cJSON *data,EmberEUI64 mac)
{
kk_rpc_send_message(data,KK_REPORT_DEVICE_JOINED_METHOD,mac);
kk_rpc_send_message(data,KK_REPORT_DEVICE_JOINED_TYPE,KK_REPORT_DEVICE_JOINED_METHOD,mac);
}
void kk_rpc_report_status(cJSON *data,EmberEUI64 mac)
{
kk_rpc_send_message(data,KK_REPORT_ATTRIBUTE_METHOD,mac);
kk_rpc_send_message(data,KK_REPORT_ATTRIBUTE_TYPE,KK_REPORT_ATTRIBUTE_METHOD,mac);
}
typedef struct{
......@@ -53,9 +64,9 @@ void kk_rpc_reportDevices(kk_report_device_s device)
rpc_cJSON_AddAppVersionToObject(devicesJson,device.AppVersion);
rpc_cJSON_AddStringToObject(devicesJson, "deviceType","1");
rpc_cJSON_AddStringToObject(devicesJson, "deviceCode","2");
rpc_cJSON_AddStringToObject(devicesJson, "productType",PRODUCT_TYPE);
rpc_cJSON_AddStringToObject(devicesJson, "productType",TEST_PRODUCT_CODE);
rpc_cJSON_AddStringToObject(devicesJson, "productCode","4");
kk_sub_tsl_add(device.mac,PRODUCT_TYPE);
kk_sub_tsl_add(device.mac,TEST_PRODUCT_CODE);
kk_rpc_report_devices(devicesJson,device.mac);
}
int kk_rpc_report_LightStatus(EmberEUI64 mac,int status,uint16_t clusterId,uint16_t attributeId)
......@@ -78,7 +89,7 @@ int kk_rpc_report_LightStatus(EmberEUI64 mac,int status,uint16_t clusterId,uint1
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return -1;
}
pCtrlIdx = kk_find_ctrl_obj(node->product_type);
pCtrlIdx = kk_find_ctrl_obj(node->productCode);
if(pCtrlIdx == -1){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
return -1;
......@@ -143,7 +154,7 @@ error_return:
}
#if 0
int kk_test_fuc(char *mac,const char *params)
{
sub_dev_node_t *node = NULL;
......@@ -191,6 +202,7 @@ int kk_test_fuc(char *mac,const char *params)
return 0;
}
#endif
cJSON *rpc_read_attribue(jrpc_context * ctx, cJSON *params, cJSON *id,cJSON *mac)
{
rpc_nwk_info_s info;
......@@ -210,7 +222,7 @@ cJSON *rpc_read_attribue(jrpc_context * ctx, cJSON *params, cJSON *id,cJSON *mac
goto error_return;
}
pCtrlIdx = kk_find_ctrl_obj(node->product_type);
pCtrlIdx = kk_find_ctrl_obj(node->productCode);
if(pCtrlIdx < SUCCESS_RETURN){
goto error_return;
}
......@@ -260,7 +272,7 @@ cJSON *rpc_Control(jrpc_context * ctx, cJSON *params, cJSON *id,cJSON *mac)
set_json_error_type(ctx,JRPC_INVALID_PARAMS,MSG_INVALID_PARAMS);
goto error_return;
}
pCtrlIdx = kk_find_ctrl_obj(node->product_type);
pCtrlIdx = kk_find_ctrl_obj(node->productCode);
if(pCtrlIdx == -1){
printf("[%s][%d]\n",__FUNCTION__,__LINE__);
set_json_error_type(ctx,JRPC_INVALID_PARAMS,MSG_INVALID_PARAMS);
......
......@@ -5,13 +5,16 @@
#include "network-creator-security.h"
#include "RPC_API.h"
#define KK_REPORT_DEVICE_JOINED_TYPE "/thing/topo/add"
#define KK_REPORT_ATTRIBUTE_TYPE "/thing/service/property/report"
#define KK_IPC_VERSION "1.0"
#define KK_REPORT_DEVICE_JOINED_METHOD "thing.topo.add"
#define KK_REPORT_DEVICE_LEAVE_METHOD "thing.topo.leave"
#define KK_REPORT_ATTRIBUTE_METHOD "thing.service.property.report"
#define KK_READ_ATTRIBUTE_METHOD "thing.service.property.get"
#define PRODUCT_TYPE "3"
#define TEST_PRODUCT_CODE "24"
cJSON *rpc_Control(jrpc_context * ctx, cJSON * params, cJSON *id,cJSON *mac);
......@@ -21,9 +24,9 @@ int lightStatusSet(jrpc_context * ctx,const char *mac,void* data);
#define RPC_KK_TEST_FUNCTION_TABLE \
{(rpc_function*)rpc_Control,"thing.service.property.set"},\
{(rpc_function*)rpc_Control,"/thing/service/property/set"},\
{(rpc_function*)rpc_Control,KK_READ_ATTRIBUTE_METHOD},\
{(rpc_function*)rpc_nwkPermitJoin,"thing.service.NetChannelState.set"}
{(rpc_function*)rpc_nwkPermitJoin,"/thing/service/NetChannelState/set"}
......
......@@ -3,12 +3,12 @@
kk_tsl_zigbee_map_t g_tsl_zigbee_map [] = {
{
PRODUCT_TYPE,
TEST_PRODUCT_CODE,
3,
{
{KK_TSL_DATA_TYPE_TEXT,"LightStatus",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
{KK_TSL_DATA_TYPE_TEXT,"LightAdjustLevel",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
{KK_TSL_DATA_TYPE_TEXT,"LightAlias",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
{KK_TSL_DATA_TYPE_TEXT,"OperationMode",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
{KK_TSL_DATA_TYPE_TEXT,"WorkMode",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
{KK_TSL_DATA_TYPE_TEXT,"Position",lightStatusSet,ZCL_ON_OFF_CLUSTER_ID,ZCL_ON_OFF_ATTRIBUTE_ID},
}
},
{
......@@ -24,13 +24,13 @@ kk_tsl_zigbee_map_t g_tsl_zigbee_map [] = {
};
int kk_find_ctrl_obj(const char *product_type)
int kk_find_ctrl_obj(const char *productCode)
{
int map_num = sizeof(g_tsl_zigbee_map) / sizeof(kk_tsl_zigbee_map_t);
int index = 0;
for(index = 0;index < map_num; index++)
{
if(!strcmp(product_type,g_tsl_zigbee_map[index].product_type))
if(!strcmp(productCode,g_tsl_zigbee_map[index].productCode))
{
return index;
}
......
......@@ -18,7 +18,7 @@ typedef struct{
}kk_zigbee_ctrl_map_t;
typedef struct{
char *product_type;
char *productCode;
int num;
kk_zigbee_ctrl_map_t zigbee_ctrl[PROPERTIES_MAX_NUM];
}kk_tsl_zigbee_map_t;
......
......@@ -55,7 +55,6 @@ void rpcInterfaceParse(void)
emberAfAppPrint("i=%d,%s\r\n",i,rpc_table[i].name);
jrpc_register_procedure(&my_server, rpc_table[i].func, rpc_table[i].name, NULL );
}
jrpc_server_run(&my_server);
jrpc_server_destroy(&my_server);
......@@ -90,18 +89,31 @@ cJSON * test_func(jrpc_context * ctx, cJSON * params, cJSON *id) {
static int send_result_resp(cJSON * result,
cJSON * id) {
int return_value = 0;
cJSON *info_root = rpc_cJSON_CreateObject();
if(info_root){
rpc_cJSON_AddStringToObject(info_root, "msgType", "");
rpc_cJSON_AddStringToObject(info_root, "productType", "");
rpc_cJSON_AddStringToObject(info_root, "productCode", "");
rpc_cJSON_AddStringToObject(info_root, "deviceCode", "");
}
cJSON *payload_root = rpc_cJSON_CreateObject();
if(payload_root){
rpc_cJSON_AddItemToObject(payload_root, "msgId", id);
rpc_cJSON_AddItemToObject(payload_root, "code", result);
rpc_cJSON_AddStringToObject(payload_root, "data", "{}");
}
cJSON *result_root = rpc_cJSON_CreateObject();
if (result)
rpc_cJSON_AddItemToObject(result_root, "code", result);
if(id){
printf("id json:\n%s\n",id->valuestring);
rpc_cJSON_AddItemToObject(result_root, "msgId", id);
if(result_root){
rpc_cJSON_AddItemToObject(result_root, "info", info_root);
rpc_cJSON_AddItemToObject(result_root, "payload", payload_root);
}
char * str_result = rpc_cJSON_Print(result_root);
printf("send json:\n%s\n",str_result);
return_value = kk_ipc_send(IPC_PLAT2MID, str_result, strlen(str_result)+1);
free(str_result);
free(str_result);
rpc_cJSON_Delete(result_root);
return return_value;
}
......@@ -110,17 +122,37 @@ static int send_result_resp(cJSON * result,
static int send_error_resp(int code, char* message,
cJSON * id) {
int return_value = 0;
cJSON *edata;
cJSON *info_root = rpc_cJSON_CreateObject();
if(info_root){
rpc_cJSON_AddStringToObject(info_root, "msgType", "");
rpc_cJSON_AddStringToObject(info_root, "productType", "");
rpc_cJSON_AddStringToObject(info_root, "productCode", "");
rpc_cJSON_AddStringToObject(info_root, "deviceCode", "");
}
cJSON *payload_root = rpc_cJSON_CreateObject();
if(payload_root){
rpc_cJSON_AddItemToObject(payload_root, "msgId", id);
rpc_cJSON_AddNumberToObject(payload_root, "code", code);
edata = rpc_cJSON_CreateObject();
if(edata){
rpc_cJSON_AddStringToObject(edata, "message", message);
}
rpc_cJSON_AddItemToObject(payload_root, "data", edata);
}
cJSON *result_root = rpc_cJSON_CreateObject();
cJSON *error_root = rpc_cJSON_CreateObject();
rpc_cJSON_AddNumberToObject(error_root, "code", code);
rpc_cJSON_AddStringToObject(error_root, "message", message);
rpc_cJSON_AddItemToObject(result_root, "error", error_root);
rpc_cJSON_AddItemToObject(result_root, "id", id);
if(result_root){
rpc_cJSON_AddItemToObject(result_root, "info", info_root);
rpc_cJSON_AddItemToObject(result_root, "payload", payload_root);
}
char * str_result = rpc_cJSON_Print(result_root);
//printf("alla=========== :%d\n", strlen(str_result)+1);
return_value = kk_ipc_send(IPC_PLAT2MID, str_result, strlen(str_result)+1);
printf("send_error_resp:\n%s\n", str_result);
free(str_result);
free(str_result);
rpc_cJSON_Delete(result_root);
free(message);
return return_value;
......@@ -154,32 +186,30 @@ static int invoke_procedure(struct jrpc_server *server,
}
static int eval_request(struct jrpc_server *server, cJSON *root) {
cJSON *method, *params, *id,*mac;
method = rpc_cJSON_GetObjectItem(root, "method");
if (method != NULL && method->type == cJSON_String) {
params = rpc_cJSON_GetObjectItem(root, "params");
if (params == NULL|| params->type == cJSON_Array
|| params->type == cJSON_Object) {
id = rpc_cJSON_GetObjectItem(root, "msgId");
if (id == NULL|| id->type == cJSON_String
|| id->type == cJSON_Number) {
mac = rpc_cJSON_GetObjectItem(root, "mac");
if(mac->type = cJSON_String){
//We have to copy ID because using it on the reply and deleting the response Object will also delete ID
cJSON * id_copy = NULL;
if (id != NULL)
id_copy =
(id->type == cJSON_String) ? rpc_cJSON_CreateString(
id->valuestring) :
rpc_cJSON_CreateNumber(id->valueint);
if (server->debug_level)
printf("Method Invoked[2]: %s\n", method->valuestring);
return invoke_procedure(server, method->valuestring,
params, id_copy,mac);
}
}
}
}
cJSON *params, *id,*mac,*info,*msgType,*payload;
info = rpc_cJSON_GetObjectItem(root, "info");
if(info != NULL){
msgType = rpc_cJSON_GetObjectItem(info, "msgType");
mac = rpc_cJSON_GetObjectItem(info, "deviceCode");
}
payload = rpc_cJSON_GetObjectItem(root, "payload");
if(payload != NULL){
params = rpc_cJSON_GetObjectItem(payload, "params");
id = rpc_cJSON_GetObjectItem(payload, "msgId");
}
if(id != NULL && params != NULL && msgType != NULL && mac != NULL){
cJSON * id_copy = NULL;
id_copy = (id->type == cJSON_String) ? rpc_cJSON_CreateString(id->valuestring) : \
rpc_cJSON_CreateNumber(id->valueint);
return invoke_procedure(server, msgType->valuestring,
params, id_copy,mac);
}
send_error_resp(JRPC_INVALID_REQUEST,
strdup("The JSON sent is not a valid Request object."), NULL);
return -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