smstools-modem-info.js 1.94 KB
const fs = require('fs');

const REGEX_IMSI = /AT\+CIMI: (\d+)/;
const REGEX_IMEI = /AT\+CGSN: (\d+)/;
const REGEX_COPS = /\+COPS: (.+) OK/;

function getMatchFromBuffer(buffer, pattern) {
    if (!buffer) return null;

    const content = typeof buffer === 'string' ? buffer : buffer.toString();
    const matches = content.match(pattern);
    return (matches && matches[1]) || null;
}

exports.getIMSI = async (modemName, filenameTemplate) => {
    const filename = (filenameTemplate || '').replace(/<MODEMNAME>/g, modemName);
    if (!filename) return null;

    try {
        const contentBuffer = await fs.promises.readFile(filename);
        return getMatchFromBuffer(contentBuffer, REGEX_IMSI);
    } catch (e) {
        return null;
    }
};

exports.getIMEI = async (modemName, filenameTemplate) => {
    const filename = (filenameTemplate || '').replace(/<MODEMNAME>/g, modemName);
    if (!filename) return null;

    try {
        const contentBuffer = await fs.promises.readFile(filename);
        return getMatchFromBuffer(contentBuffer, REGEX_IMEI);
    } catch (e) {
        return null;
    }
};

exports.getCOPS = async (modemName, filenameTemplate) => {
    const filename = (filenameTemplate || '').replace(/<MODEMNAME>/g, modemName);
    if (!filename) return null;

    try {
        const contentBuffer = await fs.promises.readFile(filename);
        return getMatchFromBuffer(contentBuffer, REGEX_COPS);
    } catch (e) {
        return null;
    }
};

exports.get = async (modemName, filenameTemplate) => {
    const filename = (filenameTemplate || '').replace(/<MODEMNAME>/g, modemName);
    if (!filename) return null;

    let buffer;
    try {
        buffer = await fs.promises.readFile(filename);
    } catch (e) {
        return null;
    }

    if (!buffer) return null;

    return {
        imsi: getMatchFromBuffer(buffer, REGEX_IMSI),
        imei: getMatchFromBuffer(buffer, REGEX_IMEI),
        cops: getMatchFromBuffer(buffer, REGEX_COPS),
    };
};