payload name added to the transport protocol

This commit is contained in:
Bogdan Pilyugin 2025-01-24 13:26:31 +02:00
parent 94af947d1f
commit 0687a6a981
2 changed files with 39 additions and 38 deletions

View File

@ -98,6 +98,7 @@ typedef struct
time_t time; time_t time;
int msgType; int msgType;
int payloadType; int payloadType;
char payloadName[32];
void *payload; void *payload;
unsigned char sha256[32]; unsigned char sha256[32];
} parsedData; } parsedData;

View File

@ -16,14 +16,15 @@
* \version 1.0 * \version 1.0
* \date 2023-07-26 * \date 2023-07-26
* \author Bogdan Pilyugin * \author Bogdan Pilyugin
* \brief * \brief
* \details * \details
* \copyright Apache License, Version 2.0 * \copyright Apache License, Version 2.0
*/ */
#include "webguiapp.h" #include "webguiapp.h"
#include "SystemApplication.h" #include "SystemApplication.h"
#include "mbedtls/md.h" #include "mbedtls/md.h"
#include <string.h>
#define TAG "SysComm" #define TAG "SysComm"
@ -59,13 +60,14 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
jwObj_string(&jwc, "time", time); jwObj_string(&jwc, "time", time);
jwObj_int(&jwc, "msgtype", DATA_MESSAGE_TYPE_RESPONSE); jwObj_int(&jwc, "msgtype", DATA_MESSAGE_TYPE_RESPONSE);
jwObj_int(&jwc, "payloadtype", MSG->parsedData.payloadType); jwObj_int(&jwc, "payloadtype", MSG->parsedData.payloadType);
jwObj_string(&jwc, "payloadname", MSG->parsedData.payloadName);
jwObj_object(&jwc, "payload"); jwObj_object(&jwc, "payload");
jwObj_int(&jwc, "applytype", 0); jwObj_int(&jwc, "applytype", 0);
jwObj_object(&jwc, "variables"); jwObj_object(&jwc, "variables");
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'variables'", &result);
if (result.dataType == JREAD_OBJECT) if (result.dataType == JREAD_OBJECT)
{ //Write variables { // Write variables
char VarName[VAR_MAX_NAME_LENGTH]; char VarName[VAR_MAX_NAME_LENGTH];
char *VarValue = malloc(VAR_MAX_VALUE_LENGTH); char *VarValue = malloc(VAR_MAX_VALUE_LENGTH);
if (!VarValue) if (!VarValue)
@ -73,9 +75,7 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
for (int i = 0; i < result.elements; ++i) for (int i = 0; i < result.elements; ++i)
{ {
jRead_string(MSG->inputDataBuffer, "{'data'{'payload'{'variables'{*", VarName, jRead_string(MSG->inputDataBuffer, "{'data'{'payload'{'variables'{*", VarName, VAR_MAX_NAME_LENGTH, &i);
VAR_MAX_NAME_LENGTH,
&i);
const char parsevar[] = "{'data'{'payload'{'variables'{'"; const char parsevar[] = "{'data'{'payload'{'variables'{'";
char expr[sizeof(parsevar) + VAR_MAX_NAME_LENGTH]; char expr[sizeof(parsevar) + VAR_MAX_NAME_LENGTH];
strcpy(expr, parsevar); strcpy(expr, parsevar);
@ -89,7 +89,7 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
esp_err_t res = ESP_ERR_INVALID_ARG; esp_err_t res = ESP_ERR_INVALID_ARG;
rest_var_types tp = VAR_ERROR; rest_var_types tp = VAR_ERROR;
if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND) if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_COMMAND)
{ //Write variables { // Write variables
res = SetConfVar(VarName, VarValue, &tp); res = SetConfVar(VarName, VarValue, &tp);
if (tp != VAR_FUNCT) if (tp != VAR_FUNCT)
{ {
@ -101,20 +101,18 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
tp = VAR_ERROR; tp = VAR_ERROR;
} }
} }
} }
else else
{ //Read variables { // Read variables
res = GetConfVar(VarName, VarValue, &tp); res = GetConfVar(VarName, VarValue, &tp);
if (res != ESP_OK) if (res != ESP_OK)
strcpy(VarValue, esp_err_to_name(res)); strcpy(VarValue, esp_err_to_name(res));
} }
//Response with actual data // Response with actual data
if (tp == VAR_STRING || tp == VAR_IPADDR || tp == VAR_ERROR || tp == VAR_PASS) if (tp == VAR_STRING || tp == VAR_IPADDR || tp == VAR_ERROR || tp == VAR_PASS)
jwObj_string(&jwc, VarName, VarValue); jwObj_string(&jwc, VarName, VarValue);
else else
jwObj_raw(&jwc, VarName, VarValue); jwObj_raw(&jwc, VarName, VarValue);
} }
free(VarValue); free(VarValue);
} }
@ -123,24 +121,23 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
jwEnd(&jwc); jwEnd(&jwc);
jwEnd(&jwc); jwEnd(&jwc);
GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); GetSysErrorDetales((sys_error_code)MSG->err_code, &err_br, &err_desc);
jwObj_string(&jwc, "error", (char*) err_br); jwObj_string(&jwc, "error", (char *)err_br);
jwObj_string(&jwc, "error_descr", (char*) err_desc); jwObj_string(&jwc, "error_descr", (char *)err_desc);
jwEnd(&jwc); jwEnd(&jwc);
char *datap = strstr(MSG->outputDataBuffer, "\"data\":"); char *datap = strstr(MSG->outputDataBuffer, "\"data\":");
if (datap) if (datap)
{ {
datap += sizeof("\"data\":") - 1; datap += sizeof("\"data\":") - 1;
SHA256hmacHash((unsigned char*) datap, strlen(datap), (unsigned char*) "mykey", sizeof("mykey"), SHA256hmacHash((unsigned char *)datap, strlen(datap), (unsigned char *)"mykey", sizeof("mykey"), MSG->parsedData.sha256);
MSG->parsedData.sha256);
unsigned char sha_print[32 * 2 + 1]; unsigned char sha_print[32 * 2 + 1];
BytesToStr(MSG->parsedData.sha256, sha_print, 32); BytesToStr(MSG->parsedData.sha256, sha_print, 32);
sha_print[32 * 2] = 0x00; sha_print[32 * 2] = 0x00;
#if REAST_API_DEBUG_MODE #if REAST_API_DEBUG_MODE
ESP_LOGI(TAG, "SHA256 of DATA object is %s", sha_print); ESP_LOGI(TAG, "SHA256 of DATA object is %s", sha_print);
#endif #endif
jwObj_string(&jwc, "signature", (char*) sha_print); jwObj_string(&jwc, "signature", (char *)sha_print);
} }
else else
return SYS_ERROR_SHA256_DATA; return SYS_ERROR_SHA256_DATA;
@ -150,7 +147,7 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
jRead(MSG->inputDataBuffer, "{'data'{'payload'{'applytype'", &result); jRead(MSG->inputDataBuffer, "{'data'{'payload'{'applytype'", &result);
if (result.elements == 1) if (result.elements == 1)
{ {
int atype = atoi((char*) result.pValue); int atype = atoi((char *)result.pValue);
switch (atype) switch (atype)
{ {
case 0: case 0:
@ -159,17 +156,16 @@ static sys_error_code PayloadDefaultTypeHandler(data_message_t *MSG)
WriteNVSSysConfig(GetSysConf()); WriteNVSSysConfig(GetSysConf());
if (CustomSaveConf != NULL) if (CustomSaveConf != NULL)
CustomSaveConf(); CustomSaveConf();
break; break;
case 2: case 2:
WriteNVSSysConfig(GetSysConf()); WriteNVSSysConfig(GetSysConf());
if (CustomSaveConf != NULL) if (CustomSaveConf != NULL)
CustomSaveConf(); CustomSaveConf();
DelayedRestart(); DelayedRestart();
break; break;
default: default:
return SYS_ERROR_PARSE_APPLYTYPE; return SYS_ERROR_PARSE_APPLYTYPE;
} }
} }
else else
{ {
@ -194,8 +190,7 @@ static sys_error_code DataHeaderParser(data_message_t *MSG)
jRead_string(MSG->inputDataBuffer, "{'data'", hashbuf, MSG->inputDataLength, 0); jRead_string(MSG->inputDataBuffer, "{'data'", hashbuf, MSG->inputDataLength, 0);
if (strlen(hashbuf) > 0) if (strlen(hashbuf) > 0)
{ {
SHA256hmacHash((unsigned char*) hashbuf, strlen(hashbuf), (unsigned char*) "mykey", sizeof("mykey"), SHA256hmacHash((unsigned char *)hashbuf, strlen(hashbuf), (unsigned char *)"mykey", sizeof("mykey"), MSG->parsedData.sha256);
MSG->parsedData.sha256);
unsigned char sha_print[32 * 2 + 1]; unsigned char sha_print[32 * 2 + 1];
BytesToStr(MSG->parsedData.sha256, sha_print, 32); BytesToStr(MSG->parsedData.sha256, sha_print, 32);
sha_print[32 * 2] = 0x00; sha_print[32 * 2] = 0x00;
@ -210,22 +205,19 @@ static sys_error_code DataHeaderParser(data_message_t *MSG)
return SYS_ERROR_PARSE_DATA; return SYS_ERROR_PARSE_DATA;
} }
jRead(MSG->inputDataBuffer, "{'signature'", &result); jRead(MSG->inputDataBuffer, "{'signature'", &result);
if (result.elements == 1) if (result.elements == 1)
{ {
#if REAST_API_DEBUG_MODE #if REAST_API_DEBUG_MODE
ESP_LOGI(TAG, "Signature is %.*s", 64, (char* )result.pValue); ESP_LOGI(TAG, "Signature is %.*s", 64, (char *)result.pValue);
#endif #endif
//Here compare calculated and received signature; // Here compare calculated and received signature;
} }
else else
return SYS_ERROR_PARSE_SIGNATURE; return SYS_ERROR_PARSE_SIGNATURE;
// Extract 'messidx' or throw exception
//Extract 'messidx' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'msgid'", &result); jRead(MSG->inputDataBuffer, "{'data'{'msgid'", &result);
if (result.elements == 1) if (result.elements == 1)
{ {
@ -252,11 +244,11 @@ static sys_error_code DataHeaderParser(data_message_t *MSG)
else else
strcpy(MSG->parsedData.dstID, "FFFFFFFF"); strcpy(MSG->parsedData.dstID, "FFFFFFFF");
//Extract 'msgtype' or throw exception // Extract 'msgtype' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'msgtype'", &result); jRead(MSG->inputDataBuffer, "{'data'{'msgtype'", &result);
if (result.elements == 1) if (result.elements == 1)
{ {
MSG->parsedData.msgType = atoi((char*) result.pValue); MSG->parsedData.msgType = atoi((char *)result.pValue);
if (MSG->parsedData.msgType > DATA_MESSAGE_TYPE_RESPONSE || MSG->parsedData.msgType < DATA_MESSAGE_TYPE_COMMAND) if (MSG->parsedData.msgType > DATA_MESSAGE_TYPE_RESPONSE || MSG->parsedData.msgType < DATA_MESSAGE_TYPE_COMMAND)
return SYS_ERROR_PARSE_MSGTYPE; return SYS_ERROR_PARSE_MSGTYPE;
if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_RESPONSE) if (MSG->parsedData.msgType == DATA_MESSAGE_TYPE_RESPONSE)
@ -265,21 +257,29 @@ static sys_error_code DataHeaderParser(data_message_t *MSG)
else else
return SYS_ERROR_PARSE_MSGTYPE; return SYS_ERROR_PARSE_MSGTYPE;
//Extract 'payloadtype' or throw exception // Extract 'payloadtype' or throw exception
jRead(MSG->inputDataBuffer, "{'data'{'payloadtype'", &result); jRead(MSG->inputDataBuffer, "{'data'{'payloadtype'", &result);
if (result.elements == 1) if (result.elements == 1)
{ {
MSG->parsedData.payloadType = atoi((char*) result.pValue); MSG->parsedData.payloadType = atoi((char *)result.pValue);
} }
else else
return SYS_ERROR_PARSE_PAYLOADTYPE; return SYS_ERROR_PARSE_PAYLOADTYPE;
jRead(MSG->inputDataBuffer, "{'data'{'payloadname'", &result);
if (result.elements == 1)
{
jRead_string(MSG->inputDataBuffer, "{'data'{'payloadname'", MSG->parsedData.payloadName, 31, 0);
}
else
strcpy(MSG->parsedData.payloadName, "notset");
sys_error_code err = SYS_ERROR_HANDLER_NOT_SET; sys_error_code err = SYS_ERROR_HANDLER_NOT_SET;
switch (MSG->parsedData.payloadType) switch (MSG->parsedData.payloadType)
{ {
case PAYLOAD_DEFAULT: case PAYLOAD_DEFAULT:
err = PayloadDefaultTypeHandler(MSG); err = PayloadDefaultTypeHandler(MSG);
break; break;
} }
if (err != SYS_ERROR_HANDLER_NOT_SET) if (err != SYS_ERROR_HANDLER_NOT_SET)
return err; return err;
@ -314,7 +314,7 @@ esp_err_t ServiceDataHandler(data_message_t *MSG)
if (MSG->err_code == SYS_GOT_RESPONSE_MESSAGE) if (MSG->err_code == SYS_GOT_RESPONSE_MESSAGE)
{ {
//ToDo Here handler of received data // ToDo Here handler of received data
#if REAST_API_DEBUG_MODE #if REAST_API_DEBUG_MODE
ESP_LOGI(TAG, "Got response message with msgid=%d", (int)MSG->parsedData.msgID); ESP_LOGI(TAG, "Got response message with msgid=%d", (int)MSG->parsedData.msgID);
#endif #endif
@ -336,9 +336,9 @@ esp_err_t ServiceDataHandler(data_message_t *MSG)
jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE); jwObj_int(&jwc, "messtype", DATA_MESSAGE_TYPE_RESPONSE);
const char *err_br; const char *err_br;
const char *err_desc; const char *err_desc;
GetSysErrorDetales((sys_error_code) MSG->err_code, &err_br, &err_desc); GetSysErrorDetales((sys_error_code)MSG->err_code, &err_br, &err_desc);
jwObj_string(&jwc, "error", (char*) err_br); jwObj_string(&jwc, "error", (char *)err_br);
jwObj_string(&jwc, "error_descr", (char*) err_desc); jwObj_string(&jwc, "error_descr", (char *)err_desc);
jwEnd(&jwc); jwEnd(&jwc);
jwClose(&jwc); jwClose(&jwc);
} }