NEWS
GSM модем + gammu + MYSQL + IOBroker
-
помоги настроить, плз..
насколько я понял, короткое сообщение читается так:
connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE ID = ?', [id], function(err, res, fields) { if (err) throw err; setState('sms.in.phone', res[0].SenderNumber); setState('sms.in.time', res[0].ReceivingDateTime); setState('sms.in.text', res[0].TextDecoded); });
где id - номер сообщения в базе
правильно?
а как прочитать длинное?
-
Правильно, а длинное
connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE ID = ?', [id], function(err, res_udh, fields) { if (err) throw err; if(res_udh[0].UDH !== ''){ udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1); date = res_udh[0].UpdatedInDB; connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) { if (err) throw err; setState('sms.in.phone', res[0].SenderNumber); setState('sms.in.time', res[0].ReceivingDateTime); setState('sms.in.text', res[0].TextDecoded); }) } } })
-
а как определить, что пришло длинное?
-
а как определить, что пришло длинное? `
Самый первый запрос из приведенного кода. Если поле UDH в базе не пустое, то СМС длинное и собирается по этому полю, последняя цифра это номер СМС по порядку, в составном. Но надо учитывать, что поле UDH может быть не уникальным в большом промежутке времени, по-этому я сделал выборку по этому полю и дате получения сообщения.
connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE ID = ?', [id], function(err, res_udh, fields) { if (err) throw err; if(res_udh[0].UDH !== ''){}
-
как получить конкретное сообщение?
как получить количество всех целых сообщений (включая собранных из кусков), а не общее количество кусков?
Помоги, плз,
Хотелось бы получить:
'sms.in.id' - номер последней пришедшей собранной СМС (а не номер последнего куска)
'sms.in.count' - Общее Количество пришедших СМС в базе (целых, а не общее количество кусков)
'sms.in.text' - Текст последней пришедшей СМС (у меня сейчас предпоследняя, так и не поборол)
И самое главное:
'sms.in.requesID' - Если тут ввести номер существующей СМС в базе…
'sms.in.requestTEXT' - ...то здесь увидим собственно текст запрошенной СМС
-
Большинство вопросов решил
Хотелось бы иметь возможность выборочно читать конкретное сообщение, сейчас только по ID… помогите, плз
Пока сделал так:
createState('sms.in.requesID',0); createState('sms.in.requestTEXT',0); createState('sms.in.requestPHONE',0); createState('sms.in.requestTIME',0); createState('sms.in.lastID',0); createState('sms.in.lastTEXT',0); createState('sms.in.lastPHONE',0); createState('sms.in.lastTIME',0); //createState('sms.in.quantity',0); createState('sms.phone.signal',0); createState('sms.phone.imei',0); var mysql = require('mysql'); var connection = mysql.createConnection ({ host: 'localhost', user: 'gammu_user', password: 'ХХХХХХХХХ', database: 'db_gammu', socketPath: '/var/run/mysqld/mysqld.sock' }); var count, udh, ud_c, date; // создаем подключение к базе connection.connect(function(err) { if (err) { log('error connecting: ' + err.stack); return; } log('connected as id ' + connection.threadId); }); // по расписанию проверяем наличие новых смс schedule("*/20 * * * * *", function () { connection.query('SELECT max(id) AS id FROM inbox', function(err, res_id, fields) { if (err) throw err; setState("javascript.0.sms.in.lastID", res_id[0].id); }); }); // выводим крайнюю смс on("javascript.0.sms.in.lastID", function (obj) { connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE ID = ?', [obj.state.val], function(err, res_udh, fields) { if (err) throw err; if(res_udh[0].UDH !== '') { udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1); date = res_udh[0].UpdatedInDB; connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.lastPHONE", res[0].SenderNumber); setState("javascript.0.sms.in.lastTIME", res[0].ReceivingDateTime); setState("javascript.0.sms.in.lastTEXT", res[0].TextDecoded); }); } if(res_udh[0].UDH === '') { connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE ID = ?', [obj.state.val], function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.lastPHONE", res[0].SenderNumber); setState("javascript.0.sms.in.lastTIME", res[0].ReceivingDateTime); setState("javascript.0.sms.in.lastTEXT", res[0].TextDecoded); }); } }); }); // выдаем смс по запросу on("javascript.0.sms.in.requesID", function (obj) { connection.query('SELECT UDH, UpdatedInDB FROM inbox WHERE ID = ?', [obj.state.val], function(err, res_udh, fields) { if (err) throw err; if(res_udh[0].UDH !== ''){ udh = res_udh[0].UDH.substring(0, res_udh[0].UDH.length - 1); date = res_udh[0].UpdatedInDB; connection.query('SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.requestPHONE", res[0].SenderNumber); setState("javascript.0.sms.in.requestTIME", res[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXT", res[0].TextDecoded); }); } if(res_udh[0].UDH === ''){ connection.query('SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM inbox WHERE ID = ?', [obj.state.val], function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.requestPHONE", res[0].SenderNumber); setState("javascript.0.sms.in.requestTIME", res[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXT", res[0].TextDecoded); }); } }); }); // ОТПРАВКА. Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression. on("javascript.0.sms.out.text", function (obj) { connection.query('INSERT INTO outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState("javascript.0.sms.out.phone").val + "','" + getState("javascript.0.sms.out.text").val + "','IOBroker'," + "'Unicode_No_Compression');", function(err, res, fields) { if (err) throw err; }); }); // получаем сведения о подключенном модеме, IMEI, уровень сигнала (по расписанию) schedule("*/20 * * * *", function () { connection.query('SELECT * FROM phones', function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.phone.signal", res[0].Signal); setState("javascript.0.sms.phone.imei", res[0].IMEI); }); });
-
Так а что ты подразумеваешь под выборочным чтением, у тебя же по ID читает, ты хочешь по другому признаку? Подробней опиши что ты под этим понимаешь.
Еще бы я сделал по другому, убрал бы mysql пакет из js. Поставил драйвер SQL, настройки сохранил бы в нем, и через него запросы делал. Чуть безопаснее. Да и пакет в актуальном состоянии будет. Имхо.
-
да, читает четко по ID, но количество ID - это количество кусков, а не реальных сообщений. т.е. я отправил 3 сообщения, одно короткое, другое длинное (из 3 допустим кусков), третье опять короткое. следовательно количество ID будет 5, а количество сообщений - 3.
если выбирать по ID то 1 - это первое сообщение, 2, 3 или 4 - это второе, а 5 - это третье
а хотелось бы выбирать по Номеру сообщений, 1 - первое короткое, 2 - второе длинное из 3 частей, 3 - третье…
и да, mysql я бы убрал, если бы знал как
-
Убрать, я описал как.
Запросы после установки sql драйвера и настройки подключения к БД, будут вида
//по расписанию проверяем наличие новых смс schedule("* * * * *", function () { sendTo('sql.0', 'query','SELECT max(id) AS id FROM smsd.inbox', function(res) { if (res.error) { console.error(res.error); }; setState('sms.in.id', res.result[0].id); }); });
По аналогии думаю разберешься. По поводу того как ты хочешь СМС удобно читать, мне приходит мысль создать дополнительную таблицу с 2 столбцами, ID СМС и IDs из текущей таблицы. Как раз у тебя и получится, что в первом столбце будет нужные тебе номера, а во втором список ID из которых состоит СМС.
-
с базой не понял, надо новый инстанцию sql создавать? можно, если не затруднит, расписать чуть подробнее и по шагам?
-
База где хранится история объектов и входящие sms на одном сервере? Если да, то просто используете запросы, только в поле где указывали таблицу откуда делать выборку указываете через точку база.таблица. Если пользователи баз разные, то пользователю указанному в настройках драйвера для хранения истории необходимо дать права на чтение с базы SMS.
-
Не работает
Подскажите, плз, где ошибка?:
// () выдаем смс по запросу on("javascript.0.sms.in.requesIDtest", function (obj) { sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = ?', [obj.state.val], function(err, res_udh, fields) { if (res.error) { console.error(res.error); } if(res_udh.result[0].UDH !== ''){ udh = res_udh.result[0].UDH.substring(0, res_udh.result[0].UDH.length - 1); date = res_udh.result[0].UpdatedInDB; sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber); setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded); }); } if(res_udh.result[0].UDH === ''){ sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = ?', [obj.state.val], function(err, res, fields) { if (res.error) { console.error(res.error); } setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber); setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded); }); } }); });
ЗЫ а отправка работает:
// () ОТПРАВКА. Отслеживает изменение в переменной и отправляет текст на русском языке, если необходимо использовать латиницу то заменяем Unicode_No_Compression на Default_No_Compression. on("javascript.0.sms.out.text", function (obj) { sendTo('sql.0', 'query', 'INSERT INTO db_gammu.outbox (DestinationNumber, TextDecoded, CreatorID, Coding) VALUES (' + "'" + getState("javascript.0.sms.out.phone").val + "','" + getState("javascript.0.sms.out.text").val + "','IOBroker'," + "'Unicode_No_Compression');", function(res) { if (res.error) { console.error(res.error); } }); });
-
Пробуй так.
// () выдаем смс по запросу on("javascript.0.sms.in.requesIDtest", function (obj) { sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(err, res_udh, fields) { if (res.error) { console.error(res.error); } if(res_udh.result[0].UDH !== ''){ udh = res_udh.result[0].UDH.substring(0, res_udh.result[0].UDH.length - 1); date = res_udh.result[0].UpdatedInDB; sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE %'+udh+'% AND UpdatedInDB = ' +date, function(err, res, fields) { if (err) throw err; setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber); setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded); }); } if(res_udh.result[0].UDH === ''){ sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(err, res, fields) { if (res.error) { console.error(res.error); } setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber); setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime); setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded); }); } }); });
Мне кажется он неправильно формирует запрос с подстановкой данных.
-
не работает
-
Переведи драйвер sql в debug режим и посмотри какой формируется запрос, возможно где-то ошибку допускаем. Раз отправка работает, значит ошибка именно в запросе.
-
длинное не выводится:
! sql.0 2018-02-12 08:36:40.914 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-12 08:36:40.884 debug SELECT max(id) AS id FROM db_gammu.inbox
! sql.0 2018-02-12 08:36:39.688 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-12 08:36:39.677 debug SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?
! sql.0 2018-02-12 08:36:39.662 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-12 08:36:39.652 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 3 <-третье сообщение (длинное)
! javascript.0 2018-02-12 08:36:39.642 info script.js.Test.SMS_SQL: NEW Request START with sql.0 <-начало запроса
короткое выводится:! sql.0 2018-02-12 08:40:55.516 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-12 08:40:55.504 debug SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = 2
! sql.0 2018-02-12 08:40:55.482 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-12 08:40:55.468 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 2 <-второе сообщение (короткое)
! javascript.0 2018-02-12 08:40:55.458 info script.js.Test.SMS_SQL: NEW Request START with sql.0 <-начало запросакусок скрипта:
! // () выдаем смс по запросу
! on("javascript.0.sms.in.requesIDtest", function (obj) {
! console.log("NEW Request START with sql.0");
! sendTo('sql.0', 'query','SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(res) {
! if (res.error) {
! console.error(res.error);
! }
! if(res.result[0].UDH !== ''){
! udh = res.result[0].UDH.substring(0, res.result[0].UDH.length - 1);
! date = res.result[0].UpdatedInDB;
! sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', ['%'+udh+'%', date], function(res) {
! if (res.error) {
! console.error(res.error);
! }
! setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
! setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
! setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
! });
! }
! if(res.result[0].UDH === ''){
! sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = ' + obj.state.val, function(res) {
! if (res.error) {
! console.error(res.error);
! }
! setState("javascript.0.sms.in.requestPHONEtest", res.result[0].SenderNumber);
! setState("javascript.0.sms.in.requestTIMEtest", res.result[0].ReceivingDateTime);
! setState("javascript.0.sms.in.requestTEXTtest", res.result[0].TextDecoded);
! });
! }
! });
! //console.log("NEW Request STOP");
! }); -
Так ты опять, где получение самого СМС вставил свой кусок кода, я же тебе его переписывал по другому.
Какая система? Если линукс, то открой консоль и выполни команду
tail -f /opt/iobroker/log/iobroker.log.[сегодняшняя дата]
После этого выполняй код, у тебя в реальном времени будет идти лог.
<size size="50">Ты в телеграмм группе есть?</size>
-
если так сделать:
! //sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE ? AND UpdatedInDB = ?', '%'+udh+'%', date, function(res) {
! sendTo('sql.0', 'query','SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE %'+udh+'% AND UpdatedInDB = ' +date, function(res) {
тогда javascript ругается:! javascript.0 2018-02-13 06:34:22.629 error at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15)
! javascript.0 2018-02-13 06:34:22.629 error at Manager.ondecoded (/opt/iobroker/node_modules/socket.io-client/lib/manager.js:332:8)
! javascript.0 2018-02-13 06:34:22.629 error at Manager.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20)
! javascript.0 2018-02-13 06:34:22.629 error at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15)
! javascript.0 2018-02-13 06:34:22.629 error at Socket.onpacket (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:228:12)
! javascript.0 2018-02-13 06:34:22.629 error at Socket.onevent (/opt/iobroker/node_modules/socket.io-client/lib/socket.js:270:10)
! javascript.0 2018-02-13 06:34:22.629 error at Socket.Emitter.emit (/opt/iobroker/node_modules/socket.io-client/node_modules/component-emitter/index.js:133:20)
! javascript.0 2018-02-13 06:34:22.629 error at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:48:30)
! javascript.0 2018-02-13 06:34:22.629 error at Object.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3151:71)
! javascript.0 2018-02-13 06:34:22.629 error at Object.cb (script.js.Test.SMS_SQL:151:84)
! javascript.0 2018-02-13 06:34:22.629 error TypeError: Cannot read property '0' of undefined
! javascript.0 2018-02-13 06:34:22.624 error message messagebox.system.adapter.javascript.0 [object Object] Cannot read property '0' of undefined
! javascript.0 2018-02-13 06:34:22.622 error script.js.Test.SMS_SQL: Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%05000341030% A
! sql.0 2018-02-13 06:34:22.611 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:22.596 debug SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded SEPARATOR "") as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE %05000341030% AND UpdatedInDB = 2018-02-01T02:22:48.000Z
! sql.0 2018-02-13 06:34:22.578 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:22.556 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 3 <-третье сообщение (длинное)
! javascript.0 2018-02-13 06:34:22.541 info script.js.Test.SMS_SQL: NEW Request START with sql.0
! sql.0 2018-02-13 06:34:20.860 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:20.849 debug SELECT max(id) AS id FROM db_gammu.inbox
! sql.0 2018-02-13 06:34:10.951 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:10.939 debug SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = 2
! sql.0 2018-02-13 06:34:10.917 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:10.904 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 2 <-второе сообщение (короткое)
! javascript.0 2018-02-13 06:34:10.895 info script.js.Test.SMS_SQL: NEW Request START with sql.0
! sql.0 2018-02-13 06:34:07.633 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:07.621 debug SELECT SenderNumber, ReceivingDateTime, TextDecoded FROM db_gammu.inbox WHERE ID = 1
! sql.0 2018-02-13 06:34:07.603 debug sendTo "query" to system.adapter.javascript.0 from system.adapter.sql.0
! sql.0 2018-02-13 06:34:07.586 debug SELECT UDH, UpdatedInDB FROM db_gammu.inbox WHERE ID = 1 <-первое сообщение (короткое)
! javascript.0 2018-02-13 06:34:07.572 info script.js.Test.SMS_SQL: NEW Request START with sql.0
2 коротких вывелись, на запрос третьего сыпятся ошибки… -
А почему у тебя дата не приводится к формату YYYY-MM-DD?
И строчка запроса неправильная, у тебя выборка приходит как непонятный формат, а не как строка. Вот этот должен правильно сработать.
"SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded ORDER BY UDH SEPARATOR '') as TextDecoded FROM smsd.inbox WHERE UDH LIKE '"+udh+"%' AND ReceivingDateTime LIKE '" + date + "%'"
-
ок, спасибо! Вот так вроде заработало, тестирую…:
sendTo('sql.0', 'query',"SELECT SenderNumber, ReceivingDateTime, GROUP_CONCAT(TextDecoded ORDER BY UDH SEPARATOR '') as TextDecoded FROM db_gammu.inbox WHERE UDH LIKE '"+udh+"%' AND ReceivingDateTime LIKE '" + formatDate(date, 'YYYY-MM-DD') + "%'" , function(res) {