From 77fb6aa90fe90c623f696ef8501574b79f261ddd Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 26 Feb 2025 15:03:23 +0800 Subject: [PATCH] =?utf8?q?=E7=B2=BE=E7=AE=80CAT1=20TCP=E4=BC=A0=E8=BE=93?= =?utf8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BC=A0=E8=BE=93?= =?utf8?q?=E6=88=90=E5=8A=9F=E6=A6=82=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../fs/user/system/cat1otaudp/cat1Service.py | 542 +++--------------- .../user/system/cat1otaudp/is_need_updata.txt | 0 .../fd230/fs/user/system/cat1otaudp/main.py | 2 +- .../{tcpService.py => tcpserver.py} | 447 ++++----------- .../slip/cat1Service/cat1_tcpServer.cpp | 25 +- 5 files changed, 198 insertions(+), 818 deletions(-) delete mode 100644 code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/is_need_updata.txt rename code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/{tcpService.py => tcpserver.py} (56%) diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/cat1Service.py b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/cat1Service.py index e0827c9c4..f0d46dc3b 100644 --- a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/cat1Service.py +++ b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/cat1Service.py @@ -1,29 +1,3 @@ -# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - - -# net.getNetMode() -# (0, '460', '11', 7) - -# net.getSignal(1) -# ([99, 99, 255, 255], [-84, -117, -15, 255, -3]) - -# net.nitzTime() -# ('24/02/26 11:17:42 8 0', 1708946262, 0) - - import usocket import log import utime @@ -37,63 +11,30 @@ 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 from usr.EventMesh import eventMesh -# from usr.telecom_dmp import telecomDmpCb -# from usr.china_mobile_dmp import chinamobileCb - -# 设置日志输出级别 log.basicConfig(level=log.INFO) clog = log.getLogger("cat1") -def msg_cb(args): - index = args[1] - storage = args[2] - sms_data = sms.getSaveLoc() - if sms_data == -1: - return - sms_max = sms_data[0][2] - if index != -1: - eventMesh.publish("send_singal_data_toBle",index) - - if index >= sms_max-1:#删除短信 - eventMesh.publish("delete_sms_event")#删除短信 - -sms.setCallback(msg_cb)#sms注册回调 - -CAT1_SERVICE_HEAD = 'FE' #固定head - +CAT1_SERVICE_HEAD = 'FE' PROJECT_NAME = "Cat1SlipUDPService" PROJECT_VERSION = "PY_SRV_V17" CONFIG_JSON="/usr/system_config.json" CURRENT_APP_TYPE="pysrv" - - - - - -#设置通话音量 voiceCall.setVolume(10) -clog.info("voice call volume {}".format(voiceCall.getVolume())) lpm_fd = pm.create_wakelock("system_lock", len("system_lock")) -# pm.autosleep(1) pm.wakelock_lock(lpm_fd) -clog.info("create_wakelock {}".format(pm.get_wakelock_num())) telecomTimerCount = 0 def get_versionkeyname_by_py(app_type): return str("{}version".format(app_type)) @@ -105,8 +46,7 @@ def get_default_versionvalue_by_py(app_type): return "PY_OTA_V14" elif (app_type == "pysrv"): return "PY_SRV_V16" - -#如果没有configfile则创建它 + if not ql_fs.path_exists(CONFIG_JSON): data = {str(get_versionkeyname_by_py(CURRENT_APP_TYPE)):get_default_versionvalue_by_py(CURRENT_APP_TYPE)} ql_fs.touch(CONFIG_JSON,data) @@ -116,135 +56,90 @@ def set_version_to_json_config(app_type,keyvalue): config_data = ql_fs.read_json(CONFIG_JSON) config_data.update( {str(get_versionkeyname_by_py(app_type)):keyvalue}) ql_fs.touch(CONFIG_JSON, config_data) - clog.info("{}={}".format(get_versionkeyname_by_py(app_type),keyvalue)) - clog.info("{}".format(config_data)) except Exception as e: clog.error("set_version_to_json_config") def get_version_from_json_config(app_type): config_data = ql_fs.read_json(CONFIG_JSON) keyvalue = config_data.get( get_versionkeyname_by_py(app_type),get_default_versionvalue_by_py(app_type)) - clog.info("{}={}".format(get_versionkeyname_by_py(app_type),keyvalue)) return keyvalue set_version_to_json_config(CURRENT_APP_TYPE,PROJECT_VERSION) audio.set_qdai_cfg(1,0,0,1,0,0,1,1) - -# GPIO21 - 引脚 86 KP_MKOUT1 唤醒主控 -# GPIO22 - 引脚 87 KP_MKIN 被主控唤醒 - -# GPIOn - GPIO号,int类型,点此查看GPIO引脚编号与物理引脚的映射关系。 - -# direction - 输入输出模式,int类型,IN - 输入模式,OUT - 输出模式。 - -# pullMode - 上下拉模式,int类型,说明如下: -# PULL_DISABLE - 浮空模式 -# PULL_PU - 上拉模式 -# PULL_PD - 下拉模式 - -# level - 引脚电平,int类型,0 - 设置引脚为低电平, 1- 设置引脚为高电平。 -# recvDataPin = Pin(Pin.GPIO22, Pin.IN, Pin.PULL_PU, 0) def ExtIntfun(args): - # clog.info('### interrupt {} ###'.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿 if args[1] == 0: - clog.info("disable autosleep") - # pm.autosleep(0) pm.wakelock_lock(lpm_fd) elif args[1] == 1: - clog.info("enable autosleep") pm.wakelock_unlock(lpm_fd) - # pm.autosleep(1) - # clog.info("recvDataPin={}".format(recvDataPin.read())) extint = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, ExtIntfun) extint.enable() - -# 创建gpio对象 gpioWakeBT = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 1) -# 设置输入输出模式 gpioWakeBT.set_dir(Pin.OUT) - -# 设置引脚电平 gpioWakeBT.write(0) -UDP_CMD_GET_CAT1VER = '0' #获取 Cat1 版本号 -UDP_CMD_DIAL_NUMB = '1' #拨打电话 -UDP_CMD_HUNGUP = '2' #挂断电话 -UDP_CMD_ANSWER = '3' #接听电话 -UDP_CMD_CAT1_OTA_UPDATE = '4' #触发Cat1 OTA升级,mcu提供url -UDP_CMD_SEND_SMS = '5' #发送SMS短信,mcu提供电话号及短信内容 -UDP_CMD_GET_TIME = '6' #获取Cat1 时间 ,YYYYMMDD HHmmss zone -UDP_CMD_GET_RECV_NETWORKSTAT = '7' #获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态 // 内容同UDP_CMD_GET_NETWORKSTAT,CAT主动发给MCU -UDP_MSG_SMS = '8' # CAT1接收到的SMS信息给MCU,包含电话号及短信内容 -UDP_CMD_ATCMD = '9' # 执行AT指令 -UDP_MSG_CALL_CONNECTED = 'A' # CAT1 电话接听消息 -UDP_MSG_CALL_DISCONNECTED = 'B' # CAT1 电话挂断消息 -UDP_MSG_COMMING_CALL = 'C' # CAT1 来电消息,包含电话号 -UDP_MSG_REPLY = 'F' # 返回值 - +UDP_CMD_GET_CAT1VER = '0' +UDP_CMD_DIAL_NUMB = '1' +UDP_CMD_HUNGUP = '2' +UDP_CMD_ANSWER = '3' +UDP_CMD_CAT1_OTA_UPDATE = '4' +UDP_CMD_SEND_SMS = '5' +UDP_CMD_GET_TIME = '6' +UDP_CMD_GET_RECV_NETWORKSTAT = '7' +UDP_MSG_SMS = '8' +UDP_CMD_ATCMD = '9' +UDP_MSG_CALL_CONNECTED = 'A' +UDP_MSG_CALL_DISCONNECTED = 'B' +UDP_MSG_COMMING_CALL = 'C' +UDP_MSG_REPLY = 'F' class Cat1Service: - AP = 0 # SLIP_INNER - STA = 1 # SLIP_OUTER - + AP = 0 + STA = 1 def __init__(self, uart=UART.UART4, mode=AP): - self.__uart = uart self.__mode = mode self.__message = '' self.__err = 0 self.__net_connected = 0 - # self.__value = None self.__wait_resp = 0 self.__waiting_netstat = 0 slip.destroy() - clog.info('slip uart={0}'.format (self.__uart)) - ret = slip.construct(self.__uart, self.__mode, 0) if ret != 0: - clog.error('slip netif construct fail') return None - clog.info('slip network card create success') - # self.__queue = Queue(1) self.__sock = self.__socket_init() self.__threadid = _thread.start_new_thread(self.__Socket_Thread, ()) self.telecom_init_flag = 0 self.telecomTimer = osTimer() eventMesh.subscribe("cat1_reply_iccid_to_ble",self.cat1_reply_iccid_to_ble) eventMesh.subscribe("cat1_reply_timesec_to_ble",self.cat1_reply_timesec_to_ble) - self.iccid_data = "" self.software_version = "" self.deletSmsTimer = osTimer() - - self.volte_switch = 1 #默认是开启VOLTE通话功能 + self.volte_switch = 1 eventMesh.subscribe("set_dmp_change_mode",self.set_dmp_change_mode) eventMesh.subscribe("get_dmp_change_mode",self.get_dmp_change_mode) eventMesh.subscribe("delete_sms_event",self.delete_sms_event) - eventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)# + eventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb) eventMesh.subscribe("send_sms_max_to_Ble",self.send_sms_max_to_Ble) - eventMesh.subscribe("get_all_sms_data",self.get_all_sms_data) #获取所有的短信内容 + eventMesh.subscribe("get_all_sms_data",self.get_all_sms_data) eventMesh.subscribe("send_singal_data_toBle",self.send_singal_data_toBle) eventMesh.subscribe("delete_sms_single_data",self.delete_sms_single_data) - eventMesh.subscribe("get_factory_status",self.get_factory_status) eventMesh.subscribe("set_factory_status",self.set_factory_status) eventMesh.subscribe("send_dmp_cm_address_toBLE",self.send_dmp_cm_address_toBLE) eventMesh.subscribe("set_volte_switch",self.set_volte_switch) eventMesh.subscribe("get_volte_switch",self.get_volte_switch) eventMesh.publish("delete_sms_event") - - self.telecom_dmp_switch = 0 - self.send_data = [] self.code_old = 0 self.code_old_num = 1 self.tmp_data = [] self.total_num = 0 - # self.msg_nums = 0 self.msg_nums_old = 0 self.china_mobile_init = 0 @@ -252,14 +147,11 @@ class Cat1Service: self.send_data_q = Queue(100) self.ack_sem=0 _thread.start_new_thread(self.Socket_SEND_Thread,()) - # 发数据线程 return None def __socket_init(self): - # 创建一个socket实例 sock = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM, usocket.TCP_CUSTOMIZE_PORT) sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) - # 绑定IP bind_addr = ('172.16.1.2', 5000) sock.bind(bind_addr) sock.settimeout(None) @@ -274,26 +166,12 @@ class Cat1Service: self.reply_cmd('0F',"VOLUME:{}".format(voiceCall.getVolume())) def btmcu_cmd_handler(self,cmd,parm): - - # cmd = "" - # cmd_tmp= int(cmd_data)#将十进制数转换成int 再转换成十六进制 - # cell_data = hex(cmd_tmp) - # decimal_number = int(cell_data, 16) - # cmd = "%02x"%(decimal_number) # 使用两位表示,不足前面补0 - clog.info(cmd) # 输出: 07 - clog.info("btmcu_cmd_handler cmd {0} , args {1}".format(cmd,parm)) if cmd == "00": - clog.info(cmd) - # UDP_CMD_GET_CAT1VER modem_ver = modem.getDevFwVersion() self.reply_cmd('00',"pyVer:{}@modemVer:{}".format(PROJECT_VERSION,modem_ver)) elif cmd == "01": - # UDP_CMD_DIAL_NUMB - if eventMesh.publish("get_volte_switch") == 1: #只有BLE开了VOLTE才允许打电话 + if eventMesh.publish("get_volte_switch") == 1: ret = voiceCall.callStart(str(parm)) - # if ret != 0: - # ret = voiceCall.callStart(str(parm)) - clog.info("ret={} {} {}".format(ret,cmd,parm)) if ret != 0: self.reply_cmd('0F',"callcmd_fail") else: @@ -301,8 +179,6 @@ class Cat1Service: else: self.reply_cmd('0F',"callcmd_fail") elif cmd == "02": - clog.info(cmd) - # UDP_CMD_HUNGUP ret = voiceCall.callEnd() if ret != 0: ret = voiceCall.callEnd() @@ -311,8 +187,6 @@ class Cat1Service: else: self.reply_cmd('0F',"callend_success") elif cmd == "03": - clog.info(cmd) - # UDP_CMD_ANSWER ret = voiceCall.callAnswer() if ret != 0: ret = voiceCall.callAnswer() @@ -320,57 +194,36 @@ class Cat1Service: self.reply_cmd('0F',"callanswer_fail") else: self.reply_cmd('0F',"callanswer_success") - elif cmd == "04": - clog.info(cmd) - elif cmd == "05": - clog.info(cmd) - # UDP_CMD_SEND_SMS elif cmd == "06": - clog.info(cmd) - # UDP_CMD_GET_TIME time=utime.localtime() zone=utime.getTimeZone() - #(2024, 3, 2, 18, 31, 32, 5, 62),8 - # 返回当前时间戳,参数为元组 - # timestamp = utime.mktime(time) - # clog.info(timestamp) self.reply_cmd('06',"{0}@{1}".format(time,zone)) elif cmd == "07": - clog.info("cmd ==== 07!") - # UDP_CMD_GET_RECV_NETWORKSTAT simstat = sim.getStatus() imei = modem.getDevImei() netstat = "0,10,0,10" netstat_ = net.getState() if netstat_ != -1 : netstat = "{},{},{},{}".format(netstat_[0][0],netstat_[0][3],netstat_[1][0],netstat_[1][3]) - # ([voice_state, voice_lac, voice_cid, voice_rat, voice_reject_cause, voice_psc], [data_state, data_lac, data_cid, data_rat, data_reject_cause, data_psc]) operator = net.operatorName() signal = net.csqQueryPoll() - clog.info("imei:{0},sim:{1},oper:{2},signal:{3},net:{4}".format(imei,simstat,operator,signal,netstat)) self.reply_cmd('07',"imei:{0}@sim:{1}@oper:{2}@signal:{3}@net:{4}".format(imei,simstat,operator,signal,netstat)) elif cmd == "09": - clog.info("{},{}".format(cmd,parm)) - # UDP_CMD_ATCMD - # net.setModemFun(0) - # net.setModemFun(1) resp=bytearray(50) ret=atcmd.sendSync("{}\r\n".format(parm),resp,'',10) if ret == 0: - clog.info("reply:{},ret:{}".format(resp.decode(),ret)) self.reply_cmd('09',"{}".format(resp.decode())) else: - clog.info("cmd error ret:{}".format(ret)) self.reply_cmd('09',"{}".format("at error")) - elif cmd == "10" or cmd == "12" or cmd == "14": #获取固件版本号或者获取BT保存的SIM卡的ICCID BLE那边是否开启电信入库功能 - if 1: #CHINA_TELECOM_DM_FUN_ENABLE == 1 : + elif cmd == "10" or cmd == "12" or cmd == "14": + if 1: if eventMesh.publish("get_dmp_change_mode") == 1: self.telecom_recv_cmd(cmd,parm) else: pass - if 1:#CHINA_MOBILE_DM_FUN_ENABLE == 1: + if 1: if eventMesh.publish("get_dmp_change_mode") > 1: self.china_mobile_recv_cmd(cmd,parm) else: @@ -378,24 +231,22 @@ class Cat1Service: pass elif cmd == "13": on = int(parm) - clog.info("set_dmp_change_mode on:{}".format(on)) eventMesh.publish("set_dmp_change_mode",on) - elif cmd == "16": - if 1: #CHINA_MOBILE_DM_FUN_ENABLE == 1: + if 1: if eventMesh.publish("get_dmp_change_mode") > 1: self.china_mobile_recv_cmd(cmd,parm) else: pass - elif cmd == "17": #用于CAT1恢复出厂需要清空数据的标识通用 + elif cmd == "17": eventMesh.publish("set_factory_status",int(parm)) elif cmd == "18": eventMesh.publish("set_dmp_cm_address",str(parm)) - elif cmd == "19": #DTMF功能 - voiceCall.startDtmf(str(parm),100) #100ms 持续时间 100-1000 + elif cmd == "19": + voiceCall.startDtmf(str(parm),100) elif cmd == "1A": eventMesh.publish("set_volte_switch",int(parm)) - elif cmd == "AC":# + elif cmd == "AC": if self.ack_sem==1: self.ack_sem=0 @@ -403,33 +254,24 @@ class Cat1Service: if cmd == "10": self.software_version = str(parm) eventMesh.publish("set_dev_version",self.software_version) - clog.info("software_version:{},{}".format(self.software_version,parm)) elif cmd == "12": pass elif cmd == "14":# - pass - - + pass pass - def set_volte_switch(self,event,msg): #设置VOLTE开关 + def set_volte_switch(self,event,msg): self.volte_switch = int(msg) - - def get_volte_switch(self,event,msg): #获取VOLTE开关 - + def get_volte_switch(self,event,msg): return self.volte_switch - - def china_mobile_recv_cmd(self,cmd,parm): #移动入库相关指令 + def china_mobile_recv_cmd(self,cmd,parm): if cmd == "10": self.software_version = str(parm) eventMesh.publish("set_dev_version",self.software_version) - clog.info("software_version:{},{}".format(self.software_version,parm)) - elif cmd == "16": #获取BLE mac地址 - eventMesh.publish("set_dev_mac",str(parm)) - clog.info("parm:{}\r\n".format(parm)) - + elif cmd == "16": + eventMesh.publish("set_dev_mac",str(parm)) pass def get_factory_status(self,event,msg): return self.factory_status @@ -454,43 +296,34 @@ class Cat1Service: def delete_sms_cb(self,*argc): eventMesh.publish_async("remove_all_sms_cb","",1*1024) def remove_all_sms_cb(self, event, msg): - clog.info("remove_all_sms_cb\r\n") - msg_nums = sms.getMsgNums() #短信数量 + msg_nums = sms.getMsgNums() if msg_nums == -1: msg_nums = 0 sms_data = sms.getSaveLoc() - clog.info("{}\r\n".format(sms_data)) if sms_data == -1: return - sms_max = sms_data[0][2] #最大存储短信数量 + sms_max = sms_data[0][2] if sms_max >= msg_nums and sms_max > 0: - sms.deleteMsg(1,4) #删除所有的sms信息 + sms.deleteMsg(1,4) def send_singal_data_toBle(self,event,msg): - msg_nums = sms.getMsgNums() #短信数量 + msg_nums = sms.getMsgNums() if msg_nums == -1: msg_nums = 0 sms_data = sms.getSaveLoc() if sms_data == -1: return - sms_max = sms_data[0][2] #最大存储短信数量 - clog.info("recv:{}".format(int(msg))) + sms_max = sms_data[0][2] message=self.sms_get_message_info(int(msg)) - if message == -1: #说明没有这条短信 + if message == -1: return message_pdu = sms.decodePdu(message[5],20) - - if message_pdu != -1: #解码出来的内容 - - message_ref = message[0] #编码 - message_total_num = message[1] #总共条数 - message_seq = message[2] #当前第几条 - data = message[5] #内容 - data_len = len(data) #内容长度 - # ref :短信参考标识,同一个标识表明为同一条短信 - # total_num :此条长短信总条数 大于1属于长短信 - # seq :此条短信在长短信中的序号 - # print("message:{} {}\r\n".format(message,message_pdu)) + if message_pdu != -1: + message_ref = message[0] + message_total_num = message[1] + message_seq = message[2] + data = message[5] + data_len = len(data) msg_total = "ref:"+str(message_ref)+"@total_num:"+str(message_total_num)+"@seq:"+str(message_seq)+"@data:"+str(message[5]) self.reply_cmd('15',msg_total) @@ -511,25 +344,7 @@ class Cat1Service: data_str3=data_str3+data_str1[i] return data_str3 def sms_get_message_info(self,index): - """ - :param index :短信索引值 - :tyoe index :整形 - - :return :元组类型 - 元组内容: - (message_ref,message_total_num,message_seq,sub_message_data,pdu_tye,sub_message_len) - - :message_ref :短信参考标识,同一个标识表明为同一条短信 - :message_total_num :此条长短信总条数 - :message_seq :此条短信在长短信中的序号 - :sub_message_data :词条短信的内容 - :pdu_tye :PDU类型,bit 6标记是否包含用户报文头,长短信需要 - :sub_message_len :此条短信内容长度 - - """ - message0=sms.searchPduMsg(index) - #print("sms_get_message_info:message0:{}".format(message0)) if message0 == -1: return -1 @@ -539,14 +354,7 @@ class Cat1Service: data_len = data_len+1*2 sca = message0[data_len:data_len+sca_num*2] - # 电话号码高低位需要转换 sca = self.sms_deal_phone_number(sca) - - # if sca_num % 2 == 1: - # print("Get SCA phone {}".format(sca[:-1])) - # else: - # print("Get SCA phone {}".format(sca)) - data_len = data_len+sca_num*2 pdu_tye = int(message0[data_len:data_len+1*2],16) @@ -563,14 +371,7 @@ class Cat1Service: oa_num_t = int((oa_num )/2) oa = message0[data_len:data_len+oa_num_t*2] - # 电话号码高低位需要转换 oa = self.sms_deal_phone_number(oa) - - # if oa_num % 2 == 1: - # print("Get OA phone {}".format(oa[:-1])) - # else: - # print("get OA phone {}".format(oa)) - data_len = data_len+oa_num_t*2 pid = message0[data_len:data_len+1*2] @@ -583,30 +384,25 @@ class Cat1Service: data_len = data_len+1*2 sub_message_head = message0[data_len:data_len+6*2] data_len = data_len+6*2 - - # 或短信用户数据 sub_message_data = message0[data_len:data_len+sub_message_len*2] - #长短信 if ((pdu_tye & 0x40 ) >> 6) == 1: - #长短信,处理长短信用户报文头 message_ref = int(sub_message_head[6:8],16) message_total_num = int(sub_message_head[8:10],16) message_seq = int(sub_message_head[10:12],16) return [message_ref,message_total_num,message_seq,pdu_tye,sub_message_len,message0] else: - # 短短信 return [0,1,1,pdu_tye,sub_message_len,message0] def send_sms_max_to_Ble(self,event,msg): - msg_nums = sms.getMsgNums()#短信数量 + msg_nums = sms.getMsgNums() if msg_nums == -1: msg_nums = 0 sms_data = sms.getSaveLoc() if sms_data != -1: - sms_max = sms_data[0][2]#最大存储短信数量 + sms_max = sms_data[0][2] self.reply_cmd('15',"@sms_max:"+str(sms_max)+"@current_num:"+str(msg_nums)) pass @@ -615,11 +411,9 @@ class Cat1Service: SMS_lis={} SMS_lis_count = 0 sms_data = sms.getSaveLoc() - clog.info(sms_data) if sms_data == -1: return - sms_max = sms_data[0][2]#最大存储短信数量 - clog.info(sms_max) + sms_max = sms_data[0][2] self.msg_nums = sms.getMsgNums() if self.msg_nums_old != self.msg_nums: self.send_data = [] @@ -635,11 +429,11 @@ class Cat1Service: break data = message[5] sms_data = [] - code = message[0]#编码 - num = message[1]#总共条数 - curren_num = message[2]#当前第几条 + code = message[0] + num = message[1] + curren_num = message[2] data_len = message[4] - sms_data.append(code)#编码 编码相同是同一条短信的内容 + sms_data.append(code) sms_data.append(num) sms_data.append(curren_num) sms_data.append(data) @@ -648,39 +442,28 @@ class Cat1Service: count = len(self.send_data) for i in range(count): text = self.send_data[i] - clog.info("text:{} {} {}\r\n".format(text[0],text[1],text[2])) - msg_total = "@code:"+str(text[0])+"@totalcodenum:"+str(text[1])+"@currcodeid:"+str(text[2])+"@data:"+str(text[3]) self.reply_cmd('17',msg_total) - # 来电提醒 def notifyIncomingcall(self, incomming_numb): self.clear_remain() __head = '0C' __message = str(incomming_numb) self.__Socket_UDP(__head, __message) - # if self.__err == 1 or self.__value[2] != 'OK': - # return -1 return 0 - # 电话接听消息 def notifyConnecteCall(self, phone_numb): self.clear_remain() __head = '0A' __message = str(phone_numb) self.__Socket_UDP(__head, __message) - # if self.__err == 1 or self.__value[2] != 'OK': - # return -1 return 0 - # 电话拒接消息 def notifyDisconnectCall(self, phone_numb): self.clear_remain() __head = '0B' __message = str(phone_numb) self.__Socket_UDP(__head, __message) - # if self.__err == 1 or self.__value[2] != 'OK': - # return -1 return 0 def wait_network_ready(self): @@ -690,22 +473,18 @@ class Cat1Service: stage, state = checkNet.waitNetworkReady(30) pm.wakelock_unlock(lpm_fd) if stage == 3 and state == 1: - clog.info('Network connection successful.') self.set_network_config() self.__net_connected = 1 eventMesh.publish("set_network_state",self.__net_connected) self.__waiting_netstat = 0 return 0 else: - clog.info('Network connection failed, stage={}, state={}'.format(stage, state)) self.reset_network_config() self.__net_connected = 0 eventMesh.publish("set_network_state",self.__net_connected) - self.__waiting_netstat = 0 return -1 - # 查询网卡状态 def timesync(self,_timesync): self.clear_remain() message = str(_timesync) @@ -720,100 +499,72 @@ class Cat1Service: def reply_cmd(self,cmd,_timesync): try : - clog.info('reply_cmd 1') self.clear_remain() message = str(_timesync) - clog.info('reply_cmd 2') self.__Socket_UDP_noreply(cmd, message) except: clog.info('reply_cmd') return 0 def clear_remain(self): - # if self.__queue.empty() == False: - # self.__queue.get() self.__err = 0 - # self.__value = None - #添加路由信息 def router_add(self, ip='192.168.4.1', mask='255.255.255.0'): self.ip = ip self.mask = mask - return slip.router_add(self.ip, self.mask) - - # 获取slip的网络配置 + def ipconfig(self): return slip.ipconfig() - # 设置dns服务器 def set_dns(self, pri_dns='8.8.8.8', sec_dns='114.114.114.114'): self.pri_dns = pri_dns self.sec_dns = sec_dns return slip.set_dns(self.pri_dns,self.sec_dns) - # 设置默认网卡 def set_default_NIC(self, ip_str): self.ip_str = ip_str return slip.set_default_netif(self.ip_str) def reset_network_config(self): if (self.__net_connected == 0): - clog.info("skip reset_network_config") return 0 Info = dataCall.getInfo(1,0) - clog.info("Info{}".format(Info)) - default_NIC_ip = Info[2][2] # 假设默认网卡ip地址为10.10.1.1,请根据实际情况更改 - segment_ip = '172.16.4.0' # 假设ap模式网段范围是[192.168.4.0 ~ 192.168.4.255],请根据实际情况更改 - mask = '255.255.255.0' # 假设子网掩码为255.255.255.0,请根据实际情况更改 - # 配置默认网卡,通过默认网卡进行网络转发 + default_NIC_ip = Info[2][2] + segment_ip = '172.16.4.0' + mask = '255.255.255.0' cat1service.set_default_NIC(default_NIC_ip) - clog.info("default_NIC_ip {0} segment_ip {1}".format(default_NIC_ip,segment_ip)) - #添加路由规则,只有该网段IP才进行转发 cat1service.router_add(segment_ip, mask) - pri_dns = '8.8.8.8' # 假设DNS首选地址为8.8.8.8,请根据实际情况更改 - sec_dns = '114.114.114.114' # 假设DNS备选地址为114.114.114.114,请根据实际情况更改 - # 配置网卡DNS服务器 + pri_dns = '8.8.8.8' + sec_dns = '114.114.114.114' cat1service.set_dns(pri_dns, sec_dns) - # 网卡IP信息查询 cat1service.ipconfig() def set_network_config(self): - - if (self.__net_connected == 1) : - clog.info("skip set_network_config") return 0 Info = dataCall.getInfo(1,0) - clog.info("Info{}".format(Info)) - default_NIC_ip = Info[2][2] # 假设默认网卡ip地址为10.10.1.1,请根据实际情况更改 - segment_ip = '172.16.1.0' # 假设ap模式网段范围是[192.168.4.0 ~ 192.168.4.255],请根据实际情况更改 - mask = '255.255.255.0' # 假设子网掩码为255.255.255.0,请根据实际情况更改 - # 配置默认网卡,通过默认网卡进行网络转发 + default_NIC_ip = Info[2][2] + segment_ip = '172.16.1.0' + mask = '255.255.255.0' cat1service.set_default_NIC(default_NIC_ip) - clog.info("default_NIC_ip {0} segment_ip {1}".format(default_NIC_ip,segment_ip)) - #添加路由规则,只有该网段IP才进行转发 cat1service.router_add(segment_ip, mask) - pri_dns = '8.8.8.8' # 假设DNS首选地址为8.8.8.8,请根据实际情况更改 - sec_dns = '114.114.114.114' # 假设DNS备选地址为114.114.114.114,请根据实际情况更改 - # 配置网卡DNS服务器 + pri_dns = '8.8.8.8' + sec_dns = '114.114.114.114' cat1service.set_dns(pri_dns, sec_dns) - # 网卡IP信息查询 cat1service.ipconfig() - if eventMesh.publish("get_dmp_change_mode") == 0:#入库功能关闭 + if eventMesh.publish("get_dmp_change_mode") == 0: return - if 1: #CHINA_TELECOM_DM_FUN_ENABLE == 1:#电信入库功能 不使用设置 0 防止两边不同步修改 + if 1: if eventMesh.publish("get_dmp_change_mode") == 1: eventMesh.publish("set_network_state",1) - # telecomDmpCb.telecom_dmp_power_on_init() - if 1: #CHINA_MOBILE_DM_FUN_ENABLE == 1: + if 1: if eventMesh.publish("get_dmp_change_mode") > 1: eventMesh.publish("set_network_state",1) if self.china_mobile_init == 1: return self.china_mobile_init = 1 - # chinamobileCb.china_mobile_init() def cat1_reply_iccid_to_ble(self,event,msg): ICCID_DATA = str("ICCID:")+str(msg) @@ -823,256 +574,109 @@ class Cat1Service: self.reply_cmd('14',"REGIST_TIME:{}".format(msg)) pass - # 释放slip网卡 + def stop(self): slip.destroy() return 0 - - # 封装tlv数据包 def __pack_tlv_format(self, head, content): - # self.head = head - # self.content = content if len(content) == 0 or len(content) > 9999 or len(head) != 2: - clog.error('illegal pack tlv content') return -1 len_str ='%04d' % len(content) tlv_pack = CAT1_SERVICE_HEAD+head+len_str+content return tlv_pack - # 解码tlv数据包 + def __unpack_tlv_format(self, msg): - clog.info('__unpack_tlv_format {}\r\n'.format(msg)) - self.msg = str(msg)[2:]#这是去除head FE + self.msg = str(msg)[2:] tag = self.msg[0:2] length = self.msg[2:6] value = self.msg[6:] len_str ='%04d' % len(value) if len(value) == 0 or len(value) > 9999 or len(tag) != 2 or len_str != self.msg[2:6]: - clog.error('__unpack_tlv_format err') return -1 - clog.info('__unpack_tlv_format: {} {} {}\r\n'.format(tag,length,value)) unpack = (tag,length,value) return unpack - # socket通信(UDP)模块 def __Socket_UDP(self, head, content): - # 0 则 __Socket_UDP_write self.send_data_q.put([head,content]) def Socket_SEND_Thread(self): while True: try: - clog.info("send====") data=self.send_data_q.get() self.ack_sem=1 - # # if data[2]: - # self.__Socket_UDP_noreply_write( data[0], data[1]) - # else : self.__Socket_UDP_write( data[0], data[1]) - - - clog.info("Socket_SEND_Thread data:{} {}".format(data[0],data[1])) count=20 while count & self.ack_sem : utime.sleep_ms(1) count=count-1 - # if data[2]: - # self.__Socket_UDP_noreply_write( data[0], data[1]) - # else : self.__Socket_UDP_write( data[0], data[1]) - - clog.info("Socket_SEND_Thread while data:{} {}".format(data[0],data[1])) - - if data: - clog.info("data ok!!") - else: - clog.error("data error!!") except Exception : clog.error("sned Socket >>>") def __Socket_UDP_write(self, head, content): try: - ##self.head = head - # self.content = content gpioWakeBT.write(1) utime.sleep_ms(2) gpioWakeBT.write(0) utime.sleep_ms(20) - # 消息处理 msg = self.__pack_tlv_format(head, content) - - # 向服务端发送消息 server_addr = ('172.16.1.5',1000) - clog.info("__Socket_UDP send msg {}".format(msg)) self.__err = 0 self.__sock.sendto(msg,server_addr) - clog.info("__Socket_UDP send 2") self.__wait_resp = 1 - # data = self.__queue.get() self.__wait_resp = 0 - # return data return 1 except Exception as error: clog.error(error) return 0 def __Socket_UDP_noreply(self, head, content): - # 1 则 __Socket_UDP_noreply_write self.send_data_q.put([head,content]) - - def __Socket_UDP_noreply_write(self, head, content): - # self.head = head - # self.content = content - gpioWakeBT.write(1) - utime.sleep_ms(2) - gpioWakeBT.write(0) - utime.sleep_ms(20) - # 消息处理 - msg = self.__pack_tlv_format(head, content) - - # 向服务端发送消息 - server_addr = ('172.16.1.5',1000) - - clog.info("__Socket_UDP_noreply send msg {}".format(msg)) - self.__err = 0 - data_size = self.__sock.sendto(msg,server_addr) - clog.info("self.__sock data_size {}".format(data_size)) - self.__wait_resp = 0 - return 0 - # socket通信(UDP)模块 def __Socket_Thread(self): while True: try: - clog.info("recv====") data=self.__sock.recv(1024) - clog.info("data:{}".format(data)) if data: value = self.__unpack_tlv_format(data.decode()) if value != -1: - clog.info('mode: {0}, recv {1} bytes, Data: {2}'.format (value[0],len(data), value[2])) if value[1] == 'FF': self.btmcu_cmd_handler(value[0],value[2]) else: - # self.__value = value - # self.__queue.put('1') self.btmcu_cmd_handler(value[0],value[2]) - clog.info("End else Thread") else: clog.error("data error!!") except Exception as recverr: - clog.error("recverr:{}\r\n".format(recverr)) if "110" in str(recverr): self.__err = 1 - # if self.__wait_resp == 1: - # self.__queue.put('0') else: utime.sleep(1) - self.__sock = self.__socket_reinit() - - - - clog.info("End Socket Thread") - - - - -# UDP_CMD_GET_CAT1VER = '0', // 获取 Cat1 版本号 -# UDP_CMD_DIAL_NUMB = '1', // 拨打电话 -# UDP_CMD_HUNGUP = '2', // 挂断电话 -# UDP_CMD_ANSWER = '3', // 接听电话 -# UDP_CMD_CAT1_OTA_UPDATE = '4', // 触发Cat1 OTA升级,mcu提供url -# UDP_CMD_SEND_SMS = '5', // 发送SMS短信,mcu提供电话号及短信内容 -# UDP_CMD_GET_TIME = '6', // 获取Cat1 时间 ,YYYYMMDD HHmmss zone -# UDP_CMD_GET_NETWORKSTAT = '7', //获取Cat1 信号信息,VOLTE信息,信号强度,SIM卡状态 -# 下文进行系统配置 -clog.info("Cat1Service start") - + self.__sock = self.__socket_reinit() cat1service = Cat1Service() -#send_data_q = Queue(100) - -#voice call callback function def voice_callback(args): if args[0] == 10: - clog.info('voicecall incoming call, PhoneNO: ', args[6]) if eventMesh.publish("get_volte_switch") == 0: #关闭VOLTE功能 - clog.info('voicecall auto end:') voiceCall.callEnd() else: - # gpioWakeBT.write(1) cat1service.notifyIncomingcall(args[6]) elif args[0] == 11: if eventMesh.publish("get_volte_switch") == 1: #开启VOLTE功能 - clog.info('voicecall connected, PhoneNO: \n'.format(args[6])) cat1service.notifyConnecteCall(args[6]) elif args[0] == 12: - clog.info('voicecall disconnect') if eventMesh.publish("get_volte_switch") == 1: #开启VOLTE功能 - clog.info('voicecall disconnected, PhoneNO: \n'.format(args[6])) cat1service.notifyDisconnectCall(args[6]) - elif args[0] == 13: - clog.info('voicecall is waiting, PhoneNO: \n'.format(args[6])) - elif args[0] == 14: - clog.info('voicecall dialing, PhoneNO: \n'.format(args[6])) - elif args[0] == 15: - clog.info('voicecall alerting, PhoneNO: \n'.format(args[6])) - elif args[0] == 16: - clog.info('voicecall holding, PhoneNO: \n'.format(args[6])) - else: - clog.info('voice_callback , args[0]: \n'.format(args[6])) - -#电话消息反馈 voiceCall.setCallback(voice_callback) - - def checknet_cb(arg): - clog.info("start checktime!!") - # if 1: #CHINA_TELECOM_DM_FUN_ENABLE == 1:#这是手表每30s检查一次 - # if eventMesh.publish("get_dmp_change_mode") == 1: - # telecomDmpCb.telecom_dmp_power_on_count() - _thread.start_new_thread(cat1service.wait_network_ready, ()) - # time=utime.localtime() - # zone=utime.getTimeZone() - #(2024, 3, 2, 18, 31, 32, 5, 62),8 - # cat1service.timesync("{0},{1}".format(time,zone)) -# _thread.start_new_thread(cat1service.wait_network_ready, ()) timer = osTimer() -# checknet_cb(()) timer.start(30000,1,checknet_cb) def bootupmsg_cb(arg): cat1service.bootup_msg_to_bt() - delaybootupmsg_timer = osTimer() delaybootupmsg_timer.start(1000,0,bootupmsg_cb) -# def checkpin_cb(arg): -# clog.info("recvDataPin={}".format(recvDataPin.read())) - -# timerCheckRevPin = osTimer() -# timerCheckRevPin.start(1000,1,checkpin_cb) - - - - - - -# while True: -# utime.sleep(5) - - -# uping.ping("172.16.1.5") - # 获取网卡当前工作状态 - -# gpioWakeBT.write(1) -# utime.sleep(1) - -# timesync = net.nitzTime() -# cat1service.timesync(timesync) - - -#url = "http://zzhc.vnet.cn:9998/" diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/is_need_updata.txt b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/is_need_updata.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/main.py b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/main.py index 8f1e40caf..ab14d8bf5 100644 --- a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/main.py +++ b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/main.py @@ -20,7 +20,7 @@ except Exception as e: clog.error("启动失败!!!!!\r\n".format(e)) try: - example.exec('/usr/tcpService.py') + example.exec('/usr/tcpserver.py') clog.info("启动tcpserver成功!!!!!\r\n") except Exception as e: clog.error("启动失败!!!!!\r\n".format(e)) diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpService.py b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpserver.py similarity index 56% rename from code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpService.py rename to code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpserver.py index 3a570f3df..afe23b2c1 100644 --- a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpService.py +++ b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/system/cat1otaudp/tcpserver.py @@ -2,46 +2,27 @@ 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 log.basicConfig(level=log.INFO) clog = log.getLogger("cat1") - USR_FILE_PATH = "/usr" # -BAK_FILE_PATH = "{}/TmpPyFile".format(USR_FILE_PATH) #文件传输的临时文件夹目录路径 +BAK_FILE_PATH = "{}/TmpPyFile".format(USR_FILE_PATH) BAK_FILE_TMP = "_bak" - CAT1_SERVICE_HEAD = "FE" CAT1_FILE_DATA_HEAD = "FF" - - CAT1_REPLAY_STATE="00" CAT1_CREAT_DIR_FAILE= "01" CAT1_CREAT_DIR_OK= "02" @@ -58,31 +39,25 @@ 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_REPLAY_OTA_END_FAILE = "10" +CAT1_NEED_UPDATE_OTA = "11" +CAT1_TCP_STOP_OTA = 0 +CAT1_TCP_START_OTA = 1 +CAT1_TCP_START_SEND_SINGLE_FILE_INFO= 2 +CAT1_TCP_START_SEND_FILE_DATA= 3 +CAT1_TCP_START_OTA_FAILE = 4 +CAT1_TCP_START_OTA_SUCC = 5 +CAT1_TCP_START_SEND_ALLFILE_FINESH = 6 +CAT1_TCP_SEND_SINGLE_FINESH = 7 +CAT1_TCP_START_ERROR_INFO = 255 -CAT1_NEED_UPDATE_OTA = "11" #提示用户强制升级 - -CAT1_TCP_STOP_OTA = 0 #结束OTA升级 -CAT1_TCP_START_OTA = 1 #ble 开始发送OTA标识 -》 CAT1 -CAT1_TCP_START_SEND_SINGLE_FILE_INFO= 2 #//ble 开始发送单个文件信息 -> CAT1 创建单个文件名 -CAT1_TCP_START_SEND_FILE_DATA= 3 #//BLE开始发送文件数据额 ----》CAT1 接收文件数据写文件 -CAT1_TCP_START_OTA_FAILE = 4 #BLE 发送OTA失败 取消文件传输 -CAT1_TCP_START_OTA_SUCC = 5 #//BLE 发送OTA成功标识 -CAT1_TCP_START_SEND_ALLFILE_FINESH = 6 #/所有PY文件传输完成 -CAT1_TCP_SEND_SINGLE_FINESH = 7 #//单个文件传输完成 -CAT1_TCP_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的发送数据就结束了 +FILE_TRANSFER_TIMEOUT=60 class TcpServiceInit: - AP = 0 # SLIP_INNER - STA = 1 # SLIP_OUTER + AP = 0 + STA = 1 def __init__(self, uart=UART.UART4, mode=AP): self.__uart = uart @@ -107,87 +82,39 @@ class TcpServiceInit: self.sock = None self.bakFlag = "0" self.conn= None - # slip.destroy() - # ret = slip.construct(self.__uart,self.__mode, 0) - # if ret != 0: - # clog.info('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, ()) self.conn_thread=_thread.start_new_thread(self._client_conn_proc, ()) - clog.info("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: - clog.info('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): - clog.info('__unpack_tlv_format file {}\r\n'.format(msg)) - msg_tmp = str(msg)[2:]#这是去除head FE + msg_tmp = str(msg)[2:] 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]: - clog.info('__unpack_tlv_format err file') return -1 - # clog.info('__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) + def __socket_file_init(self): self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.IPPROTO_TCP_SER) 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) self.sock.listen(10) - return self.sock - def __socket_file_reinit(self): - clog.info("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) #服务端口也需要更改 - - clog.info("__Socket_TCP_file_noreply send msg {}".format(msg)) - try: - data_size = self.__sock_file.sendto(msg,server_addr) - clog.info("self.__sock_file data_size {}".format(data_size)) - except Exception as e: - clog.info("self.__sock_file error {}".format(e)) - return 0 def __Socket_TCP_file_noreply(self, head, content): head1 = head content1 = content @@ -195,74 +122,38 @@ class TcpServiceInit: utime.sleep_ms(2) gpioWakeBT.write(0) utime.sleep_ms(20) - # 消息处理 msg = self.__pack_tlv_format(head1,content1) - if msg == -1: #无效数据 + if msg == -1: return 0 - # 向服务端发送消息 - # server_addr = ('172.16.1.5',1001) #服务端口也需要更改 - - clog.info("__Socket_TCP_file_noreply send msg {}".format(msg)) try: - data_size = self.conn.send(msg) - clog.info("self.__sock_file data_size {}".format(data_size)) + self.conn.send(msg) except Exception as e: clog.info("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 _client_conn_proc(self): - clog.error('[_client_conn_proc] _client_conn_proc') - while True: if self.conn==None: utime.sleep_ms(20) continue try: - # Receive data sent by the client - data = self.conn.recv(1024) - clog.info('[server] [client addr: %s] recv data:', data) if not data: clog.info("__Socket_File_Thread data null:\r\n") else: self.src_data(data.decode('uft-8')) - - # Send data back to the client - # conn.send(data) except: - # Exception occurred and connection closed - clog.error('[server] disconnected') self.conn.close() - # self.__sock_file = self.__socket_file_reinit() break - - + def __Socket_File_Thread(self): - - # clog.info('[server] accept a client: %s, %s' % (cli_ip_addr, cli_port)) - while True: try : - clog.info('[serveice] start accept a client' ) cli_conn, cli_ip_addr, cli_port = self.__sock_file.accept() self.conn=cli_conn clog.info('[serveice] accept a client: %s, %s' % (cli_ip_addr, cli_port)) except : - clog.error('__Socket_File_Thread' ) utime.sleep_ms(20) - # Create a new thread for each client connection for concurrent processing - - # clog.info("End __Socket_File_Thread Thread") def cat1FileTimerCb(self,*argc): clog.info("timer test\r\n") @@ -274,21 +165,19 @@ class TcpServiceInit: self.deleteTmpFile() self.deleteUsrTmpFile() self.__Socket_TCP_file_noreply(CAT1_OTA_TIMEOUT_BLE_NO_REPLAY,"ota error") #结束文件接收不完整的 - self.Cat1FileTransTimer.stop() #//关闭定时器 + 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() - # clog.info("hex_data:{}\r\n".format(hex_data)) data = hex_data crcValue = 0 j = 0 i = 0 json_state = 0 crcbuf = 0 - # clog.info("len(data) :{}\r\n".format(len(data))) data_len = len(str(data)) try: if data_len % 2 != 0: @@ -296,42 +185,29 @@ class TcpServiceInit: return [json_state,crcbuf] except Exception as e: json_state = 0 - clog.info("不合法的的十六进制数据!!\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: - clog.info("不合法的的十六进制数据!!\r\n") + clog.info("crc_cal") j+=2 - crcbuf = crcValue%256 crcbuf = 256-crcbuf crcbuf = crcbuf%256 - - # clog.info("crcbuf:{}\r\n".format(crcbuf)) return [json_state,"%02x"%(crcbuf)] - #删除临时创建的文件夹 def deleteTmpFile(self): tmp_dir = ql_fs.path_exists(BAK_FILE_PATH) if tmp_dir == True: ql_fs.rmdirs(BAK_FILE_PATH) - - #删除usr临时创建的文件夹 + def deleteUsrTmpFile(self): - return - # tmp_dir = ql_fs.path_exists("/usr/UsrTmpPyFile") - # if tmp_dir == True: - # ql_fs.rmdirs("/usr/UsrTmpPyFile") + return def src_data(self,data): - mk_dir_state = 0 - clog.info("data!!!!!{}\r\n".format(len(data))) if self.updateTimerFlag == 0: self.updateTimerFlag = 1 self.updateTimer.stop() @@ -342,38 +218,33 @@ class TcpServiceInit: json_state = 1 except Exception as e: json_state = 0 - if json_state == 0: #不是json 字典的格式 {} 就是命令 - value = self.__unpack_tlv_format(data) #解析数据 FE + if json_state == 0: + value = self.__unpack_tlv_format(data) self.cmd_data(value[0],value[2]) return else: self.file_data(msg) pass - def cmd_data(self,cmd,parm): #(self,cmd,parm): + def cmd_data(self,cmd,parm): if cmd == "01": self.bakFlag = str(parm) - pass def file_data(self,msg): - # clog.info("msg type msg {} {}\r\n".format(msg,type(data))) if "Code" in msg: - Code = int(msg["Code"]) - clog.info("Code {} self.Cat1FileState:{}\r\n".format(Code,self.Cat1FileState)) - if Code == CAT1_TCP_STOP_OTA: #OTA失败 + if Code == CAT1_TCP_STOP_OTA: self.allPyRecvFlag = 0 self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() self.deleteTmpFile() self.deleteUsrTmpFile() pass - elif Code == CAT1_TCP_START_OTA: #BLE 开始OTA cat1创建临时文件夹记录传输的文件数据 文件名 + elif Code == CAT1_TCP_START_OTA: self.ota_state =0 self.ota_bstate =0 self.allPyRecvFlag = 0 self.fileNameList = [] self.fileSizeList = [] - clog.info("CAT1_TCP_START_OTA {} \r\n".format(CAT1_TCP_START_OTA)) self.allPyRecvFlag = 0 self.Cat1FileState = 0 self.deleteUsrTmpFile() @@ -384,41 +255,33 @@ class TcpServiceInit: try: self.deleteTmpFile() except Exception as e: - clog.info("移除失败!!!!\r\n") + clog.info("移除失败\r\n") check_dir = ql_fs.path_exists(BAK_FILE_PATH) - if check_dir == False: #文件夹不存在 创建目录文件夹 + if check_dir == False: try: ql_fs.mkdirs(BAK_FILE_PATH) mk_dir_state = 1 - clog.info("创建临时文件 创建成功!!!!\r\n") except Exception as e: mk_dir_state = 0 - clog.info("创建临时文件失败没有内存!!!!\r\n") - else: #已经存在目录了 + else: mk_dir_state = 1 - clog.info("创建成功!!!!{}\r\n".format(mk_dir_state)) if mk_dir_state == 0: self.__Socket_TCP_file_noreply(CAT1_CREAT_DIR_FAILE,"creat dir error!") else: self.Cat1FileState = 1 self.fileNameList = [] self.fileSizeList = [] - self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT self.Cat1FileTransTimer.stop() self.Cat1FileTransTimer.start(1000,1,self.cat1FileTimerCb) self.__Socket_TCP_file_noreply(CAT1_CREAT_DIR_OK,"creat dir success!") - - elif Code == CAT1_TCP_START_SEND_SINGLE_FILE_INFO and self.Cat1FileState == 1: #包含文件名 文件大小 - clog.info("CAT1_TCP_START_SEND_SINGLE_FILE_INFO {} \r\n".format(CAT1_TCP_START_SEND_SINGLE_FILE_INFO)) - self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间60s - # {"Code":1,"fileName":"testpy.py","fileSize":1040} + elif Code == CAT1_TCP_START_SEND_SINGLE_FILE_INFO and self.Cat1FileState == 1: + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT self.fileNameTmp = str(msg["fileName"]) self.fileSize = msg["fileSize"] self.fileNameList = msg["fileNameList"] - # self.fileSizeList.append({"fileName":self.fileNameTmp,"fileSize":int(self.fileSize)}) path = "{}/{}".format(BAK_FILE_PATH,self.fileNameTmp) - clog.info("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("{}/{}".format(BAK_FILE_PATH,self.fileNameTmp)) if check_touch == True: try: @@ -428,77 +291,55 @@ class TcpServiceInit: try: with open(path,"w+") as fd: fd.write("") - fd.close() #关闭文件流 + fd.close() self.__Socket_TCP_file_noreply(CAT1_CREAT_FILE_SUCC,"1creat file or dir success!") except Exception as e: - clog.info("创建文件失败\r\n") self.__Socket_TCP_file_noreply(CAT1_CREAT_FILE_ERROR,"1creat file or dir err!") else: try: - clog.info("self.fileNameTmp 111111{}\r\n".format(self.fileNameTmp)) with open(path,"w+") as fd: fd.write("") - fd.close() #关闭文件流 + fd.close() self.crc_err = 0 - clog.info("self.fileNameTmp {}\r\n".format(self.fileNameTmp)) + self.__Socket_TCP_file_noreply(CAT1_CREAT_FILE_SUCC,"2creat file or dir success!") except Exception as e: self.__Socket_TCP_file_noreply(CAT1_CREAT_FILE_ERROR,"2creat file or dir err!") - clog.info("创建文件失败\r\n") + - elif Code == CAT1_TCP_START_SEND_FILE_DATA and self.Cat1FileState == 1: #文件数据 - self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s - clog.info("CAT1_TCP_START_SEND_FILE_DATA {} self.fileNameTmp:{}\r\n".format(CAT1_TCP_START_SEND_FILE_DATA,self.fileNameTmp)) - # {"Code":2,"data":"89ggjdggsjgdj"} - if len(self.fileNameTmp) == 0: #文件名不能为空 + elif Code == CAT1_TCP_START_SEND_FILE_DATA and self.Cat1FileState == 1: + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT + if len(self.fileNameTmp) == 0: return data = msg["data"] if len(data) == 0: return - clog.info(" (data):{}\r\n".format(len(data))) tmpdata = str(data) - head = tmpdata[0:2] #FE - if head != CAT1_FILE_DATA_HEAD or len(tmpdata) <= 8: #必须大于8 FF+012C+DATA+crc(一个字节89) + head = tmpdata[0:2] + if head != CAT1_FILE_DATA_HEAD or len(tmpdata) <= 8: clog.info("head {}\r\n".format(head)) self.__Socket_TCP_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 一个字节 - clog.info("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: #数据为空 + datalen = str(tmpdata[2:6]) + datalen = int("0x" + datalen, 16) + data_buf = tmpdata[6:] + data_buf = data_buf[:-2] + crc = tmpdata[-2:] + if len(str(data_buf)) == 0 or len(str(data_buf)) != datalen: self.__Socket_TCP_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_TCP_file_noreply(CAT1_CRC_ERROR,"crc error!") - # return - # decnumCrcCal = int("0x" + str(newcrc), 16) #转换成十进制数 - # decnumCrc = int("0x" + str(crc), 16) #转换成十进制数 - # clog.info("crc:{} newcrc:{}\r\n".format(crc,newcrc,decnumCrc,decnumCrcCal)) - # if decnumCrcCal != decnumCrc and news == 0: - # clog.info("newcrc is not === crc crc校验出错不一致\r\n") - # self.__Socket_TCP_file_noreply(CAT1_CRC_ERROR,"crc error!") - # return data = str(data_buf) path = "{}/{}".format(BAK_FILE_PATH,str(self.fileNameTmp)) - clog.info("py path:{} self.fileNameTmp:{}\r\n".format(path,self.fileNameTmp)) try: with open(path,"a") as fd: fd.write(data) - fd.close() #关闭文件流 + fd.close() self.__Socket_TCP_file_noreply(CAT1_WRITE_FILE_SUCC,"write file success!") - clog.info("写文件成功!!!!!\r\n") + except Exception as e: self.__Socket_TCP_file_noreply(CAT1_WRITE_FILE_ERROR,"write file error!") - clog.info("写文件失败没有内存!!!!!{}:\r\n".format(e)) - - elif Code == CAT1_TCP_START_OTA_FAILE and self.Cat1FileState == 1: #取消文件传输 OTA失败 移除目录文件 - clog.info("CAT1_TCP_START_OTA_FAILE {} \r\n".format(CAT1_TCP_START_OTA_FAILE)) + + elif Code == CAT1_TCP_START_OTA_FAILE and self.Cat1FileState == 1: self.allPyRecvFlag = 0 self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"OTA FAILE") self.Cat1FileState = 0 @@ -506,139 +347,111 @@ class TcpServiceInit: self.deleteTmpFile() self.deleteUsrTmpFile() pass - elif Code == CAT1_TCP_START_SEND_ALLFILE_FINESH and self.Cat1FileState == 1: #全部文件传输完成 + elif Code == CAT1_TCP_START_SEND_ALLFILE_FINESH and self.Cat1FileState == 1: if self.bakFlag == "0": - clog.info("self.bakFlag auto:\r\n") if self.allPyRecvFlag == 1: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") else: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - clog.info("重启 auto:\r\n") self.Cat1OtaTimeOut.stop() self.Cat1TimeCount = 0 self.ota_state = 1 - self.allPyRecvFlag = 1 #所有的py文件接收完成 + self.allPyRecvFlag = 1 self.Cat1OtaTimeOut.start(5000,0,self.otaTimeOut) return - clog.info("BAK_FILE_FUN!!!!!!\r\n") tmp_dir = ql_fs.path_exists(BAK_FILE_PATH) if tmp_dir == True: filenamesList = uos.listdir(BAK_FILE_PATH) list1 = sorted(filenamesList) list2 = sorted(self.fileNameList) - clog.info("filenamesList:{} self.fileNameList:{} {}{}\r\n".format(filenamesList,self.fileNameList,type(filenamesList),type(self.fileNameList))) - if list1 != list2: #传输的文件列表和BLE不一致说明有文件没有传输完成不再重启CAT1 + if list1 != list2: self.deleteTmpFile() self.Cat1FileState = 0 - clog.info("self.Cat1PyFile444!!!:{}\r\n".format(self.Cat1FileState)) self.Cat1FileTransTimer.stop() self.deleteUsrTmpFile() self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") return - try: copy_state = 1 compare_flag = 1 copy_flag = 0 filenamesList = uos.listdir(BAK_FILE_PATH) - for tmp in filenamesList: #将传输的文件 copy到usr目录下 - clog.info("filenamesList for :{}\r\n".format(filenamesList)) - dst_path = "{}/{}".format(USR_FILE_PATH,tmp) #目标目录文件 - # if ql_fs.path_exists(dst_path) == False: - # try: - # copy_flag = 1 - # ql_fs.touch(dst_path,"") - # except Exception as e: - # clog.info("创建文件失败!!!!!\r\n") - - # if copy_flag == 0: - # clog.info("创建文件失败!!!!!copy_flag\r\n") - # copy_state = 0 - # break - src_path = "{}/{}".format(BAK_FILE_PATH,tmp) #源目录文件 + for tmp in filenamesList: + dst_path = "{}/{}".format(USR_FILE_PATH,tmp) + src_path = "{}/{}".format(BAK_FILE_PATH,tmp) ret = False file_size = 0 - try: ret = ql_fs.file_copy(dst_path,src_path) - clog.info("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) - - clog.info("copy dstfile_size:{} srcfile_size:{}\r\n".format(dstfile_size,srcfile_size)) if dstfile_size != srcfile_size: compare_flag = 0 break - else: #拷贝完之后比较大小一致移除文件 + else: try: compare_flag = 1 uos.remove(src_path) filenamesList = uos.listdir(BAK_FILE_PATH) - clog.info("remove filenamesList :{}\r\n".format(filenamesList)) except Exception as e: clog.info("copy file \r\n") else: compare_flag = 0 break - except Exception as e: clog.info("copy file \r\n") - - if copy_state == 0 or compare_flag == 0 : #比较失败 或者copy失败没有内存了 + if copy_state == 0 or compare_flag == 0 : self.deleteUsrTmpFile() self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") return - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - clog.info("重启 auto:\r\n") self.Cat1OtaTimeOut.stop() self.Cat1TimeCount = 0 self.ota_state = 1 - self.allPyRecvFlag = 1 #所有的py文件接收完成 + self.allPyRecvFlag = 1 self.Cat1OtaTimeOut.start(5000,0,self.otaTimeOut) except Exception as e: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!33") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_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_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") pass else: self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() self.deleteUsrTmpFile() - clog.info("cat1 ota\r\n") self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") - elif Code == CAT1_TCP_START_OTA_SUCC and self.Cat1FileState == 1: if self.bakFlag == "0": self.deleteUsrTmpFile() self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - if self.allPyRecvFlag == 1: #所有的py文件接收完成 - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + if self.allPyRecvFlag == 1: + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") else: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") return - - if self.allPyRecvFlag == 0: #没有接收完成就发送OTA成功的标识 + if self.allPyRecvFlag == 0: self.deleteTmpFile() self.deleteUsrTmpFile() self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") @@ -648,11 +461,9 @@ class TcpServiceInit: filenamesList = uos.listdir(BAK_FILE_PATH) list1 = sorted(filenamesList) list2 = sorted(self.fileNameList) - clog.info("filenamesList:{} self.fileNameList:{} {}{}\r\n".format(filenamesList,self.fileNameList,type(filenamesList),type(self.fileNameList))) - if list1 != list2: #传输的文件列表和BLE不一致说明有文件没有传输完成不再重启CAT1 + if list1 != list2: self.deleteTmpFile() self.Cat1FileState = 0 - clog.info("self.Cat1PyFile444!!!:{}\r\n".format(self.Cat1FileState)) self.Cat1FileTransTimer.stop() self.deleteUsrTmpFile() self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") @@ -661,170 +472,130 @@ class TcpServiceInit: try: copy_state = 1 compare_flag = 1 - copy_flag = 0 filenamesList = uos.listdir(BAK_FILE_PATH) - for tmp in filenamesList: #将传输的文件 copy到usr目录下 - clog.info("filenamesList for :{}\r\n".format(filenamesList)) - dst_path = "{}/{}".format(USR_FILE_PATH,tmp) #目标目录文件 - # if ql_fs.path_exists(dst_path) == False: #usr下面没有就创建文件写空的数据 - # try: - # ret = ql_fs.touch(dst_path,"") - # clog.info("创建文件成功!!!!!:ret {}\r\n".format(ret)) - # if ret == 0: - # copy_flag = 1 - # except Exception as e: - # clog.info("创建文件失败!!!!!\r\n") - - # if copy_flag == 0: - # clog.info("创建文件失败!!!!!copy_flag\r\n") - # copy_state = 0 - # break - src_path = "{}/{}".format(BAK_FILE_PATH,tmp) #源目录文件 + for tmp in filenamesList: + dst_path = "{}/{}".format(USR_FILE_PATH,tmp) + src_path = "{}/{}".format(BAK_FILE_PATH,tmp) ret = False file_size = 0 - try: ret = ql_fs.file_copy(dst_path,src_path) - clog.info("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) - - clog.info("copy dstfile_size:{} srcfile_size:{}\r\n".format(dstfile_size,srcfile_size)) if dstfile_size != srcfile_size: compare_flag = 0 break - else: #拷贝完之后比较大小一致移除文件 + else: try: compare_flag = 1 uos.remove(src_path) filenamesList = uos.listdir(BAK_FILE_PATH) - clog.info("remove filenamesList :{}\r\n".format(filenamesList)) except Exception as e: - clog.info("copy file \r\n") + clog.info("file\r\n") else: compare_flag = 0 break except Exception as e: - clog.info("copy file \r\n") - - - if copy_state == 0 or compare_flag == 0 : #比较失败 或者copy失败没有内存了 + clog.info("file\r\n") + if copy_state == 0 or compare_flag == 0 : self.deleteUsrTmpFile() self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!22") return - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() - clog.info("重启 auto:\r\n") self.Cat1OtaTimeOut.stop() self.Cat1TimeCount = 0 self.ota_bstate = 1 self.conn.close() self.Cat1OtaTimeOut.start(10000,0,self.otaTimeOut) except Exception as e: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota faile!33") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_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_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") #传输文件完之后最后提示是否成功失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"ota success!") pass else: self.deleteTmpFile() self.Cat1FileState = 0 self.Cat1FileTransTimer.stop() self.deleteUsrTmpFile() - clog.info("cat1 ota\r\n") self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_FALIE,"ota end faile!") - elif Code == CAT1_TCP_SEND_SINGLE_FINESH and self.Cat1FileState == 1: #单个文件传输完成 - clog.info("CAT1_TCP_SEND_SINGLE_FINESH {} self.fileNameTmp:{}\r\n".format(CAT1_TCP_SEND_SINGLE_FINESH,self.fileNameTmp)) - self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT #超时时间10s + elif Code == CAT1_TCP_SEND_SINGLE_FINESH and self.Cat1FileState == 1: + self.Cat1PyFileTimout = FILE_TRANSFER_TIMEOUT tmp_dir = ql_fs.path_exists(BAK_FILE_PATH) if tmp_dir == True: tmp_file = ql_fs.path_exists("{}/{}".format(BAK_FILE_PATH,self.fileNameTmp)) - if tmp_file == True: #文件存在 + if tmp_file == True: file_size = ql_fs.path_getsize("{}/{}".format(BAK_FILE_PATH,self.fileNameTmp)) - clog.info("file size :file_size:{} self.fileSize:{}\r\n".format(file_size,self.fileSize)) - if self.fileSize != file_size: #文件大小不一致 传输出错 - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file size err") #结束文件接收不完整的 - - else: #传完一个文件copy到usr下面 + if self.fileSize != file_size: + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file size err") + else: if self.bakFlag == "0": - - dst_path = "{}/{}".format(USR_FILE_PATH,self.fileNameTmp) #目标文件 - src_path = "{}/{}".format(BAK_FILE_PATH,self.fileNameTmp) #源文件目录 /usr/TmpFile/ + dst_path = "{}/{}".format(USR_FILE_PATH,self.fileNameTmp) + src_path = "{}/{}".format(BAK_FILE_PATH,self.fileNameTmp) ret = False try: - clog.info("touch single file!!!!!dtpath111:{}\r\n".format(dst_path,src_path)) ret = ql_fs.file_copy(dst_path,src_path) if ret == True: dstfile_size = ql_fs.path_getsize(dst_path) srcfile_size = ql_fs.path_getsize(src_path) - if dstfile_size != srcfile_size: #copy 之后比较文件大小一不一致 - - src_file = ql_fs.path_exists(src_path) #删除文件 + if dstfile_size != srcfile_size: + src_file = ql_fs.path_exists(src_path) if src_file == True: try: - uos.remove(src_path) #移除文件 + uos.remove(src_path) except Exception as e: clog.info("copy 文件异常出错 yichu!{}:\r\n".format(e)) - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file size err") #结束文件接收完整的 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file size err") return else: - src_file = ql_fs.path_exists(src_path) #删除文件 + src_file = ql_fs.path_exists(src_path) if src_file == True: try: - uos.remove(src_path) #移除文件 + uos.remove(src_path) except Exception as e: clog.info("copy 文件异常出错!!!!!!!!!!{}:\r\n".format(e)) - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_OK,"file size ok") #文件大小不一致 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_OK,"file size ok") return else: - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file copy err") #copy失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file copy err") except Exception as e: - clog.info("copy 文件异常出错!!!!!!!!!!{}:\r\n".format(e)) - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file copy err") #copy失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_ERR,"file copy err") else: - clog.info("self.bakFlag 1:\r\n") - self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_OK,"file copy ok") #copy失败 + self.__Socket_TCP_file_noreply(CAT1_REPLAY_FILE_SIZE_OK,"file copy ok") else: self.__Socket_TCP_file_noreply(CAT1_CREAT_FILE_ERROR,"creat file or dir err!") pass else: self.__Socket_TCP_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_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"reset start!") #结束文件接收不完整的 - clog.info("错误信息!!!!!\r\n") + self.__Socket_TCP_file_noreply(CAT1_REPLAY_OTA_SUCC,"reset start!") self.Cat1FileState == 0 - self.Cat1FileTransTimer.stop() #//关闭定时器 + self.Cat1FileTransTimer.stop() self.Cat1PyFileTimout = 0 self.fileNameList=[] self.deleteTmpFile() self.deleteUsrTmpFile() - def otaTimeOut(self,*argc): - - clog.info("重启成功!!!!!!!!\r\n") - # 上层直接重启即可 - # Power.powerRestart() TcpService = TcpServiceInit() diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_tcpServer.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_tcpServer.cpp index 59c37672f..838a3e257 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_tcpServer.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_tcpServer.cpp @@ -446,9 +446,8 @@ static void stop_cat1_ota(void){ //停止 CAT1 ota 清标识 fclose(fp); fp = NULL; } - uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL; - - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + uapi_cat1_keep_wakeup(0); } static void cat1_file_Timer_CallBack(int data_tmp) @@ -595,7 +594,7 @@ void read_UDP_dir(void){ else if (i==3) snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","main.py"); else - snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","tcpService.py"); + snprintf(fileNameList[file_count],DEFAULT_MAX_FILE_NAME_SIZE,"%s","tcpserver.py"); printf("fileNameList[file_count] %s\r\n",fileNameList[file_count]); file_count+=1; @@ -974,6 +973,8 @@ static int udp_packet_parse(char *rx_buffer, int len) return 0; } uint8_t shutdowflag = 1;//重启 + uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL; + switch (cmd) { case CAT1_REPLAY_CREAT_DIR_FAILE: //cat1:创建临时文件夹失败 @@ -983,6 +984,7 @@ static int udp_packet_parse(char *rx_buffer, int len) creat_file_err+=1; if(creat_file_err >= FAILE_COUNT){ //创建十次都出错不创建结束当前的升级 creat_file_err=0; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); stop_cat1_ota(); break; } @@ -1012,6 +1014,7 @@ static int udp_packet_parse(char *rx_buffer, int len) if(write_data_err >= FAILE_COUNT){ write_data_err = 0; stop_cat1_ota(); + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); break; } printf("CAT1_REPLAY_WRITE_FILE_ERROR! %d",cmd); @@ -1024,6 +1027,8 @@ static int udp_packet_parse(char *rx_buffer, int len) data_crc_err+=1; if(data_crc_err >= FAILE_COUNT){ //连续十次CRC都出错就结束进程 data_crc_err = 0; + uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); stop_cat1_ota(); break; } @@ -1045,6 +1050,8 @@ static int udp_packet_parse(char *rx_buffer, int len) if(creat_file_err >= FAILE_COUNT){ creat_file_err = 0; stop_cat1_ota(); + uint8_t TRANSMIT_DATA=OTA_UPDATA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); break; } send_data_case(CREAT_FILE_FAILE); @@ -1054,7 +1061,8 @@ static int udp_packet_parse(char *rx_buffer, int len) //成功直接重启 if(is_need_udp_updata) { - remove(CAT1_PY_IS_NEED_UDP_PATH); + FILE *fp= fopen(CAT1_PY_IS_NEED_UDP_PATH,"wb+"); + fclose(fp); } CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag)); //添加GUI @@ -1072,6 +1080,7 @@ static int udp_packet_parse(char *rx_buffer, int len) if(file_size_err >= FAILE_COUNT){ file_size_err = 0; stop_cat1_ota(); + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); break; } send_curfile_info_data(); @@ -1291,15 +1300,11 @@ errcode_t cat1_tcp_server_init(void) taskcfg.func = cat1_server_file_task; taskcfg.use_mem = USE_EXTEND_MEM; FILE* fp= fopen(CAT1_PY_IS_NEED_UDP_PATH,"rb"); - if(fp) + if(fp==NULL) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"is_need_udp_updata !\r\n"); is_need_udp_updata=1; - fclose(fp); - fp=NULL; } - - errcode_t ret=uapi_create_osThread_custom(&taskcfg); -- 2.17.1