Internet Speedtest

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Sirius3
User
Beiträge: 7052
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Internet Speedtest

Beitragvon Sirius3 » Montag 23. Januar 2017, 10:30

@Nr8: das mit dem Einrücken passiert hier, weil Du Tabs mit Spaces gemischt hast. Das sollte nicht sein, weil es, wie Du siehst, nur Probleme macht. Jeder vernünftige Editor bietet Dir die Möglichkeit einmalig Tabs in Spaces umzuwandeln und danach nur noch mit Spaces einzurücken, damit solche Fehler nicht passieren.

Statt irgendwelche Zeichen aus einem String rauszulöschen und zu hoffen, dass dadurch nicht der wichtige Inhalt kaputt geht, solltest Du den String parsen. Da das eine Komma-separierte Liste ist, sollte das nicht all zu schwierig sein.
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Dienstag 24. Januar 2017, 12:34

Gibt es python etwas wie grep?

Wenn ich also response = ser.readline() nach etwas greppen möchte???

Vielen Dank!
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Dienstag 24. Januar 2017, 12:43

@Nr8: Den ``in``-Operator auf Zeichenketten für einfache Tests auf statische Teilzeichenketten oder das `re`-Modul für reguläre Ausdrücke.
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Dienstag 24. Januar 2017, 15:03

Habe den Code jetzt etwas geändert.

Leider bekomme ich noch nicht das gewünschte Ergebniss.

response="" wollte ich testen ob ich alle paar sekunden neue Werte von HCSQ bekomme und das ist leider nicht so.

Sendet ser.write("AT^HCSQ?\x0D") nicht alle paar Sekunden eine Abfrage?

  1. ser = serial.Serial()
  2. ser.port = "/dev/ttyUSB1"
  3. ser.baudrate = 9600
  4. ser.bytesize = serial.EIGHTBITS
  5. ser.parity = serial.PARITY_NONE
  6. ser.stopbits = serial.STOPBITS_ONE
  7. ser.timeout = 0            
  8. ser.xonxoff = False    
  9. ser.rtscts = False    
  10. ser.dsrdtr = False      
  11. ser.writeTimeout = 2    
  12.  
  13. def doSignal():
  14.     ser.flushInput() #flush input buffer, discarding all its contents
  15.     ser.flushOutput()#flush output buffer, aborting current output
  16.  
  17.    
  18.     while True:
  19.         response = ser.readline().rstrip()
  20.         ser.write("AT^HCSQ?\x0D")
  21.         time.sleep(1)  #give the serial port sometime to receive the data
  22.         for HCSQ in response:  
  23.             signalst =  response.split(',')
  24.             verbindung = signalst[0]
  25.  
  26.             if (verbindung == '^HCSQ:"WCDMA"'):
  27.                 rssi = int(signalst[1])-120.5
  28.                 rsrp = int(signalst[2])-120.5
  29.                 sinr = int(signalst[3])
  30.                 sinr = (0.5*sinr)-32
  31.                 rsrq = 0
  32.                 verbindung = "WCDMA"
  33.                 subprocess.call("./Verbindungsaufbau1")
  34.  
  35.             elif (verbindung == '^HCSQ:"LTE"'):
  36.                 rssi = int(signalst[1])-120.5
  37.                 rsrp = int(signalst[2])-140.5
  38.                 sinr = int(signalst[3])
  39.                 sinr = (0.2*sinr)-20.1
  40.                 rsrq = (int(signalst[4])*0.5)-19.75
  41.                 verbindung = "LTE"
  42.                
  43.             elif (verbindung == '^HCSQ:"GSM"'):
  44.                 rssi = int(signalst[1])-120.5
  45.                 rsrp = 0
  46.                 sinr = 0
  47.                 sinr = 0
  48.                 rsrq = 0
  49.                 verbindung = "GSM"
  50.                 subprocess.call("./Verbindungsaufbau1")
  51.            
  52.             time.sleep(2)
  53.             datei = (format(DateTime.now(), '%H:%M:%S'),str(rssi), str(rsrp), str(sinr), str(rsrq), str(verbindung))
  54.             print (response)
  55.             print (";".join(datei))
  56.             fout.write(";".join(datei)+"\n")
  57.             #print (verbindung)
  58.             response=""
  59.  
  60. try:
  61.     ser.open()
  62.  
  63. except Exception, e:
  64.     print "error open serial port: " + str(e)
  65.     exit()
  66.  
  67. if ser.isOpen():
  68.     while True:
  69.         doSignal()
  70.         time.sleep(0.1)
  71.  
  72.  
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Dienstag 24. Januar 2017, 17:02

Mit dem bash Code geht es.

  1. #!/bin/bash
  2.  
  3. sudo cat /dev/ttyUSB1 | grep HCSQ &
  4.  
  5. while true
  6.     do
  7.        sudo echo "AT^HCSQ?" >/dev/ttyUSB1
  8.        sleep 2
  9.     done
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Dienstag 24. Januar 2017, 17:11

@Nr8: Zumindest das zweite ``sudo`` macht keinen Sinn. Und wenn man dafür die nötigen Rechte hat, dann sollte das erste ``sudo`` auch überflüssig sein.

Edit: Also (ungetestet):
  1. #!/bin/bash
  2. DEVICE_FILENAME='/dev/ttyUSB1'
  3.  
  4. grep 'HCSQ' "$DEVICE_FILENAME" &
  5.  
  6. while true; do
  7.    echo 'AT^HCSQ?' >"$DEVICE_FILENAME"
  8.    sleep 2
  9. done
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Dienstag 24. Januar 2017, 17:30

Kannst du dir erklären warum das mit dem bash geht aber mit Python nicht?
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Dienstag 24. Januar 2017, 17:44

@Nr8: Das geht auch in Python.
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Dienstag 24. Januar 2017, 19:30

Was mache ich denn falsch?
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Dienstag 24. Januar 2017, 21:09

@Nr8: Naja, Du hast halt was anderes implementiert. Zum Beispiel sehe ich nichts was dem ``&`` im Shell-Skript entspricht, damit das auslesen und filtern parallel ausgeführt wird.
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Dienstag 24. Januar 2017, 21:58

Nur mal so als Beispiel Dein Python-Programm als Shell-Skript, weil das irgendwie so klang als könnte man im Shell-Skript etwas machen was in Python nicht geht (ungetestet):
  1. #!/bin/bash
  2. SERIAL='/dev/ttyUSB1'
  3. VERBINDUNGSAUFBAU_1='./Verbindungsaufbau1'
  4.  
  5. do_signal() {
  6.     local response
  7.     local -a signalst
  8.     local verbindung
  9.     local rssi
  10.     local datei
  11.  
  12.     while true; do
  13.         read -r response
  14.         echo 'AT^HCSQ?' > "$SERIAL"
  15.         sleep 1
  16.         for (( i = 0; i < $(#response); i++ )); do  # XXX Völlig unsinnig.
  17.             IFS=',' read -r -a signalst <<< "$response"
  18.             verbindung=${signalst[0]}
  19.             case "$verbindung" in
  20.                 'HCSQ:"WCDMA"'*)
  21.                     rssi=$(echo "${signalst[1]} - 120.5" | bc)
  22.                     verbindung='WCDMA'
  23.                     $VERBINDUNGSAUFBAU_1
  24.                     ;;
  25.                 'HCSQ:"LTE"'*)
  26.                     rssi=$(echo "${signalst[1]} - 120.5" | bc)
  27.                     verbindung='LTE'
  28.                     ;;
  29.                 'HCSQ:"GSM"'*)
  30.                     rssi=$(echo "${signalst[1]} - 120.5" | bc)
  31.                     verbindung='GSM'
  32.                     $VERBINDUNGSAUFBAU_1
  33.                     ;;
  34.             esac
  35.  
  36.             sleep 2
  37.             datei="$(date '+%H:%M:%S');$rssi"
  38.             echo "$response"
  39.             echo "$datei"
  40.             response=''  # XXX Nur nötig wegen der unsinnigen ``for``-Schleife!
  41.         done
  42.  
  43.     done < "$SERIAL"
  44. }
  45.  
  46. while true; do
  47.     do_signal
  48.     sleep 0.1
  49. done

Die Kommentare zur ``for``-Schleife gelten natürlich auch für Deine Python-Fassung. Und ich habe hier nur `rssi` berechnet um Tipparbeit zu sparen, das wäre für die anderen Variablen ähnlich.

Die ``while``-Schleife im Hauptprogramm ist auch total unnötig weil die Funktion ja bereits eine Endlosschleife enthält.
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Mittwoch 25. Januar 2017, 08:20

Hab es jetzt so probiert.


  1. #!/usr/bin/python
  2.  
  3. import serial, time
  4. import sys
  5. import subprocess
  6. from datetime import datetime as DateTime
  7. #initialization and open the port
  8.  
  9. #possible timeout values:
  10. #    1. None: wait forever, block call
  11. #    2. 0: non-blocking mode, return immediately
  12. #    3. x, x is bigger than 0, float allowed, timeout block call
  13. ser = serial.Serial()
  14. #ser.port = "/dev/ttyUSB0"
  15. ser.port = "/dev/ttyUSB1"
  16. #ser.port = "/dev/ttyS2"
  17. ser.baudrate = 9600
  18. ser.bytesize = serial.EIGHTBITS #number of bits per bytes
  19. ser.parity = serial.PARITY_NONE #set parity check: no parity
  20. ser.stopbits = serial.STOPBITS_ONE #number of stop bits
  21. #ser.timeout = None          #block read
  22. ser.timeout = 1            #non-block read
  23. #ser.timeout = 2              #timeout block read
  24. ser.xonxoff = False     #disable software flow control
  25. ser.rtscts = False     #disable hardware (RTS/CTS) flow control
  26. ser.dsrdtr = False       #disable hardware (DSR/DTR) flow control
  27. ser.writeTimeout = 2     #timeout for write
  28.  
  29. try:
  30.     ser.open()
  31. except Exception, e:
  32.     print "error open serial port: " + str(e)
  33.     exit()
  34.  
  35. if ser.isOpen():
  36.  
  37.     try:
  38.         ser.flushInput() #flush input buffer, discarding all its contents
  39.         ser.flushOutput()#flush output buffer, aborting current output
  40.                  #and discard all that is in buffer
  41.         #write data
  42.         ser.write("AT^HCSQ?\x0D")
  43.         time.sleep(0.5)
  44.         numOfLines = 0
  45.         while True:
  46.             response = ser.readline().rstrip()
  47.             for HCSQ in response:
  48.                 a =  response.translate(None, ':')
  49.                 a = a.translate(None, ' ')
  50.                 a = a.translate(None, '^')
  51.                 a = a.translate(None, '"')
  52.                 a = a.translate(None, "'")
  53.                 a = a.translate(None, 'HCSQ')
  54.                 a = a.translate(None, '\r\n')
  55.                 b = a.split(",")
  56.                 signalst = tuple(b)
  57.                 verbindung = signalst[0]
  58.                            
  59.                 if (verbindung == "WDMA"):
  60.                     rssi = int(signalst[1])-120.5
  61.                     rsrp = int(signalst[2])-120.5
  62.                     sinr = int(signalst[3])
  63.                     sinr = (0.5*sinr)-32
  64.                     rsrq = 0
  65.                     verbindung = "WCDMA"
  66.                     subprocess.call("./Verbindungsaufbau1")
  67.  
  68.                 elif (verbindung == "LTE"):
  69.                     rssi = int(signalst[1])-120.5
  70.                     rsrp = int(signalst[2])-140.5
  71.                     sinr = int(signalst[3])
  72.                     sinr = (0.2*sinr)-20.1
  73.                     rsrq = (int(signalst[4])*0.5)-19.75
  74.                     verbindung = "LTE"
  75.                
  76.                 elif (verbindung == "GM"):
  77.                     rssi = int(signalst[1])-120.5
  78.                     rsrp = 0
  79.                     sinr = 0
  80.                     sinr = 0
  81.                     rsrq = 0
  82.                     verbindung = "GSM"
  83.                     subprocess.call("./Verbindungsaufbau1")
  84.            
  85.  
  86.                 datei = format(DateTime.now(), '%H:%M:%S'),str(rssi), str(rsrp), str(sinr), str(rsrq), str(verbindung)
  87.                 print (";".join(datei))
  88.                 fout.write(";".join(datei)+"\n")
  89.  
  90.                 numOfLines = numOfLines + 2
  91.  
  92.  
  93.                 if (numOfLines >= 2):
  94.                     break
  95.                 time.sleep(2)
  96.             if (numOfLines >= 2):
  97.                 break
  98.                 time.sleep(2)
  99.         ser.close()
  100.     except Exception, e1:
  101.         print "error communicating...: " + str(e1)
  102.  
  103. else:
  104.     print "cannot open serial port "
  105.  



Sollte .rstrip() nicht die Leerzeile löschen?
Hat nicht geklappt, deshalb habe ich "for HCSQ in response:" noch mit drin.

Die Sache mit dem translate klappt irgendwie am besten.
BlackJack

Re: Internet Speedtest

Beitragvon BlackJack » Mittwoch 25. Januar 2017, 10:46

Diese ``for HCSQ in response:``-Schleife ist völlig Banane. Wie oft wird die denn in welchen Fällen durchlaufen? Schleifen sind dazu da Code zumindest potentiell mehrfach zu wiederholen, sonst macht eine Schleife keinen Sinn. Also wie muss `response` aussehen (Beispielwerte und Erklärungen bitte) um diese Schleife 0 mal, 1 mal, 2 mal zu durchlaufen? Und an welchen Wert wird `HCSQ` in jedem dieser Durchläufe gebunden? Warum wird der Wert dann nirgends in der Schleife für irgend etwas verwendet?

Was meinst Du mit `rstrip()` und Leerzeile löschen? Auf eine Leerzeile angewandt ergibt das eine leere Zeichenkette, wobei Leerzeile in diesem Fall eine Zeile ist die nur „whitespace“-Zeichen enthält.

Der Test nach dem öffnen der seriellen Schnittstelle ob sie denn auch tatsächlich offen ist, macht keinen Sinn. Denn zu dem Zeitpunkt wo das getestet wird, ist die Schnittstelle natürlich offen, denn sonst wäre das `open()` direkt davor ja fehlgeschlagen.

Die `translate()`-Methode wird falsch verwendet. Der Code macht nicht das was Du denkst was er tut. Das gleiche Ergebnis könnte man mit *einem* Aufruf erreichen: ``a = response.translate(None, '\n\r "\':CHQS^')``. Und das klappt halt auch nur solange es tatsächlich klappt. Ich würde an der Stelle auf die Struktur der Daten in der Zeile eingehen statt etwas willkürlich einzelne Zeichen da rauszuschiessen. Das hat mehr was von Schrotgewehr anstelle eines passenden Werkzeugs.

Edit: Das einfache Shell-Skript mit ``grep`` als Hy-Programm (ungetestet):
  1. #!/usr/bin/env hy
  2. (import
  3.   [multiprocessing [Process]]
  4.   [time [sleep]]
  5.   [serial [Serial]])
  6.  
  7.  
  8. (defn call-async [func &rest args]
  9.   (let [process (Process :target func :args args)]
  10.     (setv (. process daemon) True)
  11.     (.start process)
  12.     process))
  13.  
  14.  
  15. (defn print-hcsq-lines [lines]
  16.   (for [line (filter (fn [s] (in "HCSQ" s)) lines)]
  17.     (print line)))
  18.  
  19.  
  20. (defmain [&rest args]
  21.   (with [serial (Serial "/dev/ttyUSB1")]
  22.     (call-async print-hcsq-lines serial)
  23.     (while True
  24.       (doto serial
  25.         (.write "AT^HCSQ?\n")
  26.         (.flush))
  27.       (sleep 2))))

Das wäre also auch in Python nicht sonderlich komplex.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]