comunika_gsm 0.1.0
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 +7 -0
- data/lib/comunika_gsm.rb +14 -0
- data/lib/comunika_gsm/gsm.rb +68 -0
- data/lib/comunika_gsm/js/pdu.js +1601 -0
- data/lib/comunika_gsm/js/pdu.min.js +1 -0
- data/lib/comunika_gsm/pdu.rb +110 -0
- data/lib/comunika_gsm/sms.rb +54 -0
- data/lib/comunika_gsm/version.rb +3 -0
- metadata +107 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 568dc5d37841896c35d14728c73eb3cdec519bf3
|
|
4
|
+
data.tar.gz: 42ebbba6ae081b8a197e40d59bc0a1dda984c2de
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 09e376be6b8382c7d9764ff8cb2aad917f6636c4b305cde15836a9f968cb35b90745362441dece1b1dd42c68913339ba80096fd022b90671de9d66c12783d7df
|
|
7
|
+
data.tar.gz: e9db3624809f468ad50a949f0a0a979deffad074028876fd3f014d8984420e158a62bf0564b2953f0269e90978e28929065c8b70c5325309e646776fa77f4941
|
data/lib/comunika_gsm.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'serialport'
|
|
2
|
+
require 'time'
|
|
3
|
+
require 'execjs'
|
|
4
|
+
|
|
5
|
+
require "comunika_gsm/version"
|
|
6
|
+
require "comunika_gsm/gsm"
|
|
7
|
+
require "comunika_gsm/sms"
|
|
8
|
+
require "comunika_gsm/pdu"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
module ComunikaGsm
|
|
12
|
+
file_path = File.join( File.dirname(__FILE__), 'comunika_gsm', 'js', 'pdu.min.js')
|
|
13
|
+
@@pdu_converter = ExecJS.compile(File.read(file_path))
|
|
14
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module ComunikaGsm
|
|
2
|
+
class GSM
|
|
3
|
+
attr_accessor :status
|
|
4
|
+
def initialize(params)
|
|
5
|
+
return nil if params.empty?
|
|
6
|
+
begin
|
|
7
|
+
@@port = SerialPort.new("/dev/#{params[:port]}",19200,8,1, SerialPort::NONE)
|
|
8
|
+
@@port.read_timeout = 1000 ## Set timeout of command
|
|
9
|
+
|
|
10
|
+
@@debug = params[:debug]
|
|
11
|
+
|
|
12
|
+
return nil unless check_port ## Send command AT to modem
|
|
13
|
+
@status = true
|
|
14
|
+
load_modem
|
|
15
|
+
rescue Errno::ENOENT
|
|
16
|
+
@status = false
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def cmd(cmd)
|
|
21
|
+
begin
|
|
22
|
+
@@port.write(cmd)
|
|
23
|
+
normalize(cmd,wait)
|
|
24
|
+
rescue => ex
|
|
25
|
+
@status = false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def wait
|
|
30
|
+
buffer = @@port.read
|
|
31
|
+
puts buffer if @@debug
|
|
32
|
+
@@port.flush()
|
|
33
|
+
buffer
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
## Load modem from send sms ##
|
|
39
|
+
def load_modem
|
|
40
|
+
cmd("ATE0\r\n") ## Echo off events
|
|
41
|
+
cmd("AT+CMGF=0\r\n") ## Set PDU mode
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def check_port
|
|
45
|
+
cmd("AT\r\n").eql?("OK")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
public
|
|
49
|
+
def normalize(cmd,res)
|
|
50
|
+
case cmd.gsub(/\r\n/,'')
|
|
51
|
+
when 'AT'
|
|
52
|
+
res.scan(/\r\n(\S+)\r\n/)[0].first unless res.empty?
|
|
53
|
+
when 'AT+COPS?'
|
|
54
|
+
res.scan(/\"(.*?)\"/)[0].first
|
|
55
|
+
when 'AT+CNUM'
|
|
56
|
+
res.scan(/\"(.*?)\"/)
|
|
57
|
+
when 'AT+CGSN'
|
|
58
|
+
res.scan(/\r\n(\d+)\r\n/)[0].first
|
|
59
|
+
when 'AT+CGMI'
|
|
60
|
+
res.scan(/\r\n(\S+)\r\n/)[0].first
|
|
61
|
+
when 'AT+CRSM=176,12258,0,0,10'
|
|
62
|
+
res.scan(/\"(.*?)\"/)[0].first
|
|
63
|
+
else
|
|
64
|
+
res
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,1601 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
/* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
|
|
4
|
+
*
|
|
5
|
+
* Further fixes and functionality by Andrew Alexander:
|
|
6
|
+
* Fix message length issues, handle +xx & 0xx phone codes, added bit length options,
|
|
7
|
+
* display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex,
|
|
8
|
+
* allow leading AT command in input, implemented some support for alpanumeric senders...
|
|
9
|
+
*
|
|
10
|
+
* ekkebus[at]cs.utwente.nl
|
|
11
|
+
* Feel free to use it, please don't forget to link to the source ;)
|
|
12
|
+
*
|
|
13
|
+
*
|
|
14
|
+
* www.rednaxela.net - Feel free to use this code as you wish.
|
|
15
|
+
* Version 1.5 r9aja
|
|
16
|
+
*
|
|
17
|
+
* Official BPS develop tool
|
|
18
|
+
*
|
|
19
|
+
* (c) BPS & co, 2003
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
//Array with "The 7 bit defaultalphabet"
|
|
24
|
+
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', 'ä', 'ö', 'ñ','ü', 'à', 'á');
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
// Variable that stores the information to show the user the calculation of the translation
|
|
30
|
+
var calculation = "";
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
var maxkeys = 160;
|
|
36
|
+
var alerted = false;
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
// function te convert a bit string into a integer
|
|
42
|
+
function binToInt(x)//sp
|
|
43
|
+
{
|
|
44
|
+
var total = 0;
|
|
45
|
+
var power = parseInt(x.length)-1;
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
for(var i=0;i<x.length;i++)
|
|
51
|
+
{
|
|
52
|
+
if(x.charAt(i) == '1')
|
|
53
|
+
{
|
|
54
|
+
total = total +Math.pow(2,power);
|
|
55
|
+
}
|
|
56
|
+
power --;
|
|
57
|
+
}
|
|
58
|
+
return total;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
// function to convert a integer into a bit String
|
|
65
|
+
function intToBin(x,size) //sp
|
|
66
|
+
{
|
|
67
|
+
var base = 2;
|
|
68
|
+
var num = parseInt(x);
|
|
69
|
+
var bin = num.toString(base);
|
|
70
|
+
for(var i=bin.length;i<size;i++)
|
|
71
|
+
{
|
|
72
|
+
bin = "0" + bin;
|
|
73
|
+
}
|
|
74
|
+
return bin;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
// function to convert a Hexnumber into a 10base number
|
|
81
|
+
function HexToNum(numberS)
|
|
82
|
+
{
|
|
83
|
+
var tens = MakeNum(numberS.substring(0,1));
|
|
84
|
+
|
|
85
|
+
var ones = 0;
|
|
86
|
+
if(numberS.length > 1) // means two characters entered
|
|
87
|
+
ones=MakeNum(numberS.substring(1,2));
|
|
88
|
+
if(ones == 'X')
|
|
89
|
+
{
|
|
90
|
+
return "00";
|
|
91
|
+
}
|
|
92
|
+
return (tens * 16) + (ones * 1);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
// helper function for HexToNum
|
|
99
|
+
function MakeNum(str)
|
|
100
|
+
{
|
|
101
|
+
if((str >= '0') && (str <= '9'))
|
|
102
|
+
return str;
|
|
103
|
+
switch(str.toUpperCase())
|
|
104
|
+
{
|
|
105
|
+
case "A": return 10;
|
|
106
|
+
case "B": return 11;
|
|
107
|
+
case "C": return 12;
|
|
108
|
+
case "D": return 13;
|
|
109
|
+
case "E": return 14;
|
|
110
|
+
case "F": return 15;
|
|
111
|
+
default:
|
|
112
|
+
return 16;
|
|
113
|
+
}
|
|
114
|
+
return 16;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
//function to convert integer to Hex
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
function intToHex(i) //sp
|
|
126
|
+
{
|
|
127
|
+
var sHex = "0123456789ABCDEF";
|
|
128
|
+
h = "";
|
|
129
|
+
i = parseInt(i);
|
|
130
|
+
for(j = 0; j <= 3; j++)
|
|
131
|
+
{
|
|
132
|
+
h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
|
|
133
|
+
sHex.charAt((i >> (j * 8)) & 0x0F);
|
|
134
|
+
}
|
|
135
|
+
return h.substring(0,2);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
function ToHex(i)
|
|
142
|
+
{
|
|
143
|
+
var sHex = "0123456789ABCDEF";
|
|
144
|
+
var Out = "";
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
Out = sHex.charAt(i&0xf);
|
|
150
|
+
i>>=4;
|
|
151
|
+
Out = sHex.charAt(i&0xf) + Out;
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
return Out;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
function getSevenBit(character) //sp
|
|
167
|
+
{
|
|
168
|
+
for(var i=0;i<sevenbitdefault.length;i++)
|
|
169
|
+
{
|
|
170
|
+
if(sevenbitdefault[i] == character)
|
|
171
|
+
{
|
|
172
|
+
return i;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//alert("No 7 bit char for " + character);
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
function getEightBit(character)
|
|
183
|
+
{
|
|
184
|
+
return character;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
function get16Bit(character)
|
|
191
|
+
{
|
|
192
|
+
return character;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
function phoneNumberMap(character)
|
|
199
|
+
{
|
|
200
|
+
// return character;
|
|
201
|
+
if((character >= '0') && (character <= '9'))
|
|
202
|
+
{
|
|
203
|
+
return character;
|
|
204
|
+
}
|
|
205
|
+
switch(character.toUpperCase())
|
|
206
|
+
{
|
|
207
|
+
case '*':
|
|
208
|
+
return 'A';
|
|
209
|
+
case '#':
|
|
210
|
+
return 'B';
|
|
211
|
+
case 'A':
|
|
212
|
+
return 'C';
|
|
213
|
+
case 'B':
|
|
214
|
+
return 'D';
|
|
215
|
+
case 'C':
|
|
216
|
+
return 'E';
|
|
217
|
+
// case '+':
|
|
218
|
+
// return '+'; // An exception to fit with current processing ...
|
|
219
|
+
default:
|
|
220
|
+
return 'F';
|
|
221
|
+
}
|
|
222
|
+
return 'F';
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
function phoneNumberUnMap(chararacter)
|
|
229
|
+
{
|
|
230
|
+
if((chararacter >= '0') && (chararacter <= '9'))
|
|
231
|
+
{
|
|
232
|
+
return chararacter;
|
|
233
|
+
}
|
|
234
|
+
switch(chararacter)
|
|
235
|
+
{
|
|
236
|
+
case 10: return '*';
|
|
237
|
+
case 11: return '#';
|
|
238
|
+
case 12: return 'A';
|
|
239
|
+
case 13: return 'B';
|
|
240
|
+
case 14: return 'C';
|
|
241
|
+
default:
|
|
242
|
+
return 'F';
|
|
243
|
+
}
|
|
244
|
+
return 'F';
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
// function to convert semioctets to a string
|
|
251
|
+
function semiOctetToString(inp) //sp
|
|
252
|
+
{
|
|
253
|
+
var out = "";
|
|
254
|
+
for(var i=0;i<inp.length;i=i+2)
|
|
255
|
+
{
|
|
256
|
+
var temp = inp.substring(i,i+2);
|
|
257
|
+
out = out + phoneNumberMap(temp.charAt(1)) + phoneNumberMap(temp.charAt(0));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
//Main function to translate the input to a "human readable" string
|
|
274
|
+
function getUserMessage(input,truelength) // Add truelength AJA
|
|
275
|
+
{
|
|
276
|
+
var byteString = "";
|
|
277
|
+
octetArray = new Array();
|
|
278
|
+
restArray = new Array();
|
|
279
|
+
septetsArray = new Array();
|
|
280
|
+
var s=1;
|
|
281
|
+
var count = 0;
|
|
282
|
+
var matchcount = 0; // AJA
|
|
283
|
+
var smsMessage = "";
|
|
284
|
+
|
|
285
|
+
var calculation1 = "<table border=1 ><tr><td align=center width=75><b>Hex</b></td>";
|
|
286
|
+
var calculation2 = "<tr><td align=center width=75> <b> Octets </b></td>";
|
|
287
|
+
var calculation3 = "<table border=1 ><tr><td align=center width=75><b>septets</b></td>";
|
|
288
|
+
var calculation4 = "<tr><td align=center width=75><b>Character</b></td>";
|
|
289
|
+
calculation = "";
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
//Cut the input string into pieces of2 (just get the hex octets)
|
|
295
|
+
for(var i=0;i<input.length;i=i+2)
|
|
296
|
+
{
|
|
297
|
+
var hex = input.substring(i,i+2);
|
|
298
|
+
byteString = byteString + intToBin(HexToNum(hex),8);
|
|
299
|
+
if((i%14 == 0 && i!=0))
|
|
300
|
+
{
|
|
301
|
+
calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
|
|
302
|
+
}
|
|
303
|
+
calculation1 = calculation1 + "<td align=center width=75>" + hex + "</td>";
|
|
304
|
+
|
|
305
|
+
}
|
|
306
|
+
calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
|
|
307
|
+
|
|
308
|
+
// make two array's these are nessesery to
|
|
309
|
+
for(var i=0;i<byteString.length;i=i+8)
|
|
310
|
+
{
|
|
311
|
+
octetArray[count] = byteString.substring(i,i+8);
|
|
312
|
+
restArray[count] = octetArray[count].substring(0,(s%8));
|
|
313
|
+
septetsArray[count] = octetArray[count].substring((s%8),8);
|
|
314
|
+
if((i%56 == 0 && i!=0))
|
|
315
|
+
{
|
|
316
|
+
calculation2 = calculation2 + "<td align=center width=75> </td>";
|
|
317
|
+
}
|
|
318
|
+
calculation2 = calculation2 + "<td align=center width=75><span style='background-color: #FFFF00'>" + restArray[count] + "</span>"+ septetsArray[count]+"</td>";
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
s++;
|
|
325
|
+
count++;
|
|
326
|
+
if(s == 8)
|
|
327
|
+
{
|
|
328
|
+
s = 1;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
calculation2 = calculation2 + "<td align=center width=75> </td>";
|
|
332
|
+
|
|
333
|
+
// put the right parts of the array's together to make the sectets
|
|
334
|
+
for(var i=0;i<restArray.length;i++)
|
|
335
|
+
{
|
|
336
|
+
|
|
337
|
+
if(i%7 == 0)
|
|
338
|
+
{
|
|
339
|
+
if(i != 0)
|
|
340
|
+
{
|
|
341
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i-1])];
|
|
342
|
+
calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i-1] + "</span> </td>";
|
|
343
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i-1])] + " </td>";
|
|
344
|
+
matchcount ++; // AJA
|
|
345
|
+
}
|
|
346
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i])];
|
|
347
|
+
calculation3 = calculation3 + "<td align=center width=75> " +septetsArray[i] + " </td>";
|
|
348
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i])] + " </td>";
|
|
349
|
+
matchcount ++; // AJA
|
|
350
|
+
}
|
|
351
|
+
else
|
|
352
|
+
{
|
|
353
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i]+restArray[i-1])];
|
|
354
|
+
calculation3 = calculation3 + "<td align=center width=75> " +septetsArray[i]+ "<span style='background-color: #FFFF00'>" +restArray[i-1] + " </span>" + "</td>"
|
|
355
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i]+restArray[i-1])] + " </td>";
|
|
356
|
+
matchcount ++; // AJA
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
}
|
|
360
|
+
if(matchcount != truelength) // Don't forget trailing characters!! AJA
|
|
361
|
+
{
|
|
362
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i-1])];
|
|
363
|
+
calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i-1] + "</span> </td>";
|
|
364
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i-1])] + " </td>";
|
|
365
|
+
}
|
|
366
|
+
else // Blank Filler
|
|
367
|
+
{
|
|
368
|
+
calculation3 = calculation3 + "<td align=center width=75>+++++++</td>";
|
|
369
|
+
calculation4 = calculation4 + "<td align=center width=75> </td>";
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
//Put all the calculation info together
|
|
373
|
+
calculation = "Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+calculation1 + "</tr>" + calculation2 + "</tr></table>" + calculation3 + "</tr>"+ calculation4 + "</tr></table>";
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
return smsMessage;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
function getUserMessage16(input,truelength)
|
|
385
|
+
{
|
|
386
|
+
var smsMessage = "";
|
|
387
|
+
calculation = "Not implemented";
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
// Cut the input string into pieces of 4
|
|
393
|
+
for(var i=0;i<input.length;i=i+4)
|
|
394
|
+
{
|
|
395
|
+
var hex1 = input.substring(i,i+2);
|
|
396
|
+
var hex2 = input.substring(i+2,i+4);
|
|
397
|
+
smsMessage += "" + String.fromCharCode(HexToNum(hex1)*256+HexToNum(hex2));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return smsMessage;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
function getUserMessage8(input,truelength)
|
|
407
|
+
{
|
|
408
|
+
var smsMessage = "";
|
|
409
|
+
calculation = "Not implemented";
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
// Cut the input string into pieces of 2 (just get the hex octets)
|
|
415
|
+
for(var i=0;i<input.length;i=i+2)
|
|
416
|
+
{
|
|
417
|
+
var hex = input.substring(i,i+2);
|
|
418
|
+
smsMessage += "" + String.fromCharCode(HexToNum(hex));
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return smsMessage;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Function to get SMSmeta info information from PDU String
|
|
425
|
+
function getPDUMetaInfo(inp)
|
|
426
|
+
{
|
|
427
|
+
var PDUString = inp;
|
|
428
|
+
var start = 0;
|
|
429
|
+
var out="";
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
// Silently Strip leading AT command
|
|
435
|
+
if (PDUString.substr(0,2)=="AT")
|
|
436
|
+
{
|
|
437
|
+
for(var i=0;i<PDUString.length;i++)
|
|
438
|
+
{
|
|
439
|
+
if(PDUString.charCodeAt(i)==10)
|
|
440
|
+
{
|
|
441
|
+
PDUString = PDUString.substr(i+1);
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
// Silently strip whitespace
|
|
451
|
+
var NewPDU="";
|
|
452
|
+
for(var i=0;i<PDUString.length;i++)
|
|
453
|
+
{
|
|
454
|
+
if (MakeNum(PDUString.substr(i,1))!=16)
|
|
455
|
+
{
|
|
456
|
+
NewPDU = NewPDU + PDUString.substr(i,1);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
PDUString = NewPDU;
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
var SMSC_lengthInfo = HexToNum(PDUString.substring(0,2));
|
|
465
|
+
var SMSC_info = PDUString.substring(2,2+(SMSC_lengthInfo*2));
|
|
466
|
+
var SMSC_TypeOfAddress = SMSC_info.substring(0,2);
|
|
467
|
+
var SMSC_Number = SMSC_info.substring(2,2+(SMSC_lengthInfo*2));
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
if (SMSC_lengthInfo != 0)
|
|
473
|
+
{
|
|
474
|
+
SMSC_Number = semiOctetToString(SMSC_Number);
|
|
475
|
+
|
|
476
|
+
// if the length is odd remove the trailing F
|
|
477
|
+
if((SMSC_Number.substr(SMSC_Number.length-1,1) == 'F') || (SMSC_Number.substr(SMSC_Number.length-1,1) == 'f'))
|
|
478
|
+
{
|
|
479
|
+
SMSC_Number = SMSC_Number.substring(0,SMSC_Number.length-1);
|
|
480
|
+
}
|
|
481
|
+
if (SMSC_TypeOfAddress == 91)
|
|
482
|
+
{
|
|
483
|
+
SMSC_Number = "+" + SMSC_Number;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
var start_SMSDeleivery = (SMSC_lengthInfo*2)+2;
|
|
488
|
+
|
|
489
|
+
start = start_SMSDeleivery;
|
|
490
|
+
var firstOctet_SMSDeliver = PDUString.substr(start,2);
|
|
491
|
+
start = start + 2;
|
|
492
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x20) == 0x20)
|
|
493
|
+
{
|
|
494
|
+
out += "Type::::Receipt requested\n";
|
|
495
|
+
}
|
|
496
|
+
var DataHeader = 0;
|
|
497
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x40) == 0x40)
|
|
498
|
+
{
|
|
499
|
+
DataHeader = 1;
|
|
500
|
+
out += "Type::::Data Header\n";
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// bit1 bit0 Message type
|
|
504
|
+
// 0 0 SMS DELIVER (in the direction SC to MS)
|
|
505
|
+
// 0 0 SMS DELIVER REPORT (in the direction MS to SC)
|
|
506
|
+
// 1 0 SMS STATUS REPORT (in the direction SC to MS)
|
|
507
|
+
// 1 0 SMS COMMAND (in the direction MS to SC)
|
|
508
|
+
// 0 1 SMS SUBMIT (in the direction MS to SC)
|
|
509
|
+
// 0 1 SMS SUBMIT REPORT (in the direction SC to MS)
|
|
510
|
+
// 1 1 Reserved
|
|
511
|
+
|
|
512
|
+
// This needs tidying up!! AJA
|
|
513
|
+
|
|
514
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 1 || (HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) // Transmit Message
|
|
515
|
+
{
|
|
516
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 3)
|
|
517
|
+
{
|
|
518
|
+
out = "Type::::Unknown Message\nTreat as Deliver\n";
|
|
519
|
+
}
|
|
520
|
+
var MessageReference = HexToNum(PDUString.substr(start,2));
|
|
521
|
+
start = start + 2;
|
|
522
|
+
|
|
523
|
+
// length in decimals
|
|
524
|
+
var sender_addressLength = HexToNum(PDUString.substr(start,2));
|
|
525
|
+
if(sender_addressLength%2 != 0)
|
|
526
|
+
{
|
|
527
|
+
sender_addressLength +=1;
|
|
528
|
+
}
|
|
529
|
+
start = start + 2;
|
|
530
|
+
|
|
531
|
+
var sender_typeOfAddress = PDUString.substr(start,2);
|
|
532
|
+
start = start + 2
|
|
533
|
+
|
|
534
|
+
var sender_number = semiOctetToString(PDUString.substring(start,start+sender_addressLength));
|
|
535
|
+
|
|
536
|
+
if((sender_number.substr(sender_number.length-1,1) == 'F') || (sender_number.substr(sender_number.length-1,1) == 'f' ))
|
|
537
|
+
{
|
|
538
|
+
sender_number = sender_number.substring(0,sender_number.length-1);
|
|
539
|
+
}
|
|
540
|
+
if (sender_typeOfAddress == 91)
|
|
541
|
+
{
|
|
542
|
+
sender_number = "+" + sender_number;
|
|
543
|
+
}
|
|
544
|
+
start +=sender_addressLength;
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
var tp_PID = PDUString.substr(start,2);
|
|
550
|
+
start +=2;
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
var tp_DCS = PDUString.substr(start,2);
|
|
556
|
+
var tp_DCS_desc = tpDCSMeaning(tp_DCS);
|
|
557
|
+
start +=2;
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
var ValidityPeriod;
|
|
563
|
+
switch( (HexToNum(firstOctet_SMSDeliver) & 0x18) )
|
|
564
|
+
{
|
|
565
|
+
case 0: // Not Present
|
|
566
|
+
ValidityPeriod = "Not Present";
|
|
567
|
+
break;
|
|
568
|
+
case 0x10: // Relative
|
|
569
|
+
ValidityPeriod = "Rel " + cValid(HexToNum(PDUString.substr(start,2)));
|
|
570
|
+
start +=2;
|
|
571
|
+
break;
|
|
572
|
+
case 0x08: // Enhanced
|
|
573
|
+
ValidityPeriod = "Enhanced - Not Decoded";
|
|
574
|
+
start +=14;
|
|
575
|
+
break;
|
|
576
|
+
case 0x18: // Absolute
|
|
577
|
+
ValidityPeriod = "Absolute - Not Decoded";
|
|
578
|
+
start +=14;
|
|
579
|
+
break;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
// Commonish...
|
|
586
|
+
var messageLength = HexToNum(PDUString.substr(start,2));
|
|
587
|
+
|
|
588
|
+
start += 2;
|
|
589
|
+
|
|
590
|
+
var bitSize = DCS_Bits(tp_DCS);
|
|
591
|
+
var userData = "Undefined format";
|
|
592
|
+
if (bitSize==7)
|
|
593
|
+
{
|
|
594
|
+
userData = getUserMessage(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
595
|
+
}
|
|
596
|
+
else if (bitSize==8)
|
|
597
|
+
{
|
|
598
|
+
userData = getUserMessage8(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
599
|
+
}
|
|
600
|
+
else if (bitSize==16)
|
|
601
|
+
{
|
|
602
|
+
userData = getUserMessage16(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
userData = userData.substr(0,messageLength);
|
|
609
|
+
if (bitSize==16)
|
|
610
|
+
{
|
|
611
|
+
messageLength/=2;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
if (out.length == 0)
|
|
616
|
+
{
|
|
617
|
+
out = "Type::::Message:\n";
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
out += "SMSC::::"+SMSC_Number+"\nReceipient::::"+sender_number+"\nValidity::::" + ValidityPeriod + "\nTP_PID::::"+tp_PID+"\nTP_DCS::::"+tp_DCS+"\nTP_DCS-popis::::"+tp_DCS_desc+"Message::::"+userData+"\nLength::::"+messageLength;
|
|
621
|
+
}
|
|
622
|
+
else // Receive Message
|
|
623
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 0) // Receive Message
|
|
624
|
+
{
|
|
625
|
+
// length in decimals
|
|
626
|
+
//out += "Type: Receive Message\n";
|
|
627
|
+
var sender_addressLength = HexToNum(PDUString.substr(start,2));
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
start = start + 2;
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
var sender_typeOfAddress = PDUString.substr(start,2);
|
|
638
|
+
start = start + 2
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
var sender_number;
|
|
644
|
+
if (sender_typeOfAddress == "D0")
|
|
645
|
+
{
|
|
646
|
+
_sl = sender_addressLength;
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
if(sender_addressLength%2 != 0)
|
|
652
|
+
{
|
|
653
|
+
sender_addressLength +=1;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
//alert(sender_addressLength);
|
|
660
|
+
//alert(_sl);
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
//alert(parseInt(sender_addressLength/2*8/7));
|
|
666
|
+
//alert(parseInt(_sl/2*8/7));
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
//alert(PDUString.substring(start,start+sender_addressLength));
|
|
672
|
+
//alert(PDUString.substring(start,start+_sl));
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
// sender_number = getUserMessage(PDUString.substring(start,start+sender_addressLength),parseInt(sender_addressLength/2*8/7));
|
|
678
|
+
sender_number = getUserMessage(PDUString.substring(start,start+sender_addressLength),parseInt(_sl/2*8/7));
|
|
679
|
+
//alert(sender_number);
|
|
680
|
+
}
|
|
681
|
+
else
|
|
682
|
+
{
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
if(sender_addressLength%2 != 0)
|
|
688
|
+
{
|
|
689
|
+
sender_addressLength +=1;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
sender_number = semiOctetToString(PDUString.substring(start,start+sender_addressLength));
|
|
696
|
+
|
|
697
|
+
if((sender_number.substr(sender_number.length-1,1) == 'F') || (sender_number.substr(sender_number.length-1,1) == 'f' ))
|
|
698
|
+
{
|
|
699
|
+
sender_number = sender_number.substring(0,sender_number.length-1);
|
|
700
|
+
}
|
|
701
|
+
if (sender_typeOfAddress == 91)
|
|
702
|
+
{
|
|
703
|
+
sender_number = "+" + sender_number;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
start +=sender_addressLength;
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
|
|
711
|
+
var tp_PID = PDUString.substr(start,2);
|
|
712
|
+
start +=2;
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
var tp_DCS = PDUString.substr(start,2);
|
|
718
|
+
var tp_DCS_desc = tpDCSMeaning(tp_DCS);
|
|
719
|
+
start +=2;
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
var timeStamp = semiOctetToString(PDUString.substr(start,14));
|
|
725
|
+
|
|
726
|
+
// get date
|
|
727
|
+
var year = timeStamp.substring(0,2);
|
|
728
|
+
var month = timeStamp.substring(2,4);
|
|
729
|
+
var day = timeStamp.substring(4,6);
|
|
730
|
+
var hours = timeStamp.substring(6,8);
|
|
731
|
+
var minutes = timeStamp.substring(8,10);
|
|
732
|
+
var seconds = timeStamp.substring(10,12);
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT ?"; //+" + timezone/4;
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
/*
|
|
743
|
+
var timezone = MakeNum(timeStamp.substring(12,13)); // timeStamp.substring(12,14);
|
|
744
|
+
if (timezone >= 8)
|
|
745
|
+
{
|
|
746
|
+
timezone -= 8;
|
|
747
|
+
timezone = timezone + timeStamp.substring(13,14); // Concats :: yeuck
|
|
748
|
+
timezone = -timezone;
|
|
749
|
+
timeStamp += "-";
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
}
|
|
755
|
+
else
|
|
756
|
+
{
|
|
757
|
+
timezone = timezone + timeStamp.substring(13,14); // Concats :: yeuck
|
|
758
|
+
timeStamp += "+";
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
timeStamp += timezone/4;
|
|
762
|
+
*/
|
|
763
|
+
start +=14;
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
// Commonish...
|
|
769
|
+
var messageLength = HexToNum(PDUString.substr(start,2));
|
|
770
|
+
start += 2;
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
var bitSize = DCS_Bits(tp_DCS);
|
|
776
|
+
var userData = "Undefined format";
|
|
777
|
+
if (bitSize==7)
|
|
778
|
+
{
|
|
779
|
+
userData = getUserMessage(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
780
|
+
}
|
|
781
|
+
else if (bitSize==8)
|
|
782
|
+
{
|
|
783
|
+
userData = getUserMessage8(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
784
|
+
}
|
|
785
|
+
else if (bitSize==16)
|
|
786
|
+
{
|
|
787
|
+
userData = getUserMessage16(PDUString.substr(start,PDUString.length-start),messageLength);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
userData = userData.substr(0,messageLength);
|
|
794
|
+
|
|
795
|
+
userData = userData.replace(/\n/g,"")
|
|
796
|
+
userData = userData.replace("::::","")
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
if (bitSize==16)
|
|
800
|
+
{
|
|
801
|
+
messageLength/=2;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
out += "SMSC::::"+SMSC_Number+"\nSender::::"+sender_number+"\nTimeStamp::::"+timeStamp+"\nTP_PID::::"+tp_PID+"\nTP_DCS::::"+tp_DCS+"\nTP_DCS-popis::::"+tp_DCS_desc+"Message::::"+userData+"\nLength::::"+messageLength;
|
|
805
|
+
}
|
|
806
|
+
else
|
|
807
|
+
{
|
|
808
|
+
out = "Type::::Status Report\n";
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
var MessageReference = HexToNum(PDUString.substr(start,2)); // ??? Correct this name
|
|
814
|
+
start = start + 2;
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
// length in decimals
|
|
820
|
+
var sender_addressLength = HexToNum(PDUString.substr(start,2));
|
|
821
|
+
if(sender_addressLength%2 != 0)
|
|
822
|
+
{
|
|
823
|
+
sender_addressLength +=1;
|
|
824
|
+
}
|
|
825
|
+
start = start + 2;
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
var sender_typeOfAddress = PDUString.substr(start,2);
|
|
831
|
+
start = start + 2
|
|
832
|
+
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
var sender_number = semiOctetToString(PDUString.substring(start,start+sender_addressLength));
|
|
837
|
+
|
|
838
|
+
if((sender_number.substr(sender_number.length-1,1) == 'F') || (sender_number.substr(sender_number.length-1,1) == 'f' ))
|
|
839
|
+
{
|
|
840
|
+
sender_number = sender_number.substring(0,sender_number.length-1);
|
|
841
|
+
}
|
|
842
|
+
if (sender_typeOfAddress == 91)
|
|
843
|
+
{
|
|
844
|
+
sender_number = "+" + sender_number;
|
|
845
|
+
}
|
|
846
|
+
start +=sender_addressLength;
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
var timeStamp = semiOctetToString(PDUString.substr(start,14));
|
|
852
|
+
|
|
853
|
+
// get date
|
|
854
|
+
var year = timeStamp.substring(0,2);
|
|
855
|
+
var month = timeStamp.substring(2,4);
|
|
856
|
+
var day = timeStamp.substring(4,6);
|
|
857
|
+
var hours = timeStamp.substring(6,8);
|
|
858
|
+
var minutes = timeStamp.substring(8,10);
|
|
859
|
+
var seconds = timeStamp.substring(10,12);
|
|
860
|
+
var timezone = timeStamp.substring(12,14);
|
|
861
|
+
|
|
862
|
+
timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT +" + timezone/4;
|
|
863
|
+
start +=14;
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
var timeStamp2 = semiOctetToString(PDUString.substr(start,14));
|
|
869
|
+
|
|
870
|
+
// get date
|
|
871
|
+
var year2 = timeStamp2.substring(0,2);
|
|
872
|
+
var month2 = timeStamp2.substring(2,4);
|
|
873
|
+
var day2 = timeStamp2.substring(4,6);
|
|
874
|
+
var hours2 = timeStamp2.substring(6,8);
|
|
875
|
+
var minutes2 = timeStamp2.substring(8,10);
|
|
876
|
+
var seconds2 = timeStamp2.substring(10,12);
|
|
877
|
+
var timezone2 = timeStamp.substring(12,14);
|
|
878
|
+
|
|
879
|
+
timeStamp2 = day2 + "/" + month2 + "/" + year2 + " " + hours2 + ":" + minutes2 + ":" + seconds2 + " GMT +" + timezone2/4;
|
|
880
|
+
start +=14;
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
var mStatus = PDUString.substr(start,2);
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
|
|
890
|
+
out += "SMSC::::"+SMSC_Number+"\nSender::::"+sender_number+"\nMessageRef::::"+MessageReference+"\nTimeStamp::::"+timeStamp+"\nTimeStamp2::::"+timeStamp2 + "\nStatus Byte::::" + mStatus;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
return out;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
function change (what)
|
|
898
|
+
{
|
|
899
|
+
var keysSoFar = what.value.length;
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
if (keysSoFar > maxkeys)
|
|
905
|
+
{
|
|
906
|
+
if (!alerted)
|
|
907
|
+
{
|
|
908
|
+
//alert ('Max length '+ maxkeys + '!');
|
|
909
|
+
}
|
|
910
|
+
what.value = what.value.substring (0, maxkeys); //chop
|
|
911
|
+
alerted = true;
|
|
912
|
+
keysSoFar = maxkeys;
|
|
913
|
+
}
|
|
914
|
+
window.status = "Characters left : " + (maxkeys - keysSoFar);
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
function DCS_Bits(tp_DCS)
|
|
921
|
+
{
|
|
922
|
+
var AlphabetSize=7; // Set Default
|
|
923
|
+
//alert(tp_DCS);
|
|
924
|
+
var pomDCS = HexToNum(tp_DCS);
|
|
925
|
+
//alert(pomDCS);
|
|
926
|
+
switch(pomDCS & 192)
|
|
927
|
+
{
|
|
928
|
+
case 0: if(pomDCS & 32)
|
|
929
|
+
{
|
|
930
|
+
// tp_DCS_desc="Compressed Text\n";
|
|
931
|
+
}
|
|
932
|
+
else
|
|
933
|
+
{
|
|
934
|
+
// tp_DCS_desc="Uncompressed Text\n";
|
|
935
|
+
}
|
|
936
|
+
switch(pomDCS & 12)
|
|
937
|
+
{
|
|
938
|
+
case 4:
|
|
939
|
+
AlphabetSize=8;
|
|
940
|
+
break;
|
|
941
|
+
case 8:
|
|
942
|
+
AlphabetSize=16;
|
|
943
|
+
break;
|
|
944
|
+
}
|
|
945
|
+
break;
|
|
946
|
+
case 192:
|
|
947
|
+
switch(pomDCS & 0x30)
|
|
948
|
+
{
|
|
949
|
+
case 0x20:
|
|
950
|
+
AlphabetSize=16;
|
|
951
|
+
break;
|
|
952
|
+
case 0x30:
|
|
953
|
+
if (pomDCS & 0x4)
|
|
954
|
+
{
|
|
955
|
+
;
|
|
956
|
+
}
|
|
957
|
+
else
|
|
958
|
+
{
|
|
959
|
+
AlphabetSize=8;
|
|
960
|
+
}
|
|
961
|
+
break;
|
|
962
|
+
}
|
|
963
|
+
break;
|
|
964
|
+
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
|
|
970
|
+
return(AlphabetSize);
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
|
|
976
|
+
function tpDCSMeaning(tp_DCS)
|
|
977
|
+
{
|
|
978
|
+
var tp_DCS_desc=tp_DCS;
|
|
979
|
+
var pomDCS = HexToNum(tp_DCS);
|
|
980
|
+
switch(pomDCS & 192)
|
|
981
|
+
{
|
|
982
|
+
case 0: if(pomDCS & 32)
|
|
983
|
+
{
|
|
984
|
+
tp_DCS_desc="Compressed Text\n";
|
|
985
|
+
}
|
|
986
|
+
else
|
|
987
|
+
{
|
|
988
|
+
tp_DCS_desc="Uncompressed Text\n";
|
|
989
|
+
}
|
|
990
|
+
if(!(pomDCS & 16)) // AJA
|
|
991
|
+
{
|
|
992
|
+
tp_DCS_desc+="MClass::No class\n";
|
|
993
|
+
}
|
|
994
|
+
else
|
|
995
|
+
{
|
|
996
|
+
tp_DCS_desc+="MClass::";
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
|
|
1000
|
+
|
|
1001
|
+
switch(pomDCS & 3)
|
|
1002
|
+
{
|
|
1003
|
+
case 0:
|
|
1004
|
+
tp_DCS_desc+="0\n";
|
|
1005
|
+
break;
|
|
1006
|
+
case 1:
|
|
1007
|
+
tp_DCS_desc+="1\n";
|
|
1008
|
+
break;
|
|
1009
|
+
case 2:
|
|
1010
|
+
tp_DCS_desc+="2\n";
|
|
1011
|
+
break;
|
|
1012
|
+
case 3:
|
|
1013
|
+
tp_DCS_desc+="3\n";
|
|
1014
|
+
break;
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
tp_DCS_desc+="Alphabet::::";
|
|
1018
|
+
switch(pomDCS & 12)
|
|
1019
|
+
{
|
|
1020
|
+
case 0:
|
|
1021
|
+
tp_DCS_desc+="Default\n";
|
|
1022
|
+
break;
|
|
1023
|
+
case 4:
|
|
1024
|
+
tp_DCS_desc+="8bit\n";
|
|
1025
|
+
break;
|
|
1026
|
+
case 8:
|
|
1027
|
+
tp_DCS_desc+="UCS2(16)bit\n";
|
|
1028
|
+
break;
|
|
1029
|
+
case 12:
|
|
1030
|
+
tp_DCS_desc+="Reserved\n";
|
|
1031
|
+
break;
|
|
1032
|
+
}
|
|
1033
|
+
break;
|
|
1034
|
+
case 64:
|
|
1035
|
+
case 128:
|
|
1036
|
+
tp_DCS_desc ="Reserved coding group\n";
|
|
1037
|
+
break;
|
|
1038
|
+
case 192:
|
|
1039
|
+
switch(pomDCS & 0x30)
|
|
1040
|
+
{
|
|
1041
|
+
case 0:
|
|
1042
|
+
tp_DCS_desc ="Message waiting group\n";
|
|
1043
|
+
tp_DCS_desc+="Discard\n";
|
|
1044
|
+
break;
|
|
1045
|
+
case 0x10:
|
|
1046
|
+
tp_DCS_desc ="Message waiting group\n";
|
|
1047
|
+
tp_DCS_desc+="Store Message. Default Alphabet\n";
|
|
1048
|
+
break;
|
|
1049
|
+
case 0x20:
|
|
1050
|
+
tp_DCS_desc ="Message waiting group\n";
|
|
1051
|
+
tp_DCS_desc+="Store Message. UCS2 Alphabet\n";
|
|
1052
|
+
break;
|
|
1053
|
+
case 0x30:
|
|
1054
|
+
tp_DCS_desc ="Data coding message class\n";
|
|
1055
|
+
if (pomDCS & 0x4)
|
|
1056
|
+
{
|
|
1057
|
+
tp_DCS_desc+="Default Alphabet\n";
|
|
1058
|
+
}
|
|
1059
|
+
else
|
|
1060
|
+
{
|
|
1061
|
+
tp_DCS_desc+="8 bit Alphabet\n";
|
|
1062
|
+
}
|
|
1063
|
+
break;
|
|
1064
|
+
}
|
|
1065
|
+
break;
|
|
1066
|
+
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
|
|
1072
|
+
//alert(tp_DCS.valueOf());
|
|
1073
|
+
|
|
1074
|
+
return(tp_DCS_desc);
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
function checkFlag(valid)
|
|
1081
|
+
{
|
|
1082
|
+
if (valid.checked)
|
|
1083
|
+
{
|
|
1084
|
+
document.pduToStringForm.valid.disabled = false;
|
|
1085
|
+
document.pduToStringForm.valid.value = "170";
|
|
1086
|
+
document.getElementById('validy').innerHTML=cValid("170");
|
|
1087
|
+
}
|
|
1088
|
+
else
|
|
1089
|
+
{
|
|
1090
|
+
document.pduToStringForm.valid.disabled = true;
|
|
1091
|
+
document.pduToStringForm.valid.value = "";
|
|
1092
|
+
document.getElementById('validy').innerHTML="";
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
function Validity(valid)
|
|
1100
|
+
{
|
|
1101
|
+
var byValidityPeriod = 0;
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
if (isNaN(parseInt(valid)))
|
|
1107
|
+
{
|
|
1108
|
+
valid = 0;
|
|
1109
|
+
document.pduToStringForm.valid.value = valid;
|
|
1110
|
+
}
|
|
1111
|
+
else
|
|
1112
|
+
{
|
|
1113
|
+
valid=parseInt(valid);
|
|
1114
|
+
if (valid <0)
|
|
1115
|
+
{
|
|
1116
|
+
valid = 0;
|
|
1117
|
+
document.pduToStringForm.valid.value = valid;
|
|
1118
|
+
}
|
|
1119
|
+
if (valid>255)
|
|
1120
|
+
{
|
|
1121
|
+
valid = 255;
|
|
1122
|
+
document.pduToStringForm.valid.value = valid;
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
return cValid(valid);
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
function cValid(valid)
|
|
1132
|
+
{
|
|
1133
|
+
var value,out="";
|
|
1134
|
+
// if (isNaN(parseInt(valid)))
|
|
1135
|
+
// {
|
|
1136
|
+
// alert("No text please we're British!");
|
|
1137
|
+
// }
|
|
1138
|
+
valid=parseInt(valid);
|
|
1139
|
+
if (valid <= 143)
|
|
1140
|
+
{
|
|
1141
|
+
value = (valid+1)*5; // Minutes
|
|
1142
|
+
}
|
|
1143
|
+
else if (valid <= 167)
|
|
1144
|
+
{
|
|
1145
|
+
value = ((valid-143) / 2 + 12); // Hours
|
|
1146
|
+
value *= 60; // Convert to Minutes
|
|
1147
|
+
}
|
|
1148
|
+
else if (valid <= 196)
|
|
1149
|
+
{
|
|
1150
|
+
value = valid-166; // days
|
|
1151
|
+
value *= 60*24; // Convert to Minutes
|
|
1152
|
+
}
|
|
1153
|
+
else
|
|
1154
|
+
{
|
|
1155
|
+
value = valid-192; // Weeks
|
|
1156
|
+
value *= 7*60*24; // Convert to Minutes
|
|
1157
|
+
}
|
|
1158
|
+
var mins,hours,days,weeks;
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
mins = value % 60;
|
|
1164
|
+
hours = value / 60;
|
|
1165
|
+
days = hours / 24;
|
|
1166
|
+
weeks = days / 7;
|
|
1167
|
+
hours %= 24;
|
|
1168
|
+
days %= 7;
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
if (parseInt(weeks) != 0)
|
|
1174
|
+
{
|
|
1175
|
+
out += parseInt(weeks) + "w ";
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
if (parseInt(days) != 0)
|
|
1182
|
+
{
|
|
1183
|
+
out += parseInt(days) + "d ";
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
if (parseInt(hours) != 0)
|
|
1190
|
+
{
|
|
1191
|
+
out += parseInt(hours) + "h ";
|
|
1192
|
+
}
|
|
1193
|
+
if (mins != 0)
|
|
1194
|
+
{
|
|
1195
|
+
out += mins + "m ";
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
return out;
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
/* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
|
|
1205
|
+
*
|
|
1206
|
+
* Further fixes and functionality by Andrew Alexander:
|
|
1207
|
+
* Fix message length issues, handle +xx & 0xx phone codes, added bit length options,
|
|
1208
|
+
* display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex,
|
|
1209
|
+
* allow leading AT command in input, implemented some support for alpanumeric senders...
|
|
1210
|
+
*
|
|
1211
|
+
* ekkebus[at]cs.utwente.nl
|
|
1212
|
+
* Feel free to use it, please don't forget to link to the source ;)
|
|
1213
|
+
*
|
|
1214
|
+
*
|
|
1215
|
+
* www.rednaxela.net - Feel free to use this code as you wish.
|
|
1216
|
+
* Version 1.5 r9aja
|
|
1217
|
+
*
|
|
1218
|
+
* Official BPS develop tool
|
|
1219
|
+
*
|
|
1220
|
+
* (c) BPS & co, 2003
|
|
1221
|
+
*/
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
//Array with "The 7 bit defaultalphabet"
|
|
1231
|
+
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', 'ä', 'ö', 'ñ','ü', 'à');
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
// Variable that stores the information to show the user the calculation of the translation
|
|
1237
|
+
var calculation = "";
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
var maxkeys = 160;
|
|
1243
|
+
var alerted = false;
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
// function te convert a bit string into a integer
|
|
1249
|
+
function binToInt(x)//sp
|
|
1250
|
+
{
|
|
1251
|
+
var total = 0;
|
|
1252
|
+
var power = parseInt(x.length)-1;
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
for(var i=0;i<x.length;i++)
|
|
1258
|
+
{
|
|
1259
|
+
if(x.charAt(i) == '1')
|
|
1260
|
+
{
|
|
1261
|
+
total = total +Math.pow(2,power);
|
|
1262
|
+
}
|
|
1263
|
+
power --;
|
|
1264
|
+
}
|
|
1265
|
+
return total;
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
// function to convert a integer into a bit String
|
|
1272
|
+
function intToBin(x,size) //sp
|
|
1273
|
+
{
|
|
1274
|
+
var base = 2;
|
|
1275
|
+
var num = parseInt(x);
|
|
1276
|
+
var bin = num.toString(base);
|
|
1277
|
+
for(var i=bin.length;i<size;i++)
|
|
1278
|
+
{
|
|
1279
|
+
bin = "0" + bin;
|
|
1280
|
+
}
|
|
1281
|
+
return bin;
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
// function to convert a Hexnumber into a 10base number
|
|
1288
|
+
function HexToNum(numberS)
|
|
1289
|
+
{
|
|
1290
|
+
var tens = MakeNum(numberS.substring(0,1));
|
|
1291
|
+
|
|
1292
|
+
var ones = 0;
|
|
1293
|
+
if(numberS.length > 1) // means two characters entered
|
|
1294
|
+
ones=MakeNum(numberS.substring(1,2));
|
|
1295
|
+
if(ones == 'X')
|
|
1296
|
+
{
|
|
1297
|
+
return "00";
|
|
1298
|
+
}
|
|
1299
|
+
return (tens * 16) + (ones * 1);
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
// helper function for HexToNum
|
|
1306
|
+
function MakeNum(str)
|
|
1307
|
+
{
|
|
1308
|
+
if((str >= '0') && (str <= '9'))
|
|
1309
|
+
return str;
|
|
1310
|
+
switch(str.toUpperCase())
|
|
1311
|
+
{
|
|
1312
|
+
case "A": return 10;
|
|
1313
|
+
case "B": return 11;
|
|
1314
|
+
case "C": return 12;
|
|
1315
|
+
case "D": return 13;
|
|
1316
|
+
case "E": return 14;
|
|
1317
|
+
case "F": return 15;
|
|
1318
|
+
default:
|
|
1319
|
+
return 16;
|
|
1320
|
+
}
|
|
1321
|
+
return 16;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
//function to convert integer to Hex
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
function intToHex(i) //sp
|
|
1333
|
+
{
|
|
1334
|
+
var sHex = "0123456789ABCDEF";
|
|
1335
|
+
h = "";
|
|
1336
|
+
i = parseInt(i);
|
|
1337
|
+
for(j = 0; j <= 3; j++)
|
|
1338
|
+
{
|
|
1339
|
+
h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
|
|
1340
|
+
sHex.charAt((i >> (j * 8)) & 0x0F);
|
|
1341
|
+
}
|
|
1342
|
+
return h.substring(0,2);
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
function ToHex(i)
|
|
1349
|
+
{
|
|
1350
|
+
var sHex = "0123456789ABCDEF";
|
|
1351
|
+
var Out = "";
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
Out = sHex.charAt(i&0xf);
|
|
1357
|
+
i>>=4;
|
|
1358
|
+
Out = sHex.charAt(i&0xf) + Out;
|
|
1359
|
+
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
return Out;
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1366
|
+
function stringToPDU(inpString,phoneNumber,smscNumber,size,mclass,valid,receipt,vFlag) // AJA fixed SMSC processing
|
|
1367
|
+
{
|
|
1368
|
+
var bitSize = size;
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
var octetFirst = "";
|
|
1374
|
+
var octetSecond = "";
|
|
1375
|
+
var output = "";
|
|
1376
|
+
|
|
1377
|
+
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
//Make header
|
|
1381
|
+
var SMSC_INFO_LENGTH = 0;
|
|
1382
|
+
var SMSC_LENGTH = 0;
|
|
1383
|
+
var SMSC_NUMBER_FORMAT = "";
|
|
1384
|
+
var SMSC = "";
|
|
1385
|
+
if (smscNumber != 0)
|
|
1386
|
+
{
|
|
1387
|
+
SMSC_NUMBER_FORMAT = "81"; // national
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
|
|
1391
|
+
|
|
1392
|
+
if (smscNumber.substr(0,1) == '+')
|
|
1393
|
+
{
|
|
1394
|
+
SMSC_NUMBER_FORMAT = "91"; // international
|
|
1395
|
+
smscNumber = smscNumber.substr(1);
|
|
1396
|
+
}
|
|
1397
|
+
else if (smscNumber.substr(0,1) !='0')
|
|
1398
|
+
{
|
|
1399
|
+
SMSC_NUMBER_FORMAT = "91"; // international
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
|
|
1403
|
+
|
|
1404
|
+
|
|
1405
|
+
if(smscNumber.length%2 != 0)
|
|
1406
|
+
{
|
|
1407
|
+
// add trailing F
|
|
1408
|
+
smscNumber += "F";
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
SMSC = semiOctetToString(smscNumber);
|
|
1412
|
+
SMSC_INFO_LENGTH = ((SMSC_NUMBER_FORMAT + "" + SMSC).length)/2;
|
|
1413
|
+
SMSC_LENGTH = SMSC_INFO_LENGTH;
|
|
1414
|
+
|
|
1415
|
+
}
|
|
1416
|
+
if(SMSC_INFO_LENGTH < 10)
|
|
1417
|
+
{
|
|
1418
|
+
SMSC_INFO_LENGTH = "0" + SMSC_INFO_LENGTH;
|
|
1419
|
+
}
|
|
1420
|
+
var firstOctet; // = "1100";
|
|
1421
|
+
|
|
1422
|
+
if (receipt)
|
|
1423
|
+
{
|
|
1424
|
+
if (vFlag)
|
|
1425
|
+
{
|
|
1426
|
+
firstOctet = "3100"; // 18 is mask for validity period // 10 indicates relative
|
|
1427
|
+
}
|
|
1428
|
+
else
|
|
1429
|
+
{
|
|
1430
|
+
firstOctet = "2100";
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
}
|
|
1437
|
+
else
|
|
1438
|
+
{
|
|
1439
|
+
if (vFlag)
|
|
1440
|
+
{
|
|
1441
|
+
firstOctet = "1100";
|
|
1442
|
+
}
|
|
1443
|
+
else
|
|
1444
|
+
{
|
|
1445
|
+
firstOctet = "0100";
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
var REIVER_NUMBER_FORMAT = "81"; // national
|
|
1450
|
+
if (phoneNumber.substr(0,1) == '+')
|
|
1451
|
+
{
|
|
1452
|
+
REIVER_NUMBER_FORMAT = "91"; // international
|
|
1453
|
+
phoneNumber = phoneNumber.substr(1); //,phoneNumber.length-1);
|
|
1454
|
+
}
|
|
1455
|
+
else if (phoneNumber.substr(0,1) !='0')
|
|
1456
|
+
{
|
|
1457
|
+
REIVER_NUMBER_FORMAT = "91"; // international
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
var REIVER_NUMBER_LENGTH = intToHex(phoneNumber.length);
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
if(phoneNumber.length%2 != 0)
|
|
1469
|
+
{
|
|
1470
|
+
// add trailing F
|
|
1471
|
+
phoneNumber += "F";
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
var REIVER_NUMBER = semiOctetToString(phoneNumber);
|
|
1478
|
+
var PROTO_ID = "00";
|
|
1479
|
+
var DCS=0;
|
|
1480
|
+
if (mclass != -1) // AJA
|
|
1481
|
+
{
|
|
1482
|
+
DCS = mclass | 0x10;
|
|
1483
|
+
}
|
|
1484
|
+
switch(bitSize)
|
|
1485
|
+
{
|
|
1486
|
+
case 7:
|
|
1487
|
+
break;
|
|
1488
|
+
case 8:
|
|
1489
|
+
DCS = DCS | 4;
|
|
1490
|
+
break;
|
|
1491
|
+
case 16:
|
|
1492
|
+
DCS = DCS | 8;
|
|
1493
|
+
break;
|
|
1494
|
+
}
|
|
1495
|
+
var DATA_ENCODING = intToHex(DCS);
|
|
1496
|
+
// var DATA_ENCODING = "00"; // Default
|
|
1497
|
+
// if (bitSize == 8)
|
|
1498
|
+
// {
|
|
1499
|
+
// DATA_ENCODING = "04";
|
|
1500
|
+
// }
|
|
1501
|
+
// else if (bitSize == 16)
|
|
1502
|
+
// {
|
|
1503
|
+
// DATA_ENCODING = "08";
|
|
1504
|
+
// }
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
var VALID_PERIOD = ""; // AA
|
|
1510
|
+
if (vFlag)
|
|
1511
|
+
{
|
|
1512
|
+
VALID_PERIOD = intToHex(valid); // AA
|
|
1513
|
+
}
|
|
1514
|
+
var userDataSize;
|
|
1515
|
+
if (bitSize == 7)
|
|
1516
|
+
{
|
|
1517
|
+
userDataSize = intToHex(inpString.length);
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
for(var i=0;i<=inpString.length;i++)
|
|
1523
|
+
{
|
|
1524
|
+
if(i==inpString.length)
|
|
1525
|
+
{
|
|
1526
|
+
if (octetSecond != "") // AJA Fix overshoot
|
|
1527
|
+
{
|
|
1528
|
+
output = output + "" + (intToHex(binToInt(octetSecond)));
|
|
1529
|
+
}
|
|
1530
|
+
break;
|
|
1531
|
+
}
|
|
1532
|
+
var current = intToBin(getSevenBit(inpString.charAt(i)),7);
|
|
1533
|
+
|
|
1534
|
+
var currentOctet;
|
|
1535
|
+
if(i!=0 && i%8!=0)
|
|
1536
|
+
{
|
|
1537
|
+
octetFirst = current.substring(7-(i)%8);
|
|
1538
|
+
currentOctet = octetFirst + octetSecond; //put octet parts together
|
|
1539
|
+
|
|
1540
|
+
output = output + "" + (intToHex(binToInt(currentOctet)));
|
|
1541
|
+
octetSecond = current.substring(0,7-(i)%8); //set net second octet
|
|
1542
|
+
}
|
|
1543
|
+
else
|
|
1544
|
+
{
|
|
1545
|
+
octetSecond = current.substring(0,7-(i)%8);
|
|
1546
|
+
}
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1549
|
+
else if (bitSize == 8)
|
|
1550
|
+
{
|
|
1551
|
+
userDataSize = intToHex(inpString.length);
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
|
|
1556
|
+
var CurrentByte = 0;
|
|
1557
|
+
for(var i=0;i<inpString.length;i++)
|
|
1558
|
+
{
|
|
1559
|
+
CurrentByte = getEightBit(inpString.charCodeAt(i));
|
|
1560
|
+
output = output + "" + ( ToHex( CurrentByte ) );
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
else if (bitSize == 16)
|
|
1564
|
+
{
|
|
1565
|
+
userDataSize = intToHex(inpString.length * 2);
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
var myChar=0;
|
|
1571
|
+
for(var i=0;i<inpString.length;i++)
|
|
1572
|
+
{
|
|
1573
|
+
myChar = get16Bit( inpString.charCodeAt(i) );
|
|
1574
|
+
output = output + "" + ( ToHex( (myChar&0xff00)>>8 )) + ( ToHex( myChar&0xff ) );
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
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;
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
var PDU = header + output;
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
var AT = (PDU.length/2 - SMSC_LENGTH - 1) ; // Add /2 for PDU length AJA - I think the SMSC information should also be excluded
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
// var bStep=18;
|
|
1591
|
+
// for(var breakUp=1;breakUp*bStep < PDU.length;breakUp++)
|
|
1592
|
+
// {
|
|
1593
|
+
// PDU = PDU.substr(0,breakUp*bStep+breakUp-1) + " " + PDU.substr(breakUp*bStep+breakUp-1);
|
|
1594
|
+
// }
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
//CMGW
|
|
1600
|
+
return AT + "\n" + PDU;
|
|
1601
|
+
}
|