From 3da6a80b179076ba51dbd178c21903e529af57ea Mon Sep 17 00:00:00 2001 From: DXY <1731678236@qq.com> Date: Wed, 21 Aug 2024 18:56:17 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- cat1modem/src/main.py | 2 +- cat1modem/src/tcpService.py | 694 ++++++++++++++++++++++++++++++++++++ 2 files changed, 695 insertions(+), 1 deletion(-) create mode 100644 cat1modem/src/tcpService.py diff --git a/cat1modem/src/main.py b/cat1modem/src/main.py index a878fb625..a72e1dc4f 100644 --- a/cat1modem/src/main.py +++ b/cat1modem/src/main.py @@ -1,7 +1,7 @@ import example main_flag = 1 try: - from usr.ftpService import FtpService + from usr.tcpService import TcpService example.exec('/usr/main_init.py') print("启动成功!!!!!\r\n") except Exception as e: diff --git a/cat1modem/src/tcpService.py b/cat1modem/src/tcpService.py new file mode 100644 index 000000000..3238fc2a5 --- /dev/null +++ b/cat1modem/src/tcpService.py @@ -0,0 +1,694 @@ +from misc import Power +import usocket +import log +import utime +import audio +from machine import UART +import _thread +from queue import Queue +from machine import Pin +from machine import ExtInt +import dataCall +import voiceCall +import net +import uping +import example +import osTimer +import sim +import modem +import utime +import checkNet +import atcmd +import fota +import request +import ql_fs +import pm +import sms +import binascii +import ujson +import uos +import slip + +CAT1_SERVICE_HEAD = "FE" + + + +CAT1_REPLAY_STATE="00" +CAT1_CREAT_DIR_FAILE= "01" +CAT1_CREAT_DIR_OK= "02" +CAT1_NO_REPLAY_OTA_OK= "03" +CAT1_WRITE_FILE_SUCC= "04" +CAT1_WRITE_FILE_ERROR = "05" +CAT1_CRC_ERROR = "06" +CAT1_SEND_HEAD_ERR = "07" +CAT1_OTA_TIMEOUT_BLE_NO_REPLAY = "08" +CAT1_CREAT_FILE_ERROR = "09" +CAT1_CREAT_FILE_SUCC = "0A" +CAT1_ALLPY_FILE_TRANSFER_END = "0B" +CAT1_REPLAY_OTA_SUCC = "0C" +CAT1_REPLAY_OTA_FALIE = "0D" +CAT1_REPLAY_FILE_SIZE_OK = "0E" +CAT1_REPLAY_FILE_SIZE_ERR = "0F" +CAT1_REPLAY_OTA_END_FAILE = "10" #升级完之后 CAT1回复升级失败 + +CAT1_NEED_UPDATE_OTA = "11" #提示用户强制升级 + +BLE_STOP_OTA = 0 #结束OTA升级 +BLE_START_OTA = 1 #ble 开始发送OTA标识 -》 CAT1 +BLE_START_SEND_SINGLE_FILE_INFO= 2 #//ble 开始发送单个文件信息 -> CAT1 创建单个文件名 +BLE_START_SEND_FILE_DATA= 3 #//BLE开始发送文件数据额 ----》CAT1 接收文件数据写文件 +BLE_START_OTA_FAILE = 4 #BLE 发送OTA失败 取消文件传输 +BLE_START_OTA_SUCC = 5 #//BLE 发送OTA成功标识 +BLE_START_SEND_ALLFILE_FINESH = 6 #/所有PY文件传输完成 +BLE_START_SEND_SINGLE_FINESH = 7 #//单个文件传输完成 +BLE_START_ERROR_INFO = 255 #/发送错误信息结束进程 + +# 创建gpio对象 +gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1) +# 设置输入输出模式 +gpioWakeBT.set_dir(Pin.OUT) + +# 设置引脚电平 +gpioWakeBT.write(0) +FILE_TRANSFER_TIMEOUT=60 #超时时间 60s没有收到BLE的发送数据就结束了 +class TcpServiceInit: + AP = 0 # SLIP_INNER + STA = 1 # SLIP_OUTER + + def __init__(self, uart=UART.UART4, mode=AP): + self.__uart = uart + self.__mode = mode + self.Cat1FileState = 0 + self.Cat1FileReplayBle = 0 + self.Cat1TimeCount = 0 + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT + self.Cat1FileTransTimer = osTimer() + self.Cat1OtaTimeOut = osTimer() + self.crc_err = 0 + self.allPyRecvFlag = 0 + self.ota_state =0 + self.ota_bstate =0 + self.fileNameTmp = "" + self.fileNameList = [] + self.fileSizeList = [] + self.fileSize = 0 + self.updateTimer = osTimer() + self.updateTimerCount = 0 + self.updateTimerFlag = 0 + self.sock = None + + slip.destroy() + ret = slip.construct(self.__uart,self.__mode, 0) + if ret != 0: + print('slip netif construct fail') + return None + + self.__sock_file = None + self.__sock_file = self.__socket_file_init() + self.__thread_file = _thread.start_new_thread(self.__Socket_File_Thread, ()) + print("ftp_Service :{}\r\n".format(self.__sock_file)) + # 封装tlv数据包 + def __pack_tlv_format(self, head, content): + head1 = head + content1 = content + if len(content1) == 0 or len(content1) > 9999 or len(head1) != 2: + print('illegal pack tlv content file') + return -1 + len_str ='%04d' % len(content1) + tlv_pack = CAT1_SERVICE_HEAD+head1+len_str+content1 + return tlv_pack + # 解码tlv数据包 + def __unpack_tlv_format(self, msg): + print('__unpack_tlv_format file {}\r\n'.format(msg)) + msg_tmp = str(msg)[2:]#这是去除head FE + tag = msg_tmp[0:2] + length = msg_tmp[2:6] + value = msg_tmp[6:] + len_str ='%04d' % len(value) + if len(value) == 0 or len(value) > 9999 or len(tag) != 2 or len_str != msg_tmp[2:6]: + print('__unpack_tlv_format err file') + return -1 + print('__unpack_tlv_format: {} {} {}\r\n'.format(tag,length,value)) + unpack = (tag,length,value) + return unpack + def __socket_init(self): + + # 创建一个socket实例 + self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) + self.sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) + return self.sock + + def __socket_file_init(self): #文件传输Socket + self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM, usocket.TCP_CUSTOMIZE_PORT) + self.sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) + # 绑定IP + bind_addr = ('172.16.1.2', 5001) + self.sock.bind(bind_addr) + self.sock.settimeout(10) + return self.sock + def __socket_file_reinit(self): + print("self.__sock_file reinit:{}\r\n".format(self.__sock_file)) + if self.__sock_file != None: + self.sock.close() + return self.__socket_file_init() + + def __Socket_UDP_file_noreply(self, head, content): + head1 = head + content1 = content + gpioWakeBT.write(1) + utime.sleep_ms(2) + gpioWakeBT.write(0) + utime.sleep_ms(20) + # 消息处理 + msg = self.__pack_tlv_format(head1,content1) + if msg == -1: #无效数据 + return 0 + # 向服务端发送消息 + server_addr = ('172.16.1.5',1001) #服务端口也需要更改 + + print("__Socket_UDP_file_noreply send msg {}".format(msg)) + try: + data_size = self.__sock_file.sendto(msg,server_addr) + print("self.__sock_file data_size {}".format(data_size)) + except Exception as e: + print("self.__sock_file error {}".format(e)) + return 0 + # py文件传输 + # //py文件传输 + # // {"Code":1} 开始OTA + # // {"Code":2,"fileName":"cat1Service.py","fileSize":123435} fileCode: 文件ID fileName:文件名称 fileSize:文件大小 + # // {"Code":3,"head+datalen+data+CRC":"数据"} // Code: 2开始发送文件数据 + # // {"Code":4} BLE 主动发送OTA失败 + # // {"Code":5} BLE 主动发送OTA成功 + # // {"Code":6} BLE 所有PY文件传输完成 + # // {"Code":7} BLE 单个文件传输完成 + def __Socket_File_Thread(self): + while True: + try: + print(" __Socket_File_Thread recv====22222") + data=self.__sock_file.recv(1024*10) + if not data: + print("__Socket_File_Thread data null:\r\n") + else: + self.file_data(data.decode('uft-8')) + # print("__Socket_File_Thread end:{}\r\n".format(data.decode())) + + except Exception as e: + print("__Socket_File_Thread:e{}\r\n".format(e)) + self.__sock_file = self.__socket_file_reinit() + # print("End __Socket_File_Thread Thread") + + def cat1FileTimerCb(self,*argc): + print("timer test\r\n") + if self.Cat1PyFileTimout > 0: + self.Cat1PyFileTimout-=1 + if self.Cat1PyFileTimout == 0: + self.Cat1PyFileTimout = 0 + self.Cat1FileState = 0 + self.deleteTmpFile() + self.deleteUsrTmpFile() + self.__Socket_UDP_file_noreply(CAT1_OTA_TIMEOUT_BLE_NO_REPLAY,"ota error") #结束文件接收不完整的 + self.Cat1FileTransTimer.stop() #//关闭定时器 + pass + + def crc_cal(self,msg): + bytes_data = msg.encode('utf-8') + hex_data = binascii.hexlify(bytes_data) + hex_data = hex_data.decode() + # print("hex_data:{}\r\n".format(hex_data)) + data = hex_data + crcValue = 0 + j = 0 + i = 0 + json_state = 0 + crcbuf = 0 + print("len(data) :{}\r\n".format(len(data))) + data_len = len(str(data)) + try: + if data_len % 2 != 0: + json_state = 0 + return [json_state,crcbuf] + except Exception as e: + json_state = 0 + print("不合法的的十六进制数据!!\r\n") + + for i in range(data_len): + if j >= data_len: + break + try: + decimal_number = int(str(data[j:j+2]), 16) + + crcValue=crcValue+decimal_number + crcValue = crcValue&0xff + except Exception as e: + print("不合法的的十六进制数据!!\r\n") + j+=2 + + crcbuf = crcValue%256 + crcbuf = 256-crcbuf + crcbuf = crcbuf%256 + + print("crcbuf:{}\r\n".format(crcbuf)) + return [json_state,"%02x"%(crcbuf)] + #删除临时创建的文件夹 + def deleteTmpFile(self): + tmp_dir = ql_fs.path_exists("/usr/TmpPyFile") + if tmp_dir == True: + ql_fs.rmdirs("/usr/TmpPyFile") + + #删除usr临时创建的文件夹 + def deleteUsrTmpFile(self): + return + tmp_dir = ql_fs.path_exists("/usr/UsrTmpPyFile") + if tmp_dir == True: + ql_fs.rmdirs("/usr/UsrTmpPyFile") + + def file_data(self,data): + mk_dir_state = 0 + print("data!!!!!{}\r\n".format(len(data))) + if self.updateTimerFlag == 0: + self.updateTimerFlag = 1 + self.updateTimer.stop() + msg = {} + json_state = 0 + try: + msg = ujson.loads(data) + json_state = 1 + except Exception as e: + + json_state = 0 + + # print("msg type msg {} {}\r\n".format(msg,type(data))) + if "Code" in msg and json_state == 1 : + + Code = int(msg["Code"]) + print("Code {} self.Cat1FileState:{}\r\n".format(Code,self.Cat1FileState)) + if Code == BLE_STOP_OTA: #OTA失败 + self.allPyRecvFlag = 0 + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.deleteTmpFile() + self.deleteUsrTmpFile() + pass + elif Code == BLE_START_OTA: #BLE 开始OTA cat1创建临时文件夹记录传输的文件数据 文件名 + self.ota_state =0 + self.ota_bstate =0 + self.allPyRecvFlag = 0 + self.fileNameList = [] + self.fileSizeList = [] + print("BLE_START_OTA {} \r\n".format(BLE_START_OTA)) + self.allPyRecvFlag = 0 + self.Cat1FileState = 0 + self.deleteUsrTmpFile() + self.Cat1OtaTimeOut.stop() + check_dir = ql_fs.path_exists("/usr/TmpPyFile") + mk_dir_state = 0 + if check_dir == True: + try: + self.deleteTmpFile() + except Exception as e: + print("移除失败!!!!\r\n") + check_dir = ql_fs.path_exists("/usr/TmpPyFile") + if check_dir == False: #文件夹不存在 创建目录文件夹 + try: + ql_fs.mkdirs("/usr/TmpPyFile") + mk_dir_state = 1 + print("创建临时文件 创建成功!!!!\r\n") + except Exception as e: + mk_dir_state = 0 + print("创建临时文件失败没有内存!!!!\r\n") + else: #已经存在目录了 + mk_dir_state = 1 + print("创建成功!!!!{}\r\n".format(mk_dir_state)) + if mk_dir_state == 0: + self.__Socket_UDP_file_noreply(CAT1_CREAT_DIR_FAILE,"creat dir error!") + else: + self.Cat1FileState = 1 + self.fileNameList = [] + self.fileSizeList = [] + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s + self.Cat1FileTransTimer.stop() + self.Cat1FileTransTimer.start(1000,1,self.cat1FileTimerCb) + self.__Socket_UDP_file_noreply(CAT1_CREAT_DIR_OK,"creat dir success!") + + + elif Code == BLE_START_SEND_SINGLE_FILE_INFO and self.Cat1FileState == 1: #包含文件名 文件大小 + print("BLE_START_SEND_SINGLE_FILE_INFO {} \r\n".format(BLE_START_SEND_SINGLE_FILE_INFO)) + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间60s + # {"Code":1,"fileName":"testpy.py","fileSize":1040} + # print("msg {}\r\n".format(msg)) + self.fileNameTmp = str(msg["fileName"]) + self.fileSize = msg["fileSize"] + self.fileNameList = msg["fileNameList"] + # self.fileSizeList.append({"fileName":self.fileNameTmp,"fileSize":int(self.fileSize)}) + path = "/usr/TmpPyFile/{}".format(self.fileNameTmp) + print("self.fileNameTmp {} self.fileSize:{} self.fileNameList:{} self.fileSizeList:{}\r\n".format(self.fileNameTmp,self.fileSize,self.fileNameList,self.fileSizeList)) + check_touch = ql_fs.path_exists("/usr/TmpPyFile/{}".format(self.fileNameTmp)) + if check_touch == True: + try: + uos.remove("/usr/TmpPyFile/{}".format(self.fileNameTmp)) + except Exception as e: + print("移除文件失败\r\n") + try: + with open(path,"w+") as fd: + fd.write("") + fd.close() #关闭文件流 + self.__Socket_UDP_file_noreply(CAT1_CREAT_FILE_SUCC,"1creat file or dir success!") + except Exception as e: + print("创建文件失败\r\n") + self.__Socket_UDP_file_noreply(CAT1_CREAT_FILE_ERROR,"1creat file or dir err!") + else: + try: + print("self.fileNameTmp 111111{}\r\n".format(self.fileNameTmp)) + with open(path,"w+") as fd: + fd.write("") + fd.close() #关闭文件流 + self.crc_err = 0 + print("self.fileNameTmp {}\r\n".format(self.fileNameTmp)) + self.__Socket_UDP_file_noreply(CAT1_CREAT_FILE_SUCC,"2creat file or dir success!") + except Exception as e: + self.__Socket_UDP_file_noreply(CAT1_CREAT_FILE_ERROR,"2creat file or dir err!") + print("创建文件失败\r\n") + + elif Code == BLE_START_SEND_FILE_DATA and self.Cat1FileState == 1: #文件数据 + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s + print("BLE_START_SEND_FILE_DATA {} self.fileNameTmp:{}\r\n".format(BLE_START_SEND_FILE_DATA,self.fileNameTmp)) + # {"Code":2,"data":"89ggjdggsjgdj"} + if len(self.fileNameTmp) == 0: #文件名不能为空 + return + data = msg["data"] + if len(data) == 0: + return + print(" (data):{}\r\n".format(len(data))) + tmpdata = str(data) + head = tmpdata[0:2] #FE + if head != "FE" and len(tmpdata) <= 8: #必须大于8 FE+012C+DATA+crc(一个字节89) + print("head {}\r\n".format(head)) + self.__Socket_UDP_file_noreply(CAT1_SEND_HEAD_ERR,"head error!") + return + datalen = str(tmpdata[2:6]) #012c + datalen = int("0x" + datalen, 16) #转换成十进制数 + data_buf = tmpdata[6:] # 数据 + data_buf = data_buf[:-2] #最后两个往前的数据 + crc = tmpdata[-2:] # 最后两个字符是 crc 一个字节 + print("crc ===!111111:{} {} len:{} {}\r\n".format(crc,type(crc),datalen,len(str(data_buf)))) + if len(str(data_buf)) == 0 or len(str(data_buf)) != datalen: #数据为空 + self.__Socket_UDP_file_noreply(CAT1_WRITE_FILE_ERROR,"crc error or data null!") + return + crclist=self.crc_cal(data_buf) + newcrc = crclist[1] + news = crclist[0] + if len(str(crc)) == 0: + self.__Socket_UDP_file_noreply(CAT1_CRC_ERROR,"crc error!") + return + decnumCrcCal = int("0x" + str(newcrc), 16) #转换成十进制数 + decnumCrc = int("0x" + str(crc), 16) #转换成十进制数 + print("crc:{} newcrc:{}\r\n".format(crc,newcrc,decnumCrc,decnumCrcCal)) + if decnumCrcCal != decnumCrc and news == 0: + print("newcrc is not === crc crc校验出错不一致\r\n") + self.__Socket_UDP_file_noreply(CAT1_CRC_ERROR,"crc error!") + return + data = str(data_buf) + path = "/usr/TmpPyFile/{}".format(str(self.fileNameTmp)) + print("py path:{} self.fileNameTmp:{}\r\n".format(path,self.fileNameTmp)) + try: + with open(path,"a") as fd: + fd.write(data) + fd.close() #关闭文件流 + self.__Socket_UDP_file_noreply(CAT1_WRITE_FILE_SUCC,"write file success!") + print("写文件成功!!!!!\r\n") + except Exception as e: + self.__Socket_UDP_file_noreply(CAT1_WRITE_FILE_ERROR,"write file error!") + print("写文件失败没有内存!!!!!\r\n") + elif Code == BLE_START_OTA_FAILE and self.Cat1FileState == 1: #取消文件传输 OTA失败 移除目录文件 + print("BLE_START_OTA_FAILE {} \r\n".format(BLE_START_OTA_FAILE)) + self.allPyRecvFlag = 0 + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"OTA FAILE") + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.deleteTmpFile() + self.deleteUsrTmpFile() + pass + elif Code == BLE_START_SEND_ALLFILE_FINESH and self.Cat1FileState == 1: #全部文件传输完成 + + tmp_dir = ql_fs.path_exists("/usr/TmpPyFile") + if tmp_dir == True: + filenamesList = uos.listdir("/usr/TmpPyFile") + list1 = sorted(filenamesList) + list2 = sorted(self.fileNameList) + print("filenamesList:{} self.fileNameList:{} {}{}\r\n".format(filenamesList,self.fileNameList,type(filenamesList),type(self.fileNameList))) + if list1 != list2: #传输的文件列表和BLE不一致说明有文件没有传输完成不再重启CAT1 + self.deleteTmpFile() + self.Cat1FileState = 0 + print("self.Cat1PyFile444!!!:{}\r\n".format(self.Cat1FileState)) + self.Cat1FileTransTimer.stop() + self.deleteUsrTmpFile() + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") + return + + try: + copy_state = 1 + compare_flag = 1 + copy_flag = 0 + filenamesList = uos.listdir("/usr/TmpPyFile") + for tmp in filenamesList: #将传输的文件 copy到usr目录下 + print("filenamesList for :{}\r\n".format(filenamesList)) + dst_path = "/usr/{}".format(tmp) #目标目录文件 + if ql_fs.path_exists(dst_path) == True: + try: + copy_flag = 1 + uos.remove(dst_path) + except Exception as e: + print("移除文件失败!!!!!\r\n") + try: + copy_flag = 1 + ql_fs.touch(dst_path,"") + except Exception as e: + print("创建文件失败!!!!!\r\n") + + if copy_flag == 0: + print("创建文件失败!!!!!copy_flag\r\n") + copy_state = 0 + break + src_path = "/usr/TmpPyFile/{}".format(tmp) #源目录文件 + ret = False + file_size = 0 + + try: + ret = ql_fs.file_copy(dst_path,src_path) + print("copy ret!!!!!:{}\r\n".format(ret)) + if ret == True: + dstfile_size = ql_fs.path_getsize(dst_path) + srcfile_size = ql_fs.path_getsize(src_path) + + print("copy dstfile_size:{} srcfile_size:{}\r\n".format(dstfile_size,srcfile_size)) + if dstfile_size != srcfile_size: + compare_flag = 0 + break + else: #拷贝完之后比较大小一致移除文件 + try: + compare_flag = 1 + uos.remove(src_path) + filenamesList = uos.listdir("/usr/TmpPyFile") + print("remove filenamesList :{}\r\n".format(filenamesList)) + except Exception as e: + print("copy file \r\n") + else: + compare_flag = 0 + break + + except Exception as e: + print("copy file \r\n") + + + if copy_state == 0 or compare_flag == 0 : #比较失败 或者copy失败没有内存了 + self.deleteUsrTmpFile() + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") #传输文件完之后最后提示是否成功失败 + return + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + print("重启 auto:\r\n") + self.Cat1OtaTimeOut.stop() + self.Cat1TimeCount = 0 + self.ota_state = 1 + self.allPyRecvFlag = 1 #所有的py文件接收完成 + self.Cat1OtaTimeOut.start(5000,0,self.otaTimeOut) + except Exception as e: + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!33") #传输文件完之后最后提示是否成功失败 + self.deleteUsrTmpFile() + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + else: + if self.ota_state == 1: + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + pass + else: + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.deleteUsrTmpFile() + print("cat1 ota\r\n") + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") + + + elif Code == BLE_START_OTA_SUCC and self.Cat1FileState == 1: + if self.allPyRecvFlag == 0: #没有接收完成就发送OTA成功的标识 + self.deleteTmpFile() + self.deleteUsrTmpFile() + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") + return + tmp_dir = ql_fs.path_exists("/usr/TmpPyFile") + if tmp_dir == True: + filenamesList = uos.listdir("/usr/TmpPyFile") + list1 = sorted(filenamesList) + list2 = sorted(self.fileNameList) + print("filenamesList:{} self.fileNameList:{} {}{}\r\n".format(filenamesList,self.fileNameList,type(filenamesList),type(self.fileNameList))) + if list1 != list2: #传输的文件列表和BLE不一致说明有文件没有传输完成不再重启CAT1 + self.deleteTmpFile() + self.Cat1FileState = 0 + print("self.Cat1PyFile444!!!:{}\r\n".format(self.Cat1FileState)) + self.Cat1FileTransTimer.stop() + self.deleteUsrTmpFile() + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") + return + + try: + copy_state = 1 + compare_flag = 1 + copy_flag = 0 + filenamesList = uos.listdir("/usr/TmpPyFile") + for tmp in filenamesList: #将传输的文件 copy到usr目录下 + print("filenamesList for :{}\r\n".format(filenamesList)) + dst_path = "/usr/{}".format(tmp) #目标目录文件 + if ql_fs.path_exists(dst_path) == True: + try: + copy_flag = 1 + uos.remove(dst_path) + except Exception as e: + print("移除文件失败!!!!!\r\n") + try: + copy_flag = 1 + ql_fs.touch(dst_path,"") + except Exception as e: + print("创建文件失败!!!!!\r\n") + + if copy_flag == 0: + print("创建文件失败!!!!!copy_flag\r\n") + copy_state = 0 + break + src_path = "/usr/TmpPyFile/{}".format(tmp) #源目录文件 + ret = False + file_size = 0 + + try: + ret = ql_fs.file_copy(dst_path,src_path) + print("copy ret!!!!!:{}\r\n".format(ret)) + if ret == True: + dstfile_size = ql_fs.path_getsize(dst_path) + srcfile_size = ql_fs.path_getsize(src_path) + + print("copy dstfile_size:{} srcfile_size:{}\r\n".format(dstfile_size,srcfile_size)) + if dstfile_size != srcfile_size: + compare_flag = 0 + break + else: #拷贝完之后比较大小一致移除文件 + try: + compare_flag = 1 + uos.remove(src_path) + filenamesList = uos.listdir("/usr/TmpPyFile") + print("remove filenamesList :{}\r\n".format(filenamesList)) + except Exception as e: + print("copy file \r\n") + else: + compare_flag = 0 + break + + except Exception as e: + print("copy file \r\n") + + + if copy_state == 0 or compare_flag == 0 : #比较失败 或者copy失败没有内存了 + self.deleteUsrTmpFile() + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") #传输文件完之后最后提示是否成功失败 + return + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + print("重启 auto:\r\n") + self.Cat1OtaTimeOut.stop() + self.Cat1TimeCount = 0 + self.ota_bstate = 1 + self.Cat1OtaTimeOut.start(10000,0,self.otaTimeOut) + except Exception as e: + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!33") #传输文件完之后最后提示是否成功失败 + self.deleteUsrTmpFile() + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + else: + if self.ota_bstate == 1: + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + pass + else: + self.deleteTmpFile() + self.Cat1FileState = 0 + self.Cat1FileTransTimer.stop() + self.deleteUsrTmpFile() + print("cat1 ota\r\n") + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") + + elif Code == BLE_START_SEND_SINGLE_FINESH and self.Cat1FileState == 1: #单个文件传输完成 + print("BLE_START_SEND_SINGLE_FINESH {} self.fileNameTmp:{}\r\n".format(BLE_START_SEND_SINGLE_FINESH,self.fileNameTmp)) + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s + tmp_dir = ql_fs.path_exists("/usr/TmpPyFile") + if tmp_dir == True: + tmp_file = ql_fs.path_exists("/usr/TmpPyFile/{}".format(self.fileNameTmp)) + if tmp_file == True: #文件存在 + file_size = ql_fs.path_getsize("/usr/TmpPyFile/{}".format(self.fileNameTmp)) + print("file size :file_size:{} self.fileSize:{}\r\n".format(file_size,self.fileSize)) + if self.fileSize != file_size: #文件大小不一致 传输出错 + self.__Socket_UDP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file size err") #结束文件接收不完整的 + pass + else: + self.__Socket_UDP_file_noreply(CAT1_REPLAY_FILE_SIZE_OK,"file size ok") #结束文件接收完整的 + pass + else: + self.__Socket_UDP_file_noreply(CAT1_CREAT_FILE_ERROR,"creat file or dir err!") + pass + else: + self.__Socket_UDP_file_noreply(CAT1_CREAT_DIR_FAILE,"creat file or dir error!") + pass + + + else: + if self.Cat1FileState == 0: + if self.Cat1FileReplayBle == 1: + return + self.Cat1FileReplayBle = 1 + self.__Socket_UDP_file_noreply(CAT1_REPLAY_OTA_SUCC,"reset start!") #结束文件接收不完整的 + print("错误信息!!!!!\r\n") + self.Cat1FileState == 0 + self.Cat1FileTransTimer.stop() #//关闭定时器 + self.Cat1PyFileTimout = 0 + self.fileNameList=[] + self.deleteTmpFile() + self.deleteUsrTmpFile() + + + def otaTimeOut(self,*argc): + print("重启成功!!!!!!!!\r\n") + Power.powerRestart() + +TcpService = TcpServiceInit() + + -- 2.17.1