1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Odys Loox - Geräte mit inotifyd automatisch verwalten, einhängen

Dieses Thema im Forum "Odys Loox Forum" wurde erstellt von fluxflux, 04.02.2012.

  1. fluxflux, 04.02.2012 #1
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Das Programm inotifyd hat ropa erwähnt, ist also seine Idee!

    Es ist Teil von busybox und kann Dateien oder Verzeichnisse überwachen.

    Ich habe für mich mal etwas getestet, es scheint einen Weg zu geben, z. B. einen USB-GPS-Empfänger automatisch einzubinden, speziell die Baudrate zu switchen, sobald der Empfänger eingesteckt wird.

    • Das benötigte Kernelmodul liegt in der boot.img, ist also im laufenden Kernel vorhanden.
    • inotifyd wird in der boot.img über die init.rc/init.sh gestartet und läuft mit dem Befehl über die /data/local/init.sh "busybox inotifyd /data/local/devwatch /dev:n"
    • In /data/local/ liegt ein Skript devwatch, das folgende Zeilen enthält:
    Code:
    #!/system/bin/sh
    if dmesg | tail -2 | grep pl2303 | grep ttyUSB0 | grep attached; then
    # stty 3mal aufrufen, da es oft beim ersten Mal nicht klappt
    stty -F /dev/ttyUSB0 ispeed 4800
    stty -F /dev/ttyUSB0 ispeed 4800
    stty -F /dev/ttyUSB0 ispeed 4800
    fi
    
    • Steckt man nun den USB-GPS-Empfänger an, dann wird die Baudrate automatisch auf 4800 eingestellt und man kann sofort das Programm UsbGPS starten, ohne in einer Konsole noch etwas eingeben zu müssen.
    Man kann so z. B. auch ein CD/DVD-Laufwerk mounten, ohne die vold.fstab zu verändern oder einen DVB-T-Empfänger starten.

    Vorschläge willkommen!

    Die Skripter dürfen das gerne in eine "schöne" Form bringen ... :)

    Thomas.
     
    Zuletzt bearbeitet: 04.02.2012
    wishmasterf, RainerWP und Oma7144 haben sich bedankt.
  2. ropa, 05.02.2012 #2
    ropa

    ropa Junior Mitglied

    Beiträge:
    29
    Erhaltene Danke:
    8
    Registriert seit:
    11.01.2012
    Hi,

    ich habe ein Script geschrieben, das /dev/bus/usb/002 mit Hilfe von inotifyd ueberwacht und beim Einstecken eines USB-Geraetes in den USB-Hostport prueft um welches Geraet es sich handelt. Wenn es ein Bluetooth USB tranceiver ist, in meinem Fall "ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)", wird darueber nach einem Geraete gesucht, das Bluetooth SP unterstuetzt. Das wird dann mit /dev/rfcomm0 gebunden, ueber das dann die z.B.: NMEA-Daten abgefragt werden koennen. Das ist zumindest das was ich moechte ;-)

    Der Aufruf des Scripts geht so:

    inotifyd /data/dev_watcher.sh /dev/bus/usb/002:nd &

    Folgendes gibt es zu beachten:
    1. Das Script geht nur wenn die Busybox und alle Symlinks unter /bin zu finden sind. Ist das nicht der Fall, muss man die 1. Zeile des Scripts anpassen.

    2. Die Vendor und Product Ids sind anzupassen. Siehe entsprechende Variablen im Script.

    3. Das Bluetooth-GPS muss VOR dem Einstecken der USB-Bluetooth-tranceivers eingeschaltet sein und sollte schon einen Positionfix haben, also seine Position kennen. Ich weis nicht ob alle GPSen schon vorher NMEA-Saetze schicken.

    4. Leider geht das Entladen nicht so wie ich es mir vorstelle. Das Device /dev/rfcomm0 ist manchmal blockiert und kann daher nicht neu gebunden werden. Ich weis im Moment leider nicht wo die Ursache liegt. Wenn Jemand von Euch Lust dazu hat, kann er das gerne untersuchen. Wuerde mich ueber Hinweise freuen.

    5. lsusb ist bei mir die "richtige vollstaendige" Version, also nicht das busybox applet. Diese Stelle im Script muss also wahrscheinlich angepasst werden.

    6. Ohne Gewaehr !!!!

    Hier das Script: ( gibt es im Anhang auch als dev_watcher.sh.txt zum downloaden )

    Code:
    #!/bin/sh
    
    # This script is called from inotifyd when a device is
    # added to or removed from /dev/bus/usb/002
    # call with:
    #     inotifyd /data/dev_watcher.sh /dev/bus/usb/002:nd &
    
    DEBUG=1
    
    if [ ${DEBUG} -eq 1 ]
    then
        # enable shell debugging
        set -x
        
        # All output send to log file
        log=/data/dev_watcher.log
    else
        # All output send to /dev/null
        log=/dev/null
    fi
    
    exec 2>&1 1>>${log}
    
    EVENT=${1}
    BUS=${2}
    DEV=${3}
    
    VENDOR="0x0a12"
    PRODUCT="0x0001"
    
    RFCOMM="/dev/rfcomm0"
    DATA="/data/dev_watcher.dta"
    
    # Should be stored in a file
    BDADDR=""
    
    case ${EVENT} in
    "n")
        echo "We have a new device in here: dev=${DEV} ${SEC} event=${EVENT}!"
    
        # USB-Bluetooth-Tranceiver found ?
        idVendor=`/sbin/lsusb  -D ${BUS}/${DEV} | grep idVendor  | awk '{print $2}'`
        idProduct=`/sbin/lsusb -D ${BUS}/${DEV} | grep idProduct | awk '{print $2}'`
    
        # Known Device and Vendor ?
        if [[ "${idVendor}" == "${VENDOR}" && "${idProduct}" == "${PRODUCT}" ]]
        then
            echo "Found Bluetooth Dongle"
            # Setup hci0
            hciconfig hci0 up
            # Wait some seconds
            sleep 5
            # Look for service SP and get bluetooth addr if device supports service
            BDADDR=`sdptool search SP | grep "Searching for SP on" | awk '{print $5}'`
            echo ${BDADDR} > ${DATA}
            if [ ! -z ${BDADDR} ]
            then
                rfcomm release ${RFCOMM} ${BDADDR} 1
                rfcomm bind ${RFCOMM} ${BDADDR} 1
                if [ ! -c ${RFCOMM} ]
                then
                    echo Could not create ${RFCOMM}
                else
                    echo ${RFCOMM} should be ready for use
                fi
            else
                echo service SP not found on /dev/bus/usb/${BUS}/${DEV}
            fi
        else
            echo Unknown device
        fi
        ;;    
    
    "d")
        echo ${BUS}/${DEV} removed so clean up
    
        # read bdaddr from file.
        BDADDR=`cat ${DATA}`
    
        rfcomm release ${RFCOMM} ${BDADDR} 1
        rm -f ${RFCOMM}
        echo ${RFCOMM} removed
        ;;
    esac
    
    exit 0
    
    
    Viele Gruesse
    ropa
     

    Anhänge:

    Zuletzt bearbeitet: 05.02.2012
    PopEi und fluxflux haben sich bedankt.
  3. fluxflux, 09.02.2012 #3
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Ich hänge hier nochmal meine /data/local/init.sh und /data/local/devwatch an.

    Die devwatch überwacht /dev bzgl. USB-GPS und switcht dann die Baudrate auf 4800 und /dev/input bzgl. Gamepad/Joystick, dessen Rechte dann für Gamepad IME korrekt gesetzt werden.

    Thomas.
     

    Anhänge:

    RainerWP und Oma7144 haben sich bedankt.
  4. fluxflux, 10.02.2012 #4
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Ich habe jetzt in der boot.img die Bluetooth-Einträge etwas verändert, lasse die Bluetooth-Kernelmodule auch schon in der Ramdisk laden. Dadurch läuft der Bluetooth-Dongle korrekt, er wird beim Einstecken sofort aktiviert und das Scannen läuft jetzt richtig ab (so schnell wie am Linuxsystem und die Remotegeräte werden mit Namen angezeigt).

    Das Verbinden, Trennen und Releasen des rfcomm0 klappt zuverlässig über inotifyd, ich verwende ein eigenes Skript mit fester <bdaddr> für den GPS-Empfänger. Der GPS-Empfänger muss nur eingeschaltet sein, ein Fix ist nicht notwendig.

    Ich stoße den Stream im Skript mit cat an und lese für 30 Sekunden den Stream im Skript mit cat aus, in dieser Zeit starte ich UsbGPS, das den Stream anstandslos übernimmt (cat wird dann beendet)

    Ich nehme das in den nächsten Tagen in eine neue boot.img auf, damit Interessierte dies auch nutzen können.

    Thomas.
     
    Zuletzt bearbeitet: 10.02.2012
    PopEi, ropa, RainerWP und eine weitere Person haben sich bedankt.
  5. fluxflux, 10.02.2012 #5
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Hier meine derzeitige Lösung, gefällt mir, klappt ohne Fehler, werde ich für mich so beibehalten.

    In der boot.img wird in der init.rc eine inotifyd.rc gestartet:

    Code:
    service inotifyd /inotifyd.rc
    user root
    oneshot
    
    Die inotifyd.rc sieht so aus:

    Code:
    #!/busybox sh
    if [ -x /system/etc/rc.d/rc.inotifyd ];
    then
    /busybox sh /system/etc/rc.d/rc.inotifyd
    fi
    
    /system/etc/rc.d/ ist bewährte Slackware-Tradition für Skripte, die beim Booten ausgeführt werden.

    Dort liegt die rc.inotifyd:

    Code:
    #!/system/bin/sh
    busybox inotifyd /system/etc/rc.d/rc.devwatch /dev:n /dev/input:n /dev/bus/usb/002:nd &
    Es werden USB-GPS, Joystick und Bluetooth-Dongle/GPS überwacht und durch die rc.devwatch im gleichen Verzeichnis (/system/etc/rc.d/) gestartet:

    Code:
    #!/system/bin/sh
    EVENT=${1}
    case ${EVENT} in
    "n")
    # USB-GPS, fuer cp210x-basierte GPS pl2303 mit cp210x ersetzen
    if dmesg | busybox tail -2 | busybox grep pl2303 | busybox grep ttyUSB0 | busybox grep attached ; then
    sleep 5
    echo Baudrate einstellen...
    busybox stty -F /dev/ttyUSB0 ispeed 4800
    busybox stty -F /dev/ttyUSB0 ispeed 4800
    busybox stty -F /dev/ttyUSB0 ispeed 4800 
    fi
    # Joystick
    if dmesg | busybox tail -5 | busybox grep Joystick ;
    then
    sleep 5
    busybox chmod 666 /dev/input/js*
    fi
    # Bluetooth-GPS
    if dmesg | busybox tail -5 | busybox grep idVendor | busybox grep 0a12 ; then
    sdptool search AVRCT > /mnt/asec/ausg
    cat /mnt/asec/ausg | busybox grep AVRCT -A 1 > /mnt/asec/ausg1
    busybox tac /mnt/asec/ausg1 | busybox sed -n '/Service/{N;d};p' > /mnt/asec/ausg2
    bdaddr=`cat /mnt/asec/ausg2 | busybox grep : | busybox cut -d" " -f5`
    busybox mknod -m 666 /dev/rfcomm0 c 216 0
    rfcomm release /dev/rfcomm0 ${bdaddr} 1
    rfcomm bind /dev/rfcomm0 ${bdaddr} 1
    cat /dev/rfcomm0 &
    sleep 30
    busybox killall cat
    fi
    ;;
    "d")
    bdaddr=`cat /mnt/asec/ausg2 | busybox grep : | busybox cut -d" " -f5`
    rfcomm release /dev/rfcomm0 ${bdaddr} 1
    rm /mnt/asec/ausg*
    ;;
    esac
    exit 0
    
    Danke an ropa für Einblicke ins Skriptschreiben!

    Die Mac-Adresse des Bluetooth-GPS wird automatisch ausgelesen, /dev/rfcomm0 automatisch gebunden und getrennt. Man hat 30 Sekunden Zeit, den Dienst UsbGPS zu starten, der auf /dev/rfcomm0 zeigen muss. Die Zeit kann man beliebig verkürzen, verlängern.

    Der Bluetooth-Dongle wird beim Anstecken automatisch erkannt und eingeschaltet, das habe ich durch ein paar Änderungen in der boot.img erreicht.

    Die geänderten Dateien init.rc, init.rk29board.rc und uevent.rk29board.rc hänge ich an, dann kann jeder selber schauen, was anders ist.

    Wie gesagt, mein Weg ...

    Thomas.
     

    Anhänge:

    Zuletzt bearbeitet: 11.02.2012
  6. fluxflux, 11.02.2012 #6
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Das System kann ab morgen im Hack-Shop (danke an PopEi!!!) komplett geladen werden, dort gibt es eine readme.txt, die alle Infos enthält.

    Alle notwendigen Änderungen oder Ergänzungen für neue USB-Geräte können durch den Nutzer problemlos in der /system/etc/rc.d/rc.devwatch eingetragen werden! Es ist somit frei konfigurierbar, läuft aber mit den eingetragenen Geräten schon beim ersten Start nach dem Flashen per default ohne Zutun des Nutzers.

    Eventuelle Fehler berichtige ich gerne, danke ...

    Thomas.
     
  7. wishmasterf, 12.02.2012 #7
    wishmasterf

    wishmasterf Fortgeschrittenes Mitglied

    Beiträge:
    409
    Erhaltene Danke:
    56
    Registriert seit:
    26.12.2011
    gibts eine derartige lösung auch füs xpress? schön wäre es wenn es eine lösung gibt die mit dem ext4-image(für xpress) zusammenarbeiten würde.
     
  8. fluxflux, 12.02.2012 #8
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Mit ext4-Image meinst du das Pistazien-System? :smile:

    Thomas.
     
  9. wishmasterf, 12.02.2012 #9
    wishmasterf

    wishmasterf Fortgeschrittenes Mitglied

    Beiträge:
    409
    Erhaltene Danke:
    56
    Registriert seit:
    26.12.2011
    ja, ich finde es ist derzeit das beste image (wenn das problem mit autorotation nicht stört)
     
  10. fluxflux, 12.02.2012 #10
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Ja, kann man machen, muss ich mir aber erst neu runterladen.

    Oder du schiebst die beiden Dateien rc.inotifyd und rc.devwatch nach /system/etc/rc.d/ (Verzeichnis erst anlegen) und ich schicke dir nur die geänderte boot.img, dann müsstest du nur die boot.img neu flashen.

    Über den Inhalt der rc.devwatch müssten wir noch reden, denn der Bluetooth-Part kann ja komplett entfallen, da Bluetooth im ext4 ja per default läuft.

    Thomas.
     
    wishmasterf bedankt sich.
  11. wishmasterf, 12.02.2012 #11
    wishmasterf

    wishmasterf Fortgeschrittenes Mitglied

    Beiträge:
    409
    Erhaltene Danke:
    56
    Registriert seit:
    26.12.2011
    bluetooth sollte per default laufen ja, läuft aber (noch) nicht beim xpress. Wenn due eine boot.img zur verfügung stellen kannst wäre dies echt genial!
     
  12. fluxflux, 12.02.2012 #12
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Kannst du mir mal den Inhalt von /system/etc/bluez/ auf dem ext4-System mal zeigen?

    Ich vermute nach wie vor, dass das Xpress den Kombichip WLAN/Bluetooth an Bord hat und deswegen ein externer Bluetooth-Dongle nicht korrekt läuft.

    Thomas.
     
  13. fluxflux, 12.02.2012 #13
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Und bitte noch prüfen, ob /system/bin/brcm_patchram_plus im ext4-System vorhanden ist ...

    Thomas.
     
  14. wishmasterf, 12.02.2012 #14
    wishmasterf

    wishmasterf Fortgeschrittenes Mitglied

    Beiträge:
    409
    Erhaltene Danke:
    56
    Registriert seit:
    26.12.2011
    #ls /system/etc/bluez/
    bcm432x
     
  15. fluxflux, 12.02.2012 #15
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Ok, noch eine Ebene tiefer bitte, also den Inhalt von bcm432x ...

    Thomas.
     
  16. wishmasterf, 12.02.2012 #16
    wishmasterf

    wishmasterf Fortgeschrittenes Mitglied

    Beiträge:
    409
    Erhaltene Danke:
    56
    Registriert seit:
    26.12.2011
    ls /system/etc/bluez/bcm432x
    BCM4329B1_USI_WM-BN-BM-01.hcd
    BCM4329B1_002.002.023.0389.0000_Cybertan-Foxconn_Cls2_extLNA_EDRmaxInputLev+PeakDEVM_NT.hcd
    BCM4325D1_004.002.004.0034.MURATA.OPERA.TESTONLY_optweak_0dBm.hcd
    BCM4329B1_TestOnly_0237_26MHz_SEMCO_B23.hcd
     
  17. KDO70, 13.02.2012 #17
    KDO70

    KDO70 Android-Hilfe.de Mitglied

    Beiträge:
    99
    Erhaltene Danke:
    15
    Registriert seit:
    03.02.2012
    Hallo Thomas,

    hab mir die aktuellen mod_.img runtergeladen und installiert. Leider wird mein Bluetooth-Stick zwar erkannt, aber Bluetooth GPS wird nicht erkannt. Die Scripte haben bisher funktioniert.
    Als letzte Meldung bei DMESG kommt:

    usb 2-1.1: input irq status -115 received

    Wo liegt der Fehler?

    Klaus
     
  18. fluxflux, 13.02.2012 #18
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Welche Skripte haben bisher funktioniert? Inhalt?

    Und wie gehst du genau vor? UsbGPS startest du innerhalb der Zeit, in der der BT-Dongle den Datenstream aufnimmt (sieht man am Flackern der LED)?

    Thomas.
     
  19. KDO70, 13.02.2012 #19
    KDO70

    KDO70 Android-Hilfe.de Mitglied

    Beiträge:
    99
    Erhaltene Danke:
    15
    Registriert seit:
    03.02.2012
    Das script btgps hat bisher hervorragend funktioniert.
    Wenn ich diese gestartet habe, hat nach ein paar Sekunden der BT-Dongle angefangen zu blinken. Danach hab ich UsbGPS gestartet...
    Nach dem aufspielen sollte ja nun der BT-Dongle automatisch erkannt und der Bluetooth-GPs eingebunden werden. Allerdings blinkt der BT-Dongle nicht. Nur die LED leuchtet blau.

    Klaus
     
  20. fluxflux, 13.02.2012 #20
    fluxflux

    fluxflux Threadstarter Android-Experte

    Beiträge:
    845
    Erhaltene Danke:
    265
    Registriert seit:
    30.11.2011
    Es läuft so ab:

    BT-Dongle nach dem Booten anstecken, er leuchtet konstant blau, da er sofort nach dem BT-GPS scannt. Hat er das gefunden, dauert es ein paar Sekunden bis der Datenstrom anfängt zu laufen, die LED flackert jetzt.

    Was läuft da bei dir anders? Wenn die LED dauernd leuchtet würde das auf ein fehlerhaftes Scannen mit sdptool hindeuten ...

    Abziehen und Anstecken des BT-Dongles hilft auch nicht?

    Thomas.

    Gesendet vom Odys Loox mit der Android-Hilfe.de-App
     

Diese Seite empfehlen