Некоторые картинки не загружаются из РФ и РК, используйте VPN.

суббота, 11 мая 2024 г.

RPi подключаем модем для обработки USSD и SMS

Ниже описан полный путь. В какой то момент я купил новый модем, но у него оказался 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. Вот эта таблица больше подходит

100002ERROR_SYSTEM_NO_SUPPORT
100003ERROR_SYSTEM_NO_RIGHTS
100004ERROR_BUSY
101001ERROR_NO_SIM_CARD_OR_INVALID_SIM_CARD
101002ERROR_CHECK_SIM_CARD_PIN_LOCK
101003ERROR_CHECK_SIM_CARD_PUN_LOCK
101004ERROR_CHECK_SIM_CARD_CAN_UNUSEABLE
101005ERROR_ENABLE_PIN_FAILED
101006ERROR_DISABLE_PIN_FAILED
101007ERROR_UNLOCK_PIN_FAILED
101008ERROR_DISABLE_AUTO_PIN_FAILED
101009ERROR_ENABLE_AUTO_PIN_FAILED
103002ERROR_DEVICE_PIN_VALIDATE_FAILED
103003ERROR_DEVICE_PIN_MODIFFY_FAILED
103004ERROR_DEVICE_PUK_MODIFFY_FAILED
103008ERROR_DEVICE_SIM_CARD_BUSY
103009ERROR_DEVICE_SIM_LOCK_INPUT_ERROR
103011ERROR_DEVICE_PUK_DEAD_LOCK
108001ERROR_LOGIN_USERNAME_WRONG
108002ERROR_LOGIN_PASSWORD_WRONG
108003ERROR_LOGIN_ALREADY_LOGIN
108005ERROR_LOGIN_TOO_MANY_USERS_LOGINED
108006ERROR_LOGIN_USERNAME_OR_PASSWORD_ERROR
108007ERROR_LOGIN_TOO_MANY_TIMES
108008MODIFYPASSWORD_ERROR
108009ERROR_LOGIN_IN_DEFFERENT_DEVICES
108010ERROR_LOGIN_FREQUENTLY_LOGIN
112001ERROR_SET_NET_MODE_AND_BAND_WHEN_DAILUP_FAILED
112002ERROR_SET_NET_SEARCH_MODE_WHEN_DAILUP_FAILED
112003ERROR_SET_NET_MODE_AND_BAND_FAILED
112005ERROR_NET_REGISTER_NET_FAILED
112008ERROR_NET_SIM_CARD_NOT_READY_STATUS
125001ERROR_WRONG_TOKEN
125002ERROR_WRONG_SESSION
125003ERROR_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, ставится из репозиториев. Я добился нужного мне результата

Комментариев нет:

Отправить комментарий