This commit is contained in:
cfif 2024-12-04 13:10:49 +03:00
commit 051a5f2431
8 changed files with 523 additions and 0 deletions

60
Inc/AtGsmSms_Utils.h Normal file
View File

@ -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

195
Src/AtGsmSms_UtilsPdu.c Normal file
View File

@ -0,0 +1,195 @@
//
// Created by xemon on 28.11.22.
//
#include <memory.h>
#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;
}

View File

@ -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;
}
}
}

View File

@ -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;
}

11
Tst/CMakeLists.txt Normal file
View File

@ -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)

33
Tst/modular.json Normal file
View File

@ -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"
}
]
}

136
Tst/test_module.c Normal file
View File

@ -0,0 +1,136 @@
//
// Created by zemon on 22.03.23.
//
#include <stdio.h>
#include <AsciiStringParsingUtils.h>
#include <AtGsmSms_Utils.h>
//#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);
}

22
modular.json Normal file
View File

@ -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"
]
}
}