CUL (CC1101 USB Lite) oder andere USB-Geräte zentral im Haus via WLAN

Begonnen von Peedy, 10 Februar 2019, 20:06:19

Vorheriges Thema - Nächstes Thema

Peedy

### Update vom 15.11.2021
Komplett überarbeitet und auf beiden Seiten (Host & Client) autobind, autoattach und ohne externe Skripte/Dateien ausserhalb systemd! :-)
Wo?
https://gist.github.com/peedy2495/e9ed5938bf0c2e3983185d0c9622e97d


Hallo!

Hier wieder eines meiner Projekte, welches ich mit euch teilen will:
Heute geht es darum ein USB-Geraet, bei mir ein CC1101, an einer optimalen Funkposition weitab vom eigentlichen Server zu betreiben ...
Dies lässt sich mit dem usbip-Projekt umsetzen.
Hierfür habe ich einen Pi Zero W als usbip-Gateway auserkoren (siehe Bild)

Die Anregung habe ich von
https://unix.stackexchange.com/questions/406847/use-usbip-for-devices-that-are-being-removed-and-reconnected
aufgenommen, jedoch notwendige Anpassungen mit noch zusätzlichen "goodies" vorgenommen ;-)

auf dem Pi wird das usbip-Packet einfach mit

apt-get install usbip
auf Raspbian installiert.

Bei meinen CentOS-Server musste ich die Pakete folgend installieren
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

yum install kmod-usbip usbip-utils



auf dem usbip-Server (PiZero), als auch auf dem Client (FHEM-Server)
müssen noch Verzeichnisse erstellt werden
mkdir /opt/usbip
mkdir /var/spool/usbip


zunächst muss der usbip-daemon "usbipd" unter systemd gestartet werden.
Erstelle die Datei /lib/systemd/system/usbipd.service:
[Unit]
Description=USB/IP server daemon
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/sbin/usbipd

[Install]
WantedBy=multi-user.target


auf dem Server wird die Datei /opt/usbip/usbip-bind erstellt
#!/bin/bash

init () {
  SPOOL=/var/spool/usbip/bind
  touch $SPOOL

  while [[ -e $SPOOL ]]; do
    $exec bind -b $1
    sleep 10
  done

  $exec unbind -b $1
  exit 0
}

err () {
  echo "Can't be a Device: $1"
  echo $"Usage: $0 {-q|--quiet} [device]"
  exit 1
}

exec=$(whereis usbip|cut -d " " -f 2|grep /)
if [ $? -eq 1  ];then
  echo "Command usbip not found! Exit"
  exit 1
fi

while test -n "$1"; do
  case "$1" in
    -q|--quiet)
      exec &>/dev/null
      shift
    ;;
    *)
      [[ $1 = [0-9]* ]] && init "$1" ||  err "$1"
    ;;
  esac
done


und ein
chmod +x /opt/usbip/usbip-bind
hinterher

und dann die Datei /lib/systemd/system/usbip-bin-cul.service
[Unit]
Description=USB-IP Bindings
Wants=network-online.target
After=network-online.target
Requires=usbipd.service

[Service]
KillMode=none
ExecStart=/opt/usbip/usbip-bind -q 1-1
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target


mit
usbip list -l
bekommt man die lokalen device-ids heraus; bei mir 1-1für das CUL-device.
Entsprechend den Eintrag in der .service-Datei anpassen.

auf dem Client die Datei /opt/usbip/usbip-attach erstellen
#!/bin/bash

init () {
  if [ -z $1 ]; then
    echo "Missing Device argument! Exit"
    exit 1
  elif [ -z $2 ]; then
    echo "Missing Host argument! Exit"
    exit 1
  fi

  SPOOL=/var/spool/usbip/attach
  touch $SPOOL

  while [[ -e $SPOOL ]]; do
    $exec attach -r $2 -b $1
    if [ $? -eq 0 ]; then
      sleep 2
      port+=("$(usbip port|grep Port|cut -d " " -f 2|tail -n1|sed 's/://')")
      echo "Device $1 bound on Port: $port"
    fi
    sleep 10
  done

  echo "detaching port: $port"
  $exec detach -p $port
  exit 0
}

err () {
  echo "Can't be a Device: $1"
  echo $"Usage: $0 {-q|--quiet} {-h=[host]} [device]"
  exit 1
}

exec=$(whereis usbip|cut -d " " -f 2|grep /)
if [ $? -eq 1  ];then
  echo "Command usbip not found! Exit"
  exit 1
fi

while test -n "$1"; do
  case "$1" in
    "")
      echo $"Usage: $0 {-q|--quiet} {-h=[host]} [device]"
      exit 1
      ;;
    -q|--quiet)
      exec &>/dev/null
      shift
      ;;
    -h=*|--host=*)
      host=$(echo $1|cut -d "=" -f 2)
      shift
      ;;
    *)
      [[ $1 = [0-9]* ]] && init "$1" "$host" ||  err "$1"
      ;;
  esac
done


und auch hier natürlich noch ausführbar machen
chmod +x /opt/usbip/usbip-attach

und dann noch in /lib/systemd/system/ die Datei usbip-attach-cul.service
[Unit]
Description=USB-IP Attach
Wants=network-online.target
After=network-online.target

[Service]
KillMode=none
ExecStart=/opt/usbip/usbip-attach -q -h=192.168.0.253 1-1
ExecStop=/bin/rm /var/spool/usbip/attach  ;  /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; echo "wait">>/opt/usbip/debug.txt; do sleep 1; done"

[Install]
WantedBy=multi-user.target


auf beiden Seiten müssen die .service-Dateien noch mit
systemctl daemon-reload
geladen werden.

danach lassen sich die Services auf der jeweiligen Seite starten

Server

systemctl enable usbipd
systemctl start usbipd
systemctl enable usbip-bind-cul
systemctl start usbip-bind-cul


Client
systemctl enable usbip-attach-cul
systemctl start usbip-attach-cul


Danach kann auch das USB-Gerät aus- und wieder einsteckt werden.
Dann ist es nach ein paar Sekunden wieder verfügbar

überprüfen lässt sich das mit
usbip port

Zusatzinfos:

Unter "systemctl status usbipd" sieht man nach einer Weile errors.
Dies ist normal, da der Clinetseitige Service ständig ein reconnect versucht, jedoch schon verbunden ist.
Also kommt nur beim ersten Versuch ein success heraus :-)

Prüfen ob der Server etwas anbietet
usbip list -r [servername oder IP]

Manuell ein USB-Gerät am Client "ausklinken"
usbip detach -p [Portnummer]

Manuell ein USB-Gerät am Server freigeben/zurücknehmen
usbip unbind -b [GeräteID]

Viel Spaß ... Peedy

dieter114

Hi Peedy,

ich hab alles nach deiner Anleitung zusammengebaut aber wenn ich auf dem Server (Pi Zero)
bei mir ein alter Pi1 die Services starte kommt:
root@Pi1:/home/pi#
root@Pi1:/home/pi# systemctl enable usbip-bind-cul
Failed to enable unit: File usbip-bind-cul.service: No such file or directory
root@Pi1:/home/pi#

Alle Dateien erstellt, ebenso alle Ordner.

Gruß Dieter
RPi II+III+IV,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLEMINI, div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI, Indego,Poolsteuerung mit fhem

Wernieman

Existiert folgende Datei?
i /lib/systemd/system/usbip-bin-cul.service
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

dieter114

RPi II+III+IV,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLEMINI, div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI, Indego,Poolsteuerung mit fhem

Wernieman

Systemd reloade oder Pi reboot?
Sonst kann folgendes nicht stimmen:
ZitatFailed to enable unit: File usbip-bind-cul.service: No such file or directory
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

dieter114

Neuer Zwischenstand:
System neu aufgesetzt, Debian Buster.
Alle Updates und dann Installation wie oben beschrieben.
Also kein fhem drauf und nichts Anderes außer usbip.
Gleiches Ergebnis beim Start.
Kann es sein das irgend was Grundlegendes fehlt?
RPi II+III+IV,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLEMINI, div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI, Indego,Poolsteuerung mit fhem

Wernieman

gib uns bitte mal:
ls -lha /lib/systemd/system/usbip-bin-cul.service
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

dieter114

Bitte:
pi@raspberrypi:~ $ ls -lha /lib/systemd/system/usbip-bin-cul.service
-rw-r--r-- 1 root root 302 Oct 31 15:54 /lib/systemd/system/usbip-bin-cul.service
pi@raspberrypi:~ $


Gruß Wolfdieter
RPi II+III+IV,OWX,div.1W Module,HM Zisterne,div. CUL, sduino MAPLEMINI, div ESPEasy, div Tasmota, MQTT2Server,WU-Upload,TabletUI, Indego,Poolsteuerung mit fhem

duke-f

Ich glaube, ich habe etwas entsprechendes mithilfe ser2net realisiert, auf 2 externen Raspberries uns 3 CUL/SCC.
Cubietruck, 3 Raspberry Pis,
CUL868, RFXtrx433, CUL433, SCC868, HM-USB,
IRTrans, EZcontrol XS1, IguanaWorks USB IR Transceiver
ESPEasy, Fritz!Box, Samsung TV+BD, LMS, Squeezelite

Peedy

Hallo Leute,
Sorry, aber die Diskussion ist an mir vorbeigegangen, da ich [SHAME ON] vergessen hatte das Board zu Abonnieren [SHAME OFF]

Ich hatte übersehen, dass noch von vorherigen Basteleien ein eigener Systemd-Service läuft, welcher auf der Serverseite den usbip-daemon startet ...

Ich erweitere den ersten Beitrag um den fehlenden Anteil. Sorry und trotzdem viel Spaß :-)

Hasta ... Peedy

Peedy

### Update
Komplett überarbeitet und auf beiden Seiten (Host & Client) autobind, autoattach und ohne externe Skripte/Dateien ausserhalb systemd! :-)
Wo?
https://gist.github.com/peedy2495/e9ed5938bf0c2e3983185d0c9622e97d