Привет! Я пытаюсь отправить SMS через RBSXTR (RouterOS v7.1.3) по API (с использованием библиотеки gopkg.in/routeros.v2 на Go). Большая часть работает, но при отправке текста «Hellö!» происходит ошибка — приходит просто «Hell!» (номер телефона я замаскировал по понятным причинам):
// опускаю обработку ошибок для краткости
client, _ := routeros.Dial("192.168.0.123", "api", "apipassword")
client.Run("/tool/sms/send", "=port=lte1", "=phone-number=+4917611111111", "=message=Hellö!")
В tcpdump я вижу, что запрос API содержит символ ö (0xC3B6 в UTF-8 кодировке):
В логах встречаются такие записи:
12:34:48 lte,async lte1: sent AT+CMGS=17\r
12:34:48 lte,async lte1: sent 0021000D91947116111111F1001105C8329B1D02\0x1a
12:34:49 lte,async,event lte1: +CMGS: 65
12:34:49 lte,async lte1: rcvd +CMGS: 65
12:34:49 lte,async lte1: rcvd OK
12:34:50 lte,async,event lte1: +CDS: 27\r
12:34:50 lte,async,event 079194710600400706410d91947116111111f12220122143354022201221 4345400000
CMGS PDU 0021000D91947116111111F1001105C8329B1D02 уже содержит только сообщение «Hell!».
Согласно GSM спецификации (3GPP TS 23.038, «Alphabets and language-specific information», § 6.2.1 GSM 7 bit Default Alphabet, стр. 20), символ ö должен кодироваться как 0x7C (до упаковки и полуоктального кодирования).
В одном посте от 2012 года предлагается преобразовать строку сообщения в Windows-1252, но и это не сработало (ö = 0xF6).
По моему мнению, команда /tool/sms/send производит очистку входных данных и вырезает этот символ. Есть ли способ обойти это?
Я также пробовал напрямую отправлять низкоуровневую команду AT+CMGS через /interface/lte/at-chat, но не смог заставить маршрутизатор принять команду — не понял, как передать порт LTE в качестве аргумента.
// опускаю обработку ошибок для краткости
client, _ := routeros.Dial("192.168.0.123", "api", "apipassword")
client.Run("/tool/sms/send", "=port=lte1", "=phone-number=+4917611111111", "=message=Hellö!")
В tcpdump я вижу, что запрос API содержит символ ö (0xC3B6 в UTF-8 кодировке):
В логах встречаются такие записи:
12:34:48 lte,async lte1: sent AT+CMGS=17\r
12:34:48 lte,async lte1: sent 0021000D91947116111111F1001105C8329B1D02\0x1a
12:34:49 lte,async,event lte1: +CMGS: 65
12:34:49 lte,async lte1: rcvd +CMGS: 65
12:34:49 lte,async lte1: rcvd OK
12:34:50 lte,async,event lte1: +CDS: 27\r
12:34:50 lte,async,event 079194710600400706410d91947116111111f12220122143354022201221
CMGS PDU 0021000D91947116111111F1001105C8329B1D02 уже содержит только сообщение «Hell!».
Согласно GSM спецификации (3GPP TS 23.038, «Alphabets and language-specific information», § 6.2.1 GSM 7 bit Default Alphabet, стр. 20), символ ö должен кодироваться как 0x7C (до упаковки и полуоктального кодирования).
В одном посте от 2012 года предлагается преобразовать строку сообщения в Windows-1252, но и это не сработало (ö = 0xF6).
По моему мнению, команда /tool/sms/send производит очистку входных данных и вырезает этот символ. Есть ли способ обойти это?
Я также пробовал напрямую отправлять низкоуровневую команду AT+CMGS через /interface/lte/at-chat, но не смог заставить маршрутизатор принять команду — не понял, как передать порт LTE в качестве аргумента.
