备份
authorp15692025051 <846603105@qq.com>
Tue, 31 Dec 2024 02:13:38 +0000 (10:13 +0800)
committerp15692025051 <846603105@qq.com>
Tue, 31 Dec 2024 02:13:38 +0000 (10:13 +0800)
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/uwebsocket.py

index 258d5f1..a781f4d 100644 (file)
@@ -10,7 +10,7 @@ import usocket as socket
 from ucollections import namedtuple
 import websocket_mask
 LOGGER = log.getLogger(__name__)
-
+import usys
 # Opcodes
 OP_CONT = 0x0
 OP_TEXT = 0x1
@@ -210,7 +210,7 @@ class Websocket(object):
                 return data
             elif opcode == OP_CLOSE:
                 self._close()
-                return
+                return "websocket close"
             elif opcode == OP_PONG:
                 # Ignore this frame, keep waiting for a data frame
                 continue
@@ -248,10 +248,12 @@ class Websocket(object):
         """Close the websocket."""
         if not self.open:
             return
+        try:
+            buf = struct.pack('!H', code) + reason.encode('utf-8')
 
-        buf = struct.pack('!H', code) + reason.encode('utf-8')
-
-        self.write_frame(OP_CLOSE, buf)
+            self.write_frame(OP_CLOSE, buf)
+        except Exception as e:
+            usys.print_exception(e)    
         self._close()
 
     def _close(self):
@@ -287,40 +289,45 @@ class Client(object):
                               uri.hostname, uri.port)
 
         sock = socket.socket()
+        sock.settimeout(6)
         addr = socket.getaddrinfo(uri.hostname, uri.port)
         sock.connect(addr[0][4])
+        
+        try:
+            if uri.protocol == 'wss':
+                import ussl
+                sock = ussl.wrap_socket(sock)
+
+            def send_header(header, *args):
+                if debug: LOGGER.info(str(header), *args)
+                sock.write(header % args + '\r\n')
+
+            # Sec-WebSocket-Key is 16 bytes of random base64 encoded
+            key = binascii.b2a_base64(bytes(random.getrandbits(8) for _ in range(16)))[:-1]
+            send_header(b'GET %s HTTP/1.1', uri.path or '/')
+            send_header(b'Host: %s:%s', uri.hostname, uri.port)
+            send_header(b'Connection: Upgrade')
+            send_header(b'Upgrade: websocket')
+            send_header(b'Sec-WebSocket-Key: %s', key)
+            send_header(b'Sec-WebSocket-Version: 13')
+            send_header(b'Origin: http://{hostname}:{port}'.format(
+                hostname=uri.hostname,
+                port=uri.port)
+            )
+            for k, v in headers.items():
+                send_header('{}:{}'.format(k, v).encode())
+            send_header(b'')
 
-        if uri.protocol == 'wss':
-            import ussl
-            sock = ussl.wrap_socket(sock)
-
-        def send_header(header, *args):
-            if debug: LOGGER.info(str(header), *args)
-            sock.write(header % args + '\r\n')
-
-        # Sec-WebSocket-Key is 16 bytes of random base64 encoded
-        key = binascii.b2a_base64(bytes(random.getrandbits(8) for _ in range(16)))[:-1]
-        send_header(b'GET %s HTTP/1.1', uri.path or '/')
-        send_header(b'Host: %s:%s', uri.hostname, uri.port)
-        send_header(b'Connection: Upgrade')
-        send_header(b'Upgrade: websocket')
-        send_header(b'Sec-WebSocket-Key: %s', key)
-        send_header(b'Sec-WebSocket-Version: 13')
-        send_header(b'Origin: http://{hostname}:{port}'.format(
-            hostname=uri.hostname,
-            port=uri.port)
-        )
-        for k, v in headers.items():
-            send_header('{}:{}'.format(k, v).encode())
-        send_header(b'')
-
-        header = sock.readline()[:-2]
-        assert header.startswith(b'HTTP/1.1 101 '), header
-
-        # We don't (currently) need these headers
-        # FIXME: should we check the return key?
-        while header:
-            if debug: LOGGER.info(str(header))
             header = sock.readline()[:-2]
-
+            assert header.startswith(b'HTTP/1.1 101 '), header
+
+            # We don't (currently) need these headers
+            # FIXME: should we check the return key?
+            while header:
+                if debug: LOGGER.info(str(header))
+                header = sock.readline()[:-2]
+        except Exception as e:
+            usys.print_exception(e) 
+            sock.close()
+            return 
         return WebsocketClient(sock, debug)