From e5d78d7c81a437f4e0e66bdcba368f34eca4efb0 Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Mon, 20 Oct 2025 11:15:04 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0n9=20=E7=A7=BB=E5=8A=A8ai?= =?utf8?q?=E5=85=A5=E5=BA=93=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../src/N9/china_mobile_ai_regulation.py | 416 ++++++++++++++++++ .../zhihui/ai/include/dev_authentication.h | 7 - code/sdk/zhihui/ai/src/ai_chat_service.c | 2 +- code/sdk/zhihui/ai/src/dev_authentication.c | 21 +- .../ai_old/websocket_server_example.cpp | 10 +- code/sdk/zhihui/ai_old/zhihui_ai_server.cpp | 1 - code/sdk/zhihui/config/include/ConfigModel.h | 4 + code/sdk/zhihui/config/include/ConfigModelC.h | 2 + code/sdk/zhihui/config/src/ConfigModel.cpp | 15 + .../ble_service/bleservice/bleEvent.c | 63 +++ .../ble_service/bleservice/bleEvent.h | 2 + 11 files changed, 520 insertions(+), 23 deletions(-) create mode 100644 cat1modem/src/N9/china_mobile_ai_regulation.py diff --git a/cat1modem/src/N9/china_mobile_ai_regulation.py b/cat1modem/src/N9/china_mobile_ai_regulation.py new file mode 100644 index 000000000..8815b0fc7 --- /dev/null +++ b/cat1modem/src/N9/china_mobile_ai_regulation.py @@ -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() + diff --git a/code/sdk/zhihui/ai/include/dev_authentication.h b/code/sdk/zhihui/ai/include/dev_authentication.h index 685e085fe..cda731fc1 100644 --- a/code/sdk/zhihui/ai/include/dev_authentication.h +++ b/code/sdk/zhihui/ai/include/dev_authentication.h @@ -52,13 +52,6 @@ int active_md5_buf(char *in_buf,char*md5_str); */ bool read_dev_token(char *data_token); -/** - * @brief 获取设备ID - * @param device_id 输出缓冲区,存储设备ID - * @return 无返回值 - */ -void get_dev_id(char *device_id); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/code/sdk/zhihui/ai/src/ai_chat_service.c b/code/sdk/zhihui/ai/src/ai_chat_service.c index 5471c0427..e20ebe501 100644 --- a/code/sdk/zhihui/ai/src/ai_chat_service.c +++ b/code/sdk/zhihui/ai/src/ai_chat_service.c @@ -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"; diff --git a/code/sdk/zhihui/ai/src/dev_authentication.c b/code/sdk/zhihui/ai/src/dev_authentication.c index 0a32d0783..e179342c8 100644 --- a/code/sdk/zhihui/ai/src/dev_authentication.c +++ b/code/sdk/zhihui/ai/src/dev_authentication.c @@ -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; diff --git a/code/sdk/zhihui/ai_old/websocket_server_example.cpp b/code/sdk/zhihui/ai_old/websocket_server_example.cpp index 3aa091aa4..1cd3745e8 100644 --- a/code/sdk/zhihui/ai_old/websocket_server_example.cpp +++ b/code/sdk/zhihui/ai_old/websocket_server_example.cpp @@ -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"); diff --git a/code/sdk/zhihui/ai_old/zhihui_ai_server.cpp b/code/sdk/zhihui/ai_old/zhihui_ai_server.cpp index 8b4e7c00f..aaa5c833c 100644 --- a/code/sdk/zhihui/ai_old/zhihui_ai_server.cpp +++ b/code/sdk/zhihui/ai_old/zhihui_ai_server.cpp @@ -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); diff --git a/code/sdk/zhihui/config/include/ConfigModel.h b/code/sdk/zhihui/config/include/ConfigModel.h index 03fdd2a16..80a4a2c10 100644 --- a/code/sdk/zhihui/config/include/ConfigModel.h +++ b/code/sdk/zhihui/config/include/ConfigModel.h @@ -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 }; diff --git a/code/sdk/zhihui/config/include/ConfigModelC.h b/code/sdk/zhihui/config/include/ConfigModelC.h index 58ae27aaf..1004f827b 100644 --- a/code/sdk/zhihui/config/include/ConfigModelC.h +++ b/code/sdk/zhihui/config/include/ConfigModelC.h @@ -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 diff --git a/code/sdk/zhihui/config/src/ConfigModel.cpp b/code/sdk/zhihui/config/src/ConfigModel.cpp index e1231aa2a..43a6cc49e 100644 --- a/code/sdk/zhihui/config/src/ConfigModel.cpp +++ b/code/sdk/zhihui/config/src/ConfigModel.cpp @@ -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 } diff --git a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c index 2deac8886..bfb9b1a9a 100644 --- a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c +++ b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c @@ -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; } diff --git a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h index 71de42b34..52529c427 100644 --- a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h +++ b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h @@ -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) -- 2.17.1