Community discussions

MUM Europe 2020
 
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: 5965
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: 5965
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: 24417
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: 32
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: 13
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";
 
drummah
just joined
Posts: 1
Joined: Fri Feb 14, 2020 11:55 am

Re: Help on script to extract SMS inbox text message

Fri Feb 14, 2020 12:06 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";

This script is working good, but there is an issue: it will work good only one time. Since it changes LTE modem to SMS TEXT mode - after 1st successful run - Mikrotik board will recieve an empty SMS messages every time after. Even with plain english letters. To avoid this, you need to add the following line before "#:log info "END";", so the end of the final script will look like:
--------------------
/interface lte at-chat lte1 input="AT+CMGF=0";

#:log info "END";
---------------------
The bold command will return lte modem to it's PDU SMS mode. Then it will work like charm, also I've added this script to scheduler each 60 seconds. So I'm getting every new SMS on my e-mail. (don't forget to change "send to=your@mail.ru" with your e-mail address).

tested on Mikrotik LHG LTE kit: https://mikrotik.com/product/lhg_lte_kit
Router OS version: 6.43.3

Cheers!)

Who is online

Users browsing this forum: No registered users and 18 guests