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();
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);
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();//刷新
+ }
+ }
}
{
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、新手引导
{
//如果在二维码界面 判断是否绑定
- 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)
{
//绑定成功
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
}
+ else
+ {
+ //判断二维码的有效性
+ if(ThunderBirdModel::GetInstance()->IsDeviceIdValid())
+ {
+ //更新二维码
+ ThunderBirdGuideView::GetInstance()->UpdateQrcode();
+ }
+ }
}
}
}
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 */