Community discussions

 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Help on script to extract SMS inbox text message

Mon May 25, 2009 12:46 pm

Hi,

I am figuring out what scripts can extract out the /tool sms inbox get

text messages.

I try /tool sms inbox get 0 text.....but fail.
Last edited by melwong on Mon May 25, 2009 3:06 pm, edited 1 time in total.
 
User avatar
mrz
MikroTik Support
MikroTik Support
Posts: 5921
Joined: Wed Feb 07, 2007 12:45 pm
Location: Latvia
Contact:

Re: Help on script to extract SMS inbox text message

Mon May 25, 2009 1:30 pm

In scripts you can't use id numbers displayed by console. Use find instead.
 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Re: Help on script to extract SMS inbox text message

Mon May 25, 2009 3:08 pm

In scripts you can't use id numbers displayed by console. Use find instead.
How do you use "find: for id numbers ? Pardon me because i am very new to the scripts. I do have some script programming experience.

Is it /tool sms inbox find 0 ?

Thanks
 
User avatar
mrz
MikroTik Support
MikroTik Support
Posts: 5921
Joined: Wed Feb 07, 2007 12:45 pm
Location: Latvia
Contact:

Re: Help on script to extract SMS inbox text message

Mon May 25, 2009 3:17 pm

No you can't use console numbers at all. for example you can write

:foreach i in=[/tool sms inbox find] do={
:put [/tool sms inbox get $i text]
}
 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Re: Help on script to extract SMS inbox text message

Mon May 25, 2009 5:15 pm

No you can't use console numbers at all. for example you can write

:foreach i in=[/tool sms inbox find] do={
:put [/tool sms inbox get $i text]
}
Hi mrz,

Thanks a lot. I have found this Mikrotik script documentation http://www.mikrotik.com/testdocs/ros/2. ... ipting.php
Wish this link could be made into sticky in this forum.
 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Re: Help on script to extract SMS inbox text message

Tue May 26, 2009 5:14 am

No you can't use console numbers at all. for example you can write

:foreach i in=[/tool sms inbox find] do={
:put [/tool sms inbox get $i text]
}

I have an issue on your given example. It always fail to print out the last item in the list. Any workarounds ?
 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Re: Help on script to extract SMS inbox text message

Tue May 26, 2009 5:27 am

Ok, i have confirm it as a bug in 3.24 sms inbox list.

Theres a missing null terminating item in the sms inbox list compare to other lists such as ip address list.

Please recommend a temporary workaround.
 
User avatar
normis
MikroTik Support
MikroTik Support
Posts: 24142
Joined: Fri May 28, 2004 11:04 am
Location: Riga, Latvia

Re: Help on script to extract SMS inbox text message

Tue May 26, 2009 1:39 pm

melwong, you are using the wrong documentation. RouterOS v2.9 is old, if you use v3.23 then you should use this documentation link:

http://wiki.mikrotik.com/wiki/Scripting
http://wiki.mikrotik.com/wiki/Scripting-examples
No answer to your question? How to write posts
 
melwong
newbie
Topic Author
Posts: 36
Joined: Tue Mar 10, 2009 11:43 am

Re: Help on script to extract SMS inbox text message

Tue May 26, 2009 3:53 pm

melwong, you are using the wrong documentation. RouterOS v2.9 is old, if you use v3.23 then you should use this documentation link:

http://wiki.mikrotik.com/wiki/Scripting
http://wiki.mikrotik.com/wiki/Scripting-examples

Hi Normis, Thanks a lot for the links. Really appreciated it.

I am now exploring the new 3.24 /tool sms inbox items.
Any suggestion on scripting to extract out the sms text and send to email out ?

Most guys uses email to sms services. But i want to do it the other way. SMS to email services.

Is that any interrupt to trigger when a new sms appears in the inbox ?
Right now, i can only think of periodically (using scheduler) command "find" on the sms inbox items to get the latest updated sms entry.
 
gabriel
just joined
Posts: 1
Joined: Thu Sep 21, 2006 12:00 pm
Location: Madrid
Contact:

Re: Help on script to extract SMS inbox text message

Mon Jul 20, 2009 1:10 pm

the command "find" count correctly, but "get" can´t get the correct information, said: "item not such"
I think that is a bug in the v.3.24, but also in the v.3.27.
Is it possible to control what the last phone number in "inbox"?

Thanks
 
wcypierre
just joined
Posts: 3
Joined: Sun Dec 27, 2015 11:14 am

Re: Help on script to extract SMS inbox text message

Sun Dec 27, 2015 11:17 am

I found that you need to add [] to make the listing of inbox messages work for the snippet above.

It would be like this
:foreach i in=[/tool sms inbox find] do={
:put [/tool sms inbox get [$i text]];
}
Tested on RouterOS 6.33.3
 
parham
newbie
Posts: 27
Joined: Sun Feb 15, 2015 11:35 pm

Re: Help on script to extract SMS inbox text message

Fri Mar 22, 2019 4:25 pm

Changed the your@domain.com to your reception email

:foreach i in=[/tool sms inbox find] do={
/tool e-mail send to=your@domain.com subject=[/tool sms inbox get number=$i phone] body=[/tool sms inbox get number=$i message];
/tool sms inbox remove $i;
}
 
pepelxl
just joined
Posts: 10
Joined: Tue Jul 23, 2013 6:59 pm

Re: Help on script to extract SMS inbox text message

Fri Jul 26, 2019 1:18 pm

International SMS in encoding UCS2
#Скрипт пересылки 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=your@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";};
	};
};
#:log info "END";

Who is online

Users browsing this forum: No registered users and 8 guests