Вам надо попробовать добавить в вызовы внутри функции extractSmsModem аргумент wait.
Вот функция
Код: Выделить всё
:global extractSmsModem do={
# Функция должна принимать один аргумент со значениями “read” или “clear”.
# При “read” возвращать должна один из трёх вариантов:
# 1 - Строку “NO SMS” в случаи отсутствия sms
# 2 - Строку с текстом ошибки при сбоях в выполнении функции
# 3 - Массив из строк PDU
# При “clear” должно вернутся булевое значение
# true - при удачном стирании sms из памяти
# false - если стереть sms не удалось
# название интерфейса
:local nameIf lte1
:local mode
:local tmp
:local content [:toarray ""]
:if ($action = "read") do={
do {
# CMGF - 0 PDU mode (default value); 1 Text mode
:set $tmp [/interface lte at-chat $nameIf input="AT+CMGF\?" as-value wait=yes]
:set $tmp ($tmp->"output")
:if ([:pick $tmp 0 5] = "+CMGF") do={:set $tmp [:tonum [:pick $tmp 7]]} else={:set $content "function extractSmsModem; wrong answer to CMGF?"; throw;}
:if ($tmp = 0) do={:set $mode false} else={:set $mode true}
:if ($mode) do={/interface lte at-chat $nameIf input="AT+CMGF=0"}
# CMGL read sms
# 0 Received unread messages
# 1 Received read messages
# 2 Stored unsent messages
# 3 Stored sent messages
# 4 All messages
:set $tmp [/interface lte at-chat $nameIf input="AT+CMGL=4" as-value wait=yes]
:set $tmp ($tmp->"output")
:if ($tmp = "OK") do={:set $content "NO SMS"; throw;}
:if ([:pick $tmp 0 5] != "+CMGL") do={:set $content "function extractSmsModem; wrong answer to CMGL"; throw;
} else={
:local flagEnd true
:local lineEnd
:local lineStart
:local line ""
:while ($flagEnd) do={
#ищем начало SMS
:set $lineStart [:find $tmp "+CMGL:" $lineStart]
# Проверяем что поиск завершился успешно
:if ([ typeof $lineStart ]="num") do={
# Ищем конец SMS
:set $lineEnd [:find $tmp "+CMGL:" $lineStart]
:if ([ typeof $lineEnd ] = "nil") do={
:set $lineEnd [:find $tmp "OK" $lineStart]}
# вынимаем сообщение
:set $line [:pick $tmp $lineStart ($lineEnd - 1)]
# вынимаем направление sms
:local stat [:tonum [:pick $line ([:find $line ","] + 1) [:find $line ",,"]]]
# поскольку флаги MTI в PDU для исходящих и входящих сообщений имеют разное значение, извлекать надо обязательно ВХОДЯЩИЕ сообщения
# since the flags MTI in the PDU for outgoing and incoming messages have different meanings, it is necessary to extract INCOMING messages
:if (($stat = 0) or ($stat = 1)) do={
:local length [:tonum [ pick $line ([:find $line ",,"] + 2) ([:find $line "\n"] - 1)]]
:set $length (($length + 1 + [:tonum ("0x".[ pick $line ([:find $line "\n"] + 1) ([:find $line "\n"] + 3)])]) * 2)
:local pdu [:pick $line ([:find $line "\n"] + 1) ([:len $line] - 1)]
:if ($length != [:len $pdu]) do={:set $content "function extractSmsModem; wrong length in CMGL"; throw;}
:set $content ($content , $pdu)
}} else={ :set $flagEnd false}}}
} on-error={}
:if ($mode) do={/interface lte at-chat $nameIf input="AT+CMGF=1"}
:return $content
}
# удаляем прочитанные сообщения
:if ($action = "clear") do={:set $tmp [/interface lte at-chat $nameIf input="at+cmgd=1,1" as-value wait=yes]}
:set $tmp ($tmp->"output")
:if ($tmp = "OK") do={:return true} else={:return false}
}
Код: Выделить всё
:put [/interface lte info 0 once as-value]