From 714cf618cc86fecb3b957a0b4846c3ddd82a7825 Mon Sep 17 00:00:00 2001 From: Caisking Date: Thu, 18 Sep 2025 22:40:25 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E7=BB=91=E5=AE=9A=E7=9A=84?= =?utf8?q?=E5=AE=9E=E9=99=85=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../include/ThunderBirdGuideView.h | 1 + .../thunderbird/include/ThunderBirdModel.h | 16 +++ .../thunderbird/src/ThunderBirdGuideView.cpp | 13 +- .../thunderbird/src/ThunderBirdModel.cpp | 113 ++++++++++++++++++ .../thunderbird/src/ThunderBirdPresenter.cpp | 15 ++- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 6 +- 6 files changed, 157 insertions(+), 7 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdGuideView.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdGuideView.h index e705b46c7..8456fdefa 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdGuideView.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdGuideView.h @@ -19,6 +19,7 @@ namespace OHOS UIViewGroup *ThunderBirdGuideViewInit(void); void ClearAll(void); void Show(int16_t showView); + void UpdateQrcode(); enum : int16_t { THUNDERBIRD_GUIDEVIEW_1 = 0, diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h index 85ad1d32d..7c00ae359 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h @@ -90,6 +90,22 @@ namespace OHOS size_t GetTextLength() const; bool IsTextEmpty() const; + // 二维码相关函数 + std::string GetQrcodeContent(); + + // 设备ID验证相关函数 + std::string GetDeviceId(); + bool IsDeviceIdValid(); + bool ValidateIMEIChecksum(const std::string& imei); + + // 版本管理相关函数 + std::string GetAppVersion(); + std::string GetFirmwareVersion(); + std::string GetBuildVersion(); + std::string GetGitHash(); + std::string GetBuildTime(); + bool IsVersionValid(); + private: ThunderBirdModel(); virtual ~ThunderBirdModel(); diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdGuideView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdGuideView.cpp index b6fa84362..128395488 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdGuideView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdGuideView.cpp @@ -79,7 +79,7 @@ namespace OHOS if (qrcode_) { qrcode_->SetPosition(133, 169, 104, 104); - qrcode_->SetQrcodeInfo("https://example.com/device/bind?deviceId=DEVICE_001"); + qrcode_->SetQrcodeInfo(ThunderBirdModel::GetInstance()->GetQrcodeContent().c_str()); qrcode_->SetStyle(STYLE_PADDING_LEFT, 4); qrcode_->SetStyle(STYLE_PADDING_RIGHT, 4); qrcode_->SetStyle(STYLE_PADDING_TOP, 4); @@ -250,6 +250,17 @@ namespace OHOS break; } } + //更新二维码 + void ThunderBirdGuideView::UpdateQrcode() + { + if (qrcode_) + { + qrcode_->SetQrcodeInfo(ThunderBirdModel::GetInstance()->GetQrcodeContent().c_str()); + //打印 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "qrcode path:%s", ThunderBirdModel::GetInstance()->GetQrcodePath().c_str()); + qrcode_->Invalidate();//刷新 + } + } } diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index ea7141c58..eef97d549 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -884,6 +884,119 @@ { return m_currentTimeStr.empty(); } + + //获取设备ID + std::string ThunderBirdModel::GetDeviceId() + { + return std::string(uapi_ln_get_device_id()); + } + + //判断设备id是否有效 + bool ThunderBirdModel::IsDeviceIdValid() + { + // 获取设备ID(IMEI) + std::string deviceId = GetDeviceId(); + + // 检查是否为空 + if (deviceId.empty()) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: Device ID is empty"); + return false; + } + + // 检查长度(IMEI应该是15位) + if (deviceId.length() != 15) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: Invalid length %zu, expected 15", deviceId.length()); + return false; + } + + // 检查是否全为数字 + for (char c : deviceId) { + if (!std::isdigit(c)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: Contains non-digit character: %c", c); + return false; + } + } + + // 检查是否包含默认值或无效值 + if (deviceId == "000000000000000" || deviceId == "123456789012345") { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: Device ID is default/invalid value: %s", deviceId.c_str()); + return false; + } + + // 检查IMEI校验位(Luhn算法) + if (!ValidateIMEIChecksum(deviceId)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: IMEI checksum validation failed"); + return false; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::IsDeviceIdValid: Valid device ID: %s", deviceId.c_str()); + return true; + } + + // IMEI校验位验证(Luhn算法) + bool ThunderBirdModel::ValidateIMEIChecksum(const std::string& imei) + { + if (imei.length() != 15) { + return false; + } + + int sum = 0; + + // 处理前14位数字(从右到左,偶数位需要乘以2) + for (int i = 0; i < 14; i++) { + int digit = imei[i] - '0'; + + // 偶数位(从0开始计数,所以i为奇数时是偶数位)需要乘以2 + if (i % 2 == 1) { + digit *= 2; + if (digit > 9) { + digit -= 9; // 等同于 digit/10 + digit%10 + } + } + + sum += digit; + } + + // 计算校验位:(10 - (sum % 10)) % 10 + int checkDigit = (10 - (sum % 10)) % 10; + int actualCheckDigit = imei[14] - '0'; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ValidateIMEIChecksum: sum=%d, calculated=%d, actual=%d", + sum, checkDigit, actualCheckDigit); + + return checkDigit == actualCheckDigit; + } + + //获取二维码内容 + std::string ThunderBirdModel::GetQrcodeContent() + { + std::string qrcodeContent = "https://example.com/device/bind?deviceId=" + GetDeviceId(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::GetQrcodeContent: %s", qrcodeContent.c_str()); + return qrcodeContent; + } + + /** + 表情配置相关函数 + 1、表情结构体 + struct character{ + string characterId;//角色ID + string characterName;//角色名称 + string hairColor;//发色 + string hairStyle;//发型 + string eyesColor;//瞳色 + string eyesShape;//眼型 + string screenImage;//屏保图片 + bool screenImageAsEmoji;//屏保图片是否作为对话表情 + } + 2、表情配置相关函数 + 2.1 下载表情的路径 /user/userdata/characterId/(以角色ID为文件夹) + 2.2 切换表情接口 + 2.3 获取表情接口 + 2.4 删除表情接口 + */ + + + /* 1、新手引导 diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp index 25bbe9a50..721a0bd58 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp @@ -366,10 +366,10 @@ namespace OHOS { //如果在二维码界面 判断是否绑定 - if(ThunderBirdMainView::GetInstance()!= nullptr) + if(ThunderBirdMainView::GetInstance() != nullptr) { - int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView(); - int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView(); + int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView(); + int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView(); //如果在二维码界面 要一直判断绑定状态 绑定成功就返回主界面 if(currentSubView == ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3) { @@ -379,6 +379,15 @@ namespace OHOS //绑定成功 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); } + else + { + //判断二维码的有效性 + if(ThunderBirdModel::GetInstance()->IsDeviceIdValid()) + { + //更新二维码 + ThunderBirdGuideView::GetInstance()->UpdateQrcode(); + } + } } } } diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 1777e2b43..fde8a8c7b 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -37,19 +37,19 @@ char g_ln_last_target_version[64] = {0}; // 最近一次查询到的 OTA 包目 char g_ln_last_package_md5[65] = {0}; // 最近一次查询到的 OTA 包 MD5 int g_ln_last_package_size = 0; // 最近一次查询到的 OTA 包大小(字节) static int g_ln_audio_download_cancel = 0; /* 0=正常, 1=取消 */ -int g_ln_is_device_bound = -1; /* 设备绑定状态 */ +int g_ln_is_device_bound = 0; /* 设备绑定状态 */ char g_ln_device_user_id[64] = {0}; // 设备绑定用户ID /* 获取设备id: 设备唯一标识 */ char *uapi_ln_get_device_id(void) { - g_device_id = "DEVICE_PC_TEST_001"; + g_device_id = cat1_api_runtime_get_cat1_imei(); return g_device_id; } /* 获取设备iccid:设备物联网卡号 */ char *uapi_ln_get_device_iccid(void) { - g_device_iccid = "86123456789012345678"; + g_device_iccid = ppp_api_update_imei(); return g_device_iccid; } /* 获取设备model */ -- 2.17.1