Главная страница \ Статьи \ Администрирование сетей \ Reading SMS on Mikrotik

Reading SMS on Mikrotik

Version: Eng | Rus

I faced with an issue how to read an SMS from Mikrotik's LTE modem (HAP ax lite LTE, L41G-2axD&FG621-EA). Problem was operators sends sms with non-latin charset. And it was represented in Mikrotik's UI as "????????".

I was looking for more information and found that I can list SMS using a terminal.

Just click "New Terminal" on a left panel, then print:

/interface/lte
at-chat lte1 input="AT+CMGF=1"
at-chat lte1 input="AT+CMGL=\"ALL\""

After that you will see list of messages. But they will be encoded just as a hex numbers.

To convert it to a non-latin characters you can use this script on a Python:

"""
Reading on Mikrotik:
1. New Terminal
2. /interface/lte
3. at-chat lte1 input="AT+CMGF=1"
4. at-chat lte1 input="AT+CMGL=\"ALL\""
5. at-chat lte1 input="AT+CMGF=0"
"""

sms = """[TEXT FROM MIKROTIK'S TERMINAL]"""

def decode_sms(msg):
    line = bytearray(b'')
    msg = msg.replace('\r','')
    msg = msg.replace('\n','')
    msg = msg.replace(' ' ,'')
    for idx in range(len(msg)//2):
      line.append(int(f"0x{msg[idx*2]}{msg[idx*2+1]}", 16))
    return bytes(line).decode('utf_16_be')

msg_accum = ''
for line in sms.split('\n'):
    if '+CMGL' in line:
        msg_info = line.split(',')
        print(f'{msg_info[2]} {msg_info[4]} {msg_info[5]}')
        print(decode_sms(msg_accum))
        msg_accum = ''
    else:
        msg_accum += line

if msg_accum != '':
    print(decode_sms(msg_accum))

And remember to call next command to allow Mikrotik's interface work with SMS Inbox:

at-chat lte1 input="AT+CMGF=1"

Чтение СМС на Микротике

Как-то, работая с имеющимся оборудованием, мне потребовалось прочитать текст СМС, полученные с помощью встроенного LTE модема (HAP ax lite LTE, L41G-2axD&FG621-EA). Но проблема проявилась в том, что оператор шлёт смс в русскими буквами. Так что я вижу в интерфейса Mikrotik просто "????????" вместо текста.

Немного поискав я нашёл, что можно прочитать СМС с помощью АТ-команд прямо к модему из терминала.

Итак, жмём "New Terminal" на левой панели и пишем:

/interface/lte
at-chat lte1 input="AT+CMGF=1"
at-chat lte1 input="AT+CMGL=\"ALL\""

После этого будут выведены СМС, но не в виде текста, а закодированные в виде 16-х чисел.

Чтобы сконвертировать эти данные я накидал простой скрипт на Python, который разбирает исходный текст и просто выводит в консоль:

"""
Reading on Mikrotik:
1. New Terminal
2. /interface/lte
3. at-chat lte1 input="AT+CMGF=1"
4. at-chat lte1 input="AT+CMGL=\"ALL\""
5. at-chat lte1 input="AT+CMGF=0"
"""

sms = """[TEXT FROM MIKROTIK'S TERMINAL]"""

def decode_sms(msg):
    line = bytearray(b'')
    msg = msg.replace('\r','')
    msg = msg.replace('\n','')
    msg = msg.replace(' ' ,'')
    for idx in range(len(msg)//2):
      line.append(int(f"0x{msg[idx*2]}{msg[idx*2+1]}", 16))
    return bytes(line).decode('utf_16_be')

msg_accum = ''
for line in sms.split('\n'):
    if '+CMGL' in line:
        msg_info = line.split(',')
        print(f'{msg_info[2]} {msg_info[4]} {msg_info[5]}')
        print(decode_sms(msg_accum))
        msg_accum = ''
    else:
        msg_accum += line

if msg_accum != '':
    print(decode_sms(msg_accum))

Чтобы после этих манипуляций SMS Inbox мог снова работать, нужно выполнить в терминале команду:

at-chat lte1 input="AT+CMGF=1"
Powered by Elise