comunika_gsm 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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
- }