增加n9 移动ai入库修改 2561/1
authorhcj <1224667075@qq.com>
Mon, 20 Oct 2025 03:15:04 +0000 (11:15 +0800)
committerhcj <1224667075@qq.com>
Mon, 20 Oct 2025 03:15:04 +0000 (11:15 +0800)
cat1modem/src/N9/china_mobile_ai_regulation.py [new file with mode: 0644]
code/sdk/zhihui/ai/include/dev_authentication.h
code/sdk/zhihui/ai/src/ai_chat_service.c
code/sdk/zhihui/ai/src/dev_authentication.c
code/sdk/zhihui/ai_old/websocket_server_example.cpp
code/sdk/zhihui/ai_old/zhihui_ai_server.cpp
code/sdk/zhihui/config/include/ConfigModel.h
code/sdk/zhihui/config/include/ConfigModelC.h
code/sdk/zhihui/config/src/ConfigModel.cpp
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h

diff --git a/cat1modem/src/N9/china_mobile_ai_regulation.py b/cat1modem/src/N9/china_mobile_ai_regulation.py
new file mode 100644 (file)
index 0000000..8815b0f
--- /dev/null
@@ -0,0 +1,416 @@
+#AI 纳管对接文件
+import modem
+import request
+import utime
+import osTimer
+import ql_fs
+from machine import RTC
+from misc import Power
+import uos
+import ujson
+import urandom
+from usr.EventMesh import eventMesh
+HEARBEAT_REPORT_TIMER_CONFIG = 60*60*12#60*60*12   #心跳上报时间间隔12小时可更改做测试
+REALY_TIME_COUNT = 60*60#   #开启1小时实时定时器 
+HEART_REPORT_ERROR_TIMER = 60 #心率上报错误定时器检测 按照1分钟检查
+PRODUCTID = "1980099696668815362"  #产品ID
+PRODUCTKEY = "XUmWHSXvwputSKpb"   #产品KEY 平台创建产品是生成的
+HEART_REPORT_ERR_MAX_NUM = 30  #连续上报错误次数最大值 30 网络异常或者哪里报错了 重启设备 可根据实际的用户的需求更改次数
+REPORT_MODE = 1 #上报方式 1 24小时内一定上报一次 2 12小时后上报一次
+class AIRegulation:
+    #定义全局变量
+    def __init__(self):
+        self.timerStart = osTimer()
+        self.timerStartReportHr = osTimer()
+        self.productId = PRODUCTID
+        self.productKey = PRODUCTKEY 
+        self.deviceId = "" #设备ID
+        self.deviceSecret = "" #设备私钥
+        self.config_data = {}
+        self.getDevInforErrCount = 0  #获取设备信息错误次数累计
+        self.report_state = 0 #超过24小时清0
+        self.TimeSec = 0 #上报的时间戳
+        self.startTimerState = 0
+        self.software_version = ""
+        self.imei_new = ""
+        self.init_flag = 0
+        self.net_work_state = 0
+        self.dev_mac = ""
+        eventMesh.subscribe("get_dev_version",self.get_dev_version)
+        eventMesh.subscribe("set_dev_version",self.set_dev_version)
+        eventMesh.subscribe("get_dev_mac",self.get_dev_mac)
+        eventMesh.subscribe("set_dev_mac",self.set_dev_mac)
+        eventMesh.subscribe("get_network_state",self.get_network_state)#订阅消息
+        eventMesh.subscribe("set_network_state",self.set_network_state)#订阅消息
+        self.report_err_count = 0 #上报错误次数 30次
+
+    def set_network_state(self,event,msg):
+        self.net_work_state=int(msg)
+
+    def get_network_state(self,event,msg):
+        return self.net_work_state
+
+    def set_dev_version(self,event,msg):
+        self.software_version=str(msg)
+
+    def get_dev_version(self,event,msg):
+        return self.software_version
+    def get_dev_mac(self,event,msg):
+        return self.dev_mac
+    def set_dev_mac(self,event,msg):
+        self.dev_mac = str(msg)
+        #要或者设备的mac 和设备的固件版本号
+
+    #读取存储设备的设备参数 包含设备imei 设备ID和设备私钥 同一个设备设备ID和设备私钥不变
+    def read_dev_storage_param(self):
+        
+        IMEI = modem.getDevImei() #获取IMEI号
+        result_ok = 0 #返回结果状态
+        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:
+                result_ok = 0
+                print("设备信息配置文件不存在\r\n")
+                return result_ok
+            else:
+                try:
+                    with open("/usr/cm_ai_regulation.json","r",encoding='utf-8') as fd:
+                        try:
+                            self.config_data = ujson.load(fd) #转换成json格式
+                            if len(self.config_data) != 0:
+                                if "deviceId" in self.config_data:# 
+                                    self.deviceId = str(self.config_data["deviceId"]) #设备ID
+            
+                                    #存在
+                                if "deviceSecret" in self.config_data:
+                                    self.deviceSecret = str(self.config_data["deviceSecret"])
+                                    #存在
+                                if "TimeSec" in self.config_data:
+                                    self.TimeSec = self.config_data["TimeSec"]
+                                if "IMEI" in self.config_data:
+                                    self.imei_new = self.config_data["IMEI"]
+                                if str(self.imei_new) != str(IMEI): #设备IMEI不一样也要重新获取
+                                    self.config_data["IMEI"] = str(IMEI)
+                                    self.write_config_msg_file(self.config_data)
+                                    result_ok = 0
+                                    return result_ok
+                                
+                                if len(str(self.deviceId)) != 0 or len(str(self.deviceSecret)) != 0:
+                                    result_ok = 1
+                            else: #m没有存储数据 需要从平台上获取设备信息
+                                result_ok = 0
+                        except Exception as error:
+                            print("配置文件的内容不是json格式 保存数据的时候格式不对\r\n")
+                            result_ok = 0
+                except Exception as error:
+                    print("打开配置文件失败\r\n")
+                    result_ok = 0
+        else:
+            print("配置文件不存在!!!!\r\n")
+            result_ok = 0
+
+        print("cm_ai_regulation result_ok: {} self.config_data:{}\r\n".format(result_ok,self.config_data))
+        return result_ok
+    #写文件信息
+    def write_config_msg_file(self,msg):
+        
+        print("cm_ai_regulation msg:{}\r\n".format(msg))
+        with open("/usr/cm_ai_regulation.json",'w+',encoding="utf-8") as fd:
+            ujson.dump(msg,fd) 
+    def get_dev_info(self): #是否需要获取设备信息
+        request_result = 0
+        netWorkState = eventMesh.publish("get_network_state")
+        if netWorkState == 0: #网络异常
+            request_result = 0
+            return request_result
+        url = "https://ivs.chinamobiledevice.com:11443/v2/customer/device/secret/info"
+        #获取设备ID和设备私钥
+        get_dev_storage = self.read_dev_storage_param() #返回1说明已经获取过设备信息 不需要再重新获取了只有
+        if get_dev_storage == 0: #还没有获取设备信息需要获取一遍
+            #获取设备设备信息地址
+            IMEI = modem.getDevImei() #获取IMEI号
+            
+            headers_T ={"Content-Type":"application/json"}
+            config_data ={
+                "deviceNoType":"IMEI",
+                "deviceNo":str(IMEI),
+                "productKey":str(self.productKey),
+                "productId":str(self.productId),
+            }
+            print("ujson.dumps(config_data):{}".format(ujson.dumps(config_data)))
+            
+            result_json = ""
+            response = 0
+            try:
+                response = request.post(url, data=ujson.dumps(config_data),headers =headers_T)
+                if response.status_code == 200: #服务器响应成功并返回数据
+                    try:
+                        content = response.content
+                        c = next(content)
+                        result_json = ujson.loads(c)
+                        print("response.json:{}".format(ujson.loads(c)))
+                        code = ""
+                        message = ""
+                        success = False
+                        if "code" in result_json:
+                            code = result_json["code"]
+                        if "message" in result_json:
+                            message = result_json["message"]
+                        if "success" in result_json:
+                            success = result_json["success"]
+                        if code == "200" and message == "成功" and success == True:
+                            if "data" in result_json:
+                                data_json = result_json["data"]
+                                if "deviceId" in data_json:
+                                    self.deviceId = data_json["deviceId"]
+                                if "deviceSecret" in data_json:
+                                    self.deviceSecret = data_json["deviceSecret"]
+
+                                if len(self.deviceId) != 0 or len(self.deviceSecret) != 0: #获取设备信息成功 保存数据 用做心跳上报
+                                    request_result = 1
+                                    self.config_data["deviceId"] = str(self.deviceId)
+                                    self.config_data["deviceSecret"] = str(self.deviceSecret)
+                                    IMEI = modem.getDevImei() #获取IMEI号
+                                    self.config_data["IMEI"] = str(IMEI)
+                                    self.write_config_msg_file(self.config_data)
+                                # {
+                                #     "code":"200",
+                                #     "message":"成功",
+                                #     "success": true,
+                                #     "data":{
+                                #     "deviceId":"xxx",
+                                #     "deviceNo":"xxx",
+                                #     "productId":"xxx",
+                                #     "deviceSecret":"xxx"
+                                #     }
+                                # }
+                            else:
+                                request_result = 0
+                                print("后台返回数据json字段里面没有data字段\r\n")
+                        else:
+                            request_result = 0
+                            print("后台返回数据失败 可能是设备没有加入产品或者产品私钥或者产品ID对不上\r\n")
+                    except Exception as e: #不是json格式
+                        print("not json data:{}".format(e))
+                        request_result = 0
+                else:
+                    print("未响应 或者网络异常连接不上后台\r\n")
+                    request_result = 0
+            except Exception as e:
+                print("response error:{}".format(e))
+                request_result = 0
+        else:
+            request_result = 1
+        return request_result
+
+    #上报心跳数据
+    def report_hr_data(self): #设备ID 设备私钥不为空才可以上报
+        result_s = 0
+        netWorkState = eventMesh.publish("get_network_state")
+        if netWorkState == 0: #网络异常
+            result_s = 0
+            return result_s
+        if len(str(self.deviceId)) != 0 and len(str(self.deviceSecret)) != 0:
+
+            #########################################################
+            # {
+            #     "deviceId":"1927659130106658817",
+            #     "deviceSecret":"xmvlRHbEaKPtCqHt",
+            #     "productId":"1927646275585744898",
+            #     "productKey":"iijgiGiTolCblSFE",
+            #     "params": {
+            #         "innerIp": [
+            #             "127.0.0.1"
+            #         ],
+            #         "netSpeed": "0Mbps",
+            #         "netType": "4G",
+            #         "platform": "RTOS",
+            #         "sdkVersion": "ai_http_1.0",
+            #         "firmwareVersion": "0.0.5.2",
+            #         "imei": "860132060564184",
+            #         "cmei": "",
+            #         "mac": ""
+            #     }
+            # }
+            IMEI = modem.getDevImei() #获取IMEI号
+            tmp_mac = ""
+            if len(self.dev_mac) != 0:
+                tmp_mac = self.dev_mac.replace(':', '-') #将传过来的字符里面的:转换成-
+            #数据格式内容
+            data_json = {
+                "deviceId":str(self.deviceId), #设备ID
+                "deviceSecret":str(self.deviceSecret), #设备私钥
+                "productId":str(self.productId), #产品ID
+                "productKey":str(self.productKey), #产品私钥
+                "params": {
+                    "innerIp": [
+                        "127.0.0.1"
+                    ],
+                    "netSpeed": "0Mbps",
+                    "netType": "4G",
+                    "platform": "RTOS",
+                    "sdkVersion": "ai_http_1.0",
+                    "firmwareVersion":str(self.software_version), #设备固件版本号
+                    "imei": str(IMEI), #设备IMEI号
+                    "cmei": "",
+                    "mac": str(tmp_mac) #设备MAC地址
+                }
+            }
+            url = "https://ivs.chinamobiledevice.com:11443/v2/customer/device/report"  #post请求上报数据心跳地址
+            #获取设备ID和设备私钥
+            try:
+                headers_T ={"Content-Type":"application/json"}  #应用是json格式
+                response = request.post(url, data=ujson.dumps(data_json),headers =headers_T) #post请求数据
+                if response.status_code == 200: #服务器响应成功并返回数据
+                    try:
+                        content = response.content
+                        c = next(content)
+                        result_json = ujson.loads(c) #将字符串转换成json格式
+                        print("response.json:{}".format(result_json))
+                        code = ""
+                        message = ""
+                        success = False
+                        if "code" in result_json:
+                            code = result_json["code"]
+                        if "message" in result_json:
+                            message = result_json["message"]
+                        if "success" in result_json:
+                            success = result_json["success"]
+                        if code == "200" and message == "成功" and success == True:   #上报成功返回
+                            date_tmp = utime.localtime()
+                            time_tmp = utime.mktime(date_tmp) #获取当前时间戳 用于下次时间判断上报心跳数据
+                            print("date_tmp :{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
+                            self.report_state = 1 #表示上报成功 置标志1 12小时之内不清0 12小时之后再次上报清零
+                            self.TimeSec = str(time_tmp)
+                            self.config_data["TimeSec"] = str(time_tmp)
+                            IMEI = modem.getDevImei() #获取IMEI号
+                            self.config_data["IMEI"] = str(IMEI)
+                            self.write_config_msg_file(self.config_data)
+                            # {
+                            #     "code":"200",
+                            #     "message":"成功",
+                            #     "success": true,
+                            #     "data":{
+                            #     "deviceId":"xxx",
+                            #     "protocolTypeTime":"xxx"
+                            #     }
+                            # }
+                            result_s = 1
+                        else:
+                            result_s = 0
+                    except Exception as e: #不是json格式
+                        print("response:{}".format(e))
+                        result_s = 0
+                else:
+                    result_s = 0
+            except Exception as e:
+                print("response:{}".format(e))
+                result_s = 0
+            if REPORT_MODE == 1: #上报方式1
+                if result_s == 1: #当前上报数据成功  开启下一个上报心跳数据定时器
+                    date_tmp = utime.localtime()
+                    time_tmp = utime.mktime(date_tmp)
+                    random_integer = urandom.randint(-15, 15) #两个时间戳相减大于24小时啧清0
+                    timerStart_init = HEARBEAT_REPORT_TIMER_CONFIG*1000+random_integer*1000*60
+                    print("timerStart_init {} random_integer:{}\r\n".format(timerStart_init,random_integer))
+                    self.timerStartReportHr.start(timerStart_init,0,self.timerStartReportHrCbOne)#重新开始 单次定时器
+            else: #上报方式2
+                if self.startTimerState == 0:
+                    self.startTimerState = 1
+                    self.open_report_start_timer()
+        else:
+            result_s = 2
+            self.AIRegulation_init() #重新初始化
+            return result_s
+        return result_s
+    def timerStartReportHrCbOne(self,*argc):
+        reportStatus = self.report_hr_data() #上报心跳数据接口函数
+        print("timerStartReportHrCbOne {}\r\n".format(reportStatus))
+        if reportStatus == 0: #当前上报失败 开启1分钟的定时器检测
+            self.timerStart.stop()
+            self.report_err_count = 0
+            self.timerStart.start(HEART_REPORT_ERROR_TIMER*1000,1,self.oneMinTimerStartCb)#重新开始
+        else:
+            self.timerStart.stop()
+    
+    def oneMinTimerStartCb(self,*argc):
+        reportStatus = self.report_hr_data()
+        print("oneMinTimerStartCb {}\r\n".format(reportStatus))
+        if reportStatus != 0: #
+            self.timerStart.stop()
+        else:
+            self.report_err_count+=1
+            if self.report_err_count >= HEART_REPORT_ERR_MAX_NUM:
+                self.report_err_count = 0
+                self.timerStart.stop()
+                Power.powerRestart() #重启设备 可能网络异常或者哪里出错了
+
+    def timerStartReportHrCb(self,*argc): #上报心跳定时器回调
+        date_tmp = utime.localtime()
+        time_tmp = utime.mktime(date_tmp)
+        random_integer = urandom.randint(-15, 15) #-15 - +15上报时间随机值分钟单位 *60*1000
+        data = RTC().datetime()
+        year = data[0]
+        month = data[1]
+        day = data[2]
+
+        if self.report_state == 1:  #上报过一次 就等下一个12小时再上报一次
+            #当前时间大于上次记录时间加上12小时就上报一次
+            next_alarm_time = utime.localtime(int(self.TimeSec))
+            old_month = next_alarm_time[1]
+            old_day = next_alarm_time[2]
+            old_year = next_alarm_time[0]
+            # if 1:
+            #     if old_year != year or old_month != month or old_day != day:
+            #         self.report_state = 0 
+            #         self.report_hr_data() 
+                
+            # else:
+            if (time_tmp >= self.TimeSec + HEARBEAT_REPORT_TIMER_CONFIG*1000 + random_integer*60*1000) or (old_year != year or old_month != month or old_day != day): #or old_year != year or old_month != month or old_day != day: #上次上报时间戳+12小时时间戳 大于当前时间戳 上报一次 或者年 月 日不一致也上报一次
+                self.report_state = 0 
+                self.report_hr_data()
+        else: #确保12小时之内上报一次 每一个小时上
+            self.report_hr_data()#上报一次心跳数据
+
+    def open_report_start_timer(self): #1小时的定时器
+        self.timerStartReportHr.start(REALY_TIME_COUNT*1000,1,self.timerStartReportHrCb)#1小时定时
+        
+    def timerStartCb(self,*argc):#获取设备信息定时器回调
+        getDevInfoState = self.get_dev_info()
+        if getDevInfoState == 0:#
+            self.getDevInforErrCount+=1
+            if self.getDevInforErrCount >= 20:
+                self.getDevInforErrCount = 0
+                self.timerStart.stop()
+        else:
+            self.getDevInforErrCount = 0
+            self.timerStart.stop()
+            self.report_hr_data()#上报一次心跳数据
+
+    def AIRegulation_init(self):#AI 纳管 初始化 获取完设备数据后立马上报心跳数据
+        status = eventMesh.publish("get_factory_status")
+        if status == None:
+            status = 0
+        print("get_factory_status:{}\r\n".format(status))
+        if status == 0:#恢复出厂或者新的机器需要清空不必要的数据
+            if self.init_flag == 0:#只初始化一次
+                IFEXIST = ql_fs.path_exists("/usr/cm_ai_regulation.json") 
+                if IFEXIST == True:
+                    uos.remove("/usr/cm_ai_regulation.json")
+                self.init_flag = 1
+        self.report_state = 0
+        self.getDevInforErrCount = 0
+        self.report_err_count = 0
+        self.timerStartReportHr.stop() 
+
+        self.startTimerState = 0
+        getDevInfoState = self.get_dev_info()
+        if getDevInfoState == 0:#开机获取失败了再等30s重新获取 获取二十次都失败就等下次重启设备获取
+            self.timerStart.stop()
+            self.timerStart.start(30*1000,1,self.timerStartCb)#重新开始 开机10分钟内没有获取到设备信息就不获取了需要手动重启设备
+        else: #设备开机获取设备信息成功 立马上报一次心跳数据
+            self.report_hr_data()#上报一次心跳数据
+
+aiRegulation = AIRegulation()
+
index 685e085..cda731f 100644 (file)
@@ -52,13 +52,6 @@ int active_md5_buf(char *in_buf,char*md5_str);
  */\r
 bool read_dev_token(char *data_token);\r
 \r
-/**\r
- * @brief 获取设备ID\r
- * @param device_id 输出缓冲区,存储设备ID\r
- * @return 无返回值\r
- */\r
-void get_dev_id(char *device_id);\r
-\r
 #ifdef __cplusplus\r
 }\r
 #endif /* __cplusplus */\r
index 5471c04..e20ebe5 100644 (file)
@@ -81,7 +81,7 @@ bool chat_api_ws_url_init(char * url_buf,const char *server_url,uint8_t type_ai)
         char * Service_url="118.145.158.207:22080";
 
         char device_id[128]={0};
-        get_dev_id(device_id);
+        get_cmai_dev_id(device_id);
     
         char * product_id="1927646275585744898";
         
index 0a32d07..e179342 100644 (file)
@@ -473,16 +473,17 @@ extern bool read_dev_pass(char *data_pass);
 extern uint32_t post_data_by_get_file(char *data,uint16_t data_len);
 bool read_dev_token(char *data_token);
 
-void get_dev_id(char *device_id_str)
-{
-    if(device_id_str==NULL)
-    {
-        return;
-    }
-    unsigned char device_id[6] = {0};
-    bluetooth_get_local_addr(&device_id[0],6);
-    sprintf(device_id_str,"%02X%02x%02X%02X%02X%02x",device_id[5],device_id[4],device_id[3],device_id[2],device_id[1],device_id[0]);
-}
+
+// void get_dev_id(char *device_id_str)
+// {
+//     if(device_id_str==NULL)
+//     {
+//         return;
+//     }
+//     unsigned char device_id[6] = {0};
+//     bluetooth_get_local_addr(&device_id[0],6);
+//     sprintf(device_id_str,"%02X%02x%02X%02X%02X%02x",device_id[5],device_id[4],device_id[3],device_id[2],device_id[1],device_id[0]);
+// }
 
 uint32_t aut_login_time=0;
 
index 3aa091a..1cd3745 100644 (file)
@@ -21,6 +21,8 @@
 
 #include "chat_https_servrt.h"
 
+#include "ConfigModelC.h"
+// #include "mp3_decoder.h"
 
 // #include "common/typed_text.h"
 
@@ -424,13 +426,13 @@ bool chat_url_callback(ws_server_type_t type, char *url_buf, uint32_t url_size,
     char token[64] = {0};
     if (read_dev_token(token)) {
         char device_id[128] = {0};
-        get_dev_id(device_id);
+        get_cmai_dev_id(device_id);
         char *product_id = "1927646275585744898";
         snprintf(url_buf, url_size, "ws://amp.raisound.com/chat/ws?device_id=%s&product_id=%s&dt=%s&platform=aliyun&noCache=1", 
                 device_id, product_id, token);
     } else {
         char device_id[128] = {0};
-        get_dev_id(device_id);
+        get_cmai_dev_id(device_id);
         char *product_id = "1927646275585744898";
         
         // 根据全局AI类型选择不同的URL
@@ -521,7 +523,7 @@ static void AIVoiceDataCallback_(const uint8_t* data, uint32_t size, void* userD
         printf("Services context not initialized");
         return;
     }
-    // printf("Audio record callback, size: %d", size);
+        // printf("Audio record callback, size: %d", size);
     
     /* 🆕 根据ASR服务启动标识决定是否发送音频数据 */
     if (asr_is_ready) {
@@ -576,7 +578,7 @@ errcode_t start_all_websocket_servers(uint8_t chat_ai_type)
 
     // ai_media_init();
     old_Start_AIVoice(AIVoiceDataCallback_,nullptr,nullptr,nullptr,false);
-    
+        
     /* 不进行默认回退注册,未注册时仅打印错误日志 */
 
     printf("All WebSocket servers started successfully\n");
index 8b4e7c0..aaa5c83 100644 (file)
@@ -109,7 +109,6 @@ extern void ble_set_ai_Answer_str(char *str, uint8_t type);
 extern void SendMsgToUIService(uint32_t msg_id, uint32_t param, void *data, uint32_t len);
 extern int send_msg_data_into_Ai_msg_queue(void *data, uint16_t len, uint8_t type);
 extern bool aut_login(void);
-extern void get_dev_id(char *device_id);
 extern void AIStreamFlush(void);
 extern void AIStreamWrite(uint8_t *buf, uint32_t len);
 
index 03fdd2a..80a4a2c 100644 (file)
@@ -153,6 +153,9 @@ namespace OHOS
             CONFIGMODEL_ITEM_URAT_AT_CONTROL_STATUS,//串口控制状态
 
             CONFIGMODEL_ITEM_SAVE_RUNTIMR_LOG_STATUS,//运行日志保存
+
+            CONFIGMODEL_ITEM_DEV_ID,
+
             CONFIGMODEL_ITEM_MAX,
 
            
@@ -428,6 +431,7 @@ namespace OHOS
             {ConfigDataType::DATATYPE_INT,     "goal_distance_time",             "1"   },// CONFIGMODEL_ITEM_SPORTS_GOAL_DISTANCE,    //运动目标距离   8.0(km)
             {ConfigDataType::DATATYPE_BOOL,     "urat_at_status",             "false"   },//CONFIGMODEL_ITEM_URAT_AT_CONTROL_STATUS // 串口AT 默认 关闭
             {ConfigDataType::DATATYPE_INT,     "runtime_log_status",             "0"   },//CONFIGMODEL_ITEM_SAVE_RUNTIMR_LOG_STATUS,//运行日志保存
+            {ConfigDataType::DATATYPE_STRING,     "ai_dev_id",       ""},//CONFIGMODEL_ITEM_DEV_ID///移动id
 
 
         };
index 58ae27a..1004f82 100644 (file)
@@ -155,7 +155,9 @@ void set_ppp_baudrate_from_config_model(uint32_t value);
 /* PPP 波特率 */
 uint32_t get_ppp_baudrate_from_config_model(void);
 
+int set_cmai_dev_id(char *buf);
 
+int get_cmai_dev_id(char *buf);
 
 
 #ifdef __cplusplus
index e1231aa..43a6cc4 100644 (file)
@@ -1674,6 +1674,21 @@ uint32_t get_ppp_baudrate_from_config_model(void)
     return OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_PPP_BAUDRATE);
 }
 
+int set_cmai_dev_id(char *buf)
+{
+    OHOS::ConfigModel::GetInstance()->set_condigData_String(OHOS::ConfigModel::CONFIGMODEL_ITEM_DEV_ID,buf);
+    return 0;
+}
+
+int get_cmai_dev_id(char *buf)
+{
+    std::string str = OHOS::ConfigModel::GetInstance()->get_configData_string(OHOS::ConfigModel::CONFIGMODEL_ITEM_DEV_ID);
+    memcpy(buf,str.c_str(),str.length());
+    return 0;
+}
+
+
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 2deac88..bfb9b1a 100644 (file)
@@ -1185,6 +1185,66 @@ static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备
     
 }
 
+void Get_AI_DEV_ID_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动
+{
+   
+    if(Check_CRC(data,len,crcvalue))
+    {
+        char device_id[128]={0};
+        get_cmai_dev_id(device_id);
+
+        cJSON *dataJSON = cJSON_CreateObject();
+        cJSON_AddStringToObject(dataJSON,"device_id",device_id);
+        cJSON_AddStringToObject(dataJSON,"product_id","1927646275585744898");
+        char *json_format = cJSON_PrintUnformatted(dataJSON);
+        cJSON_Delete(dataJSON);
+
+        uint32_t data_len = strlen(json_format);
+        uint32_t surplus_len=data_len;
+        uint32_t pack;
+        uint16_t pack_size=(ble_nus_max_data_len-18);
+        if(pack_size>482)pack_size=482;
+
+        if(data_len%pack_size==0)
+        {
+            pack=data_len/pack_size;
+        }
+        else
+        {   
+            pack=data_len/pack_size+1;
+        }
+        uint32_t pack_id=1;
+        uint32_t offset=0;
+        while (surplus_len!=0)
+        {
+            if(surplus_len>=pack_size)
+            {
+                surplus_len=surplus_len-pack_size;
+
+
+                ble_data_type type_={0x01,0x50,data_len,pack,pack_id};
+                send_big_data(type_,json_format+offset,pack_size);
+                offset+=pack_size;
+            }
+            else
+            {
+                
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+                ble_data_type type_={0x01,0x50,data_len,pack,pack_id};
+                send_big_data(type_,json_format+offset,surplus_len);
+                break;
+            }
+            pack_id++;
+        }
+        cJSON_free(json_format);
+
+
+    }else{
+        ble_reply_cmdarr(SYN_AI_DEV_ID,NULL,0);
+    }
+}
+
+
 void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息
 {
     uint8_t value[19];
@@ -6346,6 +6406,9 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case GET_DMP_MODE_CMD://0X0132
             GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);
             break;
+        case SYN_AI_DEV_ID://0X0132
+            Get_AI_DEV_ID_Cmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
         default:
             break;
     }
index 71de42b..52529c4 100644 (file)
@@ -119,6 +119,8 @@ void cameram_send_data(void);
 
 #define MAX_INTERVAL_MS_BETWEEN_2_CMD 50  // 50ms 在一个分包里,如果多个指令间超过50ms,则认为分包失败
 
+#define SYN_AI_DEV_ID 0x0150 //同步ai认证数据
+
 /*******************data structure*************************/
 
 #pragma pack(1)