From 57ca2f1ea35eb79a5ad6dd7dcd6fb44c1ec72c89 Mon Sep 17 00:00:00 2001 From: wuxu Date: Sat, 27 Jun 2026 09:31:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=20ICCID=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modem.js | 66 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/src/modem.js b/src/modem.js index 2fdb34d..524ac88 100644 --- a/src/modem.js +++ b/src/modem.js @@ -1316,30 +1316,58 @@ class ModemManager extends EventEmitter { return this.iccid; } - try { - const resp = await this.sendATCommand('AT+CCID', 2000); - const match = resp.match(/\+CCID:\s*(\d+)/); - if (match) { - const previousICCID = this.iccid; - this.iccid = match[1]; - this.iccidCheckedAt = new Date().toISOString(); - if (previousICCID !== this.iccid) { - logger.info(`✓ 当前SIM ICCID: ${this.formatICCID(this.iccid)}`); + const commands = ['AT+ICCID', 'AT+CCID', 'AT+QCCID']; + + for (const command of commands) { + try { + const resp = await this.sendATCommand(command, 2000); + const iccid = this.parseICCIDResponse(resp); + + if (iccid) { + const previousICCID = this.iccid; + this.iccid = iccid; + this.iccidCheckedAt = new Date().toISOString(); + if (previousICCID !== this.iccid) { + logger.info(`✓ 当前SIM ICCID: ${this.formatICCID(this.iccid)}`); + } + return this.iccid; } - return this.iccid; + + logger.debug(`${command}未返回可识别ICCID: ${this.formatATResponse(resp)}`); + } catch (err) { + logger.debug(`${command}查询ICCID失败: ${err.message}`); + } + } + + this.iccid = null; + this.iccidCheckedAt = new Date().toISOString(); + logger.warn('查询ICCID失败: 模组未返回可识别ICCID'); + return null; + } + + parseICCIDResponse(resp) { + const lines = String(resp || '') + .split('\n') + .map(line => line.trim()) + .filter(Boolean); + + for (const line of lines) { + if (/^AT/i.test(line) || line === 'OK' || line === 'ERROR') { + continue; } - this.iccid = null; - this.iccidCheckedAt = new Date().toISOString(); - return null; - } catch (err) { - if (options.refresh) { - this.iccid = null; - this.iccidCheckedAt = new Date().toISOString(); + const prefixed = line.match(/^\+(?:ICCID|CCID|QCCID):\s*"?([0-9]{18,22})"?/i); + if (prefixed) { + return prefixed[1]; + } + + const plain = line.match(/^"?([0-9]{18,22})"?$/); + if (plain) { + return plain[1]; } - logger.error('查询ICCID失败:', err); - return null; } + + return null; } formatICCID(iccid) {