comunika_gsm 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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>&nbsp;&nbsp;&nbsp;Octets&nbsp;&nbsp;&nbsp;</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>&nbsp;</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>&nbsp;</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'>&nbsp;" + restArray[i-1] + "</span>&nbsp;</td>";
343
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(restArray[i-1])] + "&nbsp;</td>";
344
+ matchcount ++; // AJA
345
+ }
346
+ smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i])];
347
+ calculation3 = calculation3 + "<td align=center width=75>&nbsp;" +septetsArray[i] + "&nbsp;</td>";
348
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(septetsArray[i])] + "&nbsp;</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>&nbsp;" +septetsArray[i]+ "<span style='background-color: #FFFF00'>" +restArray[i-1] + "&nbsp;</span>" + "</td>"
355
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(septetsArray[i]+restArray[i-1])] + "&nbsp;</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'>&nbsp;" + restArray[i-1] + "</span>&nbsp;</td>";
364
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;" + sevenbitdefault[binToInt(restArray[i-1])] + "&nbsp;</td>";
365
+ }
366
+ else // Blank Filler
367
+ {
368
+ calculation3 = calculation3 + "<td align=center width=75>+++++++</td>";
369
+ calculation4 = calculation4 + "<td align=center width=75>&nbsp;</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
+ }