JsonParser.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #include "Module_OcppBackend.h"
  2. void CallErrorHandler(char *id, char *errorCode, char *errorDescription,char *payload);
  3. int CallHandler(char *uuid, char *str1,char *payload);
  4. void CallResultHandler(char *str1,char *payload, int gun_index);
  5. extern void CheckTransactionPacket(char *uuid);
  6. typedef void (*FunCallErrorPtr)(char *id, char *errorCode, char *errorDescription,char *payload);
  7. typedef void (*FunPtr)(char *payload, int gun_index);
  8. typedef int (*FunCallPtr)(char *uuid, char *payload);
  9. typedef enum boolean { FALSE, TRUE } BOOL;
  10. static char *requestNames[] = { "CancelReservation",
  11. "ChangeAvailability",
  12. "ChangeConfiguration",
  13. "ClearCache",
  14. "ClearChargingProfile",
  15. "DataTransfer",
  16. "GetCompositeSchedule",
  17. "GetConfiguration",
  18. "GetDiagnostics",
  19. "GetLocalListVersion",
  20. "RemoteStartTransaction",
  21. "RemoteStopTransaction",
  22. "ReserveNow",
  23. "Reset",
  24. "SendLocalList",
  25. "SetChargingProfile",
  26. "TriggerMessage",
  27. "UnlockConnector",
  28. "UpdateFirmware" };
  29. static char *responseNames[] = {"Authorize",
  30. "BootNotification",
  31. "DataTransfer",
  32. "DiagnosticsStatusNotification",
  33. "FirmwareStatusNotification",
  34. "Heartbeat",
  35. "MeterValues",
  36. "StartTransaction",
  37. "StatusNotification",
  38. "StopTransaction" };
  39. static FunPtr funs[] = {handleAuthorizeResponse,
  40. handleBootNotificationResponse,
  41. handleDataTransferResponse,
  42. handleDiagnosticsStatusNotificationResponse,
  43. handleFirmwareStatusNotificationResponse,
  44. handleHeartbeatResponse,
  45. handleMeterValuesResponse,
  46. handleStartTransactionResponse,
  47. handleStatusNotificationResponse,
  48. handleStopTransactionnResponse };
  49. static FunCallPtr funcalls[] = {handleCancelReservationRequest,
  50. handleChangeAvailabilityRequest,
  51. handleChangeConfigurationRequest,
  52. handleClearCacheRequest,
  53. handleClearChargingProfileRequest,
  54. handleDataTransferRequest,
  55. handleGetCompositeScheduleRequest,
  56. handleGetConfigurationRequest,
  57. handleGetDiagnosticsRequest,
  58. handleGetLocalListVersionRequest,
  59. handleRemoteStartRequest,
  60. handleRemoteStopTransactionRequest,
  61. handleReserveNowTransactionRequest,
  62. handleResetRequest,
  63. handleSendLocalListRequest,
  64. handleSetChargingProfileRequest,
  65. handleTriggerMessageRequest,
  66. handleUnlockConnectorRequest,
  67. handleUpdateFirmwareRequest };
  68. static FunCallErrorPtr funcallerror[] = { handleError };
  69. //==========================================
  70. // Receive Message routine
  71. //==========================================
  72. void ReceivedMessage(void *in, size_t len)
  73. {
  74. //DEBUG_INFO("ReceivedMessage\n");
  75. char tempin[65536];
  76. int MsgType = 0;
  77. char UniqueId[37],Action[33],Payload[64824],ErrorCode[129],ErrorDescription[513];
  78. char *arr[2]= {};
  79. int gun_index = 0;
  80. const char *del = ",";
  81. char *substr = NULL;
  82. int count = 0;
  83. int i = 0;
  84. char key_value[VALUE_MAX_LENGTH];
  85. //parsing received message and do something
  86. memset(key_value, 0, sizeof key_value);
  87. memset(UniqueId, 0, sizeof UniqueId);
  88. memset(Action, 0, sizeof Action);
  89. memset(Payload, 0, sizeof Payload);
  90. memset(ErrorCode, 0, sizeof ErrorCode);
  91. memset(ErrorDescription, 0, sizeof ErrorDescription);
  92. memset(tempin, 0, 1024*4);
  93. strcpy(tempin, (const char *)in);
  94. memset( (void *)in, 0, sizeof(char)*len );
  95. if(tempin[0] != '\0')
  96. {
  97. if(strcmp((const char *)tempin,"[ ]") == 0)
  98. {
  99. DEBUG_WARN("Message is empty array.\n");
  100. return;
  101. }
  102. json_object *obj = NULL;
  103. obj = json_tokener_parse(tempin);
  104. if(!is_error(obj))
  105. {
  106. MsgType = json_object_get_int(json_object_array_get_idx(obj, 0));
  107. sprintf(UniqueId, "%s", json_object_get_string(json_object_array_get_idx(obj, 1)));
  108. if((MsgType != 2) && (MsgType != 3) && (MsgType != 4) )
  109. {
  110. DEBUG_WARN("Message type not valid.\n");
  111. return;
  112. }
  113. if(UniqueId[0] == '\0')
  114. {
  115. DEBUG_WARN("Message unique id is null.\n");
  116. return;
  117. }
  118. CheckTransactionPacket(UniqueId);
  119. switch (MsgType)
  120. {
  121. case MESSAGE_TYPE_CALL:
  122. sprintf(Action, "%s", json_object_get_string(json_object_array_get_idx(obj, 2)));
  123. sprintf(Payload, "%s", json_object_to_json_string_ext(json_object_array_get_idx(obj, 3), JSON_C_TO_STRING_PLAIN));
  124. CallHandler(UniqueId,Action,Payload);
  125. break;
  126. case MESSAGE_TYPE_CALLRESULT:
  127. sprintf(Payload, "%s", json_object_to_json_string_ext(json_object_array_get_idx(obj, 2), JSON_C_TO_STRING_PLAIN));
  128. if(hashmap_operation(HASH_OP_GET, UniqueId, key_value) == TRUE)
  129. {
  130. hashmap_operation(HASH_OP_REMOVE, UniqueId, key_value);
  131. char * const testdup = strdup(key_value);
  132. substr = strtok(testdup, del);
  133. while (substr != NULL)
  134. {
  135. arr[count] = substr;
  136. count++;
  137. substr = strtok(NULL, del);
  138. }
  139. i=0;
  140. sprintf(Action, "%s", *(arr+i++));
  141. gun_index = atoi(*(arr+i++));
  142. CallResultHandler(Action, Payload, gun_index);
  143. free(testdup);
  144. }
  145. break;
  146. case MESSAGE_TYPE_CALLERROR:
  147. sprintf(ErrorCode, "%s", json_object_get_string(json_object_array_get_idx(obj, 2)));
  148. sprintf(ErrorDescription, "%s", json_object_get_string(json_object_array_get_idx(obj, 3)));
  149. sprintf(Payload, "%s", json_object_to_json_string_ext(json_object_array_get_idx(obj, 4), JSON_C_TO_STRING_PLAIN));
  150. if(hashmap_operation(HASH_OP_GET, UniqueId, key_value) == TRUE)
  151. {
  152. hashmap_operation(HASH_OP_REMOVE, UniqueId, key_value);
  153. sprintf(Action, "%s", key_value);
  154. CallErrorHandler(UniqueId,ErrorCode, ErrorDescription, "");
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. }
  161. else
  162. {
  163. DEBUG_WARN("Message is invalid JSON format.\n");
  164. }
  165. json_object_put(obj);
  166. }
  167. else
  168. {
  169. DEBUG_WARN("Message is null. can't parse message.\n");
  170. }
  171. }
  172. int CallHandler(char *uuid, char *str1,char *payload)
  173. {
  174. static int CallHandlerNumber = 0;
  175. static int CallHandlerIndex = 0;
  176. int (*callfptr)(char *uuid,char *payload);
  177. CallHandlerNumber = sizeof(requestNames)/sizeof(requestNames[0]);
  178. for(int i= 0; i < CallHandlerNumber ; i ++ )
  179. {
  180. if(strcmp(requestNames[i],str1) == 0)
  181. {
  182. CallHandlerIndex = i ;
  183. break;
  184. }
  185. }
  186. callfptr = NULL;
  187. callfptr = funcalls[CallHandlerIndex];
  188. if(callfptr == NULL)
  189. {}
  190. if ( callfptr )
  191. {
  192. callfptr(uuid, payload);
  193. callfptr = NULL;
  194. return PASS;
  195. }
  196. callfptr = NULL;
  197. return FAIL;
  198. }
  199. void CallResultHandler(char *str1, char *payload, int gun_index)
  200. {
  201. static int CallResultHandlerNumber = 0;
  202. static int CallResultHandlerIndex = 0;
  203. void (*callResultfptr)(char *payload, int gun_index );
  204. CallResultHandlerNumber = sizeof(responseNames)/sizeof(responseNames[0]);
  205. for(int i= 0; i < CallResultHandlerNumber ; i ++ )
  206. {
  207. if(strcmp(responseNames[i],str1) == 0)
  208. {
  209. CallResultHandlerIndex = i ;
  210. break;
  211. }
  212. }
  213. callResultfptr = NULL;
  214. callResultfptr = funs[CallResultHandlerIndex];
  215. if(callResultfptr == NULL)
  216. {}
  217. if ( callResultfptr )
  218. {
  219. callResultfptr(payload, gun_index);
  220. }
  221. callResultfptr = NULL;
  222. }
  223. void CallErrorHandler(char *id, char *errorCode, char *errorDescription,char *payload)
  224. {
  225. void (*callErrorfptr)(char *id, char *errorCode, char *errorDescription,char *payload );
  226. callErrorfptr = NULL;
  227. callErrorfptr = funcallerror[0];
  228. if(callErrorfptr == NULL)
  229. {
  230. DEBUG_ERROR("callErrorfptr is null\n");
  231. }
  232. if ( callErrorfptr )
  233. {
  234. callErrorfptr(id, errorCode, errorDescription, payload);
  235. }
  236. callErrorfptr = NULL;
  237. }