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 };
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'))
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
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.
"""
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."""
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
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)
-['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
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
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")
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!!!!!!!")
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"])
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号
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)
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={}¤tVersion={}".format(modem.getDevImei(),currentVersion)
print(url)
response = request.post(url,timeout=5)
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:
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")
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)
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_})
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):
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
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):
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
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
# 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:
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
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)
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)
# #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
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"]
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:
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
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:
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))
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')
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:
# 死循环接收数据
# 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)
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)
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))
}
}
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
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)