Ja też miałem problem z wysyłaniem smsów przez ten modem, z twoim skryptem @desperat miałem taki problem, że źle były wycinane tokeny. Najpierw info o wersji modemu:

E3372h-320 (hilink)
Bieżąca wersja 10.0.3.1(H192SP2C983)
Wersja interfejsu internetowego WEBUI 10.0.3.1(W13SP2C7201)

Tak, jak wspominałem, u mnie był problem z wyciąganiem tokenu przez skrypt. Nie wiem czy mam wersję softwaru za starą, czy za młodą (moje wartości wyglądają jakby miały inną numerację), ale mam inny response przy SesTokInfo:

GET http://192.168.8.1/api/webserver/SesTokInfo
Reponse:
<?xml version="1.0" encoding="UTF-8"?>
<response>
    <SesInfo>
E1nGw6cmVvY10w8NJWn0It2Kx6M9FEwOh6nOPF6MZp0U7rMIeoL6H0NCYqH0PnD864nMsD20Rd34j6IWmIKfjm1MfLdMSTpad86faYoClQAXhZbV0Sq39kvDX090yZKC
    </SesInfo>
    <TokInfo>SRjEWvhnONhc7HjM41x6Y09sbrlbYz7o</TokInfo>
</response>

Dokładnie rzecz biorąc, nie występuje u mnie ciąg SessionID, zamiast tego jest tag <SesInfo>

Stąd, wrzucam modyfikację tego skryptu, która wycina znaki na odpowiednich pozycjach bez grepa:

#!/bin/sh

# usage: sh send.sh "192.168.8.1" "+48xxxyyyzzz" "test kolejny :) ąśćź"

if [ $# -lt 2 ]
then
echo "Podałeś za mało paramerów ustawiam domyslne\n"
host="192.168.8.1"
number="+48533090410"
content="testowy sms do $number"
echo -e "Host: $host\nNumer: $number\nTreść: $content"
else
host="$1"
number="$2"
content="$3"
echo -e "Podałeś Host: $host\nNumer: $number\nTreść: $content"
fi 
length=${#content}

echo $length
cc=`curl -s -X GET http://$host/api/webserver/SesTokInfo`
echo $cc
c=`echo "$cc"| cut -b 58-185`
t=`echo "$cc"| cut -b 205-236`
date=$(date +"%Y-%m-%d %H:%M:%S")
echo $date

curl -v http://$host/api/sms/send-sms \
 -H "Cookie: SessionID=$c" -H "__RequestVerificationToken: $t" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
 --data "<?xml version="1.0" encoding="UTF-8"?><request><Index>-1</Index><Phones><Phone>$number</Phone></Phones><Sca></Sca><Content>$content</Content><Length>$length</Length><Reserved>1</Reserved><Date>$date</Date></request>"

Dziękuję za pomocny wątek i życzę powodzenia z hakowaniem modemów

2

(10 odpowiedzi, napisanych Oprogramowanie / Software)

Witam, moje spostrzeżenie jest takie, że kody o długości 8n-1 (n to liczba naturalna) znaków wymagają specjalnego traktowania. Podobny problem miałem z biblioteką kodującą znaki do PDU Pythonie.

Kod *115*5# ma 7 znaków (8*1-1), więc podpada pod jakby "szczególny" przypadek.

Na stronie http://smstools3.kekekasvi.com/topic.php?id=288 znalazłem skrypt, który koduje tak, że ciągi znaków są interpretowane poprawnie na routerze Teltonika RUT955 17V020, czyli starszym modelu z modemem Huawei, który wymaga wysyłania komend USSD po AT z kodowaniem PDU.

Biblioteka w Pythonie, z której korzystałem, koduje poprawnie ciągi znaków, o ile ich długość jest różna od (8n-1). Dla przykładowego kodu USSD *115*5# otrzymuję niepoprawnie zakodowany ciąg: AA58ACA6AA8D00. Być może w Twoim skrypcie jest podobnie. Skrypt na wyżej wymienionej stronie koduje ten sam USSD do postaci: AA58ACA6AA8D1A czyli jakby na końcu był znak powrotu karetki: *115*5#\r

A ty którą masz wersję? Można zrobić upgrade poprzez ruta?

Ja też poprawiłem post, mam wersję EC25EFAR02A08M4G.

Mam wersję EC25EFAR02A08M4G.

# gsmctl -y
EC25EFAR02A08M4G

Znalazłem jeszcze w menu GUI Status/Device coś takiego:

Model         EC25
FW version    EC25EFAR02A08M4G

W modemie? A jak mogę to sprawdzić? W ustawieniach znalazłem tylko informacje dotyczące oprogramowania ruta:

Firmware version       RUT9XX_R_00.05.03.3
Firmware build date    2018-12-11, 07:38:19
Kernel version         3.18.44
Bootloader version     3.0.1 

Ja nie zmieniałem tego, kolega z którym pracuję nad tym urządzeniem podobno też nie, ale na wszelki wypadek zamieszczę configa:

/etc/config/network:

(...)
config interface 'ppp'
    option enabled '1'
    option backup '1'
    option metric '10'
    option auth_mode 'none'
    option dialnumber '*99#'
    option pppd_options 'noipdefault'
    option pdptype '1'
    option method 'nat'
    option mtu '1500'
    option service 'auto'
    option device '/dev/cdc-wdm0'
    option proto 'qmi2'
    option ifname 'wwan0'
    option apn 'plus'

config interface 'ppp_usb'

config interface 'stabridge'
    option enabled '0'

Po wykonaniu ifdown ppp dalej wyskakuje ten sam błąd (na ttyUSB3). Natomiast na ttyUSB2 pojawia się błąd CME 30 No network service

# ussd159 -v -p /dev/ttyUSB3 -u "*100#"
ussd159: opening port /dev/ttyUSB3
ussd159: port opened
ussd159: at_command: sending "ate0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cmgf=0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cscs="IRA""
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cusd=1,"aa180c3602",15"
ussd159: at_wcusd...
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CME ERROR: 258"
ussd159: at_wcusd: got ""
ussd159: /dev/ttyUSB3: Operation timed out
root@Teltonika-RUT955:~# ussd159 -v -p /dev/ttyUSB2 -u "*100#"
ussd159: opening port /dev/ttyUSB2
ussd159: port opened
ussd159: at_command: sending "ate0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cmgf=0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cscs="IRA""
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cusd=1,"aa180c3602",15"
ussd159: at_wcusd...
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CME ERROR: 30"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CPIN: READY"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: /dev/ttyUSB2: Operation timed out

Apropo procesu QuectelCM znalazłem coś ciekawego:

# ps | grep -i "quectel"
20881 root      3140 S    /usr/sbin/quectel-CM -s plus -c ppp

Ten skrypt zawsze jest uruchamiany z parametrem PPP, mimo że w ustawieniach mam wybrane QMI.

Próbowałem wstrzymywać bądź kasować QuectelCM, bez skutku. Chyba wgrane jest monitorowanie tego procesu i automatyczne uruchomienie w przypadku jego braku. Chciałem też "przechytrzyć" ruta, ale wygląda na to że są jakieś błędy z tym programem QuectelCM:

# ps | grep -i "quectel"
24475 root      5188 S    /usr/sbin/quectel-CM -s plus -c ppp
26256 root      1376 S    grep -i quectel
root@Teltonika-RUT955:~# kill 24475; /usr/sbin/quectel-CM -s plus -c qmi
[12-19_13:31:30:029] WCDMA&LTE_QConnectManager_Linux&Android_V1.1.38
[12-19_13:31:30:030] /usr/sbin/quectel-CM profile[3] = plus///0, pincode = (null), config = qmi
[12-19_13:31:30:033] Find /sys/bus/usb/devices/1-1.3 idVendor=2c7c idProduct=0125
[12-19_13:31:30:033] Find /sys/bus/usb/devices/1-1.3:1.4/net/wwan0
[12-19_13:31:30:033] Find usbnet_adapter = wwan0
[12-19_13:31:30:034] Find /sys/bus/usb/devices/1-1.3:1.4/usbmisc/cdc-wdm0
[12-19_13:31:30:034] Find qmichannel = /dev/cdc-wdm0
[12-19_13:31:30:035] cdc_wdm_fd = 7
[12-19_13:31:31:035] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:31:32:108] Get clientWDS = 19
[12-19_13:31:32:139] Get clientDMS = 1
[12-19_13:31:32:172] Get clientNAS = 3
[12-19_13:31:32:204] Get clientUIM = 1
[12-19_13:31:32:235] Get clientWDA = 1
[12-19_13:32:02:254] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:32:02:254] requestBaseBandVersion err = 145
[12-19_13:32:32:255] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:33:02:255] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:33:02:255] requestSetEthMode err = 145
[12-19_13:33:32:255] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:33:32:256] requestGetSIMStatus err = 145
[12-19_13:33:32:256] requestSetProfile[3] plus///0
[12-19_13:34:02:256] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:34:02:256] requestSetProfile err = 145
[12-19_13:34:32:257] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:34:32:257] requestGetProfile err = 145
[12-19_13:35:02:257] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:35:02:257] requestRegistrationState2 err = 145
[12-19_13:35:32:258] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:35:32:258] requestQueryDataCall err = 145
[12-19_13:36:02:258] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:36:02:259] requestQueryDataCall err = 145
[12-19_13:36:32:260] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:36:32:260] requestRegistrationState2 err = 145
[12-19_13:36:32:260] requestSetOperatingMode(1)
[12-19_13:37:02:261] QmiThreadSendQMITimeout pthread_cond_timeout_np=145, errno: 2 (No such file or directory)
[12-19_13:37:02:261] requestSetOperatingMode err = 145
[12-19_13:37:02:261] requestSetOperatingMode(0)
[12-19_13:37:02:302] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED
[12-19_13:37:02:366] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:37:02:431] requestSetupDataCall WdsConnectionIPv4Handle: 0x8795db30
[12-19_13:37:02:494] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:37:02:526] requestQueryDataCall IPv4ConnectionStatus: CONNECTED
[12-19_13:37:02:560] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:37:02:590] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:37:02:654] /lib/netifd/mobile.script up wwan0 qmi
Failed to parse message data
[12-19_13:37:02:730] WARNING: Variable 'values' does not exist or is not an array/object
Command failed: Not found
[12-19_13:37:33:214] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:38:03:262] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED
[12-19_13:38:03:263] /lib/netifd/mobile.script down wwan0 qmi
Command failed: Not found
[12-19_13:38:03:390] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW
[12-19_13:38:03:390] requestSetOperatingMode(1)
[12-19_13:38:03:485] requestSetOperatingMode(0)
[12-19_13:38:03:550] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW
[12-19_13:38:04:062] requestRegistrationState2 MCC: 260, MNC: 1, PS: Detached, DataCap: UNKNOW
[12-19_13:38:04:478] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:38:04:545] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:38:04:607] requestSetupDataCall WdsConnectionIPv4Handle: 0x8795db30
[12-19_13:38:04:671] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:38:04:702] requestQueryDataCall IPv4ConnectionStatus: CONNECTED
[12-19_13:38:04:767] /lib/netifd/mobile.script up wwan0 qmi
Failed to parse message data
[12-19_13:38:04:849] WARNING: Variable 'values' does not exist or is not an array/object
Command failed: Not found
[12-19_13:39:38:206] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:40:08:253] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED
[12-19_13:40:08:254] /lib/netifd/mobile.script down wwan0 qmi
Command failed: Not found
[12-19_13:40:08:381] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW
[12-19_13:40:08:381] requestSetOperatingMode(1)
[12-19_13:40:08:541] requestSetOperatingMode(0)
[12-19_13:40:08:606] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW
[12-19_13:40:09:246] requestRegistrationState2 MCC: 260, MNC: 1, PS: Detached, DataCap: UNKNOW
[12-19_13:40:09:695] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:40:09:769] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:40:09:822] requestSetupDataCall WdsConnectionIPv4Handle: 0x8795db30
[12-19_13:40:09:886] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:40:09:917] requestQueryDataCall IPv4ConnectionStatus: CONNECTED
[12-19_13:40:09:982] /lib/netifd/mobile.script up wwan0 qmi
Failed to parse message data
[12-19_13:40:10:059] WARNING: Variable 'values' does not exist or is not an array/object
Command failed: Not found
[12-19_13:40:23:774] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
[12-19_13:41:43:199] requestRegistrationState2 MCC: 260, MNC: 1, PS: Attached, DataCap: LTE
^C[12-19_13:41:53:966] requestDeactivateDefaultPDP err = 0
[12-19_13:41:53:966] /lib/netifd/mobile.script down wwan0 qmi
Command failed: Not found
[12-19_13:41:54:269] QmiWwanThread exit
[12-19_13:41:54:270] main exit

W końcu przerwałem proces (Ctrl-C). Wygląda na to, że biblioteka dla QMI jest wadliwa albo coś nie działa.

Apropo drugiej części Twojej sugestii, nie wiem jak rozłączyć połączenie z internetem? Próbowałem na przykład przez zmianę APNu, tak aby uniemożliwić nawiązanie połączenia. Niestety nadal nie pomogło (na żadnym kanale, ani USB2 ani USB). Jest jakaś specjalna komenda na rozłączanie?

@EDIT: Usunąłem "Nawiasem mówiąc, na RUT955 z Huawei wysyłanie komend USSD działa tylko i wyłącznie na QMI, nie da się tego zrobić na PPP." - pomyliło mi się z innymi ruterami

Bardzo dziękuję za odpowiedź. Niestety w moim przypadku rozwiązanie nie podziałało:

# ussd159 -v -p /dev/ttyUSB3 -u "*100#"
ussd159: opening port /dev/ttyUSB3
ussd159: port opened
ussd159: at_command: sending "ate0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cmgf=0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cscs="IRA""
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cusd=1,"aa180c3602",15"
ussd159: at_wcusd...
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CME ERROR: 258"
ussd159: at_wcusd: got ""
ussd159: /dev/ttyUSB3: Operation timed out

Czy możliwe, że wynika to z innego firmwaru? Moja wersja to RUT9XX_R_00.05.03.3, chyba najnowsza na ten moment.
Zastanawiam się jeszcze nad ustawieniami sieci, ale nie mam pomysłu gdzie powinienem szukać.

Dzień dobry,

Korzystam z routera internetowego Teltonika RUT955. Jest on obsługiwany przez modem Quectela EC25E. Router aktualnie chodzi na karcie SIM w taryfie na kartę, skąd konieczność okresowego sprawdzania stanu konta. W wyniku specyficznego działania skryptu producenta do analizy pakietów, przed wysłaniem kodu USSD muszę wstrzymywać usługę gsmd. Aktualnie potrafię pobrać stan konta poprzez picocoma:

(zatrzymanie procesu gsmd)

# ps | grep -i "gsmd"
 2051 root      2916 S    /usr/sbin/gsmd -p /dev/modem_cmd -s 115200 -m auto
 6699 root      1376 S    grep -i gsmd
# kill -STOP 2051

# picocom -b 115200 /dev/ttyUSB2

Niestety to rozwiązanie wymaga filtrowania kanału wyjściowego, bo oprócz odpowiedzi operatora są jeszcze wyświetlane jakieś pakiety z LTE. Stąd zainteresowałem się popularną tutaj paczką ussd159. Problem w tym, że działa ona poprawnie na RUT955 z modemem Huawei, jednak na Quectelu już nie:

# ussd159 -v -p /dev/ttyUSB2 -t 30 -u *100#
ussd159: opening port /dev/ttyUSB2
ussd159: port opened
ussd159: at_command: sending "ate0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cmgf=0"
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cscs="IRA""
ussd159: at_wok...
ussd159: at_wok: got ""
ussd159: at_wok: got "OK"
ussd159: at_wok: done
ussd159: at_command: sending "at+cusd=1,"aa180c3602",15"
ussd159: at_wcusd...
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "OK"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CREG: 1,"2AFA","47FF7B6",2"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "WCDMA",-92,-92,-8"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CME ERROR: 258"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "WCDMA",-92,-90,-5"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "WCDMA",-86,-87,-4"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "LTE",-86,-105,121,-11"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+CREG: 1,"FFFE","03FD50B",7"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "LTE",-82,-105,121,-11"
ussd159: at_wcusd: got ""
ussd159: at_wcusd: got "+QCSQ: "LTE",-82,-105,124,-11"
ussd159: /dev/ttyUSB2: Operation timed out

Jak widać, pojawia się błąd CME ERROR: 258 (Phone is busy). Czy ktoś ma pomysł w czym może tkwić problem?