EventMesh.subscribe("led_b_open",self.led_b_open)
EventMesh.subscribe("led_rgb_open",self.led_rgb_open)
EventMesh.subscribe("led_close",self.led_close)
- EventMesh.subscribe("up_datat_bt",self.up_datat_bt)
+ EventMesh.subscribe("bt_ota_run",self.bt_ota_run)#
EventMesh.subscribe("start_ota",self.start_ota)
EventMesh.subscribe("end_ota",self.end_ota)
EventMesh.subscribe("send_ble_adv_switch",self.send_ble_adv_switch)
EventMesh.publish("pwk_key_release")
def start_ota(self,event=None,msg=None):#通过串口给蓝牙升级
-
+ EventMesh.publish("wakeup_BT")
print("start_ota!!!")
print("start_ota!!!")
json_data = \
print("start_ota count:{}!!!".format(count))
def end_ota(self,event=None,msg=None):#通过串口给蓝牙升级
-
+ EventMesh.publish("wakeup_BT")
print("end_ota!!!")
print("end_ota!!!")
json_data = \
utime.sleep_ms(1)
print("end_ota count:{}!!!".format(count))
- def up_datat_bt(self,event=None,msg=None):#通过串口给蓝牙升级
- print("up_datat_bt!!!:url:{}".format(msg))
- print("up_datat_bt!!!")
- print("up_datat_bt!!!")
+ def bt_ota_run(self,event=None,msg=None):#通过串口给蓝牙升级
+ EventMesh.publish("wakeup_BT")
+ print("bt_ota_run!!!:url:{}".format(msg))
+ print("bt_ota_run!!!")
+ print("bt_ota_run!!!")
self.bt_ota_flag = 1
self.read_ack_flag = 0
json_str =ujson.dumps(json_data)
self.AI_uart.write(json_str)
print(json_str)
- count =100
+ count =2000#等20秒,擦除flash
while True:
count -=1
if count <=0 or self.read_ack_flag == 1:
break
- utime.sleep_ms(1)
+ utime.sleep_ms(10)
+ print("ota_start:count:{}".format(count))
headers_T = {"Content-Type":"application/octet-stream"}
response = request.get(url = msg,headers=headers_T,decode = False)
+ offset = 0
+ checksum = 0
for i in response.content:
- self.read_ack_flag = 0
+ EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+
+
data = base64.b64encode(i)
- json_data = \
- {
- "event": "ota_data",
- "update":data
- }
- json_str =ujson.dumps(json_data)
- self.AI_uart.write(json_str)
- #utime.sleep_ms(100)
- count =500
- while True:
- count -=1
- if count <=0 or self.read_ack_flag == 1:
+ send_count = 5#最大重发5次,没ack或者返回error重发
+ while 1:
+ send_count-=1
+ self.read_ack_flag = 0
+ checksum = 0
+ # 对每个字节进行异或运算
+ for byte in i:
+ checksum ^= byte # 等价于 checksum = checksum ^ byte
+ json_data = \
+ {
+ "event": "ota_data",
+ "update":data,
+ "offset":offset,
+ "checksum":checksum
+ }
+ print("offset:{},checksum:{}".format(offset,checksum))
+ json_str =ujson.dumps(json_data)
+ self.AI_uart.write(json_str)
+ #utime.sleep_ms(100)
+ count =300
+ while True:
+ count -=1
+ if count <=0 or self.read_ack_flag != 0 :
+ break
+ utime.sleep_ms(10)
+ print("ota_data:{} count:{}".format(len(json_str),count))
+ if send_count <=0 or self.read_ack_flag == 1:
break
- utime.sleep_ms(10)
- print("ota_data:{} count:{}".format(len(json_str),count))
+ offset+=len(i)
self.read_ack_flag = 0
json_data = \
{
#4G唤醒蓝牙中断
self.PIN_wakeup_bt =Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_DISABLE, 0)
#蓝牙开电
+ self.PIN_BT_ON =Pin(Pin.GPIO31, Pin.OUT, Pin.PULL_DISABLE, 0)
+ utime.sleep_ms(200)
self.PIN_BT_ON =Pin(Pin.GPIO31, Pin.OUT, Pin.PULL_DISABLE, 1)
#马达
self.PIN_MOT=Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_DISABLE, 1)
#EventMesh.subscribe("min_sys_ota",self.min_sys_ota)
self.downloadFileVoURL1= ""
self.downloadFileVoURL2= ""
+ self.downloadFileVoURLBT=""
#小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够
def min_sys_ota(self,event=None,msg=None):
print("min_sys_ota")
ret_str =0
self.downloadFileVoURL1= ""
self.downloadFileVoURL2= ""
+ self.downloadFileVoURLBT=""
try:
sourceVersion = versions.Build_Time
sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
try:
if data["code"] == 20007:#有新版本
if "fileList"in data["data"]:
- if len(data["data"]["fileList"]) == 2:
+ #if len(data["data"]["fileList"]) == 2:
for fileList in data["data"]["fileList"]:
if fileList["fileName"] == "dfota_2.bin":
self.downloadFileVoURL2 = fileList["url"]
elif fileList["fileName"] == "dfota_1.bin":
self.downloadFileVoURL1 = fileList["url"]
-
+ elif fileList["fileName"] == "update.ufw":
+ self.downloadFileVoURLBT = fileList["url"]
if data["code"] == 20006:#已是最新版本
ret_str = 0
if response != None:
response.close()
- print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))
+ print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{},\ndownloadFileVoURLBT{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2,self.downloadFileVoURLBT))
print("min_sys_ota end")
- if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":
+ if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="" and self.downloadFileVoURLBT !="":
battery = EventMesh.publish("get_battery")
if battery>=40:
self.ota_timer = osTimer()
- self.ota_timer.start(15000, 0, self.ota_timer_cb)
+ #self.ota_timer.start(15000, 0, self.ota_timer_cb)
+ self.AI_client_VC_recv_id = _thread.start_new_thread(self.ota_task,())
ret_str = 1
else:
ret_str = 2
return ret_str
- def ota_timer_cb(self, *args, **kwargs):
+ # def ota_timer_cb(self, *args, **kwargs):
+ # EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event})
+
+ def ota_task(self):
import fota
+ utime.sleep_ms(2000)
+ count = 30#最多等待30秒
+ while 1:
+ count-=1
+ VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+ if VC_satrt_flag == None:
+ VC_satrt_flag = 0
+ if VC_satrt_flag == 0 or count<=0:
+ break
+ utime.sleep_ms(100)
+
+ EventMesh.publish("bt_ota_run",self.downloadFileVoURLBT) #升级蓝牙
+ utime.sleep_ms(30000)
fota_obj = fota()
fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)
#ota升级结果返回,开机时调用一次即可