comunika_gsm 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9cf966b6250fb4add1fe67c47b7e5f3a19f99121
4
- data.tar.gz: 1ed0b6c13643695666b2fda7b927ff02642a2e30
3
+ metadata.gz: 65001b45352fa61eea2a3d6183a9461ddfdf0443
4
+ data.tar.gz: 701358d13eba5b83d1a927c28104d7cf39ca598e
5
5
  SHA512:
6
- metadata.gz: f8e26fa8198c01b1fc8d97f26368ebf2b83a5ac0db257171a424b3f5d553dcbf52e09d37716e620f974bcc9d58b9ab30447ad767698b223e88083c3a64757ac7
7
- data.tar.gz: 2cdbaea565bafca2491344bca17e7d3404bcd7851da3c438f9de2e44101ed88c6b692ec4272d4639495a267f21b44c6e530d7f3a9ccafc2b31b042ade8339643
6
+ metadata.gz: cf88c01c16c6767dc4d3746a772e85a209fd97df80e57f97f1ae85ee710b6156c3d66b4dd129a271786c16cb9fd23a51a2b7c7bbb8b7c9a480f525fc23267267
7
+ data.tar.gz: 9aa39be18cdc70851330da7da3ba29bced8b291c55d3e9fb9fd98a049d4663c8bdd43c0c8fe7d31772bc610ead71cebb2f6ed5a2eb4f227e47396e38b5935e22
data/lib/comunika_gsm.rb CHANGED
@@ -4,6 +4,7 @@ require 'execjs'
4
4
 
5
5
  require "comunika_gsm/version"
6
6
  require "comunika_gsm/gsm"
7
+ require "comunika_gsm/gsm2"
7
8
  require "comunika_gsm/pdu"
8
9
  require "comunika_gsm/modem"
9
10
 
@@ -1,30 +1,39 @@
1
1
  module ComunikaGsm
2
2
  class GSM
3
- attr_reader :status
3
+ attr_accessor :status#, :imei, :iccid, :provider, :signal_level
4
+
4
5
  def initialize(params)
5
6
  return nil if params.empty?
6
7
  begin
7
8
  @@port = SerialPort.new("/dev/#{params[:port]}",19200,8,1, SerialPort::NONE)
8
- @@port.read_timeout = 1000 ## Set timeout of command
9
+ @@port.read_timeout = 250 ## Set timeout of command
9
10
 
10
11
  @@debug = params[:debug]
11
- @status = false
12
12
 
13
- cmd("ATE0\r\n") ## Set echo off
14
- return unless cmd("AT\r\n").eql?("OK") ## Test if running AT ok
15
- cmd("AT+CMGF=0\r\n") ## Set PDU mode
16
- @status = true
17
- rescue Errno::ENOENT
18
- @status = false
13
+ res = cmd("ATE0\r\n") ## Set echo off
14
+ if res.length > 0
15
+ cmd("AT+CMGF=0\r\n") ## Set PDU mode
16
+ # @imei = imei
17
+ # @iccid = iccid
18
+ # @provider = provider
19
+ # @signal_level = signal_level
20
+ @status = true
21
+ else
22
+ return @status = false
23
+ end
24
+ rescue => ex
25
+ return @status = false
19
26
  end
20
27
  end
21
28
 
22
- def cmd(cmd)
29
+ def cmd(c)
23
30
  begin
24
- @@port.write(cmd)
25
- normalize(cmd,wait)
31
+ @@port.write(c)
32
+ normalize(c,wait)
26
33
  rescue => ex
34
+ puts ex
27
35
  @status = false
36
+ #close
28
37
  end
29
38
  end
30
39
 
@@ -36,7 +45,48 @@ module ComunikaGsm
36
45
  end
37
46
 
38
47
  def close
48
+ puts "Fechando conexão"
39
49
  @@port.close
50
+ @status = false
51
+ end
52
+
53
+ def send_sms(msg)
54
+ return {id: nil, status: "ERROR", code: "304"} if msg[:number].length == 0
55
+ return {id: nil, status: "ERROR", code: "304"} if msg[:number].length < 11
56
+ return {id: nil, status: "ERROR", code: "503"} if msg[:message].length == 0
57
+
58
+ ## GENERATE PDU TO MESSAGE ##
59
+ pdu = PDU.encode(:number => msg[:number].prepend("+55"), :smsc => msg[:smsc], :message => msg[:message])
60
+
61
+ cmd("AT+CMGS=#{pdu[:size]}\r")
62
+ res = cmd("#{pdu[:pdu]}#{26.chr}")
63
+
64
+ sleep 3
65
+ while res.length == 0
66
+ res = wait
67
+ end
68
+
69
+ if res.include?('+CMGS')
70
+ res = res.scan(/\+(\S+)\: (\d+)\r\n/)
71
+ status = 'OK'
72
+ code = "-1"
73
+ id = res.first[1]
74
+ elsif res.include?('+CMS')
75
+ res = res.scan(/\+CMS (\S+)\: (\d+)/).first
76
+ status = 'ERROR'
77
+ code = res[1]
78
+ id = nil
79
+ end
80
+
81
+ {:id => id, :code => code, :status => status}
82
+ end
83
+
84
+ def messages
85
+ sms = cmd("AT+CMGL=4\r\n")
86
+ msgs = sms.scan(/\+CMGL\:\s*?(\d+),\s*?(\d+),.*?\,s*?(\d+)\r\n(.*)/)
87
+
88
+ ## IDS: 0 - ID, 1 -- ,2 - size, 3 - PDU
89
+ msgs.collect!{ |m| PDU::PDUDecode.new(connection: self, id: m[0], size: m[2], pdu: m[3].chomp).decode }# rescue nil
40
90
  end
41
91
 
42
92
  def imei
@@ -51,6 +101,10 @@ module ComunikaGsm
51
101
  cmd("AT+COPS?\r\n")
52
102
  end
53
103
 
104
+ def signal_level
105
+ cmd("AT+CSQ\r\n")
106
+ end
107
+
54
108
 
55
109
  def normalize(cmd,res)
56
110
  case cmd.gsub(/\r\n/,'')
@@ -66,6 +120,8 @@ module ComunikaGsm
66
120
  res.scan(/\r\n(\S+)\r\n/)[0].first
67
121
  when 'AT+CRSM=176,12258,0,0,10'
68
122
  res.scan(/\"(.*?)\"/)[0].first
123
+ when 'AT+CSQ'
124
+ res.scan(/\d+/)[0]
69
125
  else
70
126
  res
71
127
  end
@@ -0,0 +1,113 @@
1
+ module ComunikaGsm
2
+ class GSM2
3
+ def initialize(options = {})
4
+ begin
5
+ @port = SerialPort.new("/dev/#{options[:port]}",19200,8,1, SerialPort::NONE)
6
+ @port.read_timeout = 500
7
+ @debug = options[:debug]
8
+ @status = true
9
+
10
+ ##cmd("ATE0\r\n")
11
+ cmd("ATE0\r\n")
12
+ #cmd("AT+CMGF=1\r\n")
13
+ cmd("AT+CMGF=0\r\n")
14
+
15
+
16
+ # Set SMSC number
17
+ #cmd("AT+CSCA=\"#{SMSC}\"")
18
+ rescue => ex
19
+ puts ex.message
20
+ @status = false
21
+ end
22
+ end
23
+
24
+ def status
25
+ @status
26
+ end
27
+
28
+ def set_status(status)
29
+ @status = status
30
+ end
31
+
32
+ def close
33
+ @port.close
34
+ end
35
+
36
+ def cmd(cmd)
37
+ begin
38
+ @port.flush()
39
+ @port.write(cmd)
40
+ normalize(cmd,wait)
41
+ rescue => ex
42
+ @status = false
43
+ end
44
+ end
45
+
46
+ def wait
47
+ buffer = @port.read
48
+ puts buffer if @debug
49
+ buffer
50
+ end
51
+
52
+ def send_sms(msg)
53
+ return {id: nil, status: "ERROR", code: "304"} if msg[:number].length == 0
54
+ return {id: nil, status: "ERROR", code: "304"} if msg[:number].length < 11
55
+ return {id: nil, status: "ERROR", code: "503"} if msg[:message].length == 0
56
+
57
+ ## GENERATE PDU TO MESSAGE ##
58
+ pdu = PDU.encode(:number => msg[:number].prepend("+55"), :smsc => msg[:smsc], :message => msg[:message])
59
+
60
+ cmd("AT+CMGS=#{pdu[:size]}\r")
61
+ res = cmd("#{pdu[:pdu]}#{26.chr}")
62
+
63
+ sleep 3
64
+ while res.length == 0
65
+ res = wait
66
+ end
67
+
68
+ if res.include?('+CMGS')
69
+ res = res.scan(/\+(\S+)\: (\d+)\r\n/)
70
+ status = 'OK'
71
+ code = "-1"
72
+ id = res.first[1]
73
+ elsif res.include?('+CMS')
74
+ res = res.scan(/\+CMS (\S+)\: (\d+)/).first
75
+ status = 'ERROR'
76
+ code = res[1]
77
+ id = nil
78
+ end
79
+
80
+ {:id => id, :code => code, :status => status}
81
+ end
82
+
83
+ def messages
84
+ sms = cmd("AT+CMGL=4\r\n")
85
+ msgs = sms.scan(/\+CMGL\:\s*?(\d+),\s*?(\d+),.*?\,s*?(\d+)\r\n(.*)/)
86
+
87
+ ## IDS: 0 - ID, 1 -- ,2 - size, 3 - PDU
88
+ msgs.collect!{ |m| PDU::PDUDecode.new(connection: self, id: m[0], size: m[2], pdu: m[3].chomp).decode }# rescue nil
89
+ end
90
+
91
+ private
92
+ def normalize(cmd,res)
93
+ case cmd.gsub(/\r\n/,'')
94
+ when 'AT'
95
+ res.scan(/\r\n(\S+)\r\n/)[0].first unless res.empty?
96
+ when 'AT+COPS?'
97
+ res.scan(/\"(.*?)\"/)[0].first
98
+ when 'AT+CNUM'
99
+ res.scan(/\"(.*?)\"/)
100
+ when 'AT+CGSN'
101
+ res.scan(/\r\n(\d+)\r\n/)[0].first
102
+ when 'AT+CGMI'
103
+ res.scan(/\r\n(\S+)\r\n/)[0].first
104
+ when 'AT+CRSM=176,12258,0,0,10'
105
+ res.scan(/\"(.*?)\"/)[0].first
106
+ when 'AT+CSQ'
107
+ res.scan(/\d+/)[0]
108
+ else
109
+ res
110
+ end
111
+ end
112
+ end
113
+ end
@@ -1074,362 +1074,3 @@ function cValid(valid) {
1074
1074
 
1075
1075
  return out;
1076
1076
  }
1077
-
1078
- /* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
1079
- *
1080
- * Further fixes and functionality by Andrew Alexander:
1081
- * Fix message length issues, handle +xx & 0xx phone codes, added bit length options,
1082
- * display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex,
1083
- * allow leading AT command in input, implemented some support for alpanumeric senders...
1084
- *
1085
- * ekkebus[at]cs.utwente.nl
1086
- * Feel free to use it, please don't forget to link to the source ;)
1087
- *
1088
- *
1089
- * www.rednaxela.net - Feel free to use this code as you wish.
1090
- * Version 1.5 r9aja
1091
- *
1092
- * Official BPS develop tool
1093
- *
1094
- * (c) BPS & co, 2003
1095
- */
1096
-
1097
-
1098
-
1099
-
1100
- //Array with "The 7 bit defaultalphabet"
1101
- sevenbitdefault = new Array('@', '£', '$', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', '\n', 'Ø', 'ø', '\r', 'Å', 'å', '\u0394', '_', '\u03a6', '\u0393', '\u039b', '\u03a9', '\u03a0', '\u03a8', '\u03a3', '\u0398', '\u039e', '€', 'Æ', 'æ', 'ß', 'É', ' ', '!', '"', '#', '¤', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '¡', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ä', 'Ö', 'Ñ', 'Ü', '§', '¿', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ä', 'ö', 'ñ', 'ü', 'à');
1102
-
1103
-
1104
-
1105
-
1106
- // Variable that stores the information to show the user the calculation of the translation
1107
- var calculation = "";
1108
-
1109
-
1110
-
1111
-
1112
- var maxkeys = 160;
1113
- var alerted = false;
1114
-
1115
-
1116
-
1117
-
1118
- // function te convert a bit string into a integer
1119
- function binToInt(x) //sp
1120
- {
1121
- var total = 0;
1122
- var power = parseInt(x.length) - 1;
1123
-
1124
-
1125
-
1126
-
1127
- for (var i = 0; i < x.length; i++) {
1128
- if (x.charAt(i) == '1') {
1129
- total = total + Math.pow(2, power);
1130
- }
1131
- power--;
1132
- }
1133
- return total;
1134
- }
1135
-
1136
-
1137
-
1138
-
1139
- // function to convert a integer into a bit String
1140
- function intToBin(x, size) //sp
1141
- {
1142
- var base = 2;
1143
- var num = parseInt(x);
1144
- var bin = num.toString(base);
1145
- for (var i = bin.length; i < size; i++) {
1146
- bin = "0" + bin;
1147
- }
1148
- return bin;
1149
- }
1150
-
1151
-
1152
-
1153
-
1154
- // function to convert a Hexnumber into a 10base number
1155
- function HexToNum(numberS) {
1156
- var tens = MakeNum(numberS.substring(0, 1));
1157
-
1158
- var ones = 0;
1159
- if (numberS.length > 1) // means two characters entered
1160
- ones = MakeNum(numberS.substring(1, 2));
1161
- if (ones == 'X') {
1162
- return "00";
1163
- }
1164
- return (tens * 16) + (ones * 1);
1165
- }
1166
-
1167
-
1168
-
1169
-
1170
- // helper function for HexToNum
1171
- function MakeNum(str) {
1172
- if ((str >= '0') && (str <= '9'))
1173
- return str;
1174
- switch (str.toUpperCase()) {
1175
- case "A":
1176
- return 10;
1177
- case "B":
1178
- return 11;
1179
- case "C":
1180
- return 12;
1181
- case "D":
1182
- return 13;
1183
- case "E":
1184
- return 14;
1185
- case "F":
1186
- return 15;
1187
- default:
1188
- return 16;
1189
- }
1190
- return 16;
1191
- }
1192
-
1193
-
1194
-
1195
-
1196
- //function to convert integer to Hex
1197
-
1198
-
1199
-
1200
-
1201
- function intToHex(i) //sp
1202
- {
1203
- var sHex = "0123456789ABCDEF";
1204
- h = "";
1205
- i = parseInt(i);
1206
- for (j = 0; j <= 3; j++) {
1207
- h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
1208
- sHex.charAt((i >> (j * 8)) & 0x0F);
1209
- }
1210
- return h.substring(0, 2);
1211
- }
1212
-
1213
-
1214
-
1215
-
1216
- function ToHex(i) {
1217
- var sHex = "0123456789ABCDEF";
1218
- var Out = "";
1219
-
1220
-
1221
-
1222
-
1223
- Out = sHex.charAt(i & 0xf);
1224
- i >>= 4;
1225
- Out = sHex.charAt(i & 0xf) + Out;
1226
-
1227
-
1228
-
1229
-
1230
- return Out;
1231
- }
1232
-
1233
- function stringToPDU(inpString, phoneNumber, smscNumber, size, mclass, valid, receipt, vFlag) // AJA fixed SMSC processing
1234
- {
1235
- var bitSize = size;
1236
-
1237
-
1238
-
1239
-
1240
- var octetFirst = "";
1241
- var octetSecond = "";
1242
- var output = "";
1243
-
1244
-
1245
-
1246
-
1247
- //Make header
1248
- var SMSC_INFO_LENGTH = 0;
1249
- var SMSC_LENGTH = 0;
1250
- var SMSC_NUMBER_FORMAT = "";
1251
- var SMSC = "";
1252
- if (smscNumber != 0) {
1253
- SMSC_NUMBER_FORMAT = "81"; // national
1254
-
1255
-
1256
-
1257
-
1258
- if (smscNumber.substr(0, 1) == '+') {
1259
- SMSC_NUMBER_FORMAT = "91"; // international
1260
- smscNumber = smscNumber.substr(1);
1261
- } else if (smscNumber.substr(0, 1) != '0') {
1262
- SMSC_NUMBER_FORMAT = "91"; // international
1263
- }
1264
-
1265
-
1266
-
1267
-
1268
- if (smscNumber.length % 2 != 0) {
1269
- // add trailing F
1270
- smscNumber += "F";
1271
- }
1272
-
1273
- SMSC = semiOctetToString(smscNumber);
1274
- SMSC_INFO_LENGTH = ((SMSC_NUMBER_FORMAT + "" + SMSC).length) / 2;
1275
- SMSC_LENGTH = SMSC_INFO_LENGTH;
1276
-
1277
- }
1278
- if (SMSC_INFO_LENGTH < 10) {
1279
- SMSC_INFO_LENGTH = "0" + SMSC_INFO_LENGTH;
1280
- }
1281
- var firstOctet; // = "1100";
1282
-
1283
- if (receipt) {
1284
- if (vFlag) {
1285
- firstOctet = "3100"; // 18 is mask for validity period // 10 indicates relative
1286
- } else {
1287
- firstOctet = "2100";
1288
- }
1289
-
1290
-
1291
-
1292
-
1293
- } else {
1294
- if (vFlag) {
1295
- firstOctet = "1100";
1296
- } else {
1297
- firstOctet = "0100";
1298
- }
1299
- }
1300
-
1301
- var REIVER_NUMBER_FORMAT = "81"; // national
1302
- if (phoneNumber.substr(0, 1) == '+') {
1303
- REIVER_NUMBER_FORMAT = "91"; // international
1304
- phoneNumber = phoneNumber.substr(1); //,phoneNumber.length-1);
1305
- } else if (phoneNumber.substr(0, 1) != '0') {
1306
- REIVER_NUMBER_FORMAT = "91"; // international
1307
- }
1308
-
1309
-
1310
-
1311
-
1312
- var REIVER_NUMBER_LENGTH = intToHex(phoneNumber.length);
1313
-
1314
-
1315
-
1316
-
1317
- if (phoneNumber.length % 2 != 0) {
1318
- // add trailing F
1319
- phoneNumber += "F";
1320
- }
1321
-
1322
-
1323
-
1324
-
1325
- var REIVER_NUMBER = semiOctetToString(phoneNumber);
1326
- var PROTO_ID = "00";
1327
- var DCS = 0;
1328
- if (mclass != -1) // AJA
1329
- {
1330
- DCS = mclass | 0x10;
1331
- }
1332
- switch (bitSize) {
1333
- case 7:
1334
- break;
1335
- case 8:
1336
- DCS = DCS | 4;
1337
- break;
1338
- case 16:
1339
- DCS = DCS | 8;
1340
- break;
1341
- }
1342
- var DATA_ENCODING = intToHex(DCS);
1343
- // var DATA_ENCODING = "00"; // Default
1344
- // if (bitSize == 8)
1345
- // {
1346
- // DATA_ENCODING = "04";
1347
- // }
1348
- // else if (bitSize == 16)
1349
- // {
1350
- // DATA_ENCODING = "08";
1351
- // }
1352
-
1353
-
1354
-
1355
-
1356
- var VALID_PERIOD = ""; // AA
1357
- if (vFlag) {
1358
- VALID_PERIOD = intToHex(valid); // AA
1359
- }
1360
- var userDataSize;
1361
- if (bitSize == 7) {
1362
- userDataSize = intToHex(inpString.length);
1363
-
1364
-
1365
-
1366
-
1367
- for (var i = 0; i <= inpString.length; i++) {
1368
- if (i == inpString.length) {
1369
- if (octetSecond != "") // AJA Fix overshoot
1370
- {
1371
- output = output + "" + (intToHex(binToInt(octetSecond)));
1372
- }
1373
- break;
1374
- }
1375
- var current = intToBin(getSevenBit(inpString.charAt(i)), 7);
1376
-
1377
- var currentOctet;
1378
- if (i != 0 && i % 8 != 0) {
1379
- octetFirst = current.substring(7 - (i) % 8);
1380
- currentOctet = octetFirst + octetSecond; //put octet parts together
1381
-
1382
- output = output + "" + (intToHex(binToInt(currentOctet)));
1383
- octetSecond = current.substring(0, 7 - (i) % 8); //set net second octet
1384
- } else {
1385
- octetSecond = current.substring(0, 7 - (i) % 8);
1386
- }
1387
- }
1388
- } else if (bitSize == 8) {
1389
- userDataSize = intToHex(inpString.length);
1390
-
1391
-
1392
-
1393
-
1394
- var CurrentByte = 0;
1395
- for (var i = 0; i < inpString.length; i++) {
1396
- CurrentByte = getEightBit(inpString.charCodeAt(i));
1397
- output = output + "" + (ToHex(CurrentByte));
1398
- }
1399
- } else if (bitSize == 16) {
1400
- userDataSize = intToHex(inpString.length * 2);
1401
-
1402
-
1403
-
1404
-
1405
- var myChar = 0;
1406
- for (var i = 0; i < inpString.length; i++) {
1407
- myChar = get16Bit(inpString.charCodeAt(i));
1408
- output = output + "" + (ToHex((myChar & 0xff00) >> 8)) + (ToHex(myChar & 0xff));
1409
- }
1410
- }
1411
- var header = SMSC_INFO_LENGTH + SMSC_NUMBER_FORMAT + SMSC + firstOctet + REIVER_NUMBER_LENGTH + REIVER_NUMBER_FORMAT + REIVER_NUMBER + PROTO_ID + DATA_ENCODING + VALID_PERIOD + userDataSize;
1412
-
1413
-
1414
-
1415
-
1416
- var PDU = header + output;
1417
-
1418
-
1419
-
1420
-
1421
- var AT = (PDU.length / 2 - SMSC_LENGTH - 1); // Add /2 for PDU length AJA - I think the SMSC information should also be excluded
1422
-
1423
-
1424
- // var bStep=18;
1425
- // for(var breakUp=1;breakUp*bStep < PDU.length;breakUp++)
1426
- // {
1427
- // PDU = PDU.substr(0,breakUp*bStep+breakUp-1) + " " + PDU.substr(breakUp*bStep+breakUp-1);
1428
- // }
1429
-
1430
-
1431
-
1432
-
1433
- //CMGW
1434
- return AT + "\n" + PDU;
1435
- }