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"