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 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
+ }