Websocket mit DEVIO test für traccar

Begonnen von carlos, 09 Dezember 2020, 15:56:38

Vorheriges Thema - Nächstes Thema

carlos

Hallo zusammen,

auf Basis von Rudis Websocket-Erweiterung für DevIO und seinem Beispiel unter https://forum.fhem.de/index.php/topic,109910.msg1057407.html#msg1057407
habe ich versucht das mal mit dem traccar Websocket api  zu testen.

https://www.traccar.org/traccar-api/

Wichtig ist hier:
Session cookie is the only authorization option for WebSocket connection.

Also habe ich vorher einen session api call abgesetzt, der auch funktioniert.
Wie kann ich jetzt dem Webservice call das cookie unterschieben.

Habe dafür das wstest module angepasst:


use strict;
use warnings;
use DevIo;
use v5.10;
use LWP::UserAgent       ();

use Encode qw(encode_utf8);

sub
wstest_Initialize($)
{
  my ($hash) = @_;
  $hash->{DefFn}     = "wstest_Define";
  $hash->{ReadFn}    = "wstest_ReadFn";
  $hash->{ReadyFn}   = "wstest_connect";
}

sub
wstest_Define($$)
{
  my ($hash, $def) = @_;
  # $hash->{DeviceName} = "ws:echo.websocket.org:443";
 
  $hash->{DeviceName} = "ws:192.168.178.114:8082/api/socket";
  $hash->{SSL} = 1;

  wstest_getSession($hash);
  wstest_connect($hash);
}


sub
wstest_ping($)
{
  my ($hash) = @_;
  return if(!$hash->{WEBSOCKET});
  DevIo_Ping($hash, "Hello");
  InternalTimer(time()+10, \&wstest_ping, $hash);
}

sub
wstest_ReadFn($)
{
  my ($hash) = @_;
  my $buf = DevIo_SimpleRead($hash);
  return if(!defined($buf)); # Disconnected, dont close, wait for reconnect
  Log 1, "[WSTEST] GOT via websocket: >$buf<";
}

sub
wstest_connect($)
{
  my ($hash) = @_;
  my $disco = (ReadingsVal($hash->{NAME}, "state", "") eq "disconnected");
  DevIo_OpenDev($hash, $disco, undef, sub(){
    return if(!$hash->{WEBSOCKET});
    DevIo_SimpleWrite($hash, 'list', 2);
    wstest_ping($hash);
  });
}

sub
wstest_getSession($)
{
  my ($hash) = @_;

  Log 1, "[WSTEST] session api:";
  my $url = 'http://192.168.178.114:8082/api/session';
 
  my $ua  = LWP::UserAgent->new();
  my $response = $ua->post( $url, [ 'email' => 'xxx@yyy.de', 'password' => 'password' ] );
  my $content = $response->decoded_content();
  Log 1, "[WSTEST] GOT via session api : >$content<";
}

1;


Das module erzeugt folgenden log:


2020.12.09 15:22:05 1: [WSTEST] session api:
2020.12.09 15:22:05 1: [WSTEST] GOT via session api : >{"id":2,"attributes":{"notificationTokens":"fzh_z-8CQv-qrV7iGgBhyq:APA91bGrZ1K5AZ3JtKRb0CwBi-D-yEiw6YDp047Tt6Wcpi4TYl5X-HKe1eBjKMYWbZgqLLUgdFXK32iWgFvRsO_qVUZ1EBmBkKcxy_pYQYsrxKZSZWZzjIviFInkzvDtmvNzvgC3d9_w"},"name":"fhem","login":"","email":"xxx@yyy.de","phone":"","readonly":false,"administrator":true,"map":"osm","latitude":0.0,"longitude":0.0,"zoom":0,"twelveHourFormat":false,"coordinateFormat":"","disabled":false,"expirationTime":null,"deviceLimit":-1,"userLimit":0,"deviceReadonly":false,"token":"bShNXPK0U5oFifY5gTNLBgNahnVgOewE","limitCommands":false,"poiLayer":"","password":null}<
2020.12.09 15:22:05 1: [WSTEST] GOT via devices api : ><h1>Bad Message 400</h1><pre>reason: Illegal character VCHAR='('</pre><
2020.12.09 15:22:05 3: Opening wstest device ws:192.168.178.114:8082/api/socket
2020.12.09 15:22:05 1: wstest: Can't connect to ws:192.168.178.114:8082/api/socket: https://192.168.178.114:8082/api/socket: Can't connect(2) to https://192.168.178.114:8082:  SSL connect attempt failed error:1408F10B:SSL routines:ssl3_get_record:wrong version number


2 Probleme:
Der Websocket connect funktioniert wohl nicht und wenn er denn funktionieren sollte wie mache ich das mit dem session cookie?

Wäre nett, wenn mir einer weiterhelfen könnte.

Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox, 3 Raspberry Pi, signalduino, nanoCUL,  toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

rudolfkoenig

Die Verbindung klappt nicht wegen einem SSL Problem, was nicht FHEM-spezifisch ist.

Ich wuerde versuchen per Internet-Suche rauszufinden, woran das liegt, und (wenn noetig) in $hash->{sslargs} die passenden Werte setzen. Fuer die Parameter siehe "perldoc IO::Socket::SSL". Womoeglich ist die Server-SSL-Bibliothek zu alt, oder dein Client-SSL-Bibliothek, dann hilft nur down/upgrade.

Session-Cookie ist je nach Server anders, es geht darum, dass man auf irgendeinem Weg ein Cooke fuer die Verbindung besorgt, und diesen im HTTP-Header setzt. Oder als Parameter. Oder anders :). Jedenfalls kann nur jemand helfen, der sich mit diesem speziellen Protokoll auskennt.

carlos

ok, werde ich mal ausprobieren
Die Bibliotheken sollten eigentlich aktuell sein, ist ein debian buster system.

Ich habe in meiner /etc/ssl/openssl.conf

CipherString = DEFAULT@SECLEVEL=2

auf

CipherString = DEFAULT@SECLEVEL=1

geändert, wegen der roomba mqtt Anbindung.
Kann das damit zusammenhängen?

Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox, 3 Raspberry Pi, signalduino, nanoCUL,  toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly