Jump to content

Sporadischer Fehler bei IPConnection


Recommended Posts

Posted

Hallo liebe TinkerUnity,

 

in meinem Projekt setze ich die WiFi Extension. Diese wählt sich in das heimische WLAN ein. Meine WebApp im Browser (JavaScript) stellt nun aus dem gleichen WLAN eine IPConnection (ipcon) zum MasterBrick her. Ich setze noch keine Verschlüsselung/Handshake ein, sondern verbinde einfach mittels IP-Adresse und Port.

 

Das klappt nur leider nicht reproduzierbar. Sporadisch, aber gerne auch mal bei fünf Versuchen hintereinander ergibt liefert ipcon.connect() folgende Fehlermeldung:

 

WebSocket connection to 'ws://192.168.1.3:4280/' failed: Status line contains non-ASCII character

Übergeordnet wird dann Error Code 13 ausgelöst.

 

Ich kann den Fehler auf die Line 49756 innerhalb der tinkerforge.js zurückverfolgen. Den dortige Code hilft mir jedoch leider nicht weiter.

 

Weiß jemand Rat???

 

Viele Grüße

Alex

Posted

Das "Status line contains non-ASCII character" ist komisch, als würde die WIFI Extension 2.0 nicht richtig antworten. Wir versuchen dass hier mal nachzustellen.

 

Welchen Browser verwendest du?

 

Welche Version der JavaScript Bindings verwendest du?

 

Welche Firmware-Version läuft auf der WIFI Extension 2.0?

 

Tritt das Problem auch mit einem der Browser-Beispiele der JavaScript Bindings auf, oder nur in deiner WebApp?

Posted

Hallo photron,

 

hier in Kürze die Antworten auf Deine Fragen zu meinem Setup:

Browser: Safari MacOS Version 12.0.2 (14606.3.4) und Safari iOS 12.1.1

JavaScript Bindings: 2.1.21

Firmware WiFi Extension: 2.1.3

Beispiel Script DualRelay: Lief bei 10/10 Versuchen einwandfrei

 

Posted

Habe jetzt auf die JavaScript Bindings Version 2019-01-29: 2.1.22 (2617875) aktualisiert und werde es weiter beobachten. Da es offensichtlich an meiner App liegt, bin ich um jeden Hinweis dankbar, in welche Richtung ich Euer Beispiel (DualRelay) und meinen Code abgleichen sollte.

 

Viele Grüße und vielen Dank

Alex

Posted

Da ich deinen Code nicht kennen, kann ich dir da keinen Rat geben. Dazu müsstest du deinen Code mal vorzeigen.

 

Vielleicht können wir dann hier das Problem nachstellen und verstehen. Denn es sieht schon eher nach einem Problem in den JavaScript Bindings aus, das wir beheben wollen, wenn wir es denn nachstellen könnten.

  • 2 months later...
Posted

Hallo photron... Leider musste ich eine längere Pause im Projekt einlegen. Hier nun mein Code, der die IP connection aufbaut. Ich habe den Fehler inzwischen seltener, aber immer noch sporadisch. Ein Muster erkenne ich bislang nicht...

 

 
function initiateConnection() {
    return new Promise((resolve, reject) => {
        console.log('initiateConnection started ...');
        htmlProtocolDiagnosis.value += getHumTimeStamp() + ' Starting IP Connection @ ' + htmlMasterBrickHOST.value + ':' + htmlMasterBrickPORT.value + '\n';

        var host = configJSON.webApp.userSettings.IP
        var port = parseInt(configJSON.webApp.userSettings.port)
        var timeout = 3000

        if(ipcon !== undefined) {
            ipcon.disconnect();
            DEBUG_2 && console.log('ipcon disconnected before reestablishing connection')
        }

        ipcon = new Tinkerforge.IPConnection(); // Create IP connection

        // Connect to brickd
        ipcon.connect(host, port, 
          function(error) {
            console.log('Error during IP Connection ' + error);
            htmlProtocolDiagnosis.value += getHumTimeStamp() + ' Error ' + error + ' during IP connection '+ '\n';
            reject(new Error('Error during IP Connection ' + error));
          }
        ); 

        // Don't use device before ipcon is connected
        ipcon.on(Tinkerforge.IPConnection.CALLBACK_CONNECTED,
            function (connectReason) {
              
              // Trigger Enumerate
              ipcon.enumerate();  

              // Get Connection state
              console.log('Current ipcon status: ' + ipcon.getConnectionState());
              htmlProtocolDiagnosis.value += getHumTimeStamp() + ' IP Connection Status ' + ipcon.getConnectionState() + ' @ ' + htmlMasterBrickHOST.value + ':' + htmlMasterBrickPORT.value + '\n';

            }
        );

        // Register Enumerate Callback
        ipcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE,
            function(uid, connectedUid, position, hardwareVersion, firmwareVersion,
                     deviceIdentifier, enumerationType) {
              var enumerationTypeEvaluated = function() {
                if(enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) {
                  return('');
                  }
                }
              var deviceIdentifierReadable = getReadableDeviceName(deviceIdentifier, position, uid) 

              var newDevice = 
                {"UID": uid, 
                "ConnectedUID": connectedUid, 
                "Position": position,
                "HardwareVersion": String(hardwareVersion).replace(/,/g, '.'),
                "FirmwareVersion": String(firmwareVersion).replace(/,/g, '.'),
                "DeviceIdentifier": deviceIdentifier,
                "DeviceIdentifierReadable": deviceIdentifierReadable}
                
                modules.push(newDevice);
              }
        );

        // Use devices enumeration results as indicator, if initiateConnection() was successful
        setTimeout( function() {
          if (modules.length >> 0) {
            DEBUG_2 && console.log('initiateConnection() successful')
            htmlProtocolDiagnosis.value += getHumTimeStamp() + ' Received Modules List from MasterBrick' + '\n';
            resolve();
          } else {
            DEBUG_2 && console.log('initiateConnection() not successful')
            htmlProtocolDiagnosis.value += getHumTimeStamp() + ' Did not receive Modules List from MasterBrick' + '\n';
            reject(new Error('Error during modules enumeration'));
          };
        }, timeout); // Give checker 1s time wait for enumeration callbacks to arrive
    })
};

  • 1 month later...
Posted

Ich kann an deinem Code so erstmal kein Problem finden.

 

Ich bin dem "Status line contains non-ASCII character" Fehler noch mal nachgegangen.

 

Der Aufbau einer WebSocket-Verbindung beginnt mit einem HTTP GET Request. Darin fragt Safari bei der WIFI Extension den Aufbau einer WebSocket Verbindung an. Darauf antwortet die WIFI Extension mit einem HTTP Response.

 

Der "Status line contains non-ASCII character" Fehler besagt jetzt, dass in der Statuszeile des HTTP Response der WIFI Extension ein ungültiges Zeichen wäre.

 

In der Statuszeile des HTTP Response steht immer dieser Text: HTTP/1.1 101 Switching Protocols

 

Ich habe mir den WIFI Extension Firmware Code angesehen und kann da kein offensichtliches Problem finden, dass erklären würde, warum da nicht immer "HTTP/1.1 101 Switching Protocols" übertragen werden sollte.

 

Ich habe das hier gerade nochmal getestet und mir auf Linux und macOS mit Wireshark die Kommunikation zwischen Browser und WIFI Extension angesehen. Das sieht aber alles exakt so aus wie es soll und funktioniert auch ohne Probleme.

 

Das hilfreichste wäre, wenn du die Kommunikation mit Wireshark aufzeichnen könntest während das Problem auftritt, damit wir sehen können welche kaputte Antwort da wirklich kommt, wenn das Problem auftritt.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...