Merge #2082 into sdk602patch0911 from refs/changes/2082/head 2085/target/1
author胡传军 <1224667075@qq.com>
Fri, 15 Aug 2025 02:46:12 +0000 (02:46 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Fri, 15 Aug 2025 02:46:12 +0000 (02:46 +0000)
Code review from 胡传军

* refs/changes/2082/head: (4 commits squashed)

  - 增加循环判断条件,避免断连后一直无法正确退出循环

  - Merge branch &#39;sdk602patch0911&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into 0911

  - Merge branch &#39;sdk602patch0911&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into 0911

  - 修改N9 tcp ota升级文件

Signed-off-by: aliyun8003852482 <1224667075@qq.com>
Reviewed-by: Caisking <3449750381@qq.com>
Reviewed-by: 罗正 <1732036298@qq.com>
Reviewed-by: aliyun8003852482 <1224667075@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Reviewed-by: aliyun6865282430 <1624952103@qq.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/2082
code/sdk/build/config/target_config/brandy/mk_fs_image/n9/fs/user/system/cat1ota/cat1Service.py
code/sdk/build/config/target_config/brandy/mk_fs_image/n9/fs/user/system/cat1ota/china_mobile_dmp.py
code/sdk/build/config/target_config/brandy/mk_fs_image/n9/fs/user/system/cat1ota/telecom_dmp.py

index d0b7271..a69f716 100644 (file)
@@ -50,11 +50,14 @@ import request
 import ql_fs
 import pm
 import sms
+import ujson
 
 from usr.EventMesh import eventMesh
+
 from usr.httpota import httpota
-# from usr.telecom_dmp import telecomDmpCb
-# from usr.china_mobile_dmp import chinamobileCb
+from usr.telecom_dmp import telecomDmpCb
+from usr.china_mobile_dmp import chinamobileCb
+
 from usr.china_mobile_ai_regulation import aiRegulation
 # 设置日志输出级别
 log.basicConfig(level=log.INFO)
@@ -78,7 +81,7 @@ sms.setCallback(msg_cb)#sms注册回调
 CAT1_SERVICE_HEAD = 'FE' #固定head 
 
 PROJECT_NAME = "Cat1SlipUDPService"
-PROJECT_VERSION = "PY_SRV_V19"
+PROJECT_VERSION = "PY_SRV_V21"
 CONFIG_JSON="/usr/system_config.json"
 CURRENT_APP_TYPE="pysrv"
 
@@ -403,9 +406,13 @@ class Cat1Service:
             httpota.run( str(parm).split("and")[0], str(parm).split("and")[-1])
             # eventMesh.publish("set_volte_switch",int(parm))
             # UDP_MSG_OTA
+        elif cmd == "1C":# 
+            self.read_dev_ai_id()
         elif cmd == "AC":#
             if self.ack_sem==1:
                 self.ack_sem=0
+      
+               
 
     def telecom_recv_cmd(self,cmd,parm): 
         if cmd == "10":
@@ -812,7 +819,7 @@ class Cat1Service:
         if 1: #CHINA_TELECOM_DM_FUN_ENABLE == 1:#电信入库功能 不使用设置 0 防止两边不同步修改
             if eventMesh.publish("get_dmp_change_mode") == 1:
                 eventMesh.publish("set_network_state",1)
-                # telecomDmpCb.telecom_dmp_power_on_init()
+                telecomDmpCb.telecom_dmp_power_on_init()
         if 1: #CHINA_MOBILE_DM_FUN_ENABLE == 1:
             if eventMesh.publish("get_dmp_change_mode") == 2:
                 eventMesh.publish("set_network_state",1)
@@ -820,7 +827,7 @@ class Cat1Service:
                     return
                 self.china_mobile_init = 1
                 #移动入库的初始化
-                # chinamobileCb.china_mobile_init()
+                chinamobileCb.china_mobile_init()
         if eventMesh.publish("get_dmp_change_mode") == 3:
             if self.china_mobile_ai_init == 1:
                 return
@@ -840,6 +847,30 @@ class Cat1Service:
     def stop(self):
         slip.destroy()
         return 0
+    
+    def read_dev_ai_id(self):
+        
+        IFEXIST = ql_fs.path_exists("/usr/cm_ai_regulation.json")   #
+        if IFEXIST == True: #文件存在
+            fileSize = ql_fs.path_getsize('usr/cm_ai_regulation.json')
+            if fileSize == 0:
+    
+                print("设备信息配置文件不存在\r\n")
+            else:
+                try:
+                    with open("/usr/cm_ai_regulation.json","r",encoding='utf-8') as fd:
+                        try:
+                            config_data = ujson.load(fd) #转换成json格式
+                            if len(config_data) != 0:
+                                if "deviceId" in config_data:# 
+                                    deviceId = str(config_data["deviceId"]) #设备ID
+                                    self.reply_cmd('1C',"{}".format(deviceId))
+                        except Exception as error:
+                            print("配置文件的内容不是json格式 保存数据的时候格式不对\r\n")
+                except Exception as error:
+                    print("打开配置文件失败\r\n")
+
+    
 
 
     # 封装tlv数据包
index 45962cc..8128328 100644 (file)
@@ -28,6 +28,8 @@ import modem
 import base64
 import request
 import ujson
+import sim
+
 BLOCK_SIZE = 16
 NEED_SAVE_CONFIG_FILE = 0  #是否需要保存上报次数 异常重试次数 时间戳到配置文件 0不保存 1保存
 #中国移动入库
@@ -154,9 +156,13 @@ class chinamobile:
 
     def china_mobile_first_get_config(self,url):
         ##############第一步#######获取采集规则配置#######
-        brand = "Watch"#品牌
-
-        model = "Watch"#型号
+        # brand = "KUMI"#品牌
+        # model = "Watch Soar"#型号
+        # NWO N9
+        brand = "NWO"#品牌
+        model = "NWO N9"#型号
+        
+        
         appKey = "M100001131"#不需要就填***appKey 厂商标识
         sdkVersion = "***"#非SDK传输
         apiVersion = "4.0.1"#接口定义 固定4.0.1
@@ -204,12 +210,16 @@ class chinamobile:
     def first_get_config_json(self):#开机上电获取配置信息 
         getresult = 0
         print("first_get_config_json false",self.__net_connected)
-        if self.__net_connected != 1:#网络不正常
+        network_state = eventMesh.publish("get_network_state")
+        if network_state != 1:#网络不正常
+            print("网络不正常")
             return getresult
         url = "https://{}//dm-multi-accept/multi/getMultiTerminalConfig".format(self.address)
         result_json = self.china_mobile_first_get_config(url)
+        
         if result_json == "":
-           return 0 
+            print("result_json == NULL")
+            return 0 
         # {
         #     "reportTime":1440,
         #     "reportNum":8,
@@ -277,15 +287,22 @@ class chinamobile:
         #########################第二步############自注册上报###################
         #设备自注册上报
         dev_autoregist_result = 0 #默认是1成功 0是失败
-        if self.__net_connected != 1:#网络不正常
+        network_state = eventMesh.publish("get_network_state")
+        if network_state != 1:#网络不正常
             return dev_autoregist_result
         #密钥
-        key = "f74c005251dc40c4b64a283827da3812"
+        key = "03816c12b6d24182981325e57670e478"
 
-        brand = "{}".format("XXX")#品牌
+        brand = "{}".format("NWO")#品牌
 
-        model = "Watch"#型号
-        appKey = "M100001131"#不需要就填***appKey 厂商标识
+        # model = "Watch Soar"#型号
+        model = "NWO N9"#型号
+        
+        # -*- coding: UTF-8 -*-
+#示例
+   
+
+        appKey = "M100001188"#不需要就填***appKey 厂商标识
         sdkVersion = "***"#非SDK传输
         apiVersion = "4.0.1"#接口定义 固定4.0.1
         apiType = "I"#非Android
@@ -297,33 +314,58 @@ class chinamobile:
         preField1 = "***"#预留字段1
         preField2 = "***"#预留字段2 
         preField3 = "***"#预留字段3
+        
+       
+        batteryCapacityCurr="***"
+        
 
         #不需要加密 #||分隔符不能超过11个 否则平台会解析出错
         config_data = "{}||{}||{}||{}||{}||{}||{}||{}||{}||{}||{}||{}".format(brand,model,appKey,sdkVersion,apiVersion,apiType,templateId,imei1,imei2,configType,preField1,preField2)
         
         #需要加密的数据明文
-        if (len(self.mac_data) == 0):#获取失败了
-            self.mac_data = "***"
+        mac_data="***"#eventMesh.publish("get_dev_mac")
+        
+        if (len(mac_data) == 0):#获取失败了
+            mac_data = "***"
+            
+        imsi = sim.getImsi()
+        print("Get IMSI : {}".format(imsi))
 
-        MAC = self.mac_data
+        MAC = mac_data
         # base64_MAC = sha256_encode(key,MAC)
-        RAM = "32MB"
+        RAM = "***"
         # base64_RAM = sha256_encode(key,RAM)
-        ROM = "144MB"
+        ROM = "***"
         # base64_ROM = sha256_encode(key,ROM)
-        CPU = "YH601S"
+        CPU = "***"
         # base64_CPU = sha256_encode(key,CPU)
-        sysVersion = "OpenHarmony 3.2"
+        GPU = "***"
+        
+        imsi2="***"
+         
+        sysVersion = "***"
+        
+        board = "***"
+        
         # base64_sysVersion = sha256_encode(key,sysVersion)
         if (len(self.software_version) == 0):#获取失败了
-            self.software_version = "Watch V1.0"
-        softwareVer = self.software_version
+            # self.software_version = "Watch Soar V1.0"
+            self.software_version = "NWO N9 V1.0"
+           
+        softwareVer = "NWO N9 V1.0"
         # base64_softwareVer = sha256_encode(key,softwareVer)
-        softwareName ="Watch"
+        # softwareName ="FD230"
+        softwareName ="***"
+        
+        sn="***"
+        
+        batteryCapacity="***"
+        
+        phoneNumber="***"
         # base64_softwareName = sha256_encode(key,softwareName)
-        volte="0" #0:开;1:关;-1:不支持
+        volte="***" #0:开;1:关;-1:不支持
         # base64_volte = sha256_encode(key,volte)
-        netType="4G"
+        netType="***"
         # base64_netType = sha256_encode(key,netType)
 
         resolution="466*466"
@@ -331,16 +373,16 @@ class chinamobile:
 
         screenSize = "1.43"
         # base64_screenSize = sha256_encode(key,screenSize)
-        wearingStatus ="-1"
+        wearingStatus ="未佩戴"
         # base64_wearingStatus = sha256_encode(key,wearingStatus)
 
-        networkStatus ="1"#1:连接;0:未连接;-1:不支持
+        networkStatus ="***"#1:连接;0:未连接;-1:不支持
 
         routerMac = "***"
 
         wifiMac = "***"
         # base64_networkStatus = sha256_encode(key,networkStatus)
-        encyr_data = [MAC,RAM,ROM,CPU,sysVersion,softwareVer,softwareName,volte,netType,resolution,screenSize,wearingStatus,networkStatus,routerMac,wifiMac]
+        encyr_data = [MAC,RAM,ROM,CPU,sysVersion,softwareVer,softwareName,volte,netType,resolution,screenSize,wearingStatus,networkStatus,routerMac,wifiMac,imsi,GPU,imsi2,board,sn,batteryCapacity,phoneNumber,batteryCapacityCurr]
         print(len(encyr_data))
         encyr_new_data=[]
         for i in range(len(encyr_data)):
@@ -363,24 +405,63 @@ class chinamobile:
         #     "networkStatus":"{}".format(base64_networkStatus)#网络状态
 
         # }
-        deviceInfo_tmp = {
-            "bluetoothMac":"{}".format(encyr_new_data[0]),#mac地址可填可不填
-            "ram":"{}".format(encyr_new_data[1]),#ram信息
-            "rom":"{}".format(encyr_new_data[2]),#rom信息
-            "cpu":"{}".format(encyr_new_data[3]),#cpu信息
-            "sysVersion":"{}".format(encyr_new_data[4]),#操作系统版本号
-            "softwareVer":"{}".format(encyr_new_data[5]),#固件版本号
-            "softwareName":"{}".format(encyr_new_data[6]),#固件名称
-            "volte":"{}".format(encyr_new_data[7]),#volte开关 默认是开
-            "netType":"{}".format(encyr_new_data[8]),#当前网络类型4G
-            "resolution":"{}".format(encyr_new_data[9]),#屏幕分辨率466*466
-            "screenSize":"{}".format(encyr_new_data[10]),#屏幕尺寸默认1.43
-            "wearingStatus":"{}".format(encyr_new_data[11]),#佩戴状态不支持
-            "networkStatus":"{}".format(encyr_new_data[12]),#网络状态
-            "routerMac":"{}".format(encyr_new_data[13]), #路由mac地址 ***
-            "mac":"{}".format(encyr_new_data[14]) #wifi mac
-        }
+        if configType_data=="keepAlive":
+            print("keepAlive :")
+            deviceInfo_tmp = {
+                "bluetoothMac":"{}".format(encyr_new_data[0]),#mac地址可填可不填
+                "ram":"{}".format(encyr_new_data[1]),#ram信息
+                "rom":"{}".format(encyr_new_data[2]),#rom信息
+                "cpu":"{}".format(encyr_new_data[3]),#cpu信息
+                "sysVersion":"{}".format(encyr_new_data[4]),#操作系统版本号
+                "softwareVer":"{}".format(encyr_new_data[5]),#固件版本号
+                "softwareName":"{}".format(encyr_new_data[6]),#固件名称
+                "volte":"{}".format(encyr_new_data[7]),#volte开关 默认是开
+                "netType":"{}".format(encyr_new_data[8]),#当前网络类型4G
+                "resolution":"{}".format(encyr_new_data[9]),#屏幕分辨率466*466
+                "screenSize":"{}".format(encyr_new_data[10]),#屏幕尺寸默认1.43
+                "wearingStatus":"{}".format(encyr_new_data[11]),#佩戴状态不支持
+                "networkStatus":"{}".format(encyr_new_data[12]),#网络状态
+                "routerMac":"{}".format(encyr_new_data[13]), #路由mac地址 ***
+                "mac":"{}".format(encyr_new_data[14]), #wifi mac
+                "imsi":"{}".format(encyr_new_data[15]), #imsi
+                "gpu":"{}".format(encyr_new_data[16]), #GPU
+                "imsi2":"{}".format(encyr_new_data[17]), #imsi2
+                "board":"{}".format(encyr_new_data[18]), #board
+                "sn":"{}".format(encyr_new_data[19]), #board
+                "batteryCapacity":"{}".format(encyr_new_data[20]), #board
+                "phoneNumber":"{}".format(encyr_new_data[21]), #board
+                "batteryCapacityCurr":"{}".format(encyr_new_data[22]), #board
+            }
+        else :
+             deviceInfo_tmp = {
+                "bluetoothMac":"{}".format(encyr_new_data[0]),#mac地址可填可不填
+                "ram":"{}".format(encyr_new_data[1]),#ram信息
+                "rom":"{}".format(encyr_new_data[2]),#rom信息
+                "cpu":"{}".format(encyr_new_data[3]),#cpu信息
+                "sysVersion":"{}".format(encyr_new_data[4]),#操作系统版本号
+                "softwareVer":"{}".format(encyr_new_data[5]),#固件版本号
+                "softwareName":"{}".format(encyr_new_data[6]),#固件名称
+                "volte":"{}".format(encyr_new_data[7]),#volte开关 默认是开
+                "netType":"{}".format(encyr_new_data[8]),#当前网络类型4G
+                "resolution":"{}".format(encyr_new_data[9]),#屏幕分辨率466*466
+                "screenSize":"{}".format(encyr_new_data[10]),#屏幕尺寸默认1.43
+                "wearingStatus":"{}".format(encyr_new_data[11]),#佩戴状态不支持
+                "networkStatus":"{}".format(encyr_new_data[12]),#网络状态
+                "routerMac":"{}".format(encyr_new_data[13]), #路由mac地址 ***
+                "mac":"{}".format(encyr_new_data[14]), #wifi mac
+                "imsi":"{}".format(encyr_new_data[15]), #imsi
+                "gpu":"{}".format(encyr_new_data[16]), #GPU
+                "imsi2":"{}".format(encyr_new_data[17]), #imsi2
+                "board":"{}".format(encyr_new_data[18]), #board
+                "sn":"{}".format(encyr_new_data[19]), #board
+                "batteryCapacity":"{}".format(encyr_new_data[20]), #board
+                "phoneNumber":"{}".format(encyr_new_data[21]), #board
+                
+            }
         json_data = ujson.dumps(deviceInfo_tmp)#需要转义的字符串
+        
+       
+            
 
         send_autoregist = {
             "endpoint":config_data,
@@ -621,6 +702,7 @@ class chinamobile:
             self.config_data["report_Num_old"] = self.report_Num_old
             self.write_config_msg_file(self.config_data)
         #设备自注册上报信息
+        print("onself_regist_report_cb:self.china_mobile_autoregist_infor")
         url = "https://{}//dm-multi-accept/multi/acceptMultiTerminalRegInfo".format(self.address)#上报地址
         confing_type = "autoRegist"#上报传输配置
         result = self.china_mobile_autoregist_infor(url,confing_type)
@@ -674,6 +756,7 @@ class chinamobile:
 
         url = "https://{}//dm-multi-accept/multi/acceptMultiTerminalHeartbeatInfo".format(self.address)#上报地址
         confing_type = "keepAlive"#上报传输配置
+        print("heart_report_cb:self.china_mobile_autoregist_infor")
         result = self.china_mobile_autoregist_infor(url,confing_type)
         if result != 1:
             #触发异常重试进制
index 28c8dc6..289ba2b 100644 (file)
@@ -32,7 +32,7 @@ REGIST_POWER_ON_TIME=5*60 #开机5分钟内就必须自注册触发
 MULTI_DAY_RESEND_T = 30*24*60*60-12*60*60#多日重发的机制的周期T 30天
 MULTI_DAY_RESEND_t = 12*60*60#多日重发的机制的周期t 0.5天
 def get_report_url_website(mode = None):#获取上报网址
-    url = "http://zzhc.vnet.cn:9998/"#上报网址
+    url = "https://zzhc.vnet.cn/pi/"#上报网址
     return url
 
 class telecomDmp:
@@ -234,16 +234,20 @@ class telecomDmp:
         print(cell_data)
         sendCellid = "{}".format(cell_data)
         REGVER = "12.0"#当前数据域协议版本号
-        MODEL = "TXB-Watch Soar"#机型字段 -前面是厂商名 -后面是设备名
+        
+        # MODEL = "TXB-Watch Soar"#机型字段 -前面是厂商名 -后面是设备名
+        
+        MODEL = "KNZ-NWO N9"#机型字段 -前面是厂商名 -后面是设备名
+        
         get_dev_version = eventMesh.publish("get_dev_version")#订阅消息
         if get_dev_version == None:
             get_dev_version = ""
-        SWVER = get_dev_version #软件版本号
+        SWVER = "NWO N9 V1.0"#get_dev_version #软件版本号
         UETYPE = "12"#终端类型 12是智能手表 11是儿童手表
         SIM1ICCID = iccid
         SIM1LTEIMSI = IMSI
         MACID = ""#可用WALN的地址 终端布支持WLAN 就是不可上网
-        OSVER = "RTOS"#操作系统版本号
+        OSVER = "OHOS 5.0"#操作系统版本号
         IMEI1 = imei#"876226002021717"#imei
         SIM1CELLID = sendCellid#下发的小区ID
         data = {
@@ -257,7 +261,8 @@ class telecomDmp:
             "OSVER":OSVER,
             "IMEI1":IMEI1,
             "SIM1CELLID":SIM1CELLID,
-            "NETWORKTYPE":4
+            # "NETWORKTYPE":4
+            "NWTYPE1":4,
         }
         data_infor=ujson.dumps(data)#将字典转换成json格式
         json_bytes = bytes(data_infor, 'utf-8')#转换成字节数
@@ -266,7 +271,8 @@ class telecomDmp:
         headers_T = {'Content-Type':'application/encrypted-json'} #请求头信息 按照实际要求填写
         request_result = 0
         try:
-            response = request.post("http://zzhc.vnet.cn:9998/", data=data_encode,headers =headers_T)
+            # https://zzhc.vnet.cn/pi
+            response = request.post("https://zzhc.vnet.cn/pi/", data=data_encode,headers =headers_T)
             request_result = 1
             if response.status_code == 200 : #返回状态码 200服务器正常解析数据
                 content = response.content#后台返回的结果