diff --git a/myProfile.json b/myProfile.json index e3875499..7e303157 100644 --- a/myProfile.json +++ b/myProfile.json @@ -432,6 +432,10 @@ "path": "src/modules/exec/SDcard", "active": false }, + { + "path": "src/modules/exec/SIM800", + "active": false + }, { "path": "src/modules/exec/SmartBoiler", "active": false diff --git a/src/modules/exec/SIM800/SIM800.cpp b/src/modules/exec/SIM800/SIM800.cpp new file mode 100644 index 00000000..9c868763 --- /dev/null +++ b/src/modules/exec/SIM800/SIM800.cpp @@ -0,0 +1,186 @@ + +#include "Global.h" +#include "classes/IoTUart.h" + +class Sim800 : public IoTUart +{ +private: + bool _debug; + String _number; + char _inc; + String _inStr = ""; // буфер приема строк + +public: + Sim800(String parameters) : IoTUart(parameters) + { + _number = jsonReadStr(parameters, "number"); + jsonRead(parameters, "debug", _debug); + } + + void _printUart(bool ln, String str) + { + if (!_myUART) + return; + if (!ln) + { + _myUART->print(str); + if (_debug) + SerialPrint("I", F("SIM800"), "<- print(" + str + ")"); + } + else + { + _myUART->println(str); + if (_debug) + SerialPrint("I", F("SIM800"), "<- println(" + str + ")"); + } + } + + void sendSms(String sms, String num) + { + _printUart(1, "AT+CMGF=1"); // переводим в текстовый режим + _printUart(1, "AT+CMGS=\"" + num + "\""); + _printUart(1, sms + "\r\n" + String((char)26)); + // _myUART->print((char)26); // код ctrl+c что является командой передачи сообщения + } + + void doByInterval() + { + if (_myUART) + { + // _myUART->println("AT"); // должен ответить OK + // _myUART->println("AT+CSQ"); // уровень сигнала в dB + // _myUART->println("AT+CCID"); // если есть сим карта, то вернет её номер + //_printUart(1, "AT+COPS?"); //+COPS: 0,0,"MTS-RUS" - оператор + _printUart(1, "AT+CPAS"); //+CPAS: 0 - готов к работе + //_printUart(1, "AT+CREG?"); // проверка регистрации в сети, второй паратетр: 1-регистрация в сети, 5-роуминг + // _myUART->println("ATI"); // имя модуля и его номер + } + } + + void uartHandle() + { + if (!_myUART) + return; + + if (_myUART->available()) + { + _inc = _myUART->read(); + + if (_inc == '\r') + { + _inStr += _inc; + if (_debug) + SerialPrint("I", F("SIM800"), "-> " + _inStr); + return; + } + + if (_inc == '\n') + { + // SerialPrint("I", F("SIM800"), "-> " + _inStr); + if (_inStr.indexOf("CPAS") != -1) + { + if (_inStr.indexOf("+CPAS: 0") != -1) + setValue("OK"); + else + setValue("NO"); + return; + } + } + else + _inStr += _inc; + } + } + + IoTValue execute(String command, std::vector ¶m) + { + if (!_myUART) + return {}; + if (command == "sms") + { + if (param.size() == 1) + { + sendSms(param[0].valS, _number); + } + else if (param.size() == 2) + { + sendSms(param[0].valS, param[1].valS); + } + } + // отправка кирилических символов на Nextion (русские буквы) + else if (command == "print") + { + if (param.size() == 2) + { + String strToUart = ""; + strToUart = param[0].valS; + + if (param[1].valD) + _printUart(0, "\"" + strToUart + "\""); + else + _printUart(0, strToUart); + } + if (param.size() == 3) + { + String strToUart = ""; + strToUart = param[0].valS; + + if (param[2].valD) + _printUart(0, strToUart + "\"" + param[1].valS + "\""); + else + _printUart(0, strToUart + param[1].valS); + } + } + else if (command == "println") + { + if (param.size() == 2) + { + String strToUart = ""; + strToUart = param[0].valS; + + if (param[1].valD) + _printUart(1, "\"" + strToUart + "\""); + else + _printUart(1, strToUart); + } + if (param.size() == 3) + { + String strToUart = ""; + strToUart = param[0].valS; + + if (param[2].valD) + _printUart(1, strToUart + "\"" + param[1].valS + "\""); + else + _printUart(1, strToUart + param[1].valS); + } + } + else if (command == "printHex") + { + unsigned char Hi, Lo; + uint8_t byteTx; + const char *strPtr = param[0].valS.c_str(); + while ((Hi = *strPtr++) && (Lo = *strPtr++)) + { + byteTx = (ChartoHex(Hi) << 4) | ChartoHex(Lo); + _myUART->write(byteTx); + } + if (_debug) + SerialPrint("I", F("SIM800"), "<- printHex(" + String(byteTx, HEX) + ")"); + } + + return {}; + } + + ~Sim800(){}; +}; + +void *getAPI_SIM800(String subtype, String param) +{ + if (subtype == F("sim800")) + { + return new Sim800(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/exec/SIM800/modinfo.json b/src/modules/exec/SIM800/modinfo.json new file mode 100644 index 00000000..959879ed --- /dev/null +++ b/src/modules/exec/SIM800/modinfo.json @@ -0,0 +1,86 @@ +{ + "menuSection": "executive_devices", + "configItem": [ + { + "global": 0, + "name": "SIM800", + "type": "Reading", + "subtype": "sim800", + "id": "sim", + "widget": "anydataDef", + "page": "Состояние", + "descr": "Sim в сети", + "int": 5, + "tx": 17, + "rx": 16, + "line": 2, + "speed": 115200, + "number": "+71234567890", + "debug": 0 + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mit4bmw", + "authorGit": "https://github.com/Mit4el", + "specialThanks": "", + "moduleName": "SIM800", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 15 + }, + "title": "SIM800", + "moduleDesc": "Оправка AT-команд в модуль SIM800L. Отправка sms сообщений через модуль", + "propInfo": { + "int": "Период опроса состояния модуля SIM800", + "tx": "TX пин", + "rx": "RX пин", + "speed": "Скорость UART", + "line": "Актуально только для ESP32: номер линии hardUART. =2 rx=16 tx=17, для SoftwarwSerial в ESP32 line = -1", + "number": "Номер телефона для отправки sms сообщения" + }, + "funcInfo": [ + { + "name": "sms", + "descr": "Отправить sms сообщение. Например sim.sms(\"сообщение\") или sim.sms(\"сообщение\", \"+7999999\")", + "params": [ + "Строка текста", + "Номер телефона, если не указывать будет отправлено на номер number из конфигурации" + ] + }, + { + "name": "print", + "descr": "Отправить в UART строку текста (AT-команду). Например sim.print(\"AT\",0)", + "params": [ + "Строка текста", + "ID Виджета или любое значение, не обязательно", + "1 - обернуть строку в кавычки, 0 - отправить без кавычек (При наличии второго параметра оборачивает только его)" + ] + }, + { + "name": "println", + "descr": "Отправить в UART строку текста (AT-команду) и признак завершения строки (перевод строки). Например sim.println(\"AT+CMGS=\", \"+799999\", 1);", + "params": [ + "Строка текста", + "ID Виджета или любое значение, не обязательно", + "1 - обернуть строку в кавычки, 0 - отправить без кавычек (Пр наличии второго параметра оборачивает только его)" + ] + }, + { + "name": "printHex", + "descr": "Отправить в UART HEX-строку.", + "params": [ + "HEX-строка." + ] + } + ] + }, + "defActive": false, + "usedLibs": { + "esp32_4mb": [], + "esp32_4mb3f": [], + "esp32*": [], + "esp82*": [] + } +} \ No newline at end of file