commit 051a5f243128246ab481343f01e45b5d9cbfa07e Author: cfif Date: Wed Dec 4 13:10:49 2024 +0300 Init diff --git a/Inc/AtGsmSms_Utils.h b/Inc/AtGsmSms_Utils.h new file mode 100644 index 0000000..457bd34 --- /dev/null +++ b/Inc/AtGsmSms_Utils.h @@ -0,0 +1,60 @@ +// +// Created by xemon on 28.11.22. +// + +#ifndef UVEOS_ON_NATION_ATGSMSMS_UTILS_H +#define UVEOS_ON_NATION_ATGSMSMS_UTILS_H + +#include "AtGsmSms.h" + +AtCommandResult AtGsmSms_UtilsSendTextMessage( + tAtCmd *env, + + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + char *messageText, + uint8_t messageTextSize +); + +#define AtGsmSms_UtilsSendTextMessageStatic(ENV, SRV, PHN, MSG) \ +AtGsmSms_UtilsSendTextMessage(ENV,SRV, sizeof(SRV)-1, PHN, sizeof(PHN)-1, MSG, sizeof(MSG)-1) + +AtCommandResult AtGsmSms_BildPduData(char *pduPacket, uint16_t inpLenMes, char *pduDecodData, uint16_t *pduDecodLen); + +AtCommandResult AtGsmSms_UtilsSendPduData( + tAtCmd *env, + + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + uint8_t *binaryData, + uint8_t binaryDataSize +); + +AtCommandResult AtGsmSms_UtilsSendPduText( + tAtCmd *env, + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + char *textString, + uint8_t textStringSize +); + +AtCommandResult AtGsmSms_UtilsReadPduData( + tAtCmd *env, + uint8_t *binaryData, + uint16_t *binaryDataSize, + uint8_t binaryDataLimit +); + +#endif //UVEOS_ON_NATION_ATGSMSMS_UTILS_H diff --git a/Src/AtGsmSms_UtilsPdu.c b/Src/AtGsmSms_UtilsPdu.c new file mode 100644 index 0000000..53d42bf --- /dev/null +++ b/Src/AtGsmSms_UtilsPdu.c @@ -0,0 +1,195 @@ +// +// Created by xemon on 28.11.22. +// + +#include +#include "AtGsmSms_Utils.h" +#include "AsciiStringParsingUtils.h" +#include "stdbool.h" +#include "AtCmdCommonProtected.h" +#include "SimpleIndelibleMalloc.h" +#include "SmsEncoderDecoder.h" + +static AtCommandResult AtGsmSms_UtilsSendOnePdu(tAtCmd *env, uint8_t bufSmsId, char *pduBody) { + + uint8_t offset = 0; + + uint8_t serviceCenterPrefixSize = 0; + + uint8_t pduServiceCenterSize = iAsciiStringParseHexByte((pduBody + offset * 2)); + offset += 1; + serviceCenterPrefixSize += 1; + + if (pduServiceCenterSize) { + uint8_t pduServiceCenterAddressType = iAsciiStringParseHexByte((pduBody + offset * 2)); + offset += 1; + serviceCenterPrefixSize += 1; + +// ServiceCenterAddress + offset += pduServiceCenterSize; + serviceCenterPrefixSize += pduServiceCenterSize; + } + + //Flags + offset += 1; //add pdu flags byte + //Message Reference + offset += 1; //add MR byte + + + //Destination Address Length + uint8_t pduAddressLen = iAsciiStringParseHexByte((pduBody + offset * 2)); + offset += 1; + //Destination Address Type + offset += 1; // byte + + //Destination Address + pduAddressLen = pduAddressLen / 2 + pduAddressLen % 2; + offset += pduAddressLen; + + + //Protocol Identifier + offset += 1; //add PID byte + + //Data Coding Schema + offset += 1; //add encoding byte + + if (false) { + //Validity Period + offset += 1; + } + + //User Data Length + uint8_t pduDataLen = iAsciiStringParseHexByte((pduBody + offset * 2)); + + + uint8_t pduFullLen = offset + pduDataLen; + uint8_t pduLen = pduFullLen - pduServiceCenterSize; + + pduFullLen += 1;//add pduDataLen byte to fullLen + + AT_INOKR(AtGsmSms_DeleteById(env, bufSmsId)); + AT_INOKR(AtGsmSms_WriteNewPduSms(env, pduBody, pduFullLen * 2, pduLen)); + AT_INOKR(AtGsmSms_SendById(env, bufSmsId)); + + return AT_OK; +} + +AtCommandResult AtGsmSms_BildPduData(char *pduPacket, uint16_t inpLenMes, char *pduDecodData, uint16_t *pduDecodLen) { + uint8_t SMS_BUFFER[1024 * 4]; + tSimpleIndelibleMalloc simpleMalloc; + tSmsPdu smsPdu; + + SimpleIndelibleMalloc_Init(&simpleMalloc, SMS_BUFFER, sizeof(SMS_BUFFER)); + SimpleIndelibleMalloc_Clear(&simpleMalloc); + tMemAllocInterface memInterface = SimpleIndelibleMalloc_GetInterface(&simpleMalloc); + tSmsPdu_Init(&smsPdu, &memInterface); + tSMS_Struct res; + + res = SmsPdu_Decode(&smsPdu, pduPacket, inpLenMes); + + *pduDecodLen = res.UDL * 2; + if (*pduDecodLen) { + memcpy(pduDecodData, res.UD, *pduDecodLen); + return AT_OK; + } else { + return AT_ERROR; + } +} + +AtCommandResult AtGsmSms_UtilsSendPduData( + tAtCmd *env, + + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + uint8_t *binaryData, + uint8_t binaryDataSize +) { + uint8_t SMS_BUFFER[1024 * 4]; + tSimpleIndelibleMalloc simpleMalloc; + tSmsPdu smsPdu; + + SimpleIndelibleMalloc_Init(&simpleMalloc, SMS_BUFFER, sizeof(SMS_BUFFER)); + SimpleIndelibleMalloc_Clear(&simpleMalloc); + tMemAllocInterface memInterface = SimpleIndelibleMalloc_GetInterface(&simpleMalloc); + tSmsPdu_Init(&smsPdu, &memInterface); + + if(AtGsmSms_SetMode(env, AT_GSM_SMS_MODE_PDU) != AT_OK){ + return 0; + } + if(AtGsmSms_SetServiceCenter(env, servNumber, servNumberSize) != AT_OK){ + return 0; + } + AT_INOKR(AtGsmSms_SetMode(env, AT_GSM_SMS_MODE_PDU)); + AT_INOKR(AtGsmSms_SetServiceCenter(env, servNumber, servNumberSize)); + + char nullPhone[phoneNumberSize + 1]; + memcpy(nullPhone, phoneNumber, phoneNumberSize); + nullPhone[phoneNumberSize] = 0; + + char hexDataString[1 + (binaryDataSize * 2)]; + size_t hexDataLen = 0; + vAsciiStringAddBytesAsHex(hexDataString, &hexDataLen, binaryData, binaryDataSize); + hexDataString[hexDataLen] = 0; + + tPDUS *pdus = SmsPdu_Encode(&smsPdu, nullPhone, hexDataString, NULL, BIT8_HEX); + + for (unsigned int i = 0; i < pdus->count; i++) { + + AtCommandResult result = AtGsmSms_UtilsSendOnePdu(env, 1, pdus->PDU[i]); + if (result != AT_OK) { + return result; + } + } + + return AT_OK; +} + + +AtCommandResult AtGsmSms_UtilsSendPduText( + tAtCmd *env, + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + char *textString, + uint8_t textStringSize +) { + uint8_t SMS_BUFFER[1024 * 4]; + tSimpleIndelibleMalloc simpleMalloc; + tSmsPdu smsPdu; + + SimpleIndelibleMalloc_Init(&simpleMalloc, SMS_BUFFER, sizeof(SMS_BUFFER)); + SimpleIndelibleMalloc_Clear(&simpleMalloc); + tMemAllocInterface memInterface = SimpleIndelibleMalloc_GetInterface(&simpleMalloc); + tSmsPdu_Init(&smsPdu, &memInterface); + + char nullPhone[phoneNumberSize + 1]; + memcpy(nullPhone, phoneNumber, phoneNumberSize); + nullPhone[phoneNumberSize] = 0; + + char nullText[textStringSize + 1]; + memcpy(nullText, textString, textStringSize); + nullText[textStringSize] = 0; + + AT_INOKR(AtGsmSms_SetMode(env, AT_GSM_SMS_MODE_PDU)); + AT_INOKR(AtGsmSms_SetServiceCenter(env, servNumber, servNumberSize)); + + tPDUS *pdus = SmsPdu_Encode(&smsPdu, nullPhone, nullText, NULL, UCS2); + + for (unsigned int i = 0; i < pdus->count; i++) { + + AtCommandResult result = AtGsmSms_UtilsSendOnePdu(env, 1, pdus->PDU[i]); + if (result != AT_OK) { + return result; + } + + } + + return AT_OK; +} diff --git a/Src/AtGsmSms_UtilsReadPduData.c b/Src/AtGsmSms_UtilsReadPduData.c new file mode 100644 index 0000000..98ee67e --- /dev/null +++ b/Src/AtGsmSms_UtilsReadPduData.c @@ -0,0 +1,40 @@ +// +// Created by zemon on 27.12.22. +// + +#include "AtGsmSms_ReedOneNewPdu.h" +#include "AtGsmSms_Utils.h" +#include "AsciiStringParsingUtils.h" + +AtCommandResult AtGsmSms_UtilsReadPduData( + tAtCmd *env, + uint8_t *binaryData, + uint16_t *binaryDataSize, + uint8_t binaryDataLimit +) { + char hexPdu[255]; + uint8_t hexPduSize = 0; + + char hexPduData[255]; + uint16_t hexPduDataSize = 0; + + if (AtGsmSms_ReedOneNewPdu(env, hexPdu, &hexPduSize, sizeof(hexPdu)) != AT_OK) { + return AT_ERROR; + } else { + + if ((hexPduSize / 2) > binaryDataLimit) { + return AT_ERROR; + } + + if (AtGsmSms_BildPduData(hexPdu, hexPduSize, hexPduData, &hexPduDataSize) != AT_OK) { + return AT_ERROR; + } else { + *binaryDataSize = (uint16_t) iAsciiStringParseHexBytes(binaryData, hexPduData, hexPduDataSize); + + return AT_OK; + } + + } + +} + diff --git a/Src/AtGsmSms_UtilsTextMessage.c b/Src/AtGsmSms_UtilsTextMessage.c new file mode 100644 index 0000000..130e94b --- /dev/null +++ b/Src/AtGsmSms_UtilsTextMessage.c @@ -0,0 +1,26 @@ +// +// Created by xemon on 28.11.22. +// + +#include "AtGsmSms_Utils.h" +#include "AtCmdCommonProtected.h" + +AtCommandResult AtGsmSms_UtilsSendTextMessage( + tAtCmd *env, + + char *servNumber, + uint8_t servNumberSize, + + char *phoneNumber, + uint8_t phoneNumberSize, + + char *messageText, + uint8_t messageTextSize +) { + + AT_INOKR(AtGsmSms_SetMode(env, AT_GSM_SMS_MODE_TEXT)); + AT_INOKR(AtGsmSms_SetServiceCenter(env, servNumber, servNumberSize)); + AT_INOKR(AtGsmSms_SendText(env, phoneNumber, phoneNumberSize, messageText, messageTextSize)); + + return AT_OK; +} \ No newline at end of file diff --git a/Tst/CMakeLists.txt b/Tst/CMakeLists.txt new file mode 100644 index 0000000..0ab65dd --- /dev/null +++ b/Tst/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.17) +project(Module C) + +set(CMAKE_C_STANDARD 11) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ") + +include(modular.cmake) + +add_executable(test_module ${SOURCES} test_module.c) +target_link_libraries(test_module PRIVATE m) diff --git a/Tst/modular.json b/Tst/modular.json new file mode 100644 index 0000000..253d653 --- /dev/null +++ b/Tst/modular.json @@ -0,0 +1,33 @@ +{ + "dep": [ + { + "type": "local", + "dir": "../" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "ArrayPrint" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "AsciiStringParsingUtils" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "SystemDelayLinux" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "LinuxStrnstr" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "EraGlonassUveos" + } + ] +} \ No newline at end of file diff --git a/Tst/test_module.c b/Tst/test_module.c new file mode 100644 index 0000000..b5b3d8d --- /dev/null +++ b/Tst/test_module.c @@ -0,0 +1,136 @@ +// +// Created by zemon on 22.03.23. +// + +#include +#include +#include +//#include "ArrayPrint.h" +#include "EraGlonassUveos.h" + +void dummyGetNavData(void *env, EraGlonassUveosNavData *navData) { + +} + +void dummyGetTime(void *env, uint32_t *time) { + +} + +bool dummySendDataPdu(void *env, char *phone, uint8_t phoneSize, uint8_t *data, uint16_t dataSize) { + return true; +} + +void dummyEraGlonassForceDumpCall(void *env) { + +} + +bool wcomp = true; + +void printfLoggerGenericMethod( + void *env, + char *authorStatic, + uint8_t authorLen, + eLoggerLevel loglevel, + char *msg, + uint16_t msgLen, + bool complete +) { + if (wcomp) { + printf("[%.*s]\t\t", authorLen, authorStatic); + printf(" "); + } + printf("%.*s", msgLen, msg); + if (complete) { + printf("\n"); + } + wcomp = complete; +} + + +////--------------------------------------- Примеры sms-pdu ------------------------------------------------------------ +//пример полученый с ivs.aoglonass +char hexPdu[] = "07919714180010F3040B919714111190F7000432302231033221350100000B0028000A00013D1D000A00010A0000000404331A00500A000000A9010000000100420D0237393431383130303032357D82"; + +//пример из лога с полинома, послано с rohde-schwartz +// char hexPdu[] = "04804523F1040A808051563412000432404131303240270100000B001A000600015513000600400404331000500600000000000000000000022302302FAE"; +// char hexPdu[] = "04804523F1040A8080515634120004324041318175402A0100000B001D000A00017516000A00400404331300500A0000000000000000000002230235353535852C"; +////-------------------------------------------------------------------------------------------------------------------- + +////--------------------------------------- Примеры sms-pdu ------------------------------------------------------------ + + + + +void test_pdu_and_egts_parser(tEraGlonassUveos *uveos) { + LoggerInfoStatic(uveos->logger, "тест", "") + LoggerInfoStatic(uveos->logger, "тест", "Тест парсера sms-pdu и егтс парсера") + + char hexPduData[140]; + uint16_t hexPduDataSize = 0; + + uint8_t binaryData[255]; + uint16_t binaryDataSize; + + + AtGsmSms_BildPduData((char *) hexPdu, sizeof(hexPdu) - 1, hexPduData, &hexPduDataSize); + + binaryDataSize = (uint16_t) iAsciiStringParseHexBytes(binaryData, hexPduData, hexPduDataSize); + + EraGlonassUveos_ProcessEgtsPacket(uveos, binaryData, binaryDataSize); +} + +void test_egts_parser_only(tEraGlonassUveos *uveos) { + LoggerInfoStatic(uveos->logger, "тест", "") + LoggerInfoStatic(uveos->logger, "тест", "Тест только егтс парсера по готовому егтс пакету") + + printf("TEST BEGIN\n"); + //пример егтс пакета с коммандой (вырезан из sms-pdu) + BIN_FROM_HEX(binData, binDataLen, "0100000B001A000600015513000600400404331000500600000000000000000000022302302FAE"); + +// ArrayPrint_Hex(binData, binDataLen); + + EraGlonassUveos_ProcessEgtsPacket(uveos, binData, binDataLen); + +} + + +int main() { + //инициализация всего необходимого для УВЭОС + tEraGlonassMsdTable table; + tUveosGostSettings settings; + tEraGlonassUveos uveos; + tNavDataProvider navDataProvider = { + .getTime = dummyGetTime, + .getNavData = dummyGetNavData + }; + tEraGlonassSmsProvider smsProvider = { + .sendDataPdu = dummySendDataPdu + }; + + tEraGlonassUveosDumperInterface dumper = { + .forceDump = dummyEraGlonassForceDumpCall + }; + tLoggerInterface logger = { + .logging =printfLoggerGenericMethod + }; + +// EraGlonassUveos_Init( +// &uveos, +// &logger, +// &table, +// &settings, +// &dumper, +// &navDataProvider, +// NULL, +// &smsProvider, +// NULL, +// NULL, +// NULL, +// NULL, +// NULL +// ); + + test_pdu_and_egts_parser(&uveos); + + test_egts_parser_only(&uveos); +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..8c8ea7f --- /dev/null +++ b/modular.json @@ -0,0 +1,22 @@ +{ + "dep": [ + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "AtGsmSms" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "SimpleIndelibleMalloc" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file