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 +4 -4
- data/lib/comunika_gsm.rb +1 -0
- data/lib/comunika_gsm/gsm.rb +68 -12
- data/lib/comunika_gsm/gsm2.rb +113 -0
- data/lib/comunika_gsm/js/pdu.js +0 -359
- data/lib/comunika_gsm/js/pdu.min.js +1 -1
- data/lib/comunika_gsm/js/pdu2.js +809 -0
- data/lib/comunika_gsm/modem.rb +19 -67
- data/lib/comunika_gsm/pdu.rb +35 -76
- data/lib/comunika_gsm/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 65001b45352fa61eea2a3d6183a9461ddfdf0443
|
|
4
|
+
data.tar.gz: 701358d13eba5b83d1a927c28104d7cf39ca598e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cf88c01c16c6767dc4d3746a772e85a209fd97df80e57f97f1ae85ee710b6156c3d66b4dd129a271786c16cb9fd23a51a2b7c7bbb8b7c9a480f525fc23267267
|
|
7
|
+
data.tar.gz: 9aa39be18cdc70851330da7da3ba29bced8b291c55d3e9fb9fd98a049d4663c8bdd43c0c8fe7d31772bc610ead71cebb2f6ed5a2eb4f227e47396e38b5935e22
|
data/lib/comunika_gsm.rb
CHANGED
data/lib/comunika_gsm/gsm.rb
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
1
|
module ComunikaGsm
|
|
2
2
|
class GSM
|
|
3
|
-
|
|
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 =
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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(
|
|
29
|
+
def cmd(c)
|
|
23
30
|
begin
|
|
24
|
-
@@port.write(
|
|
25
|
-
normalize(
|
|
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
|
data/lib/comunika_gsm/js/pdu.js
CHANGED
|
@@ -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
|
-
}
|