Разборка SMS и отправка на e-mail

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Ca6ko
Сообщения: 1484
Зарегистрирован: 23 ноя 2018, 11:08
Откуда: Харкiв

podarok66 писал(а): 05 сен 2021, 16:17 Вы про это?
Шато́ (фр. château)
нет он про эти
Chateau 5G https://mikrotik.com/product/chateau_5g
Chateau LTE12 https://mikrotik.com/product/chateau_lte12


1-е Правило WiFi - Везде где только можно откажитесь от WiFi!
2-е Правило WiFi -Устройство, которое пользователь не носит с собой постоянно, должно подключаться кабелем!!

Микротики есть разные: черные, белые, красные. Но все равно хочется над чем нибудь заморочится.
vovvw
Сообщения: 20
Зарегистрирован: 25 янв 2021, 10:18

podarok66 писал(а): 05 сен 2021, 16:17 Вы про это?
Нет про это RBD53G-5HacD2HnD-TC&EG12-EA
)))


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Признаюсь честно, я про эти устройства не знал и их никогда не видел. В том числе и в чужих руках. Но то, что у eurodk они уже появились в продаже, вселяет уверенность в том, что релиз v7 не за горами. Веселья с переползанием на новую ветку будет много, надо морально готовится :-)


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
vovvw
Сообщения: 20
Зарегистрирован: 25 янв 2021, 10:18

podarok66 писал(а): 06 сен 2021, 18:49 Признаюсь честно, я про эти устройства не знал и их никогда не видел.
Ну скоро год уже в работе, если не считать, что продали с бетой конечный продукт, то в целом все хорошо работает )))


Аватара пользователя
plood
Сообщения: 1
Зарегистрирован: 04 сен 2021, 14:31

vovvw писал(а): 07 сен 2021, 16:38
podarok66 писал(а): 06 сен 2021, 18:49 Признаюсь честно, я про эти устройства не знал и их никогда не видел.
Ну скоро год уже в работе, если не считать, что продали с бетой конечный продукт, то в целом все хорошо работает )))
Да, по началу было много проблем с ним, но с выходом rc билдов жизнь наладилась))
Кстати отличный роутер для города, в Москве агрегация 3 бэндов с билайна, скорость 150-170 мбит/с
Но очень не хватает скрипта для смс на русском. Приходится переставлять симку в свисток от хуавея чтобы прочитать что они там присылают.


SergeyN
Сообщения: 20
Зарегистрирован: 04 ноя 2021, 10:00

Приветствую.

Запустил скрипт на RBD53GR-5HacD2HnD(hAP ac³ LTE6 kit). Все отлично работает. Спасибо!
Но стоило подключить USB 4G модем(E3372h), он в системе сейчас как интерфейс "lte3" скрипт перестал отрабатываться.
Скрипт останавливается сразу после запуска, в консоли выдает:

Код: Выделить всё

#system script run PDUtoEMAIL
failure: Info not supported!
Если погасить "lte3", соответственно скрипт опять начинает работать.
 
переменная extractSmsModem ";(eval / (eval /localdo=;(eval / (eval /localname=$t;value=f=false;r=OK) (eval /ifcondition=(= $1 lte);do=;(eval (eval /setname=(-> $t r);value=(-> (eval (eval /interface lte at-chatas-value=true;input=$3;number=$2;wait=true)) output)))) (eval /ifcondition=(= $1 ppp-client);do=;(eval (eval /setname=(-> $t r);value=(-> (eval (eval /interface ppp-client at-chatas-value=$3;input=$3;number=$2)) output)))) (eval /ifcondition=(!= (~ (-> $t r) ( . (^|
)OK( $ |
))) true);do=;(eval (eval /setname=(-> $t f);value=true));else=;(eval (eval /setname=(-> $t f);value=false))) (eval /returnvalue=$t));name=$chat) (eval /localname=$nameFind;value=(eval (eval /toarrayvalue=))) (eval /foreachcounter=$i;do=;(eval / (eval /ifcondition=(= (eval (eval /interface lte getnumber=$i;value-name=disabled)) false);do=;(eval / (eval /localname=$tmp;value=(eval (eval /interface lte infoas-value=$i;number=$i;once=$i))) (eval /setname=$nameFind;value=(, $nameFind manufacturer=(-> $tmp manufacturer);model=(-> $tmp model);name=(eval (eval /interface lte getnumber=$i;value-name=name));revision=(-> $tmp revision);type=lte)))));in=(eval (eval /interface lte find))) (eval /foreachcounter=$i;do=;(eval / (eval /ifcondition=(= (eval (eval /interface ppp-client getnumber=$i;value-name=disabled)) false);do=;(eval / (eval /localname=$manufacturer) (eval /setname=$nameFind;value=(, $nameFind name=(eval (eval /interface ppp-client getnumber=$i;value-name=name));type=ppp-client)))));in=(eval (eval /interface ppp-client find))) (eval /ifcondition=(= (eval (eval /lenvalue=$nameFind)) 0);do=;(eval (eval /returnvalue=No found Modem))) (eval /localname=$output;value=(eval (<%% (eval /parsevalue=( . ({ " errorStr " =[:tostr " " ]; " arr " =[:toarray " " ]}))) ))) (eval /foreachcounter=$m;do=;(eval / (eval /localname=$tmp) (eval /localname=$tmp2) (eval /localname=$stStart) (eval /localname=$stEnd) (eval /localname=$mode) (eval /docommand=;(eval / (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);ATE0))) (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);ATV1))) (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGF?))) (eval /ifcondition=(-> $tmp f);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGF

)) (<%% bad command name throw (line 49 column 65) throw))) (eval /setname=$stStart;value=(eval (eval /findin=(-> $tmp r);key=+CMGF))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGF

)) (<%% bad command name throw (line 51 column 81) throw))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGF

)) (<%% bad command name throw (line 53 column 79) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=(+ $stStart 7);counter=(-> $tmp r)))) (eval /ifcondition=(= $tmp2 0);do=;(eval (eval /setname=$mode;value=false));else=;(eval (eval /setname=$mode;value=true))) (eval /ifcondition=$mode;do=;(eval (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGF=0))))) (eval /ifcondition=(-> $tmp f);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGF=0

)) (<%% bad command name throw (line 58 column 67) throw))) (eval /localname=$curStruct;value=index=(eval (eval /toarrayvalue=));pdu=(eval (eval /toarrayvalue=))) (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGL=4))) (eval /ifcondition=(! (-> $tmp f));do=;(eval / (eval /localname=$flagend;value=true) (eval /setname=$stStart;value=(eval (eval /findin=(-> $tmp r);key=+CMGL))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (eval /setname=$flagend;value=false))) (eval /setname=$stStart) (eval /whilecondition=$flagend;do=;(eval / (eval /setname=$stStart;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=+CMGL))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGL

)) (<%% bad command name throw (line 78 column 81) throw))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGL

)) (<%% bad command name throw (line 80 column 79) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stStart;counter=(-> $tmp r);end=$stEnd))) (eval /localname=$stat;value=(eval (eval /tonumvalue=(eval (eval /pickbegin=(+ (eval (eval /findin=$tmp2;key=,)) 1);counter=$tmp2))))) (eval /ifcondition=(|| (= $stat 0) (= $stat 1));do=;(eval / (eval /setname=$stStart;value=(eval (eval /findin=$tmp2;key=,,))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (eval /setname=$stStart;value=(+ (eval (eval /findin=$tmp2;key=( . , " " ,))) 4)));else=;(eval (eval /setname=$stStart;value=(+ $stStart 2)))) (eval /localname=$length;value=(eval (eval /tonumvalue=(eval (eval /pickbegin=$stStart;counter=$tmp2;end=(eval (eval /lenvalue=$tmp2))))))) (eval /localname=$index;value=(eval (eval /tonumvalue=(eval (eval /pickbegin=(+ (eval (eval /findin=$tmp2;key= )) 1);counter=$tmp2;end=(eval (eval /findin=$tmp2;key=,))))))) (eval /setname=$stStart;value=(+ $stEnd 2)) (eval /localname=$coretka;value=true) (eval /whilecondition=$coretka;do=;(eval / (eval /ifcondition=(|| (= (eval (eval /pickbegin=$stStart;counter=(-> $tmp r)))
) (= (eval (eval /pickbegin=$stStart;counter=(-> $tmp r)))
));do=;(eval / (eval /setname=$stStart;value=(+ $stStart 1)));else=;(eval (eval /setname=$coretka;value=false))))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGL

)) (<%% bad command name throw (line 95 column 79) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stStart;counter=(-> $tmp r);end=$stEnd))) (eval /setname=$length;value=(* (+ $length 1 (eval (eval /tonumvalue=( . 0x (eval (eval /pickbegin=0;counter=$tmp2;end=2)))))) 2)) (eval /ifcondition=(!= $length (eval (eval /lenvalue=$tmp2)));do=;(eval (eval /setname=$tmp2;value=( . wrong length in CMGL

)) (<%% bad command name throw (line 98 column 74) throw))) (eval /setname=(-> $curStruct pdu);value=(, (-> $curStruct pdu) mode=sms;name=(-> $m name);pdu=$tmp2)) (eval /setname=(-> $curStruct index);value=(, (-> $curStruct index) $index)))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stEnd;counter=(-> $tmp r);end=(eval (eval /lenvalue=(-> $tmp r)))))) (eval /ifcondition=(&& (!= (~ $tmp2 ( . \ +CMGL)) true) (= (~ $tmp2 ( . (^|
)OK( $ |
))) true));do=;(eval (eval /setname=$flagend;value=false))))));else=;(eval (eval /localname=$simFill) (eval /docommand=;(eval / (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGD=?))) (eval /ifcondition=(-> $tmp f);do=;(eval (<%% bad command name throw (line 108 column 23) throw))) (eval /setname=$stStart;value=(eval (eval /findin=(-> $tmp r);key=+CMGD))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (<%% bad command name throw (line 110 column 39) throw))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (<%% bad command name throw (line 112 column 37) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stStart;counter=(-> $tmp r);end=$stEnd))) (eval /setname=$stStart;value=(eval (eval /findin=$tmp2;key=())) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (<%% bad command name throw (line 115 column 39) throw))) (eval /setname=$stEnd;value=(eval (eval /findin=$tmp2;key=)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (<%% bad command name throw (line 117 column 37) throw))) (eval /setname=$simFill;value=(eval (eval /toarrayvalue=(eval (eval /pickbegin=(+ $stStart 1);counter=$tmp2;end=$stEnd))))));on-error=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGD=?

)) (<%% bad command name throw (line 119 column 57) throw))) (eval /foreachcounter=$i;do=;(eval (eval /docommand=;(eval / (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);( . AT+CMGR= (eval (eval /tostrvalue=$i)))))) (eval /ifcondition=(-> $tmp f);do=;(eval (<%% bad command name throw (line 122 column 23) throw))) (eval /setname=$stStart;value=(eval (eval /findin=(-> $tmp r);key=+CMGR))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (<%% bad command name throw (line 124 column 39) throw))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (<%% bad command name throw (line 126 column 37) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stStart;counter=(-> $tmp r);end=$stEnd))) (eval /localname=$stat;value=(eval (eval /tonumvalue=(eval (eval /pickbegin=(+ (eval (eval /findin=$tmp2;key= )) 1);counter=$tmp2))))) (eval /ifcondition=(|| (= $stat 0) (= $stat 1));do=;(eval / (eval /setname=$stStart;value=(eval (eval /findin=$tmp2;key=,,))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stStart)) num);do=;(eval (eval /setname=$stStart;value=(+ (eval (eval /findin=$tmp2;key=( . , " " ,))) 4)));else=;(eval (eval /setname=$stStart;value=(+ $stStart 2)))) (eval /localname=$length;value=(eval (eval /tonumvalue=(eval (eval /pickbegin=$stStart;counter=$tmp2;end=(eval (eval /lenvalue=$tmp2))))))) (eval /setname=$stStart;value=(+ $stEnd 2)) (eval /localname=$coretka;value=true) (eval /whilecondition=$coretka;do=;(eval / (eval /ifcondition=(|| (= (eval (eval /pickbegin=$stStart;counter=(-> $tmp r)))
) (= (eval (eval /pickbegin=$stStart;counter=(-> $tmp r)))
));do=;(eval / (eval /setname=$stStart;value=(+ $stStart 1)));else=;(eval (eval /setname=$coretka;value=false))))) (eval /setname=$stEnd;value=(eval (eval /findfrom=$stStart;in=(-> $tmp r);key=( .

)))) (eval /ifcondition=(!= (eval (eval /typeofvalue=$stEnd)) num);do=;(eval (<%% bad command name throw (line 140 column 37) throw))) (eval /setname=$tmp2;value=(eval (eval /pickbegin=$stStart;counter=(-> $tmp r);end=$stEnd))) (eval /setname=$length;value=(* (+ $length 1 (eval (eval /tonumvalue=( . 0x (eval (eval /pickbegin=0;counter=$tmp2;end=2)))))) 2)) (eval /ifcondition=(!= $length (eval (eval /lenvalue=$tmp2)));do=;(eval (<%% bad command name throw (line 143 column 35) throw))) (eval /setname=(-> $curStruct pdu);value=(, (-> $curStruct pdu) mode=sms;name=(-> $m name);pdu=$tmp2)) (eval /setname=(-> $curStruct index);value=(, (-> $curStruct index) $i)))));on-error=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGR= $i ; simfill= (eval (eval /tostrvalue=$simFill))

)) (<%% bad command name throw (line 146 column 92) throw))));in=$simFill))) (eval /ifcondition=(> (eval (eval /lenvalue=(-> $curStruct index))) 0);do=;(eval / (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGD=1,1))) (eval /ifcondition=(-> $tmp f);do=;(eval / (eval /foreachcounter=$i;do=;(eval / (eval /localname=$iterError;value=5) (eval /whilecondition=(> $iterError 0);do=;(eval / (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);( . AT+CMGD= (eval (eval /tostrvalue=$i)))))) (eval /setname=$iterError;value=(- $iterError 1)) (eval /ifcondition=(! (-> $tmp f));do=;(eval (eval /setname=$iterError;value=0))))) (eval /ifcondition=(-> $tmp f);do=;(eval (eval /ifcondition=(!= (~ (-> $m model) R11e) true);do=;(eval / (eval /setname=$tmp2;value=( . wrong answer in CMGD

)) (<%% bad command name throw (line 159 column 40) throw));else=;(eval (eval /setname=(-> $tmp f);value=false))))));in=(-> $curStruct index)))))) (eval /ifcondition=$mode;do=;(eval (eval /setname=$tmp;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CMGF=1))))) (eval /ifcondition=(-> $tmp f);do=;(eval (eval /setname=$tmp2;value=( . wrong answer to AT+CMGF=1

)) (<%% bad command name throw (line 163 column 67) throw))) (eval /ifcondition=(> (eval (eval /lenvalue=(-> $curStruct index))) 0);do=;(eval / (eval /setname=(-> $output arr);value=(, (-> $output arr) (-> $curStruct pdu))))));on-error=;(eval / (eval /localname=$es;value=(-> $tmp r)) (eval /ifcondition=(= (-> $m type) ppp-client);do=;(eval / (eval /localname=$man;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+GMI))) (eval /ifcondition=(-> $man f);do=;(eval (eval /setname=$man;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CGMI))))) (eval /ifcondition=(-> $man f);do=;(eval (eval /setname=$man;value=no information));else=;(eval (eval /setname=$man;value=(-> $man r)))) (eval /localname=$mod;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+GMM))) (eval /ifcondition=(-> $mod f);do=;(eval (eval /setname=$mod;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CGMM))))) (eval /ifcondition=(-> $mod f);do=;(eval (eval /setname=$mod;value=no information));else=;(eval (eval /setname=$mod;value=(-> $mod r)))) (eval /localname=$rev;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+GMR))) (eval /ifcondition=(-> $rev f);do=;(eval (eval /setname=$rev;value=(eval (<%% $chat (> $chat);(-> $m type);(-> $m name);AT+CGMR))))) (eval /ifcondition=(-> $rev f);do=;(eval (eval /setname=$rev;value=no information));else=;(eval (eval /setname=$rev;value=(-> $rev r)))) (eval /setname=$m;value=(, $m manufacturer=$man;model=$mod;revision=$rev)))) (eval /setname=(-> $output errorStr);value=( . (-> $output errorStr) Modem: (eval (eval /tostrvalue=$m))

Error: $tmp2 Returned:

$es

)))));in=$nameFind) (eval /returnvalue=$output))"


pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Честно слово - забыл уже что там и как. Возможно не работает

Код: Выделить всё

/interface lte info lte3
на данном модеме
Ось 6?


SergeyN
Сообщения: 20
Зарегистрирован: 04 ноя 2021, 10:00

Да, не работает.

Код: Выделить всё

[admin@MT-G] > /interface lte info lte3
failure: Info not supported!
Ось 6.49.
Может тогда как-то исключить обработку интерфейса lte3?


pepelxl
Сообщения: 161
Зарегистрирован: 23 июл 2013, 18:47

Вставить исключение в этот цикл

Код: Выделить всё

# ищем модемы lte
:foreach i in=[/interface lte find] do={
if ([/interface lte get $i value-name=disabled] = false) do={
:local tmp [/interface lte info $i once as-value]
:set $nameFind ($nameFind , {{"name"=[/interface lte get $i value-name=name];"type"="lte";"manufacturer"=($tmp->"manufacturer");"model"=($tmp->"model");"revision"=($tmp->"revision")}})
}}
Или заполнить руками, тогда скрипт пойдёт дальше.


xan
Сообщения: 9
Зарегистрирован: 13 дек 2020, 23:58

plood писал(а): 18 сен 2021, 16:33 Но очень не хватает скрипта для смс на русском. Приходится переставлять симку в свисток от хуавея чтобы прочитать что они там присылают.
Поставьте временно этот скрипт из первой части viewtopic.php?f=1&t=7711

Код: Выделить всё

#Скрипт пересылки SMS на email. 
# Автор: pepelxl, 07.2019.
# Немного памятки:
# из модема sms можно извлечь в двух режимах – PDU и text
# Текст передаётся в трёх кодировках :
# 7bit – 160 символов
# 8bit – 140 символов
# UCS2 – 70 символов
# в режиме text,  модем сам распарсит sms из 7bit и 8bit, но не сможет распасить ucs2.
# Мой скрип работает с режимом  text, из минусов: 
# - нет возможности сортировать и склеивать сообщения.
# - 7bit базируется на кодировке alphabet, не известно как передаст модем символы отличные от ANSII
# - 8bit может содержать кодировки на национальных языках, опять же проблема поведения и передачи символов.
# Обработчик ошибок так и не осилил, возможно сделаю позже.
# UCS2 по байтно совместим с UTF-16(базис план, 2byte), можно слать его сразу на почту,
# но тогда придётся разбивать шапку и тело, а поскольку национальное sms
# как правило состоит из нескольких  штук, - будет не удобно.
# Кроме того, не все почтовые клиенты правильно обрабатывают ucs2.
# скрипт конвертирует UCS2 в UTF-8 и отсылает собранные sms в один email.
# текст будет в том же виде, как и пришел.
# cкрипт проверялся на оборудовании: Huawei me909, basebox2, routerOS  6.45.1(на более
# ранних версиях присутствует баг извлечения sms из модема).




#:log info "Running...";
# Переводим модем в режим чтения TEXT
/interface lte at-chat lte1 input="AT+CMGF=1";
# Читаем все сообщения
:local content [/interface lte at-chat lte1 input="AT+CMGL=\"all\"" as-value];
# Извлекаем элемент массива output в переменную
:set content ($content->"output");
# Проверяем, что сообщение есть
:if ([:len $content]>2) do={

:local lineEnd;
:local lineStart;
:local line "";
:local smsTo "";
:local smsDate "";
:local smsBody "";
:local ucs2text true;
:local outUtf "";
:local emailBody "";
:local flagEnd true;

:while ($flagEnd) do={
#ищем начало SMS
:set lineStart [ find $content "+CMGL:" $lineStart ] ;
# Проверяем что поиск завершился успешно
:if ([ typeof $lineStart ]="num") do={
	# Ищем конец SMS
	:set $lineEnd [ find $content "+CMGL:" $lineStart ];
	:if ([ typeof $lineEnd ] = "nil") do={
	:set $lineEnd [ find $content "OK" $lineStart ];
	};
	# вынимаем сообщение
	:set line [ pick $content $lineStart ($lineEnd - 1) ];
	# вынимаем телефон отправителя
	:set $smsTo [ pick $line ([:find $line "\",\""] + 3) ([:find $line ",,"] - 1)];
	# вынимаем дату
	:set $smsDate [ pick $line ([:find $line ",,"] + 3) ([:find $line "\n"] - 2)];
	# вынимаем тело
	:set smsBody [:pick $line ([:find $line "\n"]+1) ([:len $line]-1)];
	
	
	# проверяем в каком формате находится тело
	:local iter [:len $smsBody];
	:local hexCap "0123456789ABCDEF";
	:while ($iter > 0) do={
		:if ([:typeof [:find $hexCap [:pick $smsBody ($iter - 1) $iter]]] != "num") do={
			:set $ucs2text false;
			:set $iter 0;};
		:set $iter ($iter - 1);
	};
	
	# Следующий блок конвертирует usc2 в utf-8
	:if ($ucs2text) do={
		:set $outUtf;
		:local symbolsHex {"\00";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";"\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";"\20";"\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\30";"\31";"\32";"\33";"\34";"\35";"\36";"\37";"\38";"\39";"\3A";"\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\41";"\42";"\43";"\44";"\45";"\46";"\47";"\48";"\49";"\4A";"\4B";"\4C";"\4D";"\4E";"\4F";"\50";"\51";"\52";"\53";"\54";"\55";"\56";"\57";"\58";"\59";"\5A";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\61";"\62";"\63";"\64";"\65";"\66";"\67";"\68";"\69";"\6A";"\6B";"\6C";"\6D";"\6E";"\6F";"\70";"\71";"\72";"\73";"\74";"\75";"\76";"\77";"\78";"\79";"\7A";"\7B";"\7C";"\7D";"\7E";"\7F";"\80";"\81";"\82";"\83";"\84";"\85";"\86";"\87";"\88";"\89";"\8A";"\8B";"\8C";"\8D";"\8E";"\8F";"\90";"\91";"\92";"\93";"\94";"\95";"\96";"\97";"\98";"\99";"\9A";"\9B";"\9C";"\9D";"\9E";"\9F";"\A0";"\A1";"\A2";"\A3";"\A4";"\A5";"\A6";"\A7";"\A8";"\A9";"\AA";"\AB";"\AC";"\AD";"\AE";"\AF";"\B0";"\B1";"\B2";"\B3";"\B4";"\B5";"\B6";"\B7";"\B8";"\B9";"\BA";"\BB";"\BC";"\BD";"\BE";"\BF";"\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";"\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";"\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";"\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF"};
		:for curposition from=0 to=[:len $smsBody] step=4 do={
		:local i [:tonum ("0x".[:pick $smsBody $curposition ($curposition +4)])];
		:if ($i < 0x80) do={
		:set $outUtf ($outUtf.($symbolsHex->$i));
		};
		:if (($i >= 0x80) and ($i < 0x800)) do={
		:local byteA (($i >> 6) | 192);
		:local byteB (($i & 63) | 128);
		:set $outUtf ($outUtf.($symbolsHex->$byteA).($symbolsHex->$byteB));
		};
		:if ($i >= 0x800) do={
		:local byteA (($i >> 12) | 224);
		:local byteB ((($i >> 6) & 63) | 128);
		:local byteC (($i & 63) | 128);
		:set $outUtf ($outUtf.($symbolsHex->$byteA).($symbolsHex->$byteB).($symbolsHex->$byteC));
		};
		};
	} else={:set $outUtf $smsBody;};
	
	########## Здесь собираем тело письма в нужной последовательности ######
	:set $emailBody ($emailBody."from: ".$smsTo."\r\nDate: ".$smsDate."\r\nMessage: ".$outUtf."\r\n\r\n");
	
	#######################################################################
	
	# Возвращаем флаг формата sms для следующего сообщения.
	:set $ucs2text true;
	# Останавливаем цикл, если прочитано последнее сообщение
	} else={ :set $flagEnd false;};
	};
	#Отправляем письмо
	:if ( [:len $emailBody] > 0 ) do={/tool e-mail send to=ВАШ@mail.ru subject="Mikrotik\r\nMIME-Version: 1.0\r\nContent-Type: text/plain; charset=utf-8" body=$emailBody;
		:delay 10s;
		#Удаляем все прочитанные sms
		:if ( [ /tool e-mail get last-status ] = "succeeded") do={/interface lte at-chat lte1 input="at+cmgd=1,2";};
	};
};
/interface lte at-chat lte1 input="AT+CMGF=0";
#:log info "END";


Ответить