From 2a4678f67a1c6d279a2d4b343eb0cd9edd0a8242 Mon Sep 17 00:00:00 2001 From: Adhidarma Hadiwinoto <me@adhisimon.org> Date: Wed, 16 Oct 2019 12:49:54 +0700 Subject: [PATCH] global MODEM_PORT --- lib/modem-commands/index.js | 146 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 116 insertions(+), 30 deletions(-) diff --git a/lib/modem-commands/index.js b/lib/modem-commands/index.js index f2b4551..293d291 100644 --- a/lib/modem-commands/index.js +++ b/lib/modem-commands/index.js @@ -1,22 +1,28 @@ /** * Modul modem-commands * - * @module + * @module modem-commands */ +/** + * Label mutex command + * @static + */ const MUTEX_COMMAND = 'COMMAND'; -exports.MUTEX_COMMAND = MUTEX_COMMAND; +/** + * Label mutex subcommand + * @static + */ const MUTEX_SUBCOMMAND = 'SUBCOMMAND'; -exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND; /** * CTRL-Z string - * @constant + * @static */ const CTRLZ = '\u001a'; -exports.CTRLZ = CTRLZ; + const pdu = require('node-pdu'); const uuidv1 = require('uuid/v1'); @@ -30,10 +36,12 @@ const mutex = require('../mutex-common'); const parsers = require('../serialport-parsers'); const modemInfo = require('../modem-info'); -let port; +// let port; function writeToPort(data) { return new Promise((resolve) => { + const port = global.MODEM_PORT; + modemInfo.lastWriteTs = new Date(); port.write(data, (err, bytesWritten) => { if (err) logger.warn(`ERROR: ${err.toString()}`); @@ -43,9 +51,9 @@ function writeToPort(data) { }); }); } -exports.writeToPort = writeToPort; function writeToPortAndWaitForReadline(cmd, lockName) { + const port = global.MODEM_PORT; let resolved = false; return new Promise(async (resolve) => { @@ -64,11 +72,12 @@ function writeToPortAndWaitForReadline(cmd, lockName) { await writeToPort(cmd); }); } -exports.writeToPortAndWaitForReadline = writeToPortAndWaitForReadline; function writeToPortAndWaitForOkOrError(cmd, lockName) { return new Promise(async (resolve) => { + const port = global.MODEM_PORT; const parser = new ParserRegex({ regex: /(?:OK|ERROR)\r\n/ }); + parser.on('data', (data) => { port.unpipe(parser); mutex.unlock(lockName || MUTEX_COMMAND, cmd.trim()); @@ -80,8 +89,13 @@ function writeToPortAndWaitForOkOrError(cmd, lockName) { await writeToPort(cmd); }); } -exports.writeToPortAndWaitForOkOrError = writeToPortAndWaitForOkOrError; +/** + * Sleep async + * @static + * @param {number} ms - Milliseconds to sleep + * @return {Promise} + */ function sleep(ms) { return new Promise((resolve) => { setTimeout(() => { @@ -89,11 +103,18 @@ function sleep(ms) { }, ms || 0); }); } -exports.sleep = sleep; -exports.setPort = function setPort(val) { - port = val; -}; +/** + * Set port + * @static + * @param {SerialPort} val + */ + +/* +function setPort(val) { + // port = val || global.MODEM_PORT; +} +*/ function querySignalQuality() { return new Promise(async (resolve) => { @@ -107,7 +128,6 @@ function querySignalQuality() { resolve(true); }); } -exports.querySignalQuality = querySignalQuality; function queryCOPS(lockName) { return new Promise(async (resolve) => { @@ -117,7 +137,6 @@ function queryCOPS(lockName) { resolve(true); }); } -exports.queryCOPS = queryCOPS; function queryCOPSAndSignalQuality(skipOnLocked) { return new Promise(async (resolve) => { @@ -135,11 +154,12 @@ function queryCOPSAndSignalQuality(skipOnLocked) { resolve(true); }); } -exports.queryCOPSAndSignalQuality = queryCOPSAndSignalQuality; function queryIMEI(lockName) { return new Promise(async (resolve) => { + const port = global.MODEM_PORT; const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); + parser.on('data', (data) => { logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMEI' }); port.unpipe(parser); @@ -155,11 +175,12 @@ function queryIMEI(lockName) { await writeToPort('AT+CGSN\r'); }); } -exports.queryIMEI = queryIMEI; function queryIMSI(lockName) { return new Promise(async (resolve) => { + const port = global.MODEM_PORT; const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); + parser.on('data', (data) => { logger.verbose('INCOMING', { data: data.toString(), parser: 'parserIMSI' }); port.unpipe(parser); @@ -175,9 +196,8 @@ function queryIMSI(lockName) { await writeToPort('AT+CIMI\r'); }); } -exports.queryIMSI = queryIMSI; -exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() { +async function queryIMEIAndIMSI() { await mutex.lock(MUTEX_COMMAND, 'queryIMEIAndIMSI'); const imei = await queryIMEI(MUTEX_SUBCOMMAND); @@ -185,11 +205,13 @@ exports.queryIMEIAndIMSI = async function queryIMEIAndIMSI() { await mutex.unlock(MUTEX_COMMAND, 'queryIMEIAndIMSI'); return { imei, imsi }; -}; +} -exports.queryManufacturer = function queryManufacturer(lockName) { +function queryManufacturer(lockName) { return new Promise(async (resolve) => { + const port = global.MODEM_PORT; const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); + parser.on('data', (data) => { logger.verbose('INCOMING', { data: data.toString(), parser: 'parserManufacturer' }); port.unpipe(parser); @@ -204,11 +226,13 @@ exports.queryManufacturer = function queryManufacturer(lockName) { port.pipe(parser); await writeToPort('AT+CGMI\r'); }); -}; +} -exports.queryModel = function queryModel(lockName) { +function queryModel(lockName) { return new Promise(async (resolve) => { + const port = global.MODEM_PORT; const parser = new ParserRegex({ regex: parsers.PARSER_WAIT_FOR_OK_OR_ERROR_REGEX }); + parser.on('data', (data) => { logger.verbose('INCOMING', { data: data.toString(), parser: 'parserModel' }); port.unpipe(parser); @@ -223,12 +247,15 @@ exports.queryModel = function queryModel(lockName) { port.pipe(parser); await writeToPort('AT+CGMM\r'); }); -}; +} +/** + * Menulis CTRL-Z ke port. + * @static + */ async function sendCtrlZ() { await writeToPort(CTRLZ); } -exports.sendCtrlZ = sendCtrlZ; async function initATCommands() { await mutex.lock(MUTEX_COMMAND, 'INIT MODEM'); @@ -237,11 +264,17 @@ async function initATCommands() { await this.writeToPortAndWaitForOkOrError('AT+CNMI=1,2,0,1,0\r', MUTEX_SUBCOMMAND); mutex.unlock(MUTEX_COMMAND, 'INIT MODEM'); } -exports.initATCommands = initATCommands; +/** + * Menulis awal pesan PDU. + * + * @param {number} pduLength + */ function sendCMGSPdu(pduLength) { return new Promise((resolve) => { + const port = global.MODEM_PORT; const parser = new ParserReady({ delimiter: '>' }); + parser.on('data', () => { logger.verbose('Got ">" message prompt, gonna to write PDU message'); port.unpipe(parser); @@ -255,7 +288,14 @@ function sendCMGSPdu(pduLength) { }); } -exports.sendSMS = function sendSMS(destination, msg) { +/** + * Mengirim sms + * @param {string} destination - nomor tujuan + * @param {string} msg - isi pesan + * @return {Promise} + * @static + */ +function sendSMS(destination, msg) { return new Promise(async (resolve) => { async function responseHandler(data) { logger.verbose('SMS sent callback called', { data }); @@ -296,9 +336,23 @@ exports.sendSMS = function sendSMS(destination, msg) { parsers.setSmsSentCallback(responseHandler); await writeToPort(`${submit.toString()}${CTRLZ}`, MUTEX_SUBCOMMAND); }); -}; +} -exports.executeUSSD = function executeUSSD(code, _includeCUSD2, _sessionId) { +/** + * Ekseksusi kode USSD. + * <br> + * <br>Pilihan includeCUSD2: + * <br>-1: sebelum + * <br>0: tidak (default) + * <br>1: sesudah + * <br>2: sebelum dan sesudah + * + * @static + * @param {string} code - Kode USSD + * @param {number} [includeCUSD2=0] - Apakah ingin otomatis memasukkan CUSD=2 + * @return {Promise} + */ +function executeUSSD(code, _includeCUSD2, _sessionId) { return new Promise(async (resolve) => { const includeCUSD2 = _includeCUSD2 || 0; const sessionId = _sessionId || uuidv1(); @@ -326,4 +380,36 @@ exports.executeUSSD = function executeUSSD(code, _includeCUSD2, _sessionId) { await writeToPort(`AT+CUSD=1,"${code}",15\r`, MUTEX_SUBCOMMAND); }); -}; +} + +exports.MUTEX_COMMAND = MUTEX_COMMAND; +exports.MUTEX_SUBCOMMAND = MUTEX_SUBCOMMAND; +exports.CTRLZ = CTRLZ; + +/** + * Modem info. + * @type {object} + */ +exports.modemInfo = modemInfo; +// exports.setPort = setPort; + +exports.writeToPort = writeToPort; +exports.writeToPortAndWaitForReadline = writeToPortAndWaitForReadline; +exports.writeToPortAndWaitForOkOrError = writeToPortAndWaitForOkOrError; +exports.sleep = sleep; + +exports.querySignalQuality = querySignalQuality; +exports.queryCOPS = queryCOPS; +exports.queryCOPSAndSignalQuality = queryCOPSAndSignalQuality; + +exports.queryIMEI = queryIMEI; +exports.queryIMSI = queryIMSI; +exports.queryIMEIAndIMSI = queryIMEIAndIMSI; + +exports.queryManufacturer = queryManufacturer; +exports.queryModel = queryModel; + +exports.sendCtrlZ = sendCtrlZ; +exports.initATCommands = initATCommands; +exports.sendSMS = sendSMS; +exports.executeUSSD = executeUSSD; -- 1.9.0