Loxone Intercom Gen2 - Webschnittstelle um Bild/Video rauszubekommen

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Laubi
    Dumb Home'r
    • 01.01.2022
    • 28

    #16
    Ähhhmmmm wie schreibt man bei Loxone das Wort Security ? Mit Sicherheit Klein, Oder?

    Das "letzte" Bild, was ich in Kommentar 5 mit "http://${KLINEL-TASTER-IP}/jpg/image.jpg?auth=64zeichen" beschrieb, habe ich
    Bei mir läufts jetzt noch auf ein bissl basteln ringsum raus und dann dürfte es funktionieren, das mich die Klingel per TEXT2SIP Plugin auf der Fritz anruft und diese auch das Bild erreicht.
    Traurig aber war. der Im Code enthaltene "Sec-WebSocket-Key:" Ist wirklich derartig beliebig, ich verwende ihn nur so komisch damit ich den Curl-Prozess wieder abschießen kann

    Wobei ich mich jetzt echt frage wo der Werbetext entstanden ist:

    "Die Kommunikation zwischen App und Intercom erfolgt dank WebRTC mit einer echten Ende-zu-Ende-Verschlüsselung. Zusätzlich wird auch weiterhin eine Kommunikation via SIP unterstützt."

    Ende-zu-Ende Verschlüsselt, LOL das ist ja genauso Stabil implementiert wie die SIP Unterstützung!

    Code findet man hier: https://github.com/markuslaube/loxon...ast-picture.sh

    LG
    Laubi

    Kommentar

    • Laubi
      Dumb Home'r
      • 01.01.2022
      • 28

      #17
      So am Rande: Wenn man den curl aufgerufen laufen lässt und mal die App startet, und dann aus dem Video geht bekommt man auch noch neben den Binären Meldungen (ich vermute das ist websocket-ping) 2-JSON Meldungen:
      {"jsonrpc":"2.0","method":"callState","params":[0]}�/{"jsonrpc":"2.0","method":"videoSlotAvailable"}
      Ich Tippe also sehr auf "saubere" Web-Socket-Verbindung. Habe es leider aber noch nicht geschafft (vermutlich aber wegen fehlender Grundkenntnisse) eine "normale" Web-Socket-Verbindung aufzubauen. => Dann könnte man vermutlich auch noch recht einfach die lastActivities abfragen (So Im Interesse eines Backups aller Bilder )​. Im Telnet wird mit aber bei jeglichen Input mit "{}" die Verbindung sofort gekappt.

      ==> Außerdem vermute ich sehr das man da wirklich mit den erforderlichen Grundfähigkeiten recht gute mittels Tools an Ton und Video kommt, selbst sprechen ist dann nur noch eine Frage der Zeit

      Zitat von MaN0258
      Mein Ziel ist es eigentlich ein Screenshot vom Videostream zu bestimmten Zeitpunkten erstellen zu können (nicht nur beim Klingeln).
      Vielleicht lässt sich ja was mit node-webrtc (https://github.com/node-webrtc/node-webrtc) zaubern. Hier gibt es ein Beispiel, mit dem man einen WebRTC Stream an FFMPEG weiterleiten kann: https://github.com/node-webrtc/node-...ream/server.js

      Eine andere Idee ist, mit Chrome Headless und Puppeteer die Loxone App zu öffnen und dadurch an den Video-Stream zu kommen. Ist aber natürlich nicht sonderlich elegant und ressourcenschonend.

      Hier gibt es eine Python Library für WebRTC. Vielleicht kann man damit was hinbekommen?

      Kommentar

      • Laubi
        Dumb Home'r
        • 01.01.2022
        • 28

        #18
        Ergänzend: wenn man die Klingel e bissl genutzt hat lohnt es sich nochmal auf die Disk zu schauen: da gibts dann (war davor glaub ich quasi leer) auf partition 6 (ext3):

        Code:
        ./tts
        ./tts/*.mp3
        ./snapshots
        ./snapshots/bell
        ./snapshots/bell/last.jpg
        ./snapshots/bell/*.jpg
        ./lost+found
        ./tmp
        ./tmp/intercom.log.2
        ./tmp/crash
        ./tmp/update.upd
        ./tmp/backup.zip
        ./tmp/crashlogs
        ./tmp/intercom.log
        ./tmp/intercom.log.1
        ./newroot




        Kommentar

        • Laubi
          Dumb Home'r
          • 01.01.2022
          • 28

          #19
          So:
          Nach der letzten Nacht verstehe ich jetzt auch etwas mehr von Websockets -> wscat funktioniert eigentlich ganz einfach gegen die Intercom:

          Code:
          wscat -c ${intercom} -s webrtc-signaling
          reicht schon völlig aus, leider ist wscat nicht wirklich scriptfähig, ich muss mir andere tools aber erst anschauen, wer ein Backup der Bestandsbilder "manuell" anstoßen möchte:

          Sammlung von Dingen zum Loxone. Contribute to markuslaube/loxone development by creating an account on GitHub.


          Geht halt nur bei Verbindung zur Eingabeaufforderung "&" und co funktionieren akuell auch im Screen nicht.

          LG
          Laubi

          Kommentar

          • MaN0258
            Dumb Home'r
            • 29.05.2016
            • 20

            #20
            Sehr cool! Habe beide Scripts getestet und sie funktionieren einwandfrei.

            Kommentar


            • Laubi
              Laubi kommentierte
              Kommentar bearbeiten
              Das zweite wird gerade auf Cron-Tauglichkeit geupdatet
          • Laubi
            Dumb Home'r
            • 01.01.2022
            • 28

            #21
            Zitat von MaN0258
            Sehr cool! Habe beide Scripts getestet und sie funktionieren einwandfrei.
            Ersteinmal Danke für deine Zuarbeit und Deine Freude, so war die Arbeit nicht nur für mich sondern ist ist für mehr gut - auch wenn ich mich innerlich über Loxone aufrege -
            Das zweite Script läuft bei mir jetzt auch im Cron erfolgreich

            Ich würde ja glatt ans Werk gehen ein eigenes Plugin draus zu bauen. Allerdings bin ich wie gesagt:

            - sehr neu hier
            - kein Entwickler
            - kein Programmierer

            Ich kann zum Beispiel kein php u. s. w. und vieles gibt es sicherlich auch schon bzw. kann von anderen abgeändert geklaut werden. Im Step 1 hätte ich folgende Vorstellungen:

            Admin-Oberfläche:

            - User gibt an:
            1. Ip-Adresse und Port der Intercom
              • Backup der Bilder, ja, nein, wie alt (ja das Script bohr ich entsprechend auf)
              • Backupziel (Pfad)
              • wscatwait
              • makewait
              • pseudotty
            2. After-Call-Script / HTTP / ...
              • Also aktuell habe ich das intercom-gen2-last-picture.sh Quick and Dirty in Text2SIP verbaut; ich würde es heraustrennen, aber dann dem User die Möglichkeit geben; dierekt danach einen HTTP-Request oder sonst etwas zu machen
              • Ideen was man alles tun will bitte gern hierher
            3. Das Ursprüngliche Script würde ich jetzt so umbauen das es bevorzugt wscat aber per Option auch curl verwenden kann (curl ist ja eh fertig wscat ist glaub ich schöner)
            Ich brauche vermutlich in erster Linie Betreuung, weil ich mir vieles aus Text2SIP abschauen kann, aber ich hab eigentlich keinen Plan, insbesondere wenn jemand das Admin-Webfrontend vorbereiten könnte das wäre glaub ich cool

            Und ja ich werde auch dafür etwas Zeit brauchen; Neben der klassischen Arbeit will ich ja noch weiter schauen ob man nicht noch die Video und/oder Voice-Kommunikation herausbekommt.

            Grüße
            Laubi


            Zuletzt geändert von Laubi; 18.01.2022, 19:48. Grund: "Und ja ich werde auch dafür etwas brauchen" -> meint "Und ja ich werde auch dafür etwas Zeit brauchen

            Kommentar


            • MaN0258
              MaN0258 kommentierte
              Kommentar bearbeiten
              Für mich am spannendsten wären Fotos vom Livebild erstellen zu können und zwar nicht erst wenn jemand geklingelt hat.

            • Laubi
              Laubi kommentierte
              Kommentar bearbeiten
              "Neben der klassischen Arbeit will ich ja noch weiter schauen ob man nicht noch die Video und/oder Voice-Kommunikation herausbekommt."
              Leider bekomme ich aktuell das von Dir erwähnte "aiortc" nicht mal installiert, geschweige denn zum kaufen :-O. Allerdings ist bei mir eh alles Test und ich hab schon so viel zum basteln installiert gehabt das ich den LoxBerry eh neu aufsetzen muss. Von daher starte ich damit demnächst nochmal neu mit einem Cleanen Raspi und schau mir das mal genauer an. Also das ich daran verzweifle eine Software zu nutzen sehe ich ein, das ich diese nicht mal installiert bekomme nicht - das kratzt dann doch an meiner ix-sehle
          • Laubi
            Dumb Home'r
            • 01.01.2022
            • 28

            #22
            Zitat von Laubi
            Ersteinmal Danke für deine Zuarbeit und Deine Freude, so war die Arbeit nicht nur für mich sondern ist ist für mehr gut - auch wenn ich mich innerlich über Loxone aufrege -
            Das zweite Script läuft bei mir jetzt auch im Cron erfolgreich
            Arghhh Irrtum vom Amt :-(
            Mein Trick mit dem "pseudo-TTY" war wohl doch nicht funktional. Irgendwas hat mich übersehen lassen das es im Cron einen Fehler wirft. Von daher habe ich

            a) das Backup-Script auf websocat umgestellt
            b) das Last-Image Script mittels Schalter auf curl + Alternative websocat

            umgestellt. Liegen nach wie vor im Github, wäre schön wenn mir nochmal jemand bestätigen kann das es nicht nur bei mir funktioniert

            Sammlung von Dingen zum Loxone. Contribute to markuslaube/loxone development by creating an account on GitHub.


            LG
            Laubi

            Kommentar


            • MaN0258
              MaN0258 kommentierte
              Kommentar bearbeiten
              Beide Scripts bei mir getestet und funktionieren einwandfrei :-)
              Vielen Dank, sieht sehr gut aus!
          • Laubi
            Dumb Home'r
            • 01.01.2022
            • 28

            #23
            fals es jemanden weiter hilft:

            Initialisierung mittels wscat:

            Code:
            wscat -c ${intercom} -s webrtc-signaling --slash -P
            Connected (press CTRL+C to quit)
            < {"id":0,"jsonrpc":"2.0","method":"authenticate","p arams":["YbyF1lGnPh1lxjnyuHoPO2Ue9cxS1ZSc8REFt6Gcpy7lV9lRu wnKATp4AXAZChMk","92F39241E3448BC8969ED3C4BF21C193 504781D9859BBD24F86F60BA540BAEF02AFD19BD72C50665A8 8F9E0FFD23BAF3E08283C292F0A0AA92B7A0C3D1FA07DC8286 BE3C2F5ADD2EBD2831E446AD494E12A287E6A5ECC918D1D063 42837C8D411065237B5B4A21D0162BF32035C9E49585134722 C0E433CE7855D934F0EA92CADB3026A61C36A03DBB1C9C9A3E A08530D7A4BF567B5E27D42AA32C8CA5643DA296F3E83F9315 FFF7C91B30C159F2D0F7D9D028FD8F55DF2EAAEC7DD77ED4D0 9A01058D330583D2BB1CE85597E624C47F8A0BB53A4FF98C43 E32BAF0B57989089222C132B2A6E42DCA2A2715C1203F75A56 1FBC8EB3920C3A0F9A3DCD0C6ECA76EBFB927CDF000A45809D 1016D3D8A12952A5AAF667A41C15746CB515BDEFFE11B246CD 34F7B1401FE37724CA5FCEEC42E455F7ABF13DEA37A353229F 59AE01E7224828FD315F2A951241DAA06159873D37D3B4ED48 FA7B60E3827A6556F0972E47B064A2B389B1666974D347B0CA 94593B28C4EB6009603F8FA77EBF28703614F595DF5F3CE38D D774351E91D4681CF18A63EAB0CD8436CD9080956D6299A8BD E5AE0E3639DE1FF664557CE146BC04FD1C777B9368F6D1270F 47FC9BE5B47F54827B1E0E51EA58A27BDF5B8C08D0F570DAB5 03C2195B373B932D7BEA9C4B8BBAD0BC98FD252BA49C291FA0 4105BB4F5EBACE2AD598B9F89C1FB6BA58873F5D2D","10001 "]}
            Ich sag ich hätte gerne Video (copy&paste aus einem tcpdump

            Code:
            {"jsonrpc":"2.0","method":"call","id":2,"params":[{"type":"offer","sdp":"v=0\r\no=- 758122599985718863 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic: WMS\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123 119 114 115 116\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:npbv\r\na=ice-pwd:17HkVba7vJgfEPCMsDrr3+nP\r\na=ice-options:trickle\r\na=fingerprint:sha-256 14:B2:21:97:DA:15:C8:24:CC:0B:58:CD:7A:68:83:11:30:90:91:4D:BD:85:52:EA:C8:90:68:B5:11:BE:C3:FC\r\na=setup:actpass\r\na=mid:0\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07\r\na=extmap:9 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=123\r\na=rtpmap:114 red/90000\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 ulpfec/90000\r\n"},"new",false]}
            und siehe da die Intercom antwortet brav:

            Code:
            < {"id":2,"jsonrpc":"2.0","result":{"code":200,"data ":{"sdp":"v=0\r\no=- 3438017603 1902914818 IN IP4 172.16.2.190\r\ns=-\r\nc=IN IP4 172.16.2.190\r\nt=0 0\r\na=ice-ufrag:00oLEVU\r\na=ice-pwd:BfV0eSjDXkjceGhRAdIOopfy5FmBrNl\r\na=setup:act ive\r\na=fingerprint:SHA-256 69:6D:8F:6D:36:8A:39:64:7F:A6:13:80:25:80:AA:0D:3F :78:A5:BB:AA:E4:96:39:76:06:7C:1D:8A:D7:A2:74\r\nm=video 10060 UDP\/TLS\/RTP\/SAVPF 108 123\r\na=rtpmap:108 H264\/90000\r\na=fmtp:108 packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:123 H264\/90000\r\na=fmtp:123 packetization-mode=1;profile-level-id=42e01f\r\na=sendonly\r\na=ssrc:629494288 cname:SccArkhFip6Pw85\r\na=framerate:20.00\r\na=rt cp-fb:* nack pli\r\na=mid:0\r\na=rtcp-mux\r\n","type":"answer"},"message":"ok"}}
            < {"id":3,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:ac1002be 1 UDP 2113929471 172.16.2.190 10060 typ host",0,null,"00oLEVU"]}
            < {"id":4,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:ac1002be 1 UDP 2113929471 172.16.2.190 10060 typ host",0,null,"00oLEVU"]}
            < {"id":5,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:28a6d630 1 UDP 2113929471 2003:c5:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 10060 typ host",0,null,"00oLEVU"]}
            < {"id":6,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:28a6d630 1 UDP 2113929471 2003:c5:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx 10060 typ host",0,null,"00oLEVU"]}
            < {"id":7,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:5de53ff0 1 UDP 1677721855 xx.xxx.xx.xxx 10060 typ srflx raddr 172.16.2.190 rport 10060",0,null,"00oLEVU"]}
            weiter bin ich jetzt aber noch nicht

            LG
            Laubi
            Zuletzt geändert von Laubi; 19.01.2022, 20:09. Grund: Maskierung public ip

            Kommentar

            • Laubi
              Dumb Home'r
              • 01.01.2022
              • 28

              #24
              Bekommt jemand das aiortc mit folgenden Befehl zum starten:

              python3 cli.py offer

              das sollte eine Offen-Nachricht wie in meinem obigen Beispiel bauen; macht es bei mir allerdings stürzt es dann auch gleich ab:

              Code:
              -- Please send this message to the remote party --
              {"sdp": "v=0\r\no=- 3851614354 3851614354 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic:WMS *\r\nm=video 51313 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102\r\nc=IN IP4 172.16.2.148\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=mid:0\r\na=msid:dded3631-d572-4957-8626-9558e8ef3666 b828a059-7b7a-48c5-8468-92a2a0634e45\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-mux\r\na=ssrc-group:FID 4242811866 2527732434\r\na=ssrc:4242811866 cname:74a776d1-51eb-4638-92c1-26dda1bf4ac5\r\na=ssrc:2527732434 cname:74a776d1-51eb-4638-92c1-26dda1bf4ac5\r\na=rtpmap:97 VP8/90000\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtpmap:98 rtx/90000\r\na=fmtp:98 apt=97\r\na=rtpmap:99 H264/90000\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=fmtp:99 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42001f\r\na=rtpmap:100 rtx/90000\r\na=fmtp:100 apt=99\r\na=rtpmap:101 H264/90000\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=fmtp:101 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42e01f\r\na=rtpmap:102 rtx/90000\r\na=fmtp:102 apt=101\r\na=candidate:96e1e51095418990f4c4ba44b88 670b4 1 udp 2130706431 172.16.2.148 51313 typ host\r\na=candidate:de5501d2ebe63eb89fa91061e91851 10 1 udp 2130706431 2003:c5:8f13:ca01:1c00:6569:7cd5:6108 53231 typ host\r\na=candidate:db571a44cac480ec600ebcb1de9a39 41 1 udp 2130706431 2003:c5:8f13:ca01:6d44:e64c:647e:fd73 58820 typ host\r\na=candidate:7367c113bc70bb46b63063036794fe a7 1 udp 2130706431 10.18.24.191 64027 typ host\r\na=candidate:c81ee1652861a7f4b8318e418b1311 3c 1 udp 2130706431 2001:780:7:25::10bd 65163 typ host\r\na=candidate:f7bdeb3ce96bef94dd262654ea9e19 e9 1 udp 2130706431 10.211.55.2 58965 typ host\r\na=candidate:0fd4d6ddc8dc75af8e4a18651f4f30 2a 1 udp 2130706431 10.37.129.2 65223 typ host\r\na=candidate:7f3953dbc4fe774c2ad64efc204558 6d 1 udp 1694498815 62.128.1.62 64027 typ srflx raddr 10.18.24.191 rport 64027\r\na=end-of-candidates\r\na=ice-ufrag:kBoL\r\na=ice-pwd:wsNspdLgwa0OopiQX0pPlh\r\na=fingerprint:sha-256 18:F4:3A:3C:EA:D9:FE:6F:D7:13:A9:79:F2:13:73:90:E0:BC:FE:B7:81:73:05:D5:AE:93:C3:F3:62:0F:20:20\r\na=setup:actpass\r\n", "type": "offer"}
              -- Please send this message to the remote party --
              Traceback (most recent call last):
              File "/Users/mlaube/Documents/PRIVAT/loxone/cli.py", line 155, in <module>
              loop.run_until_complete(
              File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
              return future.result()
              File "/Users/mlaube/Documents/PRIVAT/loxone/cli.py", line 102, in run
              await signaling.send(pc.localDescription)
              File "/usr/local/lib/python3.9/site-packages/aiortc/contrib/signaling.py", line 147, in send
              self._write_pipe.write(object_to_string(descr) + "\n")
              BlockingIOError: [Errno 35] write could not complete without blocking
              
              During handling of the above exception, another exception occurred:
              
              Traceback (most recent call last):
              File "/Users/mlaube/Documents/PRIVAT/loxone/cli.py", line 169, in <module>
              loop.run_until_complete(signaling.close())
              File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
              return future.result()
              File "/usr/local/lib/python3.9/site-packages/aiortc/contrib/signaling.py", line 135, in close
              Aktuell bin ich 2x ratlos:

              1.) Ich hätte erwartet das der Befehl einen Server spant; es bereitet aber den Offer vor.
              2.) Keine Ahnung und google hilft mir aktuell gerade gar nicht weiter

              Laubi

              Kommentar


              • Laubi
                Laubi kommentierte
                Kommentar bearbeiten
                Fehler Gefunden: doch gleich auf dem PI zum laufen bekommen müssen :-/

                Try to run example aiortc/examples/videostream-cli with command python cli.py offer I tried with python 3.7 and 3.6, on the latest macOS. Error message is (above is normal) -- Please send this mess...

                "aiortc's demos provide several ways of exchanging SDP between the two parties, copy and paste is just one of them. Since copy-and-paste seems to have issues on OS X my suggestion is to use a different method."
            • MaN0258
              Dumb Home'r
              • 29.05.2016
              • 20

              #25
              Habe aoirtc auch gerade mal ausprobiert (auf meinem Windows 10 PC mit Python 3.8.7, auf dem loxberry hab ich auf die schnelle aiortc nicht installiert bekommen)
              Habe zwar auch exceptions, aber bei mir geht es zumindest etwas weiter, sodass ich die message der remote party eintragen könnte.

              Vermutlich muss die offer von aiortc nun an die Intercom gesendet werden (wie Dein Code Block 2 in #23) und die Antwort (Dein Code Block 3 in #23) wird dann als answer der remote party in aiortc eingegeben.

              Habe aber leider noch keine wirkliche Ahnung bisher.

              Kommentar


              • MaN0258
                MaN0258 kommentierte
                Kommentar bearbeiten
                Habe per wscat meine offer von aiortc an die intercom gesendet und auch eine answer bekommen. Leider funktioniert bei mir das einfügen der answer in cli.py nicht. Kann bei "-- Please enter a message from remote party --" leider nichts eintippen oder reinkopieren.

              • Laubi
                Laubi kommentierte
                Kommentar bearbeiten
                einer der spannenden Lösungen war:

                apt-get install python3-opencv python3-opencv-apps
                bloß nicht pip3 verwenden :-O
            • Laubi
              Dumb Home'r
              • 01.01.2022
              • 28

              #26
              Status Quo:

              Ich hab jetzt irgendwie aiortc auf dem pi zum laufen bekommen;

              python3 cli.py offer liefert mir einen offer:

              Code:
              root@loxberry:~/bin/loxone-miniserver/aiortc# python3 cli.py offer
              /usr/local/lib/python3.7/dist-packages/google_crc32c/__init__.py:29: RuntimeWarning: As the c extension couldn't be imported, `google-crc32c` is using a pure python implementation that is significantly slower. If possible, please configure a c build environment and compile the extension
              warnings.warn(_SLOW_CRC32C_WARNING, RuntimeWarning)
              -- Please send this message to the remote party --
              {"sdp": "v=0\r\no=- 3851619935 3851619935 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic:WMS *\r\nm=video 33688 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102\r\nc=IN IP4 172.16.2.146\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=mid:0\r\na=msid:a9a29d29-7bf5-48da-aebb-3948806febc0 883bb05f-f084-4e88-bb8f-37fb968b24a0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-mux\r\na=ssrc-group:FID 1185129913 490108438\r\na=ssrc:1185129913 cname:fdeb4bb9-37a4-41cf-a3aa-0508a8fd4ee5\r\na=ssrc:490108438 cname:fdeb4bb9-37a4-41cf-a3aa-0508a8fd4ee5\r\na=rtpmap:97 VP8/90000\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtpmap:98 rtx/90000\r\na=fmtp:98 apt=97\r\na=rtpmap:99 H264/90000\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=fmtp:99 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42001f\r\na=rtpmap:100 rtx/90000\r\na=fmtp:100 apt=99\r\na=rtpmap:101 H264/90000\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=fmtp:101 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42e01f\r\na=rtpmap:102 rtx/90000\r\na=fmtp:102 apt=101\r\na=candidate:c04f73782a97008445a2dec47df 1d2db 1 udp 2130706431 172.16.2.146 33688 typ host\r\na=candidate:de8eeb196603e5298f6a2c0da98835 34 1 udp 2130706431 2003:c5:8f13:ca01:dea6:32ff:fe49:db1a 39428 typ host\r\na=candidate:61d86a35ff26f9c4d9652c628138d2 7e 1 udp 1694498815 93.229.63.241 33688 typ srflx raddr 172.16.2.146 rport 33688\r\na=end-of-candidates\r\na=ice-ufrag:eUnf\r\na=ice-pwd:oZdZ9WuVOAMMSPAWUfE2EM\r\na=fingerprint:sha-256 63:65:DE:1F:3C:87:E4:98:25:AB:84:71:55:61:5F:B1:D7:EC:67:A9:24:06:DA:0F:C7:D3:CE:99:BE:3D:35:C0\r\na=setup:actpass\r\n", "type": "offer"}
              
              -- Please enter a message from remote party --
              den "baue ich um" in dem ich davor ein:

              Code:
              {"jsonrpc":"2.0","method":"call","id":2,"params ":[
              und danach ein

              Code:
              ,"new",false]}
              packe, dann ist es ausreichend identisch mit meinem tcpdump ....

              das sende ich an den websocket

              Code:
              root@loxberry:~# ${websocat} --protocol webrtc-signaling ws://${intercom}
              {"id":0,"jsonrpc":"2.0","method":"authenticate","p arams":["NRaoDYaskNRMND1Xzv5hkDsWy9igNcvoGRHwt7r7B92rscnzt w2ZhgnvDwklVxL7","92F39241E3448BC8969ED3C4BF21C193 504781D9859BBD24F86F60BA540BAEF02AFD19BD72C50665A8 8F9E0FFD23BAF3E08283C292F0A0AA92B7A0C3D1FA07DC8286 BE3C2F5ADD2EBD2831E446AD494E12A287E6A5ECC918D1D063 42837C8D411065237B5B4A21D0162BF32035C9E49585134722 C0E433CE7855D934F0EA92CADB3026A61C36A03DBB1C9C9A3E A08530D7A4BF567B5E27D42AA32C8CA5643DA296F3E83F9315 FFF7C91B30C159F2D0F7D9D028FD8F55DF2EAAEC7DD77ED4D0 9A01058D330583D2BB1CE85597E624C47F8A0BB53A4FF98C43 E32BAF0B57989089222C132B2A6E42DCA2A2715C1203F75A56 1FBC8EB3920C3A0F9A3DCD0C6ECA76EBFB927CDF000A45809D 1016D3D8A12952A5AAF667A41C15746CB515BDEFFE11B246CD 34F7B1401FE37724CA5FCEEC42E455F7ABF13DEA37A353229F 59AE01E7224828FD315F2A951241DAA06159873D37D3B4ED48 FA7B60E3827A6556F0972E47B064A2B389B1666974D347B0CA 94593B28C4EB6009603F8FA77EBF28703614F595DF5F3CE38D D774351E91D4681CF18A63EAB0CD8436CD9080956D6299A8BD E5AE0E3639DE1FF664557CE146BC04FD1C777B9368F6D1270F 47FC9BE5B47F54827B1E0E51EA58A27BDF5B8C08D0F570DAB5 03C2195B373B932D7BEA9C4B8BBAD0BC98FD252BA49C291FA0 4105BB4F5EBACE2AD598B9F89C1FB6BA58873F5D2D","10001 "]}
              
              
              {"jsonrpc":"2.0","method":"call","id":2,"params ":[{"sdp": "v=0\r\no=- 3851620043 3851620043 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0\r\na=msid-semantic:WMS *\r\nm=video 41712 UDP/TLS/RTP/SAVPF 97 98 99 100 101 102\r\nc=IN IP4 172.16.2.146\r\na=sendrecv\r\na=extmap:1 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=mid:0\r\na=msid:73bfc155-ac41-45d3-9bda-ab4d9106d985 7e647e2b-e48e-477c-87c7-821799ec492f\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=rtcp-mux\r\na=ssrc-group:FID 1052586587 854186381\r\na=ssrc:1052586587 cname:4874e9eb-e00f-4e4b-b2f2-5c72122bdf37\r\na=ssrc:854186381 cname:4874e9eb-e00f-4e4b-b2f2-5c72122bdf37\r\na=rtpmap:97 VP8/90000\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtpmap:98 rtx/90000\r\na=fmtp:98 apt=97\r\na=rtpmap:99 H264/90000\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=fmtp:99 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42001f\r\na=rtpmap:100 rtx/90000\r\na=fmtp:100 apt=99\r\na=rtpmap:101 H264/90000\r\na=rtcp-fb:101 nack\r\na=rtcp-fb:101 nack pli\r\na=rtcp-fb:101 goog-remb\r\na=fmtp:101 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42e01f\r\na=rtpmap:102 rtx/90000\r\na=fmtp:102 apt=101\r\na=candidate:c04f73782a97008445a2dec47df 1d2db 1 udp 2130706431 172.16.2.146 41712 typ host\r\na=candidate:de8eeb196603e5298f6a2c0da98835 34 1 udp 2130706431 2003:c5:8f13:ca01:dea6:32ff:fe49:db1a 37145 typ host\r\na=candidate:61d86a35ff26f9c4d9652c628138d2 7e 1 udp 1694498815 93.229.63.241 41712 typ srflx raddr 172.16.2.146 rport 41712\r\na=end-of-candidates\r\na=ice-ufrag:Jma1\r\na=ice-pwd:i5TuR0HRree5KZ8TW4pxzV\r\na=fingerprint:sha-256 39:3F:76:02:2F:9C:EE:B1:E5:38:26:EB:AD:83:C8:11:C1 :2B:FB:DE:BE:DE:72:AD:A5:9F:01:EE:A6:97:CE:C3\r\na=setup:actpass \r\n", "type": "offer"},"new",false]}
              dort bekomme ich zurück:

              Code:
              {"id":2,"jsonrpc":"2.0","result":{"code":200,"data ":{"sdp":"v=0\r\no=- 4037213997 476117362 IN IP4 172.16.2.190\r\ns=-\r\nc=IN IP4 172.16.2.190\r\nt=0 0\r\na=ice-ufrag:OKxTdf7\r\na=ice-pwd:EuuHhGZ4xIDvnRkEblLtLgOHE5WhPIa\r\na=setup:act ive\r\na=fingerprint:SHA-256 58:D2:45:B4:FA:E2:75:4F:E4:7F:13:39:36:A4:58:23:81:D6:1F:79:44:B1:F2:15:78:A8:CB:62:F0:41:F0:95\r\nm=v ideo 4148 UDP\/TLS\/RTP\/SAVPF 101\r\na=rtpmap:101 H264\/90000\r\na=fmtp:101 packetization-mode=1;profile-level-id=42e01f\r\na=sendrecv\r\na=ssrc:1189940422 cname:kb5lHn0fn46mYEO\r\na=framerate:20.00\r\na=rt cp-fb:* nack pli\r\na=mid:0\r\na=rtcp-mux\r\n","type":"answer"},"message":"ok"}}
              {"id":3,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:ac1002be 1 UDP 2113929471 172.16.2.190 4148 typ host",0,null,"OKxTdf7"]}
              {"id":4,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:ac1002be 1 UDP 2113929471 172.16.2.190 4148 typ host",0,null,"OKxTdf7"]}
              {"id":5,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:62b7b2f8 1 UDP 2113929471 2003:c5:8f13:ca01:28cf:88de:7f6d:f578 4148 typ host",0,null,"OKxTdf7"]}
              {"id":6,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:62b7b2f8 1 UDP 2113929471 2003:c5:8f13:ca01:28cf:88de:7f6d:f578 4148 typ host",0,null,"OKxTdf7"]}
              {"id":7,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:5de53ff0 1 UDP 1677721855 93.229.63.241 4148 typ srflx raddr 172.16.2.190 rport 4148",0,null,"OKxTdf7"]}
              jetzt schicke ich an aiortc:

              Code:
              {"sdp":"v=0\r\no=- 4037213997 476117362 IN IP4 172.16.2.190\r\ns=-\r\nc=IN IP4 172.16.2.190\r\nt=0 0\r\na=ice-ufrag:OKxTdf7\r\na=ice-pwd:EuuHhGZ4xIDvnRkEblLtLgOHE5WhPIa\r\na=setup:active\r\na=fingerprint:SHA-256 58:D2:45:B4:FA:E2:75:4F:E4:7F:13:39:36:A4:58:23:81:D6:1F:79:44:B1:F2:15:78:A8:CB:62:F0:41:F0:95\r\nm=video 4148 UDP\/TLS\/RTP\/SAVPF 101\r\na=rtpmap:101 H264\/90000\r\na=fmtp:101 packetization-mode=1;profile-level-id=42e01f\r\na=sendrecv\r\na=ssrc:1189940422 cname:kb5lHn0fn46mYEO\r\na=framerate:20.00\r\na=rtcp-fb:* nack pli\r\na=mid:0\r\na=rtcp-mux\r\n","type":"answer"}
              ich hoffe man sieht wie ich geschnitten habe: das

              Code:
              {"id":2,"jsonrpc":"2.0","result":{"code":200,"data ":
              führt zu Irritationen und muss einschließlich der zur klammer gehörenden hinteren teile weg

              darauf hin sendet mir aiortc:

              Code:
              Receiving video
              -- Please enter a message from remote party --
              und jetzt bin ich "sprachlos" ...

              weil mir nix mehr einfällt, der websocat liefert nix neues ...
              und ein

              Code:
              {"id":6,"jsonrpc":"2.0","method":"addIceCandidate","params":["candidate:62b7b2f8 1 UDP 2113929471 2003:c5:8f13:ca01:28cf:88de:7f6d:f578 4148 typ host",0,null,"OKxTdf7"]}
              bricht ab, was schon allein am jsonrpc liegen kann ....

              Code:
              -- Please enter a message from remote party --
              {"id":6,"jsonrpc":"2.0","method":"addIceCandidate" ,"params":["candidate:62b7b2f8 1 UDP 2113929471 2003:c5:8f13:ca01:28cf:88de:7f6d:f578 4148 typ host",0,null,"OKxTdf7"]}
              
              -- Please send this message to the remote party --
              {"type": "bye"}
              
              Traceback (most recent call last):
              File "cli.py", line 161, in <module>
              role=args.role,
              File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
              return future.result()
              File "cli.py", line 106, in run
              obj = await signaling.receive()
              File "/usr/local/lib/python3.7/dist-packages/aiortc/contrib/signaling.py", line 143, in receive
              return object_from_string(data.decode(self._read_pipe.enc oding))
              File "/usr/local/lib/python3.7/dist-packages/aiortc/contrib/signaling.py", line 24, in object_from_string
              if message["type"] in ["answer", "offer"]:
              KeyError: 'type'
              Jemand eine Idee, mehr Ahnung mit webrtc ???

              Kommentar


              • Laubi
                Laubi kommentierte
                Kommentar bearbeiten
                copy & paste Fehler
                => "---" war ne blöde Idee

              • MaN0258
                MaN0258 kommentierte
                Kommentar bearbeiten
                Deine Fehlermeldung hört sich eher so an, als wäre da was falsch eingetippt geworden. Kannst Du mal den kompletten Befehl schreiben?

              • MaN0258
                MaN0258 kommentierte
                Kommentar bearbeiten
                sorry, habs gefixt ;-)
            • Laubi
              Dumb Home'r
              • 01.01.2022
              • 28

              #27
              der Ansatz ist gut, es fehlt nur noch Gehirn bei mir

              => also google liefert mir zum Beispiel:

              We are trying to connect a browser (client) with the aiortc library (server, which sends a single video stream). Currently, the connection is successfully established (on signalingstatechange is st...


              => ich vermute eine der zeilen mit dem

              Code:
              {"id":3,"jsonrpc":"2.0","method":"addIceCandidate","params":["candidate:ac1002be 1 UDP 2113929471 172.16.2.190 34658 typ host",1,null,"Nio5RfD"]}
              muss "nur" passend umgebaut werden

              aktuell stehe ich (in Zusammenhang mit meinem google finding) hier:

              Code:
              Receiving video
              -- Please enter a message from remote party --
              {"candidate":"candidate:ac1002be 1 udp 2113929471 172.16.2.190 34658 typ host generation 1 ufrag A5nH network-cost 999","Nio5RfD":"video","sdpMLineIndex":0,"type":"c andidate"}
              
              -- Please send this message to the remote party --
              {"type": "bye"}
              
              Traceback (most recent call last):
              File "cli.py", line 161, in <module>
              role=args.role,
              File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
              return future.result()
              File "cli.py", line 106, in run
              obj = await signaling.receive()
              File "/usr/local/lib/python3.7/dist-packages/aiortc/contrib/signaling.py", line 143, in receive
              return object_from_string(data.decode(self._read_pipe.enc oding))
              File "/usr/local/lib/python3.7/dist-packages/aiortc/contrib/signaling.py", line 28, in object_from_string
              candidate.sdpMid = message["id"]
              KeyError: 'id'
              Sprich da fehlt jetzt doch nach meinem Umbau die "id" oder; übersehe ich da was?

              Kommentar

            • Laubi
              Dumb Home'r
              • 01.01.2022
              • 28

              #28
              So es geht weiter, meine Erkenntnisse sind soweit, das ich jetzt mal wieder ratlos bin. Teilweise habe ich das auch schon verscriptet; kommt demnächst ins GitHub

              Also: Nio5RfD ist kein Passwort sondern der ice-ufrag

              Ich hab einfach mal den aiortc einmal im offer und 1x im Answer laufen lassen. Siehe da der Unterschied der zeitlich schnell klar wurde, war das der candidate beim AIO nicht in einer getrennten Response kommt, sondern in der Answer mit enthalten ist :-O

              da gibts dann nein Eintrag (eigentlich ja Zeile wenn man sich die \r\n mal als Zeilenumbruch anschaut, die dann lautet

              Code:
              a=candidate .....
              Gesagt getan, umgebaut genau genommen ein script gebastelt, weil das hin und her kopieren schon echt langsam nervig war. Und Teilerfolg Nr.1:
              - Es passiert irgendwie nichts, aber im tcpdump springen endlich UDP Pakete an, zwar regelmäßig aber maximal 100 Byte und wenig (zumindest im Vergleich zum Live Bild )

              Nochmal den Eigentlichen tcp dump angeschaut und auch alle Offer und Answers und da fiel es mir wie Schuppen von den Augen:

              Mein Mac sendet nachdem er die Answer hat in Abstand davon (so wenn die ersten kleinen (ebenfalls ca. 100 Byte ahhh) UDP Pakete kommen. Da gab der aiortc mir aber nix mehr aus. Richtig bei dem sind die Candidates nähmlich genauso verbaut wie er es in der answer erwartet.

              Jetzt habe ich folgenden stand:

              -> Ich starte den aiortc im Offer Mode (Optimiert mit Pipe an Tee und dort in ein Log
              -> Ich hab ein Script was mir daraus ein json-rpc baut und nochmal die Candidates getrennt ausweist

              -> Ich starte den websocat und Pipe auch hier den Output über Tee in ein 2. Log
              -> Ich paste das json-rpc in den websocat
              -> Hab wieder ein Script was mir den Output in *1* Answer ding kopiert

              -> Ich kopiere die Answer om dem aiortc
              -> die ersten kleinen UDP Pakete laufen
              -> Ich kopiere den 2. Teil der Offer in den Websocat
              -> Ich bekomme vom Loxone OK-Meldungen :-O

              Code:
              {"id":11,"jsonrpc":"2.0","result":{"code":200,"message":"Ok"}}
              PS: auch einen 500er für den ipv6 Candidate

              Code:
              {"error":{"code":500,"message":"Failed to add ice candiate"},"id":12,"jsonrpc":"2.0"}
              und auf einmal rasen unendlich viele UDP Pakete a 1046 Byte durch die Gegend ....

              Blöd nur:

              Code:
              --record-to output.mp4
              und auch
              Code:
              --record-to file-%3d.png
              tuen nichts. Rein gar nix, während es bei dem Test von aiortc zu aiortc was gespeichert hat :-/
              Und jetzt bin ich planlos.

              => Scripte muss ich noch minimal aufbereiten, dann lad ich sie hoch.



              VG
              Laubi

              Kommentar


              • MaN0258
                MaN0258 kommentierte
                Kommentar bearbeiten
                Hier beginnt jetzt vermutlich die Verschlüsselung.

                Vielleicht kann das weiterhelfen?
                https://stackoverflow.com/questions/...ream-to-a-file

              • Laubi
                Laubi kommentierte
                Kommentar bearbeiten
                Verschlüsselung war auch mein Gedanke aber:

                die Intercom weis ja noch nicht einmal welcher User ich bin. Mein Passwort, Mein Token, etc. können es also nicht sein. Ausweislich der SD Karte kennt Sie zwar explizit den Public-Key des Miniserver; ich bezweifle aber - alleine schon weil der PubKey des Miniservers im Backup der Intercom liegt - den Private Key hat => und dann wärs ja auch für die Katz zu verschlüsseln. Ich würde eher davon ausgehen das der Schlüssel im Offer und Answer zu finden sein muss. ice-pass und ice-ufrah. Was mich aber dann wiederum verwundert das es die aiortc Software nicht entschlüsseln können soll. der link geht langsam aber allmählich über meine Fertigkeiten weit hinaus ... Interessant finde ich; das ich aiortc tatsächlich abbrechen kann und er mir noch sagt das ich dem WebSocket ein Bye senden soll. Die Pakete kommen weiter. Wäre vielleicht ein Ansatz die am UDP Port einzusammeln. Aber wie und was dann damit machen .... Fragen über Fragen ...

              • Laubi
                Laubi kommentierte
                Kommentar bearbeiten
                Stop vielleicht spielt ja der Authkey mal wieder eine rolle
            • Laubi
              Dumb Home'r
              • 01.01.2022
              • 28

              #29
              Also bei weiteren "Studien" bin ich eigentlich unterdessen immer mehr davon überzeugt, das es nicht an der Verschlüsselung liegt, im verbose log steht u. a. gleich zu Anfang:

              Code:
              INFO:aioice.ice:Connection(0) ICE completed
              DEBUG:aiortc.rtcicetransport:RTCIceTransport(contr olling) - checking -> completed
              DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() iceConnectionState checking -> completed
              DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(ser ver) - State.NEW -> State.CONNECTING
              DEBUG:aioice.ice:Connection(0) protocol(0) > ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.REQUEST, transaction_id=b'lu\xb86L\xa5\x06?\xf1I\xe5\x1b')
              DEBUG:aioice.ice:Connection(0) protocol(0) < ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.RESPONSE, transaction_id=b'lu\xb86L\xa5\x06?\xf1I\xe5\x1b')
              DEBUG:aioice.ice:Connection(0) protocol(0) < ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.REQUEST, transaction_id=b'\xe8\x93\xc3\xd1mpO\xc2q\xcbH\x0f ')
              DEBUG:aioice.ice:Connection(0) protocol(0) > ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.RESPONSE, transaction_id=b'\xe8\x93\xc3\xd1mpO\xc2q\xcbH\x0f ')
              DEBUG:aioice.ice:Connection(0) protocol(0) < ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.REQUEST, transaction_id=b'\\)\xac^\x89\xa2\xee\x86\xae\xe7\ xafq')
              DEBUG:aioice.ice:Connection(0) protocol(0) > ('172.16.2.190', 34056) Message(message_method=Method.BINDING, message_class=Class.RESPONSE, transaction_id=b'\\)\xac^\x89\xa2\xee\x86\xae\xe7\ xafq')
              DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(ser ver) - DTLS handshake complete
              DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(ser ver) - State.CONNECTING -> State.CONNECTED
              DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() connectionState connecting -> connected
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) - RTP started
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) - RTCP started
              DEBUG:aiortc.rtcrtpreceiver:RTCRtpReceiver(video) - RTCP started
              Aktuell würde ich davon ausgehe, das die von Loxone erwähnte Verschlüsselung
              erfolgt dank WebRTC mit einer echten Ende-zu-Ende-Verschlüsselung
              tatsächlich die Verschlüsselung selbst "nur" auf dem Standard und damit DTLS basiert. Aber helfen tut mir das aktuell dennoch nicht. Ich hab wie gesagt auch keine Begründung gefunden warum es nicht geht.

              Auch am ende sieht das eigentlich gut aus:

              Code:
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58039, ts=1819282327, marker=1, payload=101, 223 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58040, ts=1819285327, marker=0, payload=101, 1257 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58041, ts=1819285327, marker=1, payload=101, 192 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58042, ts=1819288327, marker=0, payload=101, 715 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58043, ts=1819288327, marker=1, payload=101, 722 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58044, ts=1819291327, marker=1, payload=101, 1289 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58045, ts=1819294327, marker=0, payload=101, 1271 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=58046, ts=1819294327, marker=1, payload=101, 108 bytes)
              DEBUG:aiortc.rtcrtpreceiver:RTCRtpReceiver(video) - RTCP finished
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) - RTP finished
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtcpByePacket(sources=[1932806639])
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) - RTCP finished
              DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(ser ver) - DTLS shutdown complete
              DEBUG:aiortc.rtcicetransport:RTCIceTransport(contr olling) - completed -> closed
              DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() iceConnectionState completed -> closed
              DEBUG:aiortc.rtcpeerconnection:RTCPeerConnection() connectionState connected -> closed
              DEBUG:aiortc.rtcdtlstransport:RTCDtlsTransport(ser ver) - State.CONNECTED -> State.CLOSED
              DEBUG:aioice.ice:Connection(0) protocol(0) connection_lost(None)
              DEBUG:aioice.ice:Connection(0) protocol(1) connection_lost(None)

              und mittendrin ist nix anderes als mal sowas:

              Code:
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40430, ts=1790152327, marker=0, payload=101, 1210 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40431, ts=1790152327, marker=1, payload=101, 175 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40432, ts=1790155327, marker=0, payload=101, 696 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40433, ts=1790155327, marker=1, payload=101, 795 bytes)
              DEBUG:aioice.ice:Connection(0) protocol(0) > ('172.16.2.190', 33636) Message(message_method=Method.BINDING, message_class=Class.REQUEST, transaction_id=b'\x85\x93J+};\xc3\xfc\xd5\xa3\xec\ xef')
              DEBUG:aioice.ice:Connection(0) protocol(0) < ('172.16.2.190', 33636) Message(message_method=Method.BINDING, message_class=Class.REQUEST, transaction_id=b'\xff\x17m\x05\xa3\x84\x86A;\x7f\x 8b\xf0')
              DEBUG:aioice.ice:Connection(0) protocol(0) > ('172.16.2.190', 33636) Message(message_method=Method.BINDING, message_class=Class.RESPONSE, transaction_id=b'\xff\x17m\x05\xa3\x84\x86A;\x7f\x 8b\xf0')
              DEBUG:aioice.ice:Connection(0) protocol(0) < ('172.16.2.190', 33636) Message(message_method=Method.BINDING, message_class=Class.RESPONSE, transaction_id=b'\x85\x93J+};\xc3\xfc\xd5\xa3\xec\ xef')
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40434, ts=1790158327, marker=0, payload=101, 699 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40435, ts=1790158327, marker=1, payload=101, 839 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40436, ts=1790161327, marker=0, payload=101, 769 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40437, ts=1790161327, marker=1, payload=101, 819 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40438, ts=1790164327, marker=0, payload=101, 701 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40439, ts=1790164327, marker=1, payload=101, 767 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40440, ts=1790167327, marker=0, payload=101, 790 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40441, ts=1790167327, marker=1, payload=101, 826 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtcpSrPacket(ssrc=1932806639, sender_info=RtcpSenderInfo(ntp_timestamp=165431603 28726867343, rtp_timestamp=1790167327, packet_count=227, octet_count=180636), reports=[])
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtcpSdesPacket(chunks=[RtcpSourceInfo(ssrc=1932806639, items=[(1, b'd9742573-7e12-449b-b435-a6d9d75ea1a9')])])
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40442, ts=1790170327, marker=0, payload=101, 779 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40443, ts=1790170327, marker=1, payload=101, 839 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40444, ts=1790173327, marker=0, payload=101, 1294 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40445, ts=1790173327, marker=1, payload=101, 54 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40446, ts=1790176327, marker=1, payload=101, 1298 bytes)
              wobei die mass solche Einträge sind:

              Code:
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40456, ts=1790194327, marker=1, payload=101, 752 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40457, ts=1790197327, marker=0, payload=101, 1272 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40458, ts=1790197327, marker=1, payload=101, 180 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40459, ts=1790200327, marker=0, payload=101, 1264 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40460, ts=1790200327, marker=1, payload=101, 113 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40461, ts=1790203327, marker=0, payload=101, 667 bytes)
              DEBUG:aiortc.rtcrtpsender:RTCRtpSender(video) > RtpPacket(seq=40462, ts=1790203327, marker=1, payload=101, 721 bytes)
              D
              Ich bleibe ratlos, leider habe ich aber auch noch keine wirklichen alternativen gefunden.

              Laubi

              Kommentar

              • Laubi
                Dumb Home'r
                • 01.01.2022
                • 28

                #30
                Ok, nachdem ich hier aktuell auf dem Schlauch stehe -> vermutlich muss ich mir wirklich ein taubes Linux bauen und aiortc nochmal neu aufsetzen. Vielleicht hab ich ja doch irgendwo einen ganz simplen encoding Fehler ... aber das mach ich erst demnächst; hab ich mir nochmal angeschaut was wir haben:

                - die aussage das die Kommunikation "dank webrtc" verschlüsselt ist
                - einen WebSocket ohne Authentifizierung der H246 spricht und websocket-signaling, jsonrpc und webrtc kann
                - die Behauptung das mal irgendwann SIP kommt

                => ja ein "${websocat} --protocol sip ws://${intercom}" ... geht aktuell noch nicht aber:

                Im Filesystem hatte ich ja schonmal ein backup gefunden:

                Code:
                ./backup
                ./backup/etc
                ./backup/etc/hostname
                ./backup/etc/network
                ./backup/etc/network/interfaces
                ./backup/etc/dhcpcd.conf
                ./backup/root
                ./backup/root/sounds
                ./backup/root/sounds/2-error_en.mp3
                ./backup/root/sounds/1-doorbell.mp3
                ./backup/root/global_config.json
                ./backup/root/504F94E00AE3
                ./backup/root/504F94E00AE3/Intercom.dat
                ./backup/root/TreeExtCfgData.bin
                ./backup/root/.baresip
                ./backup/root/.baresip/contacts
                ./backup/root/.baresip/config
                ./backup/root/.baresip/current_contact
                ./backup/root/.baresip/accounts
                ./backup/root/.baresip/uuid
                ./backup.zip
                BareSIP ohhh ja; die Config erscheint nicht logisch aber ACHTUNG:

                Code:
                intercom.log.2:2022-01-01 13:55:54.851 Info Baresip: video: Dumping media state: ----- ICE Media <video> -----
                intercom.log.2:2022-01-01 13:55:54.853 Info Baresip: video: comp1 setting local: 172.16.2.190:25732
                intercom.log.2:2022-01-01 13:55:54.854 Info Baresip: stream: mnat 'ice' connected: raddr 172.16.2.148:61667
                intercom.log.2:2022-01-01 13:55:54.854 Info Baresip: rtcsession: ice connected (video)
                intercom.log.2:2022-01-01 13:55:54.854 Info Baresip: stream: video: starting mediaenc 'dtls_srtp' (wait_secure=1)
                intercom.log.2:2022-01-01 13:55:54.854 Info Baresip: dtls_srtp: media=video -- start DTLS client
                intercom.log.2:2022-01-01 13:55:54.855 Info Baresip: dtls_srtp: component start: RTP [raddr=172.16.2.148:61667]
                intercom.log.2:2022-01-01 13:55:54.855 Info Baresip: dtls_srtp: 'video,RTP' dtls connect to 172.16.2.148:61667
                intercom.log.2:2022-01-01 13:55:54.856 Info Baresip: ice: video: connectivity check is complete (update=0)
                intercom.log.2:2022-01-01 13:55:54.859 Info Baresip: video: Dumping media state: ----- ICE Media <video> -----
                Ich glaub das ist interessant, auch wenn ich der Meinung bin das Loxone damit klar gegen das Copyright von Baresip verstößt (https://github.com/baresip/baresip/b...r/docs/COPYING) müssen sie vermutlich die Anpasungen selbst nicht veröffentlichen. Allerdings habe ich langsam Zweifel das hier viel Eigenleistung von Loxone drin steckt.

                Also ich glaube da setze ich jetzt an:

                https://github.com/baresip
                insbesondere auch:
                https://github.com/baresip/baresip-webrtc
                vielleicht aber auch da:
                https://forums.raspberrypi.com/viewtopic.php?t=136994

                Für alle die nicht nachschauen wollen oder können; hier mal die Config die in meinem Backup lagerte (eingekürzt um auskommentierte zeilen:

                Code:
                root@loxberry:~/intercom/usb/tmp/backup.zip.D/backup# grep -v '^#' ./root/.baresip/config | grep -v '^$'
                poll_method epoll # poll, select, epoll ..
                sip_listen 0.0.0.0:5060
                call_local_timeout 120
                call_max_calls 4
                audio_player himpp_ao,default
                audio_source himpp_ai,default
                audio_alert alsa,default
                audio_level no
                ausrc_format s16 # s16, float, ..
                auplay_format s16 # s16, float, ..
                auenc_format s16 # s16, float, ..
                audec_format s16 # s16, float, ..
                video_size 352x288
                video_bitrate 500000
                video_fps 25.00
                video_fullscreen no
                videnc_format yuv420p
                rtp_tos 184
                rtcp_mux no
                jitter_buffer_delay 5-10 # frames
                rtp_stats no
                net_prefer_ipv6 no
                module_path /usr/lib/baresip/modules
                module stdio.so
                module g711.so
                module alsa.so
                module stun.so
                module turn.so
                module ice.so
                module_tmp uuid.so
                module_tmp account.so
                module_app auloop.so
                module_app contact.so
                module_app debug_cmd.so
                module_app vidloop.so
                cons_listen 0.0.0.0:5555 # cons
                http_listen 0.0.0.0:8000 # httpd - server
                ctrl_tcp_listen 0.0.0.0:4444 # ctrl_tcp
                evdev_device /dev/input/event0
                opus_bitrate 28000 # 6000-510000
                vumeter_stderr yes
                video_selfview window # {window,pip}
                ice_turn no
                ice_debug no
                ice_nomination regular # {regular,aggressive}
                root@loxberry:~/intercom/usb/tmp/backup.zip.D/backup#

                Kommentar

                Lädt...