module SIM800

This commit is contained in:
Mit4el
2024-03-17 21:27:51 +03:00
parent cf099b0db6
commit 403535b8d6
3 changed files with 276 additions and 0 deletions

View File

@@ -432,6 +432,10 @@
"path": "src/modules/exec/SDcard", "path": "src/modules/exec/SDcard",
"active": false "active": false
}, },
{
"path": "src/modules/exec/SIM800",
"active": false
},
{ {
"path": "src/modules/exec/SmartBoiler", "path": "src/modules/exec/SmartBoiler",
"active": false "active": false

View File

@@ -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<IoTValue> &param)
{
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;
}
}

View File

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