From e8425dc8a79f958d5bf4905dbb9f2412c3eecf59 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 24 Mar 2026 14:55:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E6=8A=A5cmei=20=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/ble_manager.dart | 11 +++++++++++ .../agent_service/AgentService.kt | 6 ++++++ .../agent_service/AgentServicePlugin.kt | 1 + .../agent_service/BleMediaService.kt | 3 +++ .../yunqiinnovation/agent_service/StsAgent.kt | 17 +++++++++++++---- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 7327929b6..ede3f510b 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -966,6 +966,16 @@ class BleManager extends GetxService { final stsDeviceNo = _storage.read('device_sts_code') ?? ''; final stsDeviceId = _storage.read('sts_device_id') ?? ''; final stsDeviceSecret = _storage.read('sts_device_secret') ?? ''; + // 从 UserDevice 获取当前连接设备的 CMEI + final mac = currentDeviceAddress?.toUpperCase() ?? ''; + String stsCmei = ''; + try { + final matchedDevice = userInfo.User.instance.devices.firstWhere( + (d) => d.devicemac.toUpperCase() == mac, + ); + stsCmei = matchedDevice.cmei; + } catch (_) {} + Logger.info('lxm--当前设备 CMEI: $stsCmei (MAC=$mac)'); final config = { // STS 模式路由 @@ -976,6 +986,7 @@ class BleManager extends GetxService { 'stsDeviceNo': stsDeviceNo, 'stsDeviceId': stsDeviceId, 'stsDeviceSecret': stsDeviceSecret, + 'stsCmei': stsCmei, // 语音代理配置参数 'azureSpeechKey': azureSpeechKey, 'azureSpeechRegion': azureSpeechRegion, diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt index eacbecf4b..997fb74a7 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt @@ -233,6 +233,7 @@ object AgentService : CoroutineScope { deviceId = config["stsDeviceId"]?.toString() ?: "", deviceSecret = config["stsDeviceSecret"]?.toString() ?: "", agentId = agentId, + cmei = config["stsCmei"]?.toString() ?: "", ) stsAgent = StsAgent( context = context, @@ -371,6 +372,11 @@ object AgentService : CoroutineScope { config["mcpServer"]?.toString() ?: "", config["musicServiceType"]?.toString() ?: "" ) + // 更新 STS 模式参数(cmei 等可能在首次初始化时尚未获取到) + val newCmei = config["stsCmei"]?.toString() ?: "" + if (newCmei.isNotEmpty()) { + stsAgent?.updateCmei(newCmei) + } } catch (e: Exception) { Log.e(TAG, "应用配置更新失败 config: $config Exception:${e.message}") } diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt index b513800fa..1b0bf0cd1 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentServicePlugin.kt @@ -91,6 +91,7 @@ class AgentServicePlugin : FlutterPlugin, MethodCallHandler, EventChannel.Stream config["stsDeviceNo"]?.toString()?.let { intent.putExtra("stsDeviceNo", it) } config["stsDeviceId"]?.toString()?.let { intent.putExtra("stsDeviceId", it) } config["stsDeviceSecret"]?.toString()?.let { intent.putExtra("stsDeviceSecret", it) } + config["stsCmei"]?.toString()?.let { intent.putExtra("stsCmei", it) } config["vipexptime"]?.toString()?.let { intent.putExtra("vipexptime", it) //打印日志 diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt index 20f0ac498..574af96ff 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/BleMediaService.kt @@ -85,6 +85,7 @@ class BleMediaService : Service(), CoroutineScope { private const val KEY_STS_DEVICE_NO = "stsDeviceNo" private const val KEY_STS_DEVICE_ID = "stsDeviceId" private const val KEY_STS_DEVICE_SECRET = "stsDeviceSecret" + private const val KEY_STS_CMEI = "stsCmei" // 用于跟踪服务是否正在运行 private val isRunning = AtomicBoolean(false) @@ -621,6 +622,7 @@ private var companionManager: BleCompanionManager? = null it.getStringExtra(KEY_STS_DEVICE_NO)?.let { value -> config[KEY_STS_DEVICE_NO] = value } it.getStringExtra(KEY_STS_DEVICE_ID)?.let { value -> config[KEY_STS_DEVICE_ID] = value } it.getStringExtra(KEY_STS_DEVICE_SECRET)?.let { value -> config[KEY_STS_DEVICE_SECRET] = value } + it.getStringExtra(KEY_STS_CMEI)?.let { value -> config[KEY_STS_CMEI] = value } Log.d(TAG, "liwei-------vipexptime 3-1 ${ config[KEY_VIP_EXPTIME]}") // 提取 supportedLanguages 参数 it.getStringArrayListExtra(KEY_SUPPORTED_LANGUAGES)?.let { languages -> @@ -695,6 +697,7 @@ private var companionManager: BleCompanionManager? = null config[KEY_STS_DEVICE_NO] = getConfigString(prefs, KEY_STS_DEVICE_NO, "") config[KEY_STS_DEVICE_ID] = getConfigString(prefs, KEY_STS_DEVICE_ID, "") config[KEY_STS_DEVICE_SECRET] = getConfigString(prefs, KEY_STS_DEVICE_SECRET, "") + config[KEY_STS_CMEI] = getConfigString(prefs, KEY_STS_CMEI, "") Log.d(TAG, "liwei-------vipexptime 3-0 ${ config[KEY_VIP_EXPTIME]}") // 添加 supportedLanguages 参数处理 val supportedLanguagesStr = getConfigString(prefs, KEY_SUPPORTED_LANGUAGES, "") diff --git a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/StsAgent.kt b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/StsAgent.kt index 5c28b2c5e..76938f508 100644 --- a/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/StsAgent.kt +++ b/local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/StsAgent.kt @@ -40,6 +40,7 @@ data class StsConfig( var deviceId: String, var deviceSecret: String, val agentId: String, + val cmei: String = "", ) /** @@ -60,10 +61,18 @@ class StsAgent( override val coroutineContext = Dispatchers.IO + job init { - Log.i(TAG, "[YIDONG] StsAgent初始化: productId=${config.productId} deviceNo=${config.deviceNo} deviceId=${config.deviceId} agentId=${config.agentId} hasSecret=${config.deviceSecret.isNotEmpty()}") + Log.i(TAG, "[YIDONG] StsAgent初始化: productId=${config.productId} deviceNo=${config.deviceNo} deviceId=${config.deviceId} agentId=${config.agentId} cmei=${config.cmei} hasSecret=${config.deviceSecret.isNotEmpty()}") fetchCredentials() } + /** 动态更新 CMEI(首次初始化时可能尚未获取到) */ + fun updateCmei(cmei: String) { + if (cmei.isNotEmpty() && cmei != config.cmei) { + config = config.copy(cmei = cmei) + Log.i(TAG, "[YIDONG] updateCmei: cmei已更新为 $cmei") + } + } + // ── WebSocket ───────────────────────────────────────────────────────────── private val okHttpClient: OkHttpClient = buildTrustAllClient() private var webSocket: WebSocket? = null @@ -190,7 +199,7 @@ class StsAgent( ) credentialReady = config.deviceSecret.isNotEmpty() if (credentialReady) { - Log.i(TAG, "[YIDONG] fetchCredentials: 密钥获取成功 deviceId=${config.deviceId} deviceNo=${config.deviceNo}") + Log.i(TAG, "[YIDONG] fetchCredentials: 密钥获取成功 deviceId=${config.deviceId} deviceNo=${config.deviceNo} cmei=${config.cmei}") onCredentialsFetched?.invoke(config.deviceId, config.deviceSecret, config.deviceNo) reportHeartbeat() // 凭证获取成功后立即上报心跳 } else { @@ -216,7 +225,7 @@ class StsAgent( Log.w(TAG, "[YIDONG] reportHeartbeat: 凭证未就绪,跳过上报") return } - Log.i(TAG, "[YIDONG] reportHeartbeat: 开始上报 deviceId=${config.deviceId} deviceNo=${config.deviceNo}") + Log.i(TAG, "[YIDONG] reportHeartbeat: 开始上报 deviceId=${config.deviceId} deviceNo=${config.deviceNo} cmei=${config.cmei}") launch { try { val netType = try { @@ -243,7 +252,7 @@ class StsAgent( put("sdkVersion", "ai_http_1.0") put("firmwareVersion", "1.0.0") put("imei", "") - put("cmei", config.deviceNo) // 非蜂窝设备使用 SN 作为 cmei + put("cmei", config.cmei.ifEmpty { config.deviceNo }) // 优先使用 UserDevice 的 CMEI put("mac", "") }) }.toString().toRequestBody("application/json".toMediaType())