202501230907备份
authorp15692025051 <846603105@qq.com>
Thu, 23 Jan 2025 01:08:02 +0000 (09:08 +0800)
committerp15692025051 <846603105@qq.com>
Thu, 23 Jan 2025 01:08:02 +0000 (09:08 +0800)
16 files changed:
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsocket.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/uwebsocket.py
2.sdk/project/7PIN/audio/didianguanji.mp3
2.sdk/project/7PIN/list.json
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC.py
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_init.py
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/sleep_test.py
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
2.sdk/project/7PIN/usr/static/audio.bin
2.sdk/project/W8/usr/static/theme1/THEME1_CAMERA.png [deleted file]
2.sdk/project/W8/usr/static/theme1/THEME1_CONTACTS.png [deleted file]
2.sdk/project/W8/usr/static/theme1/THEME1_SETING.png [deleted file]
2.sdk/project/W8/usr/static/theme1/THEME1_WECHAT.png [deleted file]

index ac4938f..4b65d6d 100644 (file)
@@ -1825,7 +1825,8 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
         FD_SET(sock->fd, &rfds);
 
         MP_THREAD_GIL_EXIT();
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06) \
+    || defined(PLAT_ASR_1606)
         if (sock->timeout > 5)
         {
             struct timeval timeout = { .tv_sec = 5, .tv_usec = 0 };
index 3d73428..3bde84b 100644 (file)
@@ -7,10 +7,28 @@ import ure as re
 import ustruct as struct
 import urandom as random
 import usocket as socket
-import websocket
 from ucollections import namedtuple
-
+import websocket_mask
 LOGGER = log.getLogger(__name__)
+import usys
+# Opcodes
+OP_CONT = 0x0
+OP_TEXT = 0x1
+OP_BYTES = 0x2
+OP_CLOSE = 0x8
+OP_PING = 0x9
+OP_PONG = 0xa
+
+# Close codes
+CLOSE_OK = 1000
+CLOSE_GOING_AWAY = 1001
+CLOSE_PROTOCOL_ERROR = 1002
+CLOSE_DATA_NOT_SUPPORTED = 1003
+CLOSE_BAD_DATA = 1007
+CLOSE_POLICY_VIOLATION = 1008
+CLOSE_TOO_BIG = 1009
+CLOSE_MISSING_EXTN = 1010
+CLOSE_BAD_CONDITION = 1011
 
 URL_RE = re.compile(r'(wss|ws)://([A-Za-z0-9-\.]+)(?:\:([0-9]+))?(/.+)?')
 URI = namedtuple('URI', ('protocol', 'hostname', 'port', 'path'))
@@ -56,10 +74,10 @@ class Websocket(object):
 
     def __init__(self, sock, debug=False):
         self.sock = sock
-        self.ws = websocket.websocket(sock)
         self.open = True
         self.debug = debug
 
+
     def __enter__(self):
         return self
 
@@ -69,13 +87,101 @@ class Websocket(object):
     def settimeout(self, timeout):
         self.sock.settimeout(timeout)
 
-    def read_frame(self, sz):
-        return self.ws.read(sz)
+    def read_frame(self, max_size=None):
+        """
+        Read a frame from the socket.
+        See https://tools.ietf.org/html/rfc6455#section-5.2 for the details.
+        """
+
+        # Frame header
+        two_bytes = self.sock.read(2)
+
+        if not two_bytes:
+            raise NoDataException
 
-    def write_frame(self, data=b''):
-        return self.ws.write(data)
+        byte1, byte2 = struct.unpack('!BB', two_bytes)
 
-    def recv(self, max_size=16*1024):
+        # Byte 1: FIN(1) _(1) _(1) _(1) OPCODE(4)
+        fin = bool(byte1 & 0x80)
+        opcode = byte1 & 0x0f
+
+        # Byte 2: MASK(1) LENGTH(7)
+        mask = bool(byte2 & (1 << 7))
+        length = byte2 & 0x7f
+
+        if length == 126:  # Magic number, length header is 2 bytes
+            length, = struct.unpack('!H', self.sock.read(2))
+        elif length == 127:  # Magic number, length header is 8 bytes
+            length, = struct.unpack('!Q', self.sock.read(8))
+
+        if mask:  # Mask is 4 bytes
+            mask_bits = self.sock.read(4)
+
+        try:
+            data = self.sock.read(length)
+        except MemoryError:
+            # We can't receive this many bytes, close the socket
+            if self.debug: LOGGER.info("Frame of length %s too big. Closing", length)
+            self.close(code=CLOSE_TOO_BIG)
+            return True, OP_CLOSE, None
+
+        if mask:
+            data = bytes(b ^ mask_bits[i % 4]
+                         for i, b in enumerate(data))
+
+        return fin, opcode, data
+
+    def write_frame(self, opcode, data=b''):
+        """
+        Write a frame to the socket.
+        See https://tools.ietf.org/html/rfc6455#section-5.2 for the details.
+        """
+        fin = True
+        mask = self.is_client  # messages sent by client are masked
+
+        length = len(data)
+
+        # Frame header
+        # Byte 1: FIN(1) _(1) _(1) _(1) OPCODE(4)
+        byte1 = 0x80 if fin else 0
+        byte1 |= opcode
+
+        # Byte 2: MASK(1) LENGTH(7)
+        byte2 = 0x80 if mask else 0
+
+        if length < 126:  # 126 is magic value to use 2-byte length header
+            byte2 |= length
+            self.sock.write(struct.pack('!BB', byte1, byte2))
+
+        elif length < (1 << 16):  # Length fits in 2-bytes
+            byte2 |= 126  # Magic code
+            self.sock.write(struct.pack('!BBH', byte1, byte2, length))
+
+        elif length < (1 << 64):
+            byte2 |= 127  # Magic code
+            self.sock.write(struct.pack('!BBQ', byte1, byte2, length))
+
+        else:
+            raise ValueError()
+        #print("mask start len:{}".format(length))
+        if mask:  # Mask is 4 bytes
+            mask_bits = struct.pack('!I', random.getrandbits(32))
+            self.sock.write(mask_bits)
+            #tmp_data = data 
+            # data = bytes(b ^ mask_bits[i % 4]
+            #              for i, b in enumerate(data))
+            # print("old mask:{}".format(data))
+
+            data_array = bytearray(data)
+            mask_bits_array = bytearray(mask_bits)
+            websocket_mask.MASK(data_array,len(data_array),mask_bits_array)
+            #print("new mask:{}".format(data_array))
+            data=bytes(data_array)
+        #print("mask end")
+        self.sock.write(data)
+        #print("write end")
+
+    def recv(self):
         """
         Receive data from the websocket.
 
@@ -86,22 +192,40 @@ class Websocket(object):
         """
         assert self.open
 
-        try:
-            data = self.read_frame(max_size)
-            if data == None:
-                data = ''
-            return data
-        except (ValueError, OSError) as e:
-            error_str = str(e)
-            print("Failed to read frame. Socket dead.", error_str)
-            if error_str.find("[Errno 110]")!= -1:
-                #print("ASR ASR:recv TIMEDOUT 正常")
-                pass
-            else:
+        while self.open:
+            try:
+                fin, opcode, data = self.read_frame()
+            except NoDataException:
+                return ''
+            except ValueError:
+                if self.debug: LOGGER.info("Failed to read frame. Socket dead.")
                 self._close()
-                raise e
+                raise ConnectionClosed()
 
+            if not fin:
+                raise NotImplementedError()
 
+            if opcode == OP_TEXT:
+                return data.decode('utf-8')
+            elif opcode == OP_BYTES:
+                return data
+            elif opcode == OP_CLOSE:
+                self._close()
+                return "websocket close"
+            elif opcode == OP_PONG:
+                # Ignore this frame, keep waiting for a data frame
+                continue
+            elif opcode == OP_PING:
+                # We need to send a pong frame
+                if self.debug: LOGGER.info("Sending PONG")
+                self.write_frame(OP_PONG, data)
+                # And then wait to receive
+                continue
+            elif opcode == OP_CONT:
+                # This is a continuation of a previous frame
+                raise NotImplementedError(opcode)
+            else:
+                raise ValueError(opcode)
 
     def send(self, buf):
         """Send data to the websocket."""
@@ -109,31 +233,34 @@ class Websocket(object):
         assert self.open
 
         if isinstance(buf, str):
+            opcode = OP_TEXT
             buf = buf.encode('utf-8')
-            self.ws.ioctl(9, 1)
         elif isinstance(buf, bytes):
-            self.ws.ioctl(9, 2)
+            opcode = OP_BYTES
         else:
             raise TypeError()
-        
-        self.write_frame(buf)
 
-    def close(self):
+        self.write_frame(opcode, buf)
+
+    def ping(self):
+        self.write_frame(OP_PING,b'ping')
+
+    def close(self, code=CLOSE_OK, reason=''):
         """Close the websocket."""
         if not self.open:
             return
-
         try:
-            self.ws.ioctl(4)
+            buf = struct.pack('!H', code) + reason.encode('utf-8')
+
+            self.write_frame(OP_CLOSE, buf)
         except Exception as e:
-            if self.debug: LOGGER.info("websocekt close:%s"%(str(e)))
+            usys.print_exception(e)    
         self._close()
 
     def _close(self):
         if self.debug: LOGGER.info("Connection closed")
-        self.open = False
         self.sock.close()
-
+        self.open = False
 
 class WebsocketClient(Websocket):
     is_client = True
@@ -162,40 +289,46 @@ class Client(object):
                               uri.hostname, uri.port)
 
         sock = socket.socket()
-        addr = socket.getaddrinfo(uri.hostname, uri.port)
-        sock.connect(addr[0][4])
-
-        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))
+        try:
+            sock.settimeout(6)
+            addr = socket.getaddrinfo(uri.hostname, uri.port)
+            sock.connect(addr[0][4])
+        
+        
+            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]
+        except Exception as e:
+            usys.print_exception(e) 
+            sock.close()
+            return 
         return WebsocketClient(sock, debug)
index 9fec2d4..00f8279 100644 (file)
Binary files a/2.sdk/project/7PIN/audio/didianguanji.mp3 and b/2.sdk/project/7PIN/audio/didianguanji.mp3 differ
index f6215c0..64adee5 100644 (file)
@@ -1 +1 @@
-['IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
\ No newline at end of file
+['didianguanji', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
\ No newline at end of file
index 1518324..9b2ed1b 100644 (file)
@@ -170,7 +170,7 @@ class AI_dev(Abstract):
     def __init__(self):
         self.is_wdt = 1 #是否开启看门狗
 
-        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":3994 , "80":3883, "60": 3707, "40":3604, "20":3537,  "10":3486,"5":3400,}
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":4179 , "80":4070, "60": 3883, "40":3770, "20":3699,  "10":3652,"5":3600,}
         self.KeyAI_status = 0
         self.KeyAI_timer_count = 0
         self.KeyAI_long_press = 0
@@ -416,6 +416,7 @@ class AI_dev(Abstract):
         self.check_rest_timer_count = 0
         print("AI_key_press")
         EventMesh.publish("AI_key_press")
+
     def AI_key_long_press(self):
         self.check_rest_timer_count = 0
         print("AI_key_long_press")
@@ -424,6 +425,7 @@ class AI_dev(Abstract):
     def AI_key_release(self):
         print("AI_key_release")
         EventMesh.publish("AI_key_release")
+        
     def pwk_key_Long_Press(self):
         self.check_rest_timer_count = 0
         print("pwk_key_long_press!!!!!!!")
@@ -473,10 +475,10 @@ class AI_dev(Abstract):
             self.Low_power_warning_flag  = 1
             EventMesh.publish("flicker_led_red")
             #self.aud.play(1,0,'Low_power_warning.mp3')
-            self.Low_power_warning_timer+=1
-            if self.Low_power_warning_timer >= 2:
-                self.Low_power_warning_timer = 0
-                EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+            # self.Low_power_warning_timer+=1
+            # if self.Low_power_warning_timer >= 2:
+            #     self.Low_power_warning_timer = 0
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
 
         if  self.usb_status == 0 and Vbatt<self.VBATT_tab["5"]:    
             EventMesh.publish("audio_montage_play",["didianguanji.mp3"])
@@ -525,11 +527,15 @@ class AI_dev(Abstract):
         print("paly_iccid_imei:ICCID:{}".format(iccid))
         if iccid != -1 and len(iccid) > 5:
             iccid = iccid.upper()
-            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+            if len(iccid) <20:
+                for i in range(20-len(iccid)):
+                    iccid = "0"+iccid
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
                 ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
                 audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
                 audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
-                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])),audio_buf.index("R_READ_TIME_{}".format(iccid[15])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[16])),audio_buf.index("R_READ_TIME_{}".format(iccid[17])),audio_buf.index("R_READ_TIME_{}".format(iccid[18])),audio_buf.index("R_READ_TIME_{}".format(iccid[19])))
         str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
         self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
     #鉴权出错,播放imei号
@@ -999,6 +1005,9 @@ class OTA():
         try:
             sourceVersion = versions.Build_Time
             sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
+            print("sourceVersion:{}".format(sourceVersion))
+            sourceVersion = sourceVersion.replace(" ", "0")
+            print("sourceVersion2:{}".format(sourceVersion))
             #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"
             url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
             print(url)
@@ -1053,6 +1062,9 @@ class OTA():
         try:
             currentVersion = versions.Build_Time
             currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+            print("currentVersion1:{}".format(currentVersion))
+            currentVersion = currentVersion.replace(" ", "0")
+            print("currentVersion2:{}".format(currentVersion))
             url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
             print(url)
             response = request.post(url,timeout=5)
@@ -1144,14 +1156,17 @@ class AI_VC(Abstract):
         self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
         if self.VC_mode == None :
             self.VC_mode = 0
-        
-        self.VC_server = 0 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.is_up_error= 0 #是否上传错误id
+        self.error_data = []
+        self.asr_taskid  = ""
+        self.VC_taskid  = ""
+        self.VC_server = 0 #0柒牌正式服务器,1:测试服务器1,2:测试服务器2
 
         self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
         if self.server_ip == None:
             if self.VC_server == 1:# 
                 
-                self.server_ip="118.145.158.207:22084"
+                self.server_ip="118.145.158.207:22083"
             elif self.VC_server == 2:# 
                 self.server_ip="118.145.158.207:22082"
             else:
@@ -1420,6 +1435,28 @@ class AI_VC(Abstract):
                 self.http_get_config()#获取/更新配置参数
             except Exception as e:
                 usys.print_exception(e)
+    #提交错误id           
+    def ud_error(self,error_data):
+        response = None
+        if self.is_up_error == 1:
+            try:
+                # currentVersion = versions.Build_Time
+                # currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+                url = "http://{}/health?task_id={}".format(self.server_ip,error_data[0]+error_data[1])
+                print(url)
+                response = request.get(url,timeout=5)
+                if response.status_code == 200:
+
+                    print("ud_error:ok")
+                else:
+                    print("ud_error  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+            except Exception as e:
+                usys.print_exception(e)
+                if response != None:
+                    response.close()
     #获取配置参数
     def http_get_config(self, event=None, msg=None):
         print("http_get_config")
@@ -1599,7 +1636,7 @@ class AI_VC(Abstract):
             return 
         self.AI_client_asr_debug+=1
         utime.sleep_ms(10)
-        self.AI_client_asr.settimeout(120)
+        self.AI_client_asr.settimeout(5)
         #开启发送线程
         if self.AI_ASR_send_data_queue_thread_id == 0:    
             _thread.stack_size(self.Audio_buf_size+8*1024)
@@ -1674,7 +1711,8 @@ class AI_VC(Abstract):
         if self.AI_client_asr_isconnect == 1:
             #self.AI_client_asr.write_frame(0x09,b'ping ping')
             self.AI_client_asr_send("ping")
-    
+    def set_AI_ASR_flag(self,data):
+        self.AI_ASR_flag = data
     def AI_ASR_timer_cb(self, *args): #
         EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) 
 
@@ -1685,17 +1723,29 @@ class AI_VC(Abstract):
             if self.AI_ASR_check_timeout <=0:
                 self.AI_ASR_check_timeout = 0
                 self.AI_ASR_error_timeout = 3#发送停止后3秒后没正式结果就提示
-                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
                 
         if self.AI_ASR_error_timeout>0:
             self.AI_ASR_error_timeout-=1
             print("AI_ASR_error_timeout:{}".format(self.AI_ASR_error_timeout))  
             if self.AI_ASR_error_timeout <= 0:
                 self.AI_ASR_error_timeout = 0
-                if self.AI_ASR_str == "":
-                        self.AI_TTS_str = "没有识别到您说话,请重试" 
-                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
-
+                #if self.AI_ASR_str == "":
+                if self.AI_ASR_str_tmp == "" and self.AI_ASR_str == "" and self.AI_ASR_text_tmp == "":
+                    self.AI_TTS_str = "没有识别到您说话,请重试" 
+                else :
+                    self.AI_ASR_str = self.AI_ASR_str_tmp + self.AI_ASR_str+self.AI_ASR_text_tmp
+                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                print("AI_ASR_error_timeout2:重连:{}!!!!!!!!!!\r\n".format(self.AI_ASR_str) )
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连ASR
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) #重连ASR
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.set_AI_ASR_flag,"data":1})#设置以打断过一次
+                if self.VC_record_state_flag > 1:
+                    self.VC_record_state_flag =1
         pass
     #关闭ASR数据发送线程
     def AI_ASR_send_data_queue_thread_close(self):
@@ -1759,6 +1809,7 @@ class AI_VC(Abstract):
                             if self.AI_client_asr_isconnect != 0:
                                 print("ASR发送数据错误,退出")
                                 EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR发送出错了,请重试"}) 
+                                self.ud_error(["asr",self.asr_taskid])
                             #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
                     utime.sleep_ms(1)
         self.AI_ASR_send_data_queue_thread_lock = 0    
@@ -1802,10 +1853,12 @@ class AI_VC(Abstract):
                     print("ASR 服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
                     
                     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    self.ud_error(["asr",self.asr_taskid])
                     break
                 elif recv_data == "":#客户端关闭连接
                     print("ASR ASR :客户端关闭连接")
                     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    self.ud_error(["asr",self.asr_taskid])
                     break
                 try:
                     if isinstance(recv_data, str):
@@ -1814,7 +1867,11 @@ class AI_VC(Abstract):
                         if jsload_data["status"] != 20000000:#返回错误
                             print("ASR返回非20000000状态码,退出")
                             EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
+                            self.ud_error(["asr",self.asr_taskid])
                             break
+                        
+                        if jsload_data["task_id"] != None:
+                            self.asr_taskid  = jsload_data["task_id"]
                         if jsload_data["event"] != None:
                             if jsload_data["event"] == "TranscriptionStarted": #开始录音
                                 self.VC_record_state_flag = 2
@@ -1920,18 +1977,19 @@ class AI_VC(Abstract):
                     usys.print_exception(e)
                 
             except Exception as e:
-                    # error_str = str(e)
-                    # print("ASR ASR:e:{}".format(error_str))
-                    # #usys.print_exception(e)
-                    # if error_str.find("[Errno 110]")!= -1:
-                    #     #print("ASR ASR:recv TIMEDOUT 正常")
-                    #     pass
-                    # else:
+                    error_str = str(e)
+                    print("ASR ASR:e:{}".format(error_str))
+                    #usys.print_exception(e)
+                    if error_str.find("[Errno 110]")!= -1:
+                        #print("ASR ASR:recv TIMEDOUT 正常")
+                        pass
+                    else:
                         usys.print_exception(e)
                         print("{}".format(cli))
                         #self.websocket_error()
                         print("ASR读数据报错,退出")
                         EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"})#
+                        self.ud_error(["asr",self.asr_taskid])
                         break
         self.AI_client_asr_isconnect = 0
         self.AI_client_asr_recv_id = 0 
@@ -2102,7 +2160,7 @@ class AI_VC(Abstract):
         #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
         #     h_data_b = bytes(h_data)
         #     self.AI_client_VC_send(h_data_b)
-        
+        AI_record_tmp_queue_len = 0
         while True:
             try:
                 if self.VC_record_thread_lock == 2:
@@ -2145,7 +2203,9 @@ class AI_VC(Abstract):
                     
                     if self.VC_record_state_flag <=1 :#没发送前先存起来
                         self.AI_record_tmp_queue.put(read_buf)
+                        AI_record_tmp_queue_len += len(read_buf)
                     else:
+                        AI_record_tmp_queue_len = 0
                         while True:
                             if self.AI_record_tmp_queue.empty() == True:
                                 break
@@ -2277,7 +2337,7 @@ class AI_VC(Abstract):
             return
         self.AI_client_VC_debug+=1
         utime.sleep_ms(10)
-        self.AI_client_VC.settimeout(120)
+        self.AI_client_VC.settimeout(5)
         #self.AI_VC_send_data_queue_thread_close()#关闭发送线程
         if self.AI_VC_send_data_queue_thread_id == 0:    
             _thread.stack_size(self.Audio_buf_size+8*1024)
@@ -2457,6 +2517,7 @@ class AI_VC(Abstract):
                                 if self.AI_client_VC_isconnect != 0:
                                     print("VC发送数据错误,退出")
                                     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) 
+                                    self.ud_error(["VC",self.VC_taskid])
                             except Exception as e: #网络连接异常
                                 usys.print_exception(e)
 
@@ -2514,10 +2575,12 @@ class AI_VC(Abstract):
                     # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
                     #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
                     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
                     break
                 elif recv_data == "":#客户端关闭连接
                     print("VC VC :客户端关闭连接")
                     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    self.ud_error(["VC",self.VC_taskid])
                     break
                 try:
                     self.websocket_error_count = 0
@@ -2528,7 +2591,10 @@ class AI_VC(Abstract):
                         if jsload_data["status"] != 20000000:#返回错误
                             print("VC VC :服务器返回非20000000状态码,退出")
                             EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                            self.ud_error(["VC",self.VC_taskid])
                             break
+                        if jsload_data["task_id"] != None:
+                            self.VC_taskid  = jsload_data["task_id"]
                         if jsload_data["event"] == "Started" :#会话开始
                             payload = jsload_data["payload"]
                             self.VC_dialog_id = payload["dialog_id"] 
@@ -2592,7 +2658,7 @@ class AI_VC(Abstract):
                             self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话
                             if self.VC_mode == 0 :#连续问答模式
                                 #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开
-                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音 
                                 pass
                             if self.play_data_save_flag == 1:
                                 if self.play_fd !=None:
@@ -2641,17 +2707,17 @@ class AI_VC(Abstract):
                 
             except Exception as e:
                     
-                    # error_str = str(e)
-                    # #print("VC VC:e:{}".format(error_str))
-                    # if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
-                    #     #print("VC VC:recv TIMEDOUT 正常")
-                    #     pass
-                    # else:
+                    error_str = str(e)
+                    #print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        #print("VC VC:recv TIMEDOUT 正常")
+                        pass
+                    else:
                         usys.print_exception(e)
                         #self.websocket_error()
                         print("VC VC :读数据报错,退出")
                         EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
-                        
+                        self.ud_error(["VC",self.VC_taskid])
                         break
         self.AI_client_VC_isconnect = 0
         self.AI_client_VC_recv_id = 0 
@@ -2822,6 +2888,9 @@ class AI_VC(Abstract):
                         sourceVersion = versions.Build_Time
                         self.AI_TTS_str ="Mr-Seven-"+sourceVersion
                         return 0
+                    if text.find("服务器地址") != -1 :
+                        self.AI_TTS_str ="服务器地址"+self.server_ip
+                        return 0
                 if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
                     
                     if self.ai_OTA.min_sys_ota()==1:
@@ -2919,6 +2988,7 @@ class AI_VC(Abstract):
             if self.VC_state >= VC_State_SpeechIng:
                 print("接口无响应,超时退出")
                 EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) 
+                self.ud_error(["VC",self.VC_taskid])
             else:
                 EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
         # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
index e7d5c4b..c6cfb00 100644 (file)
@@ -41,13 +41,36 @@ class watchApp(App):
         super().start()
 
 
+#开机执行下面函数就可以配置成ipv4拨号
+import dataCall
+import net
 
+def set_ipv4_datacall():
+       # 获取第一路的APN,ipType 等信息
+       pdpCtx = dataCall.getPDPContext(1)
+       if pdpCtx != -1:
+               if pdpCtx[0] != 0:
+                       # 如果不是用户需要的ipv4,使用如下方式配置,使用如下方式配置
+                       ret = dataCall.setPDPContext(1, 0,pdpCtx[1],pdpCtx[2],pdpCtx[3],pdpCtx[4])
+                       if ret == 0:
+                               print('配置成功。')
+                               # cfun0/1后按照配置的信息进行拨号
+                               net.setModemFun(0)
+                               net.setModemFun(1)
+                       else:
+                               print('配置失败。')
+               else:
+                       print('已经配置为IPv4')
+       else:
+               print('获取PDP Context失败。')
 def main_init():
 # if __name__ == '__main__':
+    #set_ipv4_datacall()
     import uos
     import ql_fs
     import utime
     import EventMesh
+    
     # if ql_fs.path_exists("/ext") == False:
     #     ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
     #     uos.mount(ldev,'/ext')
index 8d7caf4..57c80b1 100644 (file)
@@ -19,9 +19,10 @@ aud.set_pa(Pin.GPIO29)
 aud.setVolume(11)
 AI_TTS_str = ""
 AI_client_tts = None
+AI_client_tts_1 = None
 _4S_timer = None
 def AI_client_tts_recv(cli,fd):
-
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
     while True:
         try:
             # 死循环接收数据
@@ -36,16 +37,21 @@ def AI_client_tts_recv(cli,fd):
                 # print("AI_client_tts_recv :{}".format(len(recv_data)))
                 #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
                 if isinstance(recv_data, str):
-                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
+                    #print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
                     if recv_data.find('\"state\":\"Listening\"') != -1:
                         AI_client_VC_RequestToRespond()
                     if recv_data.find('\"event\":\"RespondingEnded\"') != -1:
                     
                         print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
                         print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
-                        cli.close()
+                        #cli.close()
                         fd.close()
                         _4S_timer.stop()
+                        # AI_client_tts.close()
+                        # try:
+                        #     AI_client_tts_1._close()
+                        # except Exception as e:
+                        #     usys.print_exception(e)
                         break
                 else:
                     fd.write(recv_data)
@@ -59,14 +65,14 @@ def AI_client_tts_recv(cli,fd):
                 break
 def _4S_timer_cb(self,*argc):
     print("_4S_timer_cb!!!!!!!!!!!!!!!!!!!!!")
-    global AI_TTS_str,AI_client_tts,_4S_timer
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
     try:
         AI_client_VC_ping()
     except Exception as e:
         usys.print_exception(e)
         _4S_timer.stop()
 def websocket_connect_tts(fd_neme,tts_str):
-    global AI_TTS_str,AI_client_tts,_4S_timer
+    global AI_TTS_str,AI_client_tts,_4S_timer,AI_client_tts_1
     _4S_timer = osTimer()
     _4S_timer.start(4000,1,_4S_timer_cb)
     
@@ -81,7 +87,8 @@ def websocket_connect_tts(fd_neme,tts_str):
     req_str = "is_auth=0{}{}".format(platform,lang)
     try:
        
-        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=True)
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
+        AI_client_tts_1 = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=False)
     except Exception as e: #网络连接异常
         usys.print_exception(e)
         print("websocket_connect_tts ERROR:{}\r\n".format(e))
@@ -119,10 +126,13 @@ def websocket_connect_tts(fd_neme,tts_str):
             }
     }
     AI_client_tts.send(ujson.dumps(json_data))
-    print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))
+    AI_client_tts_1.send(ujson.dumps(json_data))
+   # print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))
 def AI_client_VC_ping():
     global AI_TTS_str,AI_client_tts,_4S_timer    
-    AI_client_tts.send("ping")
+    #AI_client_tts.send("ping")
+    AI_client_tts.send("aaa")
+    print("AI_client_VC_ping")
 
 def AI_client_VC_RequestToRespond():
         global AI_TTS_str,AI_client_tts
@@ -182,7 +192,7 @@ def AI_audio_queue_thread():
             print("AI_audio_queue_thread:ERROR:")
             usys.print_exception(e)
 
-#websocket_connect_tts("/usr/shouhou.mp3",",可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值!")
+websocket_connect_tts("/usr/didianguanji.mp3","电量低,请充电后使用...,正在关机!")
 # for i in range(10):
 #     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"{}。".format(i))
 #     utime.sleep_ms(4000)
index 844215d..a3aef00 100644 (file)
Binary files a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
index c37c1ab..9aa5365 100644 (file)
Binary files a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
index 30b5c46..bf46984 100644 (file)
Binary files a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
index 4fd01b0..149f6cb 100644 (file)
Binary files a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
index 74e20cb..f6f0bfe 100644 (file)
Binary files a/2.sdk/project/7PIN/usr/static/audio.bin and b/2.sdk/project/7PIN/usr/static/audio.bin differ
diff --git a/2.sdk/project/W8/usr/static/theme1/THEME1_CAMERA.png b/2.sdk/project/W8/usr/static/theme1/THEME1_CAMERA.png
deleted file mode 100644 (file)
index b175b0f..0000000
Binary files a/2.sdk/project/W8/usr/static/theme1/THEME1_CAMERA.png and /dev/null differ
diff --git a/2.sdk/project/W8/usr/static/theme1/THEME1_CONTACTS.png b/2.sdk/project/W8/usr/static/theme1/THEME1_CONTACTS.png
deleted file mode 100644 (file)
index e62722a..0000000
Binary files a/2.sdk/project/W8/usr/static/theme1/THEME1_CONTACTS.png and /dev/null differ
diff --git a/2.sdk/project/W8/usr/static/theme1/THEME1_SETING.png b/2.sdk/project/W8/usr/static/theme1/THEME1_SETING.png
deleted file mode 100644 (file)
index 2464976..0000000
Binary files a/2.sdk/project/W8/usr/static/theme1/THEME1_SETING.png and /dev/null differ
diff --git a/2.sdk/project/W8/usr/static/theme1/THEME1_WECHAT.png b/2.sdk/project/W8/usr/static/theme1/THEME1_WECHAT.png
deleted file mode 100644 (file)
index 2ab9e3e..0000000
Binary files a/2.sdk/project/W8/usr/static/theme1/THEME1_WECHAT.png and /dev/null differ