26

Odp: Sposób na działające USSD

Nie mam. Udev nie występuje na openwrt, więc domyślnie tego nie znajdziesz. Czeka cię tworzenie i kompilacja pakietu od początku.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

27 (edytowany przez client22 2021-11-23 08:33:22)

Odp: Sposób na działające USSD

Znalazłem skrypt do hotpluga, który wiąże urządzenia do konkretnych portów tak jak tego potrzebowałem: https://openwrt.org/docs/guide-user/base-system/hotplug

Skrypt działa i po podpięciu modemu tworzy symlinki w katalogu dev:

https://i.imgur.com/WViZpPS.png

#!/bin/sh
# Description: Action executed on boot (bind) and with the system on the fly
if [ "${ACTION}" = "bind" ]; then
  case "${PRODUCT}" in
    12d1*) # E173 3g modem product id prefix
      DEVICE_NAME="$(ls /sys/${DEVPATH} | grep tty)"
      DEVICE_TTY="$(ls /sys/${DEVPATH}/tty/)"

      # Module E173-* connected to slot 1
      if [ "${DEVICENAME}" = "1-1:1.0" ]; then
        ln -s /dev/${DEVICE_TTY} /dev/ttyGSMO1_AT
        logger -t hotplug "Symlink from /dev/${DEVICE_TTY} to /dev/ttyGSMO1_AT created"

      elif [ "${DEVICENAME}" = "1-1:1.1" ]; then
        ln -s /dev/${DEVICE_TTY} /dev/ttyGSMO1_DATA
        logger -t hotplug "Symlink from /dev/${DEVICE_TTY} to /dev/ttyGSMO1_DATA created"

      elif [ "${DEVICENAME}" = "1-1:1.2" ]; then
        ln -s /dev/${DEVICE_TTY} /dev/ttyGSMO1_AT2
        logger -t hotplug "Symlink from /dev/${DEVICE_TTY} to /dev/ttyGSMO1_AT2 created"

      fi
    ;;
  esac
fi
# Action to remove the symlinks
if [ "${ACTION}" = "remove" ]; then
  case "${PRODUCT}" in
    12d1*)  # E173 3g modem product id prefix

     # Module E173-* connected to slot 1
      if [ "${DEVICENAME}" = "1-1:1.0" ]; then
        rm /dev/ttyGSMO1_AT
        logger -t hotplug "Symlink /dev/ttyGSMO1_AT removed"

      elif [ "${DEVICENAME}" = "1-1:1.1" ]; then
        rm /dev/ttyGSMO1_DATA
        logger -t hotplug "Symlink /dev/ttyGSMO1_DATA removed"

      elif [ "${DEVICENAME}" = "1-1:1.2" ]; then
        rm /dev/ttyGSMO1_AT2
        logger -t hotplug "Symlink /dev/ttyGSMO1_AT2 removed"

      fi
    ;;
  esac
fi
EOF

...Jednak co z tego skoro są one nieużywalne i smsd wywala taki błąd:

2021-11-23 00:57:55,3, GSM1: Couldn't open serial port /dev/ttyGSMO1_AT, error: Is a directory, waiting 30 sec.
2021-11-23 00:57:55,3, GSM2: Couldn't open serial port /dev/GSM2_0, error: No such file or directory, waiting 30 sec.

Dla przykładu ten "GSM2" nie jest w ogóle podpięty.

Wynik zapytania:

dmesg | grep tty

Pokazuje to:

[   20.012509] option 1-1:1.0: GSM modem (1-port) converter detected
[   20.019136] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0

[   20.026780] option 1-1:1.1: GSM modem (1-port) converter detected
[   20.033406] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1

[   20.040952] option 1-1:1.2: GSM modem (1-port) converter detected
[   20.047585] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2

28

Odp: Sposób na działające USSD

Nie robisz nigdzie /dev/GSM2_0, więc czemu się dziwisz że nie działa? Ponad to - chyba pomyliłeś O (litera) z 0 (cyfra) w linkach bo inaczej się to wyświetla.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

29 (edytowany przez client22 2021-11-24 02:07:30)

Odp: Sposób na działające USSD

Tu nie chodzi o błąd "GSM2_0" bo on w ogóle nie jest podpięty więc to normalne, że taki błąd wywala, ale o to "/dev/ttyGSMO1_AT, error: Is a directory, waiting 30 sec" - niby mam symlinka w katalogu ale jest jakby nieaktywny. Testuje na razie przy minimalnej konfiguracji, na jednym modemie. Wrzuciłem, ten log GSM2_0 aby pokazać, że komunikaty błędów się różnią. Inaczej wygląda komunikat o błędzie jeśli symlink w ogóle nie istnieje w a inaczej jeśli symlink niby jest w katalogu ale z jakiegoś powodu nie działa.

Ale mniejsza z tym, bo znalazłem już inny skrypt do hotpluga. Wygląda może mniej elegancko i czytelnie ale przynajmniej działa jak należy.

#!/bin/sh

#
# /etc/hotplug.d/tty/10-persistent_ttys
#
# creates persistent USB tty device links under /dev/serial/by-port based on usb port number (eg hub port)
#
# Sat Jan 26 23:28:14 CET 2019        Michael Rausch <mrausch (at) netadair.de>      Initial version
# Tue Mar 17 16:24:29 CET 2020        Michael Rausch                    Fixed regex for ttyACM
#
# TODO: check with multi-tty UMTS adapters
#

. /lib/functions.sh
. /lib/functions/procd.sh

logger -t DEBUG "hotplug tty: action='$ACTION' devicename='$DEVICENAME' devname='$DEVNAME' devpath='$DEVPATH' product='$PRODUCT' type='$TYPE' interface='$INTERFACE'"

# Sun Jan 20 10:35:27 2019 user.notice DEBUG: hotplug tty: action='add' devicename='ttyUSB1' devname='ttyUSB1' devpath='/devices/pci0000:00/0000:00:13.0/usb1/1-2/1-2.2/1-2.2:1.0/ttyUSB1/tty/ttyUSB1' product='' type='' interface=''
# /dev/serial/by-port//sys/devices/platform/ehci-platform/usb1/1-1/1-1:1.0/tty/ttyACM0

# NB: not sure if this works properl in all cases, eg multiple dev nodes per physical device
[ -z "${DEVNAME}" ] && exit


SERIALPATH=/dev/serial/by-port
[ ! -d "$SERIALPATH" ] && mkdir -p "$SERIALPATH" 

#USBPORT=$(echo "/sys$DEVPATH" | sed -r -e 's/(^.*\/)(.*)(\/tty.*\/tty\/tty.*$)/\2/' )
USBPORT=$(echo "/sys$DEVPATH" | sed -r -e 's#(/tty.*$)##' | sed -r -e 's#(^.*/)(.*$)#\2#' )

if [ "${ACTION}" = "add" ]; then
    if [ -z "${USBPORT}" ]; then
        logger -t WARN "hotplug tty: Warning, usb port is empty"
        exit
    fi

    ln -sf /dev/$DEVICENAME "${SERIALPATH}/${USBPORT}" 
    logger -t INFO "hotplug tty: Symlink to /dev/$DEVICENAME from ${SERIALPATH}/${USBPORT} created"
fi

if [ "${ACTION}" = "remove" ]; then
        if [ -z "${USBPORT}" ]; then
                logger -t WARN "hotplug tty: Warning, usb port is empty"
                exit
        fi

       rm "${SERIALPATH}/${USBPORT}"
        logger -t INFO "hotplug tty: Symlink from ${SERIALPATH}/${USBPORT} removed"
fi

Działa to tak, że w katalogu dev tworzy on ścieżkę składającą się z dwóch podkatalogów dev/serial/by-port/ gdzie w tym ostatnim folderze mam już symlinki do poszczególnych interfejsów modemu czyli w configu smsd podaje np. coś takiego:

device = /dev/serial/by-port/1-1:1.0

Co odpowiada: "/dev/ttyUSB0" Dopóki modemy będą wpięte w te same porty huba to wszystko będzie działać.

Ale ogólnie muszę powiedzieć, że dramat z tym hotplugiem.. Uważam, że skoro społeczność odpowiedzialna za OpenWrt zdecydowała na usunięcie udeva, to przykładów rozwiązań tutaj https://openwrt.org/docs/guide-user/base-system/hotplug powinno być więcej a okazuje się, że nawet to co tam jest nie zupełnie działa. Wszystkie tego typu rozwiązania w innych systemach opartych na linuxie opierają się na regułach udev i chyba tylko OpenWrt z tego korzysta. Skoro domyślnie udev-a nie ma to powinna być chociaż możliwość jego prostej instalacji dla tych co tego potrzebują a tak jak widać na tym przykładzie tworzy to masę problemów, bo nie każdy jest od razu programistą basha wink