From: dxy15521469561 <1731678236@qq.com> Date: Thu, 25 Apr 2024 07:32:14 +0000 (+0800) Subject: G10 G15老化测试 G10格物改成TLS加密通道 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=9c38401ea0b0dc2b95214f5918e451f985927e7d;p=mirrors%2FASR1603_G5.git G10 G15老化测试 G10格物改成TLS加密通道 --- diff --git a/2.sdk/project/D10/new.bat b/2.sdk/project/D10/new.bat index ca3ab81c..43458e99 100644 --- a/2.sdk/project/D10/new.bat +++ b/2.sdk/project/D10/new.bat @@ -13,7 +13,7 @@ if errorlevel 0 ( ) :STEP1 -..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 914400 -i .\images\customer_fs.bin +..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 716800 -i .\images\customer_fs.bin if errorlevel 1 ( echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!" goto exit diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/EventMesh.py index 4fb4c895..e1a25216 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/EventMesh.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/EventMesh.py @@ -9,7 +9,8 @@ model = "D10" project = "D10" platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分 -# platform = ""#格物平台 不用的话选择空 +# platform = "D10"#格物平台 不用的话选择空 +# platform = "D15"#格物平台 不用的话选择空 # model = "G10W_DT_YBX_" diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py index 9fe35c78..9bbf5e90 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py @@ -12,7 +12,7 @@ import ql_fs import ujson import voiceCall from misc import Power -from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,close_led_green,close_led_white +from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white from machine import RTC from queue import Queue import _thread @@ -2212,6 +2212,11 @@ if EventMesh.model == "D10" : self.pwkey_press = 0 self.led_state = 0 self.hsensorTest_timer = osTimer() + self.factoryTest_timer = osTimer() + self.factoryTest_count = 0 + self.factory_timesec = 0 + self.factoryTest_led_count = 0 + self.factoryTest_flag = 0 self.btnInfo_queue = Queue() _thread.stack_size(10*1024+192) _thread.start_new_thread(self.btnInfo_queue_thread, ()) @@ -2549,6 +2554,52 @@ if EventMesh.model == "D10" : self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断 def publish_sosKey_timeout_cb_do(self, *args, **kwargs): EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0}) + + def close_factory_test(self):#关闭老化测试 + if self.factoryTest_flag == 1: + self.factoryTest_flag = 0 + close_led_white() + close_led_red() + close_led_green() + self.factoryTest_led_count = 0 + self.factoryTest_count = 0 + self.aud.stopPlayStream() + self.factoryTest_timer.stop() + + def factoryTest_timer_cb(self,e): + # self.factoryTest_count+=1 + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + + if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出 + # self.factoryTest_count = 0 + self.close_factory_test() + return + #播放音频 + str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW")) + if EventMesh.publish("get_audio_state") == 0: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #led灯常亮 + self.factoryTest_led_count+=1 + if self.factoryTest_led_count == 1:#1 4 7 10 + open_led_red() + close_led_green() + close_led_white() + elif self.factoryTest_led_count == 2: + open_led_green() + close_led_red() + close_led_white() + elif self.factoryTest_led_count == 3: #3 6 9 12 + open_led_white() + close_led_red() + close_led_green() + if self.factoryTest_led_count >= 3+1: + self.factoryTest_led_count = 0 + + + + + pass def sosKey_timeout_cb(self, data):# open_power = EventMesh.publish("get_power_on_state")#获取开机标识 open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识 @@ -2560,6 +2611,24 @@ if EventMesh.model == "D10" : self.sosKey_long_press = 0 self.sosKey_press_count = 0 return + factory_count = EventMesh.publish("get_factory_test_time") + print("factory_count:%d",factory_count) + try : + if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式 + #EventMesh.debug_log("boot_count:{}".format(boot_count)) + if self.sosKey_press_count >= 15: + self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb) + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + self.factory_timesec = time_tmp + self.sosKey_press_count = 0 + self.factoryTest_led_count = 0 + self.factoryTest_flag = 1 + return + + except Exception as e: + usys.print_exception(e) + # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count) flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备 fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识 @@ -2573,6 +2642,7 @@ if EventMesh.model == "D10" : pass elif self.sosKey_press_count == 6:# self.sosKey_press_count = 0 + self.close_factory_test() pass elif self.sosKey_press_count == 5:#功能暂时屏蔽 self.sosKey_press_count = 0 diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py index e398b13f..ffec04ca 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py @@ -21,7 +21,7 @@ import sms from Gsensor import SC7A20 NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义 if EventMesh.model == "D15" : - from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,close_led_green,close_led_white + from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0) @@ -2586,6 +2586,11 @@ if EventMesh.model == "D15" : self.pwkey_press = 0 self.led_state = 0 self.hsensorTest_timer = osTimer() + self.factoryTest_timer = osTimer() + self.factoryTest_count = 0 + self.factoryTest_led_count = 0 + self.factoryTest_flag = 0 + self.factory_timesec = 0 self.btnInfo_queue = Queue() _thread.stack_size(10*1024+192) _thread.start_new_thread(self.btnInfo_queue_thread, ()) @@ -3393,6 +3398,50 @@ if EventMesh.model == "D15" : # 3、短按三下,发起视频通话(默认第一个) # 4、短按六次,播报IMEI号 # 5、短按十次,解绑APP,同时恢复出厂设置 + def close_factory_test(self):#关闭老化测试 + if self.factoryTest_flag == 1: + self.factoryTest_flag = 0 + close_led_white() + close_led_red() + close_led_green() + self.factoryTest_led_count = 0 + self.aud.stopPlayStream() + self.factoryTest_timer.stop() + EventMesh.publish("close_motor_infor") + + def factoryTest_timer_cb(self,e): + # self.factoryTest_count+=1 + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec) + if time_tmp - self.factory_timesec > 60*60*2: + # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出 + # self.factoryTest_count = 0 + self.close_factory_test() + return + #播放音频 + str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW")) + if EventMesh.publish("get_audio_state") == 0: + self.aud.montage_play('U:/static/audio.bin',1,1,str_data) + #led灯常亮 + self.factoryTest_led_count+=1 + if self.factoryTest_led_count == 1:#1 4 7 10 + open_led_red() + close_led_green() + close_led_white() + elif self.factoryTest_led_count == 2: + open_led_green() + close_led_red() + close_led_white() + elif self.factoryTest_led_count == 3: #3 6 9 12 + open_led_white() + close_led_red() + close_led_green() + if self.factoryTest_led_count >= 3+1: + self.factoryTest_led_count = 0 + + EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数 + def sosKey_timeout_cb(self, data):# # print("sosKey_timeout_cb",self.sosKey_press_count) open_power = EventMesh.publish("get_power_on_state")#获取开机标识 @@ -3405,11 +3454,29 @@ if EventMesh.model == "D15" : self.sosKey_long_press = 0 self.sosKey_press_count = 0 return + factory_count = EventMesh.publish("get_factory_test_time") + print("factory_count:%d",factory_count) + try : + if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式 + #EventMesh.debug_log("boot_count:{}".format(boot_count)) + if self.sosKey_press_count >= 15: + self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb) + self.sosKey_press_count = 0 + self.factoryTest_led_count = 0 + self.factoryTest_flag = 1 + date_tmp = utime.localtime() + time_tmp = utime.mktime(date_tmp) + self.factory_timesec = time_tmp + return + + except Exception as e: + usys.print_exception(e) + if NEW_ENABLE == 1:#旧的按键定义 # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count) flag = EventMesh.publish("get_call_state")#获取通话状态 fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识 - if self.sosKey_press_count > 1:#短按十次解绑app + if self.sosKey_press_count > 1:# if fall_down != None: if fall_down != 0 or flag != 0: self.sosKey_press_count = 0 @@ -3419,6 +3486,7 @@ if EventMesh.model == "D15" : pass elif self.sosKey_press_count == 6:# self.sosKey_press_count = 0 + self.close_factory_test() pass elif self.sosKey_press_count == 5:#功能暂时屏蔽 self.sosKey_press_count = 0 @@ -3483,6 +3551,7 @@ if EventMesh.model == "D15" : pass elif self.sosKey_press_count == 6:#播报IMEI号 self.sosKey_press_count = 0 + self.close_factory_test() EventMesh.publish("stop_led_timer")#设置参数 EventMesh.publish("play_imei_event")#播報imei号 pass diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py index 032281ce..c56a8dc4 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py @@ -758,6 +758,7 @@ if EventMesh.model == "D10": _thread.start_new_thread(self.DeviceInfo_queue_thread, ()) _thread.stack_size(8*1024) self.boot_time_count = 0 + self.factory_test_time = 0 EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo) self.key = "" self.imei = "" @@ -960,6 +961,7 @@ if EventMesh.model == "D10": EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp) EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp) EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count) + EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time) EventMesh.subscribe("get_dev_state", self.get_dev_state) EventMesh.subscribe("set_dev_state", self.set_dev_state) @@ -1038,14 +1040,23 @@ if EventMesh.model == "D10": def get_boot_time_count(self, event, msg): return self.boot_time_count + def get_factory_test_time(self, event, msg): + return self.factory_test_time + def get_dev_state(self, event, msg): return self.dev_state def set_dev_state(self, event, msg): self.dev_state = msg def publish_event_cb(self, *args, **kwargs): - if self.boot_time_count < 50000000: - self.boot_time_count += 10 + + open_power = EventMesh.publish("get_power_on_state")#获取开机标识 + if open_power != None: + if open_power == 1: + if self.boot_time_count < 50000000: + self.boot_time_count += 10 + if self.factory_test_time < 300: + self.factory_test_time+=10 #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count)) EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0}) def optimize_temp(self,temp): diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py index 221ec97d..87dca015 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py @@ -768,6 +768,7 @@ if EventMesh.model == "D15": _thread.start_new_thread(self.DeviceInfo_queue_thread, ()) _thread.stack_size(8*1024) self.boot_time_count = 0 + self.factory_test_time = 0 EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo) self.key = "" self.imei = "" @@ -968,6 +969,7 @@ if EventMesh.model == "D15": EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp) EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp) EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count) + EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time) EventMesh.subscribe("get_dev_state", self.get_dev_state) EventMesh.subscribe("set_dev_state", self.set_dev_state) @@ -1046,14 +1048,23 @@ if EventMesh.model == "D15": def get_boot_time_count(self, event, msg): return self.boot_time_count + def get_factory_test_time(self, event, msg): + return self.factory_test_time + def get_dev_state(self, event, msg): return self.dev_state def set_dev_state(self, event, msg): self.dev_state = msg def publish_event_cb(self, *args, **kwargs): - if self.boot_time_count < 50000000: - self.boot_time_count += 10 + open_power = EventMesh.publish("get_power_on_state")#获取开机标识 + if open_power != None: + if open_power == 1: + if self.boot_time_count < 50000000: + self.boot_time_count += 10 + + if self.factory_test_time < 300: + self.factory_test_time+=10 #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count)) EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0}) def optimize_temp(self,temp): diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py index 409b351c..6e64fe91 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py @@ -214,8 +214,8 @@ def mqtt_client_pro_init():#一型一密 Client_id = "{}|{}|0|1|0".format(deviceId,productKey) # # print(Client_id) - server = "dmp-mqtt.cuiot.cn" - port = 1883 + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 # {deviceKey}|{productKey} mqttUsername userName = "{}|{}".format(deviceKey,productKey) userpassword = checkpassword @@ -223,7 +223,7 @@ def mqtt_client_pro_init():#一型一密 # print(userpassword) # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09") # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242") - client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False) + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) # 设置消息回调 client.set_callback(mqttsub_cb) @@ -255,14 +255,14 @@ def mqtt_client_dev_init():#一机一密 checkpassword = get_hmac_sha256(deviceSecret,data) print(checkpassword) # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 - Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # - server = "dmp-mqtt.cuiot.cn" - port = 1883 + Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0 + server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn" + port = 8883 # {deviceKey}|{productKey} mqttUsername userName = "{}|{}".format(deviceKey,productKey) userpassword = checkpassword - client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False) + client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True) # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) # 设置消息回调 client.set_callback(mqttsub_cb) diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/sleep_test.py index 31f2970e..95e6b196 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/sleep_test.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/sleep_test.py @@ -5,15 +5,540 @@ from misc import PWM import camera import jrtc -jrtc.init() -jrtc.config_server("119.3.54.56:1050") -jrtc.config("e99697f86096a74dbf635096", "us144a", "1234567890abcdef", "") -jrtc.open("us145c", "",[],[15,120,240,320]) +# jrtc.init() +# jrtc.config_server("119.3.54.56:1050") +# jrtc.config("e99697f86096a74dbf635096", "us144a", "1234567890abcdef", "") +# jrtc.open("us145c", "",[],[15,120,240,320]) # jrtc.init() # jrtc.config_server("119.3.54.56:1050") # jrtc.config("e99697f86096a74dbf635096", "us145a", "1234567890abcdef", "") # jrtc.open("us144a", "",[],[15,129,128,128]) -jrtc.set_cam_angle(jrtc.CAM_ROTATE_180) +# jrtc.set_cam_angle(jrtc.CAM_ROTATE_180) + +''' +@Author: Baron +@Date: 2020-04-24 +@LastEditTime: 2020-04-24 17:06:08 +@Description: example for module umqtt +@FilePath: example_mqtt_file.py +''' +# from umqtt import MQTTClient +# import utime +# import log +# import checkNet +# import uhashlib +# import hmac +# import ubinascii +# import base64 +# import ujson +# SHA1 = uhashlib.sha256 +# ''' +# 下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值 +# ''' +# PROJECT_NAME = "QuecPython_MQTT_example" +# PROJECT_VERSION = "1.0.0" + +# checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# # 设置日志输出级别 +# log.basicConfig(level=log.INFO) +# mqtt_log = log.getLogger("MQTT") + +# state = 0 + +# def sub_cb(topic, msg): +# global state +# mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) +# jsload_data = ujson.loads(msg.decode()) +# if "code" in jsload_data: +# code = int(jsload_data["code"]) +# if code == 0:#合法设备 发送成功数据 +# mqtt_log.info("publish ok Recv!!!!") + +# state = 1 +# class gewu_conn_client: + +# def __init__(self, host_name: str, port: int,deviceId:str,deviceKey:str,productKey:str,deviceSecret:str): +# self.host_name = host_name +# self.port = port +# self.deviceId = deviceId +# self.deviceKey = deviceKey +# self.productKey = productKey +# self.deviceSecret = deviceSecret +# pass +# def HMAC(self,k, m): +# SHA1_BLOCK_SIZE = 256 +# KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k))) +# KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) +# KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) +# inner_message = KEY_INNER + m +# outer_message = KEY_OUTER + SHA1(inner_message).digest() +# return SHA1(outer_message) + + +# def get_hmac_sha1(self,k, m): +# data = self.HMAC(k, m).digest() +# print("HMAC(k, m).digest():", data) +# print("HMAC(k, m).digest():", ubinascii.hexlify(data)) +# hex_data = ubinascii.hexlify(data) +# hex_data = hex_data.decode('ascii') +# return hex_data + +# def __get_auth(self) ->dict: +# time = utime.localtime()#本地时间戳 +# t = utime.mktime(time) + +# string = "{}|{}|{}".format(self.deviceId,self.deviceKey,self.productKey) + + +# md5_str = uhashlib.md5(string) +# res = md5_str.digest() +# # 转成十六进制表示 +# MD5_head = ubinascii.hexlify(res)# +# MD5_head = MD5_head.decode('ascii') +# # print("uri!!",MD5_head) +# signature = self.get_hmac_sha1(self.deviceSecret, MD5_head)#对api_key进行再加密 +# print("signature:%s",signature) + +# if __name__ == '__main__': + +# def HMAC(k, m): +# SHA1_BLOCK_SIZE = 64 +# KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k))) +# KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) +# KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) +# inner_message = KEY_INNER + m +# outer_message = KEY_OUTER + SHA1(inner_message).digest() +# return SHA1(outer_message) + + +# def get_hmac_sha1(k, m): +# data = HMAC(k, m).digest() +# print("HMAC(k, m).digest():", data) +# print("HMAC(k, m).digest():", ubinascii.hexlify(data)) +# hex_data = ubinascii.hexlify(data) +# hex_data = hex_data.decode('ascii') +# return hex_data + +# # def hmac_sha256(key, data): +# # return uhmac.new(key.encode('utf-8'), data.encode('utf-8'), uhashlib.sha256).hexdigest() + + +# # import hashlib +# # 需要加密的数据 +# data = "{}{}{}".format("DD86000000001","DD86000000001","cu1r1rjjrjdhz0lx") +# # data = b"The data to encrypt" +# # 密钥 +# secret_key = b"93FEEC6D16D30E2B90FE0DBC2FFCDB14" + + +# signature = get_hmac_sha1(secret_key,data) +# print(signature) +# # 创建一个mqtt实例 +# c = MQTTClient("DD86000000001|cu1r1rjjrjdhz0lx|0|0|0", "dmp-mqtt.cuiot.cn", 1883, "DD86000000001|cu1r1rjjrjdhz0lx","{}".format(signature)) +# # 设置消息回调 +# c.set_callback(sub_cb) +# #建立连接 +# connect_state = c.connect() +# print(connect_state) +# # 订阅主题 +# if connect_state == 0:#连接成功mqtt + +# c.subscribe(b"$sys/cu1r1rjjrjdhz0lx/DD86000000001/property/batch_reply",0)#订阅消息主题 +# print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic") +# # 发布消息 +# data = { +# "messageId":"54691", +# "params": { +# "data": [ +# { +# "key":"deviceOffOn", +# "value": { +# "deviceStatus":"2", +# "updateTime":"1711962300000", +# "Imei":"860132060346475" +# }, + +# }, +# { +# "key":"HeartRate", +# "value":{ +# "heartRate":70, +# "updateTme":"1711962300000", +# "Imei":"860132060346475" +# } +# }, +# { +# "key":"geoLocation", +# "value":{ +# "longitude": 118.763334, +# "latitude": 32.0175, +# "altitude": 3.9 +# }, +# }, +# { +# "key":"powerSavingMode", +# "value":20 +# } + +# ] +# } +# } +# data_json = ujson.dumps(data) +# c.publish(b"$sys/cu1r1rjjrjdhz0lx/DD86000000001/event/batch",data_json)#publis主题内容 +# print("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + +# while True: +# c.wait_msg() # 阻塞函数,监听消息 +# if state == 1: +# break +# else: +# c.disconnect() + + + # c = MqttClient("DD86000000001|cu1r1rjjrjdhz0lx|0|0|0", "dmp-mqtt.cuiot.cn", 1883, "DD86000000001|cu1r1rjjrjdhz0lx","4d616b40ca8ed4e823221c6d0ee0f04ad20170096e10206dadcebeb6b31713db") + +import utime +import log +import net +import _thread +import checkNet +import ujson +import dataCall +from umqtt import MQTTClient +import utime +import log +import uhashlib +import ubinascii +import base64 +import ujson +SHA256 = uhashlib.sha256 +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# 调用disconnect后会通过该状态回收线程资源 +TaskEnable = True +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + + +# 封装mqtt,使其可以支持更多自定义逻辑 +class MqttClient(): + ''' + mqtt init + ''' + + # 说明:reconn该参数用于控制使用或关闭umqtt内部的重连机制,默认为True,使用内部重连机制。 + # 如需测试或使用外部重连机制可参考此示例代码,测试前需将reconn=False,否则默认会使用内部重连机制! + def __init__(self, clientid, server, port, user=None, password=None, keepalive=0, ssl=False, ssl_params={}, + reconn=False): + self.__clientid = clientid + self.__pw = password + self.__server = server + self.__port = port + self.__uasename = user + self.__keepalive = keepalive + self.__ssl = ssl + self.__ssl_params = ssl_params + self.topic = None + self.qos = None + # 网络状态标志 + self.__nw_flag = True + # 创建互斥锁 + self.mp_lock = _thread.allocate_lock() + # 创建类的时候初始化出mqtt对象 + self.client = MQTTClient(self.__clientid, self.__server, self.__port, self.__uasename, self.__pw, + keepalive=self.__keepalive, ssl=self.__ssl, ssl_params=self.__ssl_params, + reconn=reconn) + + def connect(self): + ''' + 连接mqtt Server + ''' + self.client.connect() + # 注册网络回调函数,网络状态发生变化时触发 + flag = dataCall.setCallback(self.nw_cb) + if flag != 0: + # 回调注册失败 + raise Exception("Network callback registration failed") + + def set_callback(self, sub_cb): + ''' + 设置mqtt回调消息函数 + ''' + self.client.set_callback(sub_cb) + + def error_register_cb(self, func): + ''' + 注册一个接收umqtt内线程异常的回调函数 + ''' + self.client.error_register_cb(func) + + def subscribe(self, topic, qos=0): + ''' + 订阅Topic + ''' + self.topic = topic # 保存topic ,多个topic可使用list保存 + self.qos = qos # 保存qos + self.client.subscribe(topic, qos) + + def publish(self, topic, msg, qos=0): + ''' + 发布消息 + ''' + self.client.publish(topic, msg, qos) + + def disconnect(self): + ''' + 关闭连接 + ''' + global TaskEnable + # 关闭wait_msg的监听线程 + TaskEnable = False + # 关闭之前的连接,释放资源 + self.client.disconnect() + + def reconnect(self): + ''' + mqtt 重连机制(该示例仅提供mqtt重连参考,根据实际情况调整) + PS:1.如有其他业务需要在mqtt重连后重新开启,请先考虑是否需要释放之前业务上的资源再进行业务重启 + 2.该部分需要自己根据实际业务逻辑添加,此示例只包含mqtt重连后重新订阅Topic + ''' + # 判断锁是否已经被获取 + if self.mp_lock.locked(): + return + self.mp_lock.acquire() + # 重新连接前关闭之前的连接,释放资源(注意区别disconnect方法,close只释放socket资源,disconnect包含mqtt线程等资源) + self.client.close() + # 重新建立mqtt连接 + while True: + net_sta = net.getState() # 获取网络注册信息 + if net_sta != -1 and net_sta[1][0] == 1: + call_state = dataCall.getInfo(1, 0) # 获取拨号信息 + if (call_state != -1) and (call_state[2][0] == 1): + try: + # 网络正常,重新连接mqtt + self.connect() + except Exception as e: + # 重连mqtt失败, 5s继续尝试下一次 + self.client.close() + utime.sleep(5) + continue + else: + # 网络未恢复,等待恢复 + utime.sleep(10) + continue + # 重新连接mqtt成功,订阅Topic + try: + # 多个topic采用list保存,遍历list重新订阅 + if self.topic is not None: + self.client.subscribe(self.topic, self.qos) + self.mp_lock.release() + except: + # 订阅失败,重新执行重连逻辑 + self.client.close() + utime.sleep(5) + continue + else: + utime.sleep(5) + continue + break # 结束循环 + # 退出重连 + return True + + def nw_cb(self, args): + ''' + dataCall 网络回调 + ''' + nw_sta = args[1] + if nw_sta == 1: + # 网络连接 + mqtt_log.info("*** network connected! ***") + self.__nw_flag = True + else: + # 网络断线 + mqtt_log.info("*** network not connected! ***") + self.__nw_flag = False + + def __listen(self): + while True: + try: + if not TaskEnable: + break + self.client.wait_msg() + except OSError as e: + # 判断网络是否断线 + if not self.__nw_flag: + # 网络断线等待恢复进行重连 + self.reconnect() + # 在socket状态异常情况下进行重连 + elif self.client.get_mqttsta() != 0 and TaskEnable: + self.reconnect() + else: + # 这里可选择使用raise主动抛出异常或者返回-1 + return -1 + + def loop_forever(self): + _thread.start_new_thread(self.__listen, ()) + + + +if __name__ == '__main__': + ''' + 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + ''' + utime.sleep(5) + checknet.poweron_print_once() + ''' + 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + 如果是网络无关代码,可以屏蔽 wait_network_connected() + 【本例程必须保留下面这一行!】 + ''' + checknet.wait_network_connected() + + def sub_cb(topic, msg): + # global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + + # c = MqttClient("umqtt_client_753", "mq.tongxinmao.com", 18830, reconn=False) + + def err_cb(error): + ''' + 接收umqtt线程内异常的回调函数 + ''' + mqtt_log.info(error) + c.reconnect() # 可根据异常进行重连 + + def HMAC(k, m): + SHA1_BLOCK_SIZE = 64 + KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k))) + KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK) + KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK) + inner_message = KEY_INNER + m + outer_message = KEY_OUTER + SHA256(inner_message).digest() + return SHA256(outer_message) + + + def get_hmac_sha256(k, m): + data = HMAC(k, m).digest() + print("HMAC(k, m).digest():", data) + print("HMAC(k, m).digest():", ubinascii.hexlify(data)) + hex_data = ubinascii.hexlify(data) + hex_data = hex_data.decode('ascii') + return hex_data + + + # 需要加密的数据 + data = "{}{}{}".format("lxRXQayZ4poQz8G","lxRXQayZ4poQz8G","cujg06l29iav591b") + # data = b"The data to encrypt" + # 密钥 + secret_key = b"6766A891EAAC855F62C05608CDA8E083" + + + checkpassword = get_hmac_sha256(secret_key,data) + print(checkpassword) + # 创建一个mqtt实例 +# + # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息 + # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId + deviceId = "lxRXQayZ4poQz8G" + deviceKey = "lxRXQayZ4poQz8G" + productKey = "cujg06l29iav591b" + # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式 + Client_id = "{}|{}|0|0|0".format(deviceId,productKey) + server = "dmp-mqtt.cuiot.cn" + port = 1883 + # {deviceKey}|{productKey} mqttUsername + userName = "{}|{}".format(deviceKey,productKey) + userpassword = checkpassword + c = MqttClient(Client_id, server, port, userName,"{}".format(userpassword)) + # 设置消息回调 + c.set_callback(sub_cb) + # 设置异常回调 + c.error_register_cb(err_cb) + # 建立连接 + c.connect() + # 订阅主题 + c.subscribe(b"$sys/cujg06l29iav591b/lxRXQayZ4poQz8G/property/batch_reply",0)#订阅消息主题 + mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") + # 发布消息 + # UnicodeHexStr_To_Utf8Str(str_data) + data_info = { + "messageId":"0", + "params": { + "data": [ + { + "key":"deviceOffOn", + "value": { + "deviceStatus":"Poweron", + "updateTime":"1711962300000", + "Imei":"860132060346475" + } + + }, + { + "key":"HeartRate", + "value":{ + "heartRate":98, + "updateTme":"1711962300000", + "Imei":"860132060346475" + } + }, + { + "key":"geoLocation", + "value":{ + "longitude": 118.763334, + "latitude": 32.0175, + "altitude": 3.87 + } + }, + { + "key":"powerSavingMode", + "value":0 + }, + { + "key":"IMEI", + "value":"860132060346475" + }, + { + "key":"DEVICE_TIME", + "value":"1712049829" + }, + { + "key":"MANUFACTURER", + "value":"fengda" + }, + { + "key":"REMAINING_POWER", + "value":60 + }, + { + "key":"DeviceState", + "value":"online" + } + ] + } + } + + data_json = ujson.dumps(data_info) + print("data_json:{}",data_json) + c.publish(b"$sys/cujg06l29iav591b/lxRXQayZ4poQz8G/property/batch",data_json)#publis主题内容 + + mqtt_log.info("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython") + # 监听mqtt消息 + # c.loop_forever() + # 等待5s接收消息 + # PS:如果需要测试重连,包括服务器断开连接等情况,请注释掉c.disconnect()和utime.sleep(5) + # utime.sleep(5) + # # 关闭连接 + # c.disconnect() + + + + -print("jrtc closed !!!!...") diff --git a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py index 5d338e83..54270d3e 100644 --- a/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py +++ b/2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py @@ -1,2 +1,2 @@ Version="V1.0" -Build_Time="2024-01-02 11:48:13" +Build_Time="2024-04-24 17:47:35" diff --git a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h index d8f4b3ef..fcdf08a9 100644 --- a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h +++ b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h @@ -56,7 +56,7 @@ #define MICROPY_QPY_MODULE_VFS_THREADSAFE (1) #if CONFIG_MBEDTLS - #define MICROPY_QPY_MODULE_USSL (0) + #define MICROPY_QPY_MODULE_USSL (1) #define MICROPY_QPY_SSL_MBEDTLS (1) #endif diff --git a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip index 1d3d86d9..b0c752f1 100644 Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ diff --git a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h index 5455ebf0..8974df17 100644 --- a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h +++ b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h @@ -2,8 +2,8 @@ #ifndef __APP_LINK_START_ADDR_H__ #define __APP_LINK_START_ADDR_H__ -#define APP_LINK_START_ADDR 0x80520000 -#define APP_FLASH_MAX_SIZE 0x190000 +#define APP_LINK_START_ADDR 0x80521000 +#define APP_FLASH_MAX_SIZE 0x1BA800 #define APP_RAM_START 0x7E3E0000 #define APP_RAM_MAX_SIZE 0x180000