G10 G15老化测试 G10格物改成TLS加密通道
authordxy15521469561 <1731678236@qq.com>
Thu, 25 Apr 2024 07:32:14 +0000 (15:32 +0800)
committerdxy15521469561 <1731678236@qq.com>
Thu, 25 Apr 2024 07:32:14 +0000 (15:32 +0800)
12 files changed:
2.sdk/project/D10/new.bat
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/EventMesh.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/mgr_d15.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/sleep_test.py
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h

index ca3ab81..43458e9 100644 (file)
@@ -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
index 4fb4c89..e1a2521 100644 (file)
@@ -9,7 +9,8 @@ model = "D10"
 project = "D10"
 
 platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分
-# platform = ""#格物平台 不用的话选择空
+# platform = "D10"#格物平台 不用的话选择空
+# platform = "D15"#格物平台 不用的话选择空
 
 # model = "G10W_DT_YBX_"
 
index 9fe35c7..9bbf5e9 100644 (file)
@@ -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
index e398b13..ffec04c 100644 (file)
@@ -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
index 032281c..c56a8dc 100644 (file)
@@ -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):
index 221ec97..87dca01 100644 (file)
@@ -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):
index 409b351..6e64fe9 100644 (file)
@@ -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)
index 31f2970..95e6b19 100644 (file)
@@ -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 !!!!...")
index d8f4b3e..fcdf08a 100644 (file)
@@ -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
 
index 1d3d86d..b0c752f 100644 (file)
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
index 5455ebf..8974df1 100644 (file)
@@ -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