Ниже описан полный путь. В какой то момент я купил новый модем, но у него оказался API без поддержки USSD и я вернулся к старому. Поэтому не взыщите за столь длинный эпос
yser@rpi02:~ $ lsusb
Bus 001 Device 007: ID 12d1:1001 Huawei Technologies Co., Ltd. E161/E169/E620/E800 HSDPA Modem
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
user@rpi02:~ $ cat lsusb_ext.sh
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
echo "/dev/$devname - $ID_SERIAL"
)
done
user@rpi02:~ $ ./lsusb_ext.sh
/dev/ttyUSB2 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB3 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB1 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB0 - POWERCOM_CO.__LTD._USB_to_Serial
Исполнить правила devrul без перезапуска/перевыдергивания
sudo udevadm control --reload-rules && sudo udevadm trigger
Чего то с тем модемом не взлетело. Купил E3372h-153, вроде как с ним должно быть проще, но нет
Погнали. Вот таблица, согласно которой нам нужно перевести модем в режим модема, чтобы получить ttyUSB* и выполнять AT команды (я хочу отправлять USSD запросы, получать и отправлять SMS)
ID | lsusb name | mode |
12d1:1f01 | Huawei Technologies Co., Ltd. | USB Mass Storage |
12d1:14dc | Huawei Technologies Co., Ltd. | 3G Internet |
12d1:1001 | Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem | Modem |
Вывод lsusb подтверждает данные по таблице. Также у нас появился новый интерфейс eth1 и ему выдан ip 192.168.8.100
user@rpi02:~ $ lsusb
Bus 001 Device 008: ID 12d1:14dc Huawei Technologies Co., Ltd. E3372 LTE/UMTS/GSM HiLink Modem/Networkcard
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
user@rpi02:~ $ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DORMANT group default qlen 1000
link/ether b8:27:eb:c1:4b:86 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether b8:27:eb:94:1e:d3 brd ff:ff:ff:ff:ff:ff
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 0c:5b:8f:27:9a:64 brd ff:ff:ff:ff:ff:ff
user@rpi02:~ $ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.8.100 netmask 255.255.255.0 broadcast 192.168.8.255
inet6 fe80::45b5:5b92:e924:53ed prefixlen 64 scopeid 0x20<link>
ether 0c:5b:8f:27:9a:64 txqueuelen 1000 (Ethernet)
RX packets 170 bytes 77656 (75.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31 bytes 4876 (4.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
В логе будет видно, что изначально модем идет в режиме USB Mass storage и переключается на 3G интернет
user@rpi02: $ grep modeswi /var/log/syslog
2024-04-13T12:51:04.150125+03:00 rpi02 systemd[1]: Removed slice system-usb_modeswitch.slice - Slice /system/usb_modeswitch.
2024-04-13T12:51:21.223187+03:00 rpi02 systemd[1]: Created slice system-usb_modeswitch.slice - Slice /system/usb_modeswitch.
2024-04-13T12:51:21.251715+03:00 rpi02 systemd[1]: Starting usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0...
2024-04-13T12:51:21.955467+03:00 rpi02 usb_modeswitch: switch device 12d1:1f01 on 001/007
2024-04-13T12:51:23.020870+03:00 rpi02 root: usb_modeswitch: switched to 12d1:14dc on 001/008
2024-04-13T12:51:23.539055+03:00 rpi02 systemd[1]: usb_modeswitch@1-1.3:1.0.service: Deactivated successfully.
2024-04-13T12:51:23.539514+03:00 rpi02 systemd[1]: Finished usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0.
Значит правила usb_modeswitch будем делать для 12d1:1f01
user@rpi02: $ tar -xzvf /usr/share/usb_modeswitch/configPack.tar.gz 12d1:1f01
Файл имеет такое содержимое
# Huawei E353 (3.se) and others
TargetVendor=0x12d1
TargetProductList="14db,14dc"
HuaweiNewMode=1
Приведим его к виду
# Huawei E3372h-153 - switch to modem mode instead of HiLink CDC-Ether mode
TargetVendor=0x12d1
TargetProduct=0x1f01
# switch to 12d1:1001 (modem mode, 3 virtual serial ports)
MessageContent="55534243123456780000000000000011062000000100000000000000000000"
Файл помещаем в какталог /etc/usb_modeswitch.d/
user@rpi02: $ sudo mv 12d1\:1f01 /etc/usb_modeswitch.d/
Перезагружаемся и проверяем лог.
user@rpi02:~ $ grep modeswi /var/log/syslog
2024-04-14T00:02:44.001560+03:00 rpi02 systemd[1]: Removed slice system-usb_modeswitch.slice - Slice /system/usb_modeswitch.
2024-04-14T00:03:01.134707+03:00 rpi02 systemd[1]: Created slice system-usb_modeswitch.slice - Slice /system/usb_modeswitch.
2024-04-14T00:03:01.163064+03:00 rpi02 systemd[1]: Starting usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0...
2024-04-14T00:03:01.333691+03:00 rpi02 root: usb_modeswitch: use overriding config file /etc/usb_modeswitch.d/12d1:1f01; make sure this is intended
2024-04-14T00:03:01.344458+03:00 rpi02 root: usb_modeswitch: please report any new or corrected settings; otherwise, check for outdated files
2024-04-14T00:03:01.912440+03:00 rpi02 usb_modeswitch: switch device 12d1:1f01 on 001/007
2024-04-14T00:03:03.033926+03:00 rpi02 root: usb_modeswitch: switched to 12d1:1f01 on 001/007
2024-04-14T00:03:03.569904+03:00 rpi02 systemd[1]: usb_modeswitch@1-1.3:1.0.service: Deactivated successfully.
2024-04-14T00:03:03.570827+03:00 rpi02 systemd[1]: Finished usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0.
user@rpi02:~ $ lsusb
Bus 001 Device 007: ID 12d1:1f01 Huawei Technologies Co., Ltd. E353/E3131 (Mass storage mode)
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Да, не взлетело, попробуем тогда использовать другой MessageContent - "55534243123456780000000000000011063000000100000000000000000000"
После перезагрузки в логе видим переключение на 12d1:1001
user@rpi02:~ $ grep modeswi /var/log/syslog
2024-04-14T00:43:02.145670+03:00 rpi02 systemd[1]: Created slice system-usb_modeswitch.slice - Slice /system/usb_modeswitch.
2024-04-14T00:43:02.172109+03:00 rpi02 systemd[1]: Starting usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0...
2024-04-14T00:43:02.335257+03:00 rpi02 root: usb_modeswitch: use overriding config file /etc/usb_modeswitch.d/12d1:1f01; make sure this is intended
2024-04-14T00:43:02.344297+03:00 rpi02 root: usb_modeswitch: please report any new or corrected settings; otherwise, check for outdated files
2024-04-14T00:43:02.884422+03:00 rpi02 usb_modeswitch: switch device 12d1:1f01 on 001/007
2024-04-14T00:43:04.018285+03:00 rpi02 root: usb_modeswitch: switched to 12d1:1001 on 001/008
2024-04-14T00:43:04.551383+03:00 rpi02 systemd[1]: usb_modeswitch@1-1.3:1.0.service: Deactivated successfully.
2024-04-14T00:43:04.552257+03:00 rpi02 systemd[1]: Finished usb_modeswitch@1-1.3:1.0.service - USB_ModeSwitch_1-1.3:1.0.
user@rpi02:~ $ lsusb
Bus 001 Device 008: ID 12d1:1001 Huawei Technologies Co., Ltd. E161/E169/E620/E800 HSDPA Modem
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
user@rpi02:~ $ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
user@rpi02:~ $ ./lsusb_ext.sh
/dev/ttyUSB2 - Vodafone__Huawei__Vodafone__Huawei_
/dev/ttyUSB3 - Vodafone__Huawei__Vodafone__Huawei_
/dev/ttyUSB1 - Vodafone__Huawei__Vodafone__Huawei_
/dev/ttyUSB0 - POWERCOM_CO.__LTD._USB_to_Serial
Но при попытке подключится к ttyUSB1-3 при помощи minicom я вижу внизу консоли "Offline" :-(
В одном из гайдов человек написал, что зашел в веб интерфейс и что то там переключил. Я нахожусь от аппарата в 3000 км и рук там нет. Как зайти в веб интерфейс? Есть несколько вариантов:
- Настроить удаленное подключение (аналог RDP, Anydesk)
- Настроить vpn и подключиться внутри VPN
- Использовать ssh tunnel with port forwarding. Этот вариант не подходит, так как веб интерфейс перенаправляет на реальный ip
- Использовать ssh tunnel as proxy, тогда можно подключиться
И тут я выяснил, что аппарат поддерживает api и уже есть скрипты для отправки и приема sms, а также отправки USSD. Скрипт принадлежит rohan molloy
#! /bin/sh
scheme=${HILINK_PROTO:-'http'}
host=${HILINK_HOST:-'192.168.8.1'}
port=${HILINK_PORT:-'80'}
curl_options="-fsSH 'Host:Hi.link'"
# Get a cookie/session id
RESPONSE=`curl $curl_options -X GET $scheme://$host:$port/api/webserver/SesTokInfo`
COOKIE=`echo "$RESPONSE"| grep SessionID=| cut -b 10-147`
TOKEN=`echo "$RESPONSE"| grep TokInfo| cut -b 10-41`
case "$1" in
connect)
curl $curl_options \
-X POST "$scheme://$host:$port/api/dialup/dial" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d"<request><Action>1</Action></request>"
;;
disconnect)
curl $curl_options \
-X POST "$scheme://$host:$port/api/dialup/dial" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d "<request><Action>1</Action></request>"
;;
send_sms)
curl $curl_options \
-X POST "$scheme://$host:$port/api/sms/send-sms" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d "<request><Index>-1</Index><Phones><Phone>$2</Phone></Phones><Sca>$sca</Sca><Content>$3</Content><Length>${#3}</Length><Reserved>1</Reserved><Date>$(date '+%Y-%m-%d %T')</Date></request>"
;;
get_sms)
curl $curl_options \
-X POST "$scheme://$host:$port/api/sms/sms-list" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d "<request><PageIndex>1</PageIndex><ReadCount>${2:-1}</ReadCount><BoxType>1</BoxType><SortType>0</SortType><Ascending>0</Ascending><UnreadPreferred>1</UnreadPreferred></request>"
;;
sms_inbox)
$0 get_sms 50
;;
sms_count)
curl $curl_options \
-X GET "$scheme://$host:$port/api/sms/sms-count" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
traffic_statistics)
curl $curl_options \
-X GET "$scheme://$host:$port/api/monitoring/traffic-statistics" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
check_notifications)
curl $curl_options \
-X GET "$scheme://$host:$port/api/monitoring/check-notifications" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
status)
curl $curl_options \
-X GET "$scheme://$host:$port/api/monitoring/status" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
dialup_connection)
curl $curl_options \
-X GET "$scheme://$host:$port/api/dialup/connection" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
device_information)
curl $curl_options \
-X GET "$scheme://$host:$port/api/device/information" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN"
;;
send_ussd)
curl $curl_options \
-X POST "$scheme://$host:$port/api/ussd/send" \
-H "Cookie:$COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d "<Request><Content>$2</Content><CodeType>CodeType</CodeType></Request>";
;;
get_ussd)
curl $curl_options \
-X POST "$scheme://$host:$port/api/ussd/get" \
-H "Cookie: $COOKIE" \
-H "__RequestVerificationToken: $TOKEN" \
-H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
-d "<request><content>$2</content><codeType>CodeType</codeType><timeout></timeout></request>";
;;
*)
cat >&2 << EOF
#######################
# HILINK API TOOL #
#######################
connect)
Brings the modem online
disconnect)
Brings the modem offline
send_sms)
Send an sms message
Usage: send_sms '\$mobile_number' '\$message'
get_sms)
Poll the sms inbox (prints latest msg if count undefined)
Usage: get_sms '\$count'
sms_inbox)
Print the entire inbox
Usage: get_inbox
sms_count)
Query number of SMS message
traffic_statistics)
Report traffic statistics
check_notifications)
Poll for new notification
status)
Report device status
dialup_connection)
Report dialup connection
device_information)
Report device information
send_ussd)
Send a USSD request
Usage: send_ussd '\$ussd_number'
get_ussd)
Query USSD response
Usage: get_ussd '\$ussd_number'
EOF
;;
esac
Смс я получил без проблем, а вот попытка отправить ussd запрос завершалась ошибкой
user@rpi02:~/sms-gateway/scripts $ ./hilink.sh get_ussd 105
<?xml version="1.0" encoding="UTF-8"?>
<error>
<code>100002</code>
<message></message>
</error>
Я нашел таблицу кодов, согласно которой ошибка говорит
Result Code | Description | Solution |
0 | Request successful. | - |
100000 | Parameter error. | Verify parameter settings based on the error information. For details about the parameter format, please refer to Request Body. |
100001 | The API key has expired or failed to be parsed. | Verify the API key in AppGallery Connect. |
100002 | Authentication failed. | Verify that the signing method and API key are correctly configured in AppGallery Connect. |
100003 | Internal service error. | Contact Huawei technical support. |
500000 | The pay-as-you-go plan subscription status is incorrect. | Verify that you have subscribed to a pay-as-you-go plan in AppGallery Connect. |
500001 | This service is unavailable for you. | If you are an individual developer, submit a ticket online to apply for adding your project ID to the trustlist. |
500032 | The number of parameters is invalid. | Verify that the number of Wi-Fi or cell parameters is less than 10,000. |
Ошибка аутентификации. Поменял пароль и добавил в скрипт блок с паролем.
HILINK_USER="admin"
HILINK_PASSWORD="admin"
RESPONSE=$(curl $curl_options -X GET \
--url "$scheme://$host:$port/api/webserver/SesTokInfo" \
--header "Host:$host" \
--user "$HILINK_USER:$HILINK_PASSWORD"
)
вместо
RESPONSE=`curl $curl_options -X GET $scheme://$host:$port/api/webserver/SesTokInfo`
Указанная выше таблица ошибочна, она не про API webui. Вот эта таблица больше подходит
100002 | ERROR_SYSTEM_NO_SUPPORT |
100003 | ERROR_SYSTEM_NO_RIGHTS |
100004 | ERROR_BUSY |
101001 | ERROR_NO_SIM_CARD_OR_INVALID_SIM_CARD |
101002 | ERROR_CHECK_SIM_CARD_PIN_LOCK |
101003 | ERROR_CHECK_SIM_CARD_PUN_LOCK |
101004 | ERROR_CHECK_SIM_CARD_CAN_UNUSEABLE |
101005 | ERROR_ENABLE_PIN_FAILED |
101006 | ERROR_DISABLE_PIN_FAILED |
101007 | ERROR_UNLOCK_PIN_FAILED |
101008 | ERROR_DISABLE_AUTO_PIN_FAILED |
101009 | ERROR_ENABLE_AUTO_PIN_FAILED |
103002 | ERROR_DEVICE_PIN_VALIDATE_FAILED |
103003 | ERROR_DEVICE_PIN_MODIFFY_FAILED |
103004 | ERROR_DEVICE_PUK_MODIFFY_FAILED |
103008 | ERROR_DEVICE_SIM_CARD_BUSY |
103009 | ERROR_DEVICE_SIM_LOCK_INPUT_ERROR |
103011 | ERROR_DEVICE_PUK_DEAD_LOCK |
108001 | ERROR_LOGIN_USERNAME_WRONG |
108002 | ERROR_LOGIN_PASSWORD_WRONG |
108003 | ERROR_LOGIN_ALREADY_LOGIN |
108005 | ERROR_LOGIN_TOO_MANY_USERS_LOGINED |
108006 | ERROR_LOGIN_USERNAME_OR_PASSWORD_ERROR |
108007 | ERROR_LOGIN_TOO_MANY_TIMES |
108008 | MODIFYPASSWORD_ERROR |
108009 | ERROR_LOGIN_IN_DEFFERENT_DEVICES |
108010 | ERROR_LOGIN_FREQUENTLY_LOGIN |
112001 | ERROR_SET_NET_MODE_AND_BAND_WHEN_DAILUP_FAILED |
112002 | ERROR_SET_NET_SEARCH_MODE_WHEN_DAILUP_FAILED |
112003 | ERROR_SET_NET_MODE_AND_BAND_FAILED |
112005 | ERROR_NET_REGISTER_NET_FAILED |
112008 | ERROR_NET_SIM_CARD_NOT_READY_STATUS |
125001 | ERROR_WRONG_TOKEN |
125002 | ERROR_WRONG_SESSION |
125003 | ERROR_WRONG_SESSION_TOKEN |
Получается, что текущая версия прошивки не поддерживает отправку ussd запросов, хоть и содержит api
Как проверить API?
user@rpi02:~ $ cat api_mapping.sh
#!/bin/bash
js=( changelang.js checklogin.js country.js deviceinformation.js dhcp.js dmzsettings.js
firewallswitch.js home.js lanipfilter.js main.js messagesetting.js mobileconnection.js
mobilenetworksettings.js modifypassword.js nat.js pincodemanagement.js ping.js
profilesmgr.js quicksetup.js redirect.js sipalgsettings.js sms.js specialapplication.js
statistic.js systemsettings.js table.js update.js upnp.js validation.js virtualserver.js
wlanadvanced.js wlanbasicsettings.js wlanmacfilter.js )
url="http://192.168.8.1/js/"
folder="./js/"
rm $folder/*
mkdir $folder
for file in "${js[@]}"
do
wget -q "$url$file" -O $folder$file.gz; gunzip $folder$file.gz
done
egrep -oh "(api/.\S*?)" $folder*.js | egrep -o '^api/[a-z/_-]*' | sort | uniq
Дальнейшие поиски подсказали, что некоторых задач с POST запросами требуется передача пары логин/пароль. А точнее получение Session_id и Token с авторизацией. И тут я просто пропал. Все сделал правильно, получаю нужную информацию, но постоянно выходит ошибка 108006 - ERROR_LOGIN_USERNAME_OR_PASSWORD_ERROR!!!
В какой то момент я вспомнил прикол веб-морды принтера kyocera, который принял пароль при сохранении, но не принимал при авторизации. Как в итоге выяснилось, было ограничение на длину пароля и при сохранении он был обрезан автоматически. Поэтому я просто сменил 15 символьный сгенерированный пароль на обычный root и наконец система перестала сыпать этой ошибкой. Правда проблему 100002 оно не решило.
http://192.168.8.1/api/user/state-login вернет
<response>
<State>-1</State>
<Username>admin</Username>
<password_type>4</password_type>
</response>
Где password_type может быть 3 или 4
# password encoding
# type 3 : base64(pw) encoded
# type 4 : base64(sha256sum(user + base64(sha256sum(pw)) + token))
Вот так изменяется шапка скрипта выше
scheme=${HILINK_PROTO:-'http'}
host=${HILINK_HOST:-'192.168.8.1'}
port=${HILINK_PORT:-'80'}
curl_options="-fsSH 'Host:Hi.link'"
HILINK_USER="admin"
HILINK_PASSWORD="root"
# Get a cookie/session id
curl -s -X GET "$scheme://$host:$port/api/webserver/SesTokInfo" > ses_tok.xml
COOKIE=`grep "SessionID=" ses_tok.xml | cut -b 10-147`
TOKEN=`grep "TokInfo" ses_tok.xml | cut -b 10-41`
pwtype=4
pwtype3=$(echo -n "$HILINK_PASSWORD" | base64 --wrap=0)
hashedpw=$(echo -n "$HILINK_PASSWORD" | sha256sum -b | sed -nr 's/^([0-9a-z]*).*$/\1/ip' )
hashedpw=$(echo -n "$hashedpw" | base64 --wrap=0)
pwtype4=$(echo -n "$HILINK_USER$hashedpw$TOKEN" | sha256sum -b | sed -nr 's/^([0-9a-z]*).*$/\1/ip' )
encpw=$(echo -n "$pwtype4" | base64 --wrap=0)
if [ $pwtype -ne 4 ];
then encpw=$pwtype3;
fi
LOGIN_REQ="<request><Username>$HILINK_USER</Username><Password>$encpw</Password><password_type>$pwtype</password_t>
curl -X POST "$scheme://$host:$port/api/user/login" \
-H "Content-Type: text/xml" \
-H "Cookie: $COOKIE" \
-H "__RequestVerificationToken:$TOKEN" \
-d $LOGIN_REQ --dump-header login_resp_hdr.txt > /dev/null
grep "SessionID=" login_resp_hdr.txt | cut -d ':' -f2 | cut -d ';' -f1 > session_id.txt
grep "__RequestVerificationTokenone" login_resp_hdr.txt | cut -d ':' -f2 > token.txt
COOKIE=`cat session_id.txt`
TOKEN=`cat token.txt`
echo "admin session_id: $COOKIE"
echo "Token: $TOKEN"
echo "Pass: $encpw"
echo "Type: $pwtype"
Мне нужны USSD запросы, поэтому я буду искать другие варианты решения. Перешить модем я не могу.
Вернулся на E173u-1
user@rpi02:~ $ lsusb
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 007: ID 12d1:1001 Huawei Technologies Co., Ltd. E161/E169/E620/E800 HSDPA Modem
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Тут я обленюсь и приложу пару выводов:
user@rpi02:~ $ cat /etc/udev/rules.d/999-sms-gateway.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1001", RUN+="/opt/scripts/usbmodem/E173u-1/crtSymlinkModem.sh '$env{ID_SERIAL}' '$links' '$devnode' 'E173u'"
user@rpi02:~ $ cat /opt/scripts/usbmodem/E173u-1/crtSymlinkModem.sh
#!/bin/bash
nameScript=$(basename "$0")
nameFolder=$(dirname "$0")
devName=$(echo $3 | sed 's/\//_/g')
logFile="$nameFolder/$nameScript_$devName.log"
if [ "$(pgrep -c "$nameScript")" -gt 1 ]; then exit; fi
echo -e "---\n" > $logFile
date >> $logFile
if [[ "$4" == "" ]]
then
echo "Name for sysmlink is empty" >> $logFile
exit
fi
tty_addr=`udevadm info -t $3 | grep DEVNAME | grep tty | awk -F"=" '{print $2}' | head -n 1`
echo "USB Device '$1' plugged in..." >> $logFile
echo "Current symlinks (in /dev dir): "$2 >> $logFile
echo "Name of the device node: "$3 >> $logFile
echo "Vendor ID: "$ID_VENDOR_ID >> $logFile
echo "Model ID: "$ID_MODEL_ID >> $logFile
echo "TTY ID: "$tty_addr >> $logFile
if [[ "$tty_addr" == "" ]]
then
echo "TTY ID is empty" >> $logFile
else
ThisIsif02=$(echo $2 | grep if02 >/dev/null && echo 1 || echo 0)
if [[ "$ThisIsif02" == "1" ]]; then
symLink="/dev/$4"
[[ -L $symLink ]] && unlink $symLink
ln -s $tty_addr $symLink
echo "Symlink create " >> $logFile
fi
fi
exit 0
user@rpi02:~ $
user@rpi02:~ $ cat /opt/scripts/usbmodem/E173u-1/
crtSymlinkModem.sh _dev_ttyUSB1.log _dev_ttyUSB2.log _dev_ttyUSB3.log
user@rpi02:~ $ cat /opt/scripts/usbmodem/E173u-1/_dev_ttyUSB3.log
---
Fri May 10 21:32:41 MSK 2024
USB Device 'HUAWEI_Technology_HUAWEI_Mobile' plugged in...
Current symlinks (in /dev dir): serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if02-port0 serial/by-path/platform-3f980000.usb-usb-0:1.1.2:1.2-port0
Name of the device node: /dev/ttyUSB3
Vendor ID: 12d1
Model ID: 1001
TTY ID: /dev/ttyUSB3
Symlink create
Было обнаружено, что один из ttyUSB принимает AT команды, но это оказался не ttyUSB1 (ttyUSB0 занят), при этом в udev +symlink ссылался на ttyUSB2, который не принимал команды AT. Изучения различий между данными устройствами показало:
user@rpi02:~ $ cat /opt/scripts/usbmodem/E173u-1/_dev_ttyUSB*
---
Fri May 10 21:32:41 MSK 2024
USB Device 'HUAWEI_Technology_HUAWEI_Mobile' plugged in...
Current symlinks (in /dev dir): serial/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-port0 gsmmodem2 serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if00-port0
Name of the device node: /dev/ttyUSB1
Vendor ID: 12d1
Model ID: 1001
TTY ID: /dev/ttyUSB1
---
Fri May 10 21:32:41 MSK 2024
USB Device 'HUAWEI_Technology_HUAWEI_Mobile' plugged in...
Current symlinks (in /dev dir): serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if01-port0 serial/by-path/platform-3f980000.usb-usb-0:1.1.2:1.1-port0
Name of the device node: /dev/ttyUSB2
Vendor ID: 12d1
Model ID: 1001
TTY ID: /dev/ttyUSB2
---
Fri May 10 21:32:41 MSK 2024
USB Device 'HUAWEI_Technology_HUAWEI_Mobile' plugged in...
Current symlinks (in /dev dir): serial/by-id/usb-HUAWEI_Technology_HUAWEI_Mobile-if02-port0 serial/by-path/platform-3f980000.usb-usb-0:1.1.2:1.2-port0
Name of the device node: /dev/ttyUSB3
Vendor ID: 12d1
Model ID: 1001
TTY ID: /dev/ttyUSB3
Различие в Current symlinks port0, if01-port0, if02-port0
Вот за if02, в вышепредложенном скрипте, я и решил зацепиться. Теперь у меня создается симлинк /dev/E173u. Я делал это для того, чтобы не поправлять каждый раз устройство в скрипте и не отправить случайно АТ команду на ИБП. В скрипте идет запрос баланса *105#
user@rpi02:~ $ cat /opt/scripts/usbmodem/ussd-balance.sh
#!/bin/bash
modem="/dev/E173u"
tempfile="/tmp/ussd-balance.log"
echo "We will use modem $modem"
UCS2_UTF8 () {
MSG=$(echo -n $1 | sed "s/\(.\{2\}\)/\\\x\1/g")
REPLY=$(printf $MSG | iconv -f UCS-2BE -t UTF-8)
echo "$REPLY"
}
printf "AT+CUSD=1,"AA18AC3602",15\r\n" > $modem
request=$(grep -m 1 "+CUSD" $modem | sed "s/.*\"\([A-F0-9]*\)\".*/\1/")
if [[ "$request" == "" ]]; then
message="The request returned an empty respons"
else
message=$(UCS2_UTF8 $request)
if [[ "$message" == "" ]];then
message="The request after conv returned an empty respons"
fi
fi
echo "" > $tempfile
if [ ! -f $tempfile ]; then
echo "$tempfile not found!"
exit
fi
echo -e "\n$message" | tee $tempfile
from=lte@domain.ru
to=it@domain.ru
( cat <<EOCAT
MIME-Version: 1.0
From: $from
To: $to
Subject: [ROOM][LTE][BALANCE]
Content-Type: text/plain
EOCAT
cat $tempfile ) | /usr/sbin/sendmail -t
В ответе на запрос могут быть пробелы, чтобы избежать ошибок sendmail рекомендуется добавить перевод строки в начало.
С SMS работаем при помощи smstools, ставится из репозиториев. Я добился нужного мне результата
Комментариев нет:
Отправить комментарий