comunika_gsm 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/comunika_gsm.rb +1 -0
- data/lib/comunika_gsm/gsm.rb +68 -12
- data/lib/comunika_gsm/gsm2.rb +113 -0
- data/lib/comunika_gsm/js/pdu.js +0 -359
- data/lib/comunika_gsm/js/pdu.min.js +1 -1
- data/lib/comunika_gsm/js/pdu2.js +809 -0
- data/lib/comunika_gsm/modem.rb +19 -67
- data/lib/comunika_gsm/pdu.rb +35 -76
- data/lib/comunika_gsm/version.rb +1 -1
- metadata +4 -2
@@ -1 +1 @@
|
|
1
|
-
function binToInt(t){for(var e=0,r=parseInt(t.length)-1,n=0;n<t.length;n++)"1"==t.charAt(n)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,n=parseInt(t),s=n.toString(r),a=s.length;e>a;a++)s="0"+s;return s}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function getSevenBit(t){for(var e=0;e<sevenbitdefault.length;e++)if(sevenbitdefault[e]==t)return e;return 0}function getEightBit(t){return t}function get16Bit(t){return t}function phoneNumberMap(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"*":return"A";case"#":return"B";case"A":return"C";case"B":return"D";case"C":return"E";default:return"F"}return"F"}function phoneNumberUnMap(t){if(t>="0"&&"9">=t)return t;switch(t){case 10:return"*";case 11:return"#";case 12:return"A";case 13:return"B";case 14:return"C";default:return"F"}return"F"}function semiOctetToString(t){for(var e="",r=0;r<t.length;r+=2){var n=t.substring(r,r+2);e=e+phoneNumberMap(n.charAt(1))+phoneNumberMap(n.charAt(0))}return e}function getUserMessage(t,e){var r="";octetArray=new Array,restArray=new Array,septetsArray=new Array;var n=1,s=0,a=0,i="",u="<table border=1 ><tr><td align=center width=75><b>Hex</b></td>",o="<tr><td align=center width=75> <b> Octets </b></td>",g="<table border=1 ><tr><td align=center width=75><b>septets</b></td>",b="<tr><td align=center width=75><b>Character</b></td>";calculation="";for(var c=0;c<t.length;c+=2){var l=t.substring(c,c+2);r+=intToBin(HexToNum(l),8),c%14==0&&0!=c&&(u+="<td align=center width=75>+++++++</td>"),u=u+"<td align=center width=75>"+l+"</td>"}u+="<td align=center width=75>+++++++</td>";for(var c=0;c<r.length;c+=8)octetArray[s]=r.substring(c,c+8),restArray[s]=octetArray[s].substring(0,n%8),septetsArray[s]=octetArray[s].substring(n%8,8),c%56==0&&0!=c&&(o+="<td align=center width=75> </td>"),o=o+"<td align=center width=75><span style='background-color: #FFFF00'>"+restArray[s]+"</span>"+septetsArray[s]+"</td>",n++,s++,8==n&&(n=1);o+="<td align=center width=75> </td>";for(var c=0;c<restArray.length;c++)c%7==0?(0!=c&&(i+=sevenbitdefault[binToInt(restArray[c-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[c-1]+"</span> </td>",b=b+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[c-1])]+" </td>",a++),i+=sevenbitdefault[binToInt(septetsArray[c])],g=g+"<td align=center width=75> "+septetsArray[c]+" </td>",b=b+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[c])]+" </td>",a++):(i+=sevenbitdefault[binToInt(septetsArray[c]+restArray[c-1])],g=g+"<td align=center width=75> "+septetsArray[c]+"<span style='background-color: #FFFF00'>"+restArray[c-1]+" </span></td>",b=b+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[c]+restArray[c-1])]+" </td>",a++);return a!=e?(i+=sevenbitdefault[binToInt(restArray[c-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[c-1]+"</span> </td>",b=b+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[c-1])]+" </td>"):(g+="<td align=center width=75>+++++++</td>",b+="<td align=center width=75> </td>"),calculation="Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+u+"</tr>"+o+"</tr></table>"+g+"</tr>"+b+"</tr></table>",i}function getUserMessage16(t,e){var r="";calculation="Not implemented";for(var n=0;n<t.length;n+=4){var s=t.substring(n,n+2),a=t.substring(n+2,n+4);r+=""+String.fromCharCode(256*HexToNum(s)+HexToNum(a))}return r}function getUserMessage8(t,e){var r="";calculation="Not implemented";for(var n=0;n<t.length;n+=2){var s=t.substring(n,n+2);r+=""+String.fromCharCode(HexToNum(s))}return r}function getPDUMetaInfo(t){var e=t,r=0,n="";if("AT"==e.substr(0,2))for(var s=0;s<e.length;s++)if(10==e.charCodeAt(s)){e=e.substr(s+1);break}for(var a="",s=0;s<e.length;s++)16!=MakeNum(e.substr(s,1))&&(a+=e.substr(s,1));e=a;var i=HexToNum(e.substring(0,2)),u=e.substring(2,2+2*i),o=u.substring(0,2),g=u.substring(2,2+2*i);0!=i&&(g=semiOctetToString(g),("F"==g.substr(g.length-1,1)||"f"==g.substr(g.length-1,1))&&(g=g.substring(0,g.length-1)),91==o&&(g="+"+g));var b=2*i+2;r=b;var c=e.substr(r,2);r+=2,32==(32&HexToNum(c))&&(n+="Type::::Receipt requested\n");var l=0;if(64==(64&HexToNum(c))&&(l=1,n+="Type::::Data Header\n"),1==(3&HexToNum(c))||3==(3&HexToNum(c))){3==(3&HexToNum(c))&&(n="Type::::Unknown Message\nTreat as Deliver\n");var d=HexToNum(e.substr(r,2));r+=2;var h=HexToNum(e.substr(r,2));h%2!=0&&(h+=1),r+=2;var p=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+h));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v),r+=h;var T=e.substr(r,2);r+=2;var f=e.substr(r,2),m=tpDCSMeaning(f);r+=2;var A;switch(24&HexToNum(c)){case 0:A="Not Present";break;case 16:A="Rel "+cValid(HexToNum(e.substr(r,2))),r+=2;break;case 8:A="Enhanced - Not Decoded",r+=14;break;case 24:A="Absolute - Not Decoded",r+=14}var y=HexToNum(e.substr(r,2));r+=2;var S=DCS_Bits(f),x="Undefined format";7==S?x=getUserMessage(e.substr(r,e.length-r),y):8==S?x=getUserMessage8(e.substr(r,e.length-r),y):16==S&&(x=getUserMessage16(e.substr(r,e.length-r),y)),x=x.substr(0,y),16==S&&(y/=2),0==n.length&&(n="Type::::Message:\n"),n+="SMSC::::"+g+"\nReceipient::::"+v+"\nValidity::::"+A+"\nTP_PID::::"+T+"\nTP_DCS::::"+f+"\nTP_DCS-popis::::"+m+"Message::::"+x+"\nLength::::"+y}else if(0==(3&HexToNum(c))){n="Type: Receive Message::::";var h=HexToNum(e.substr(r,2));r+=2;var p=e.substr(r,2);r+=2;var v;"D0"==p?(_sl=h,h%2!=0&&(h+=1),v=getUserMessage(e.substring(r,r+h),parseInt(_sl/2*8/7))):(h%2!=0&&(h+=1),v=semiOctetToString(e.substring(r,r+h)),("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v)),r+=h;var T=e.substr(r,2);r+=2;var f=e.substr(r,2),m=tpDCSMeaning(f);r+=2;var M=semiOctetToString(e.substr(r,14)),w=M.substring(0,2),H=M.substring(2,4),N=M.substring(4,6),k=M.substring(6,8),C=M.substring(8,10),F=M.substring(10,12);M=N+"/"+H+"/"+w+" "+k+":"+C+":"+F+" GMT ?",r+=14;var y=HexToNum(e.substr(r,2));r+=2;var S=DCS_Bits(f),x="Undefined format";7==S?x=getUserMessage(e.substr(r,e.length-r),y):8==S?x=getUserMessage8(e.substr(r,e.length-r),y):16==S&&(x=getUserMessage16(e.substr(r,e.length-r),y)),x=x.substr(0,y),x=x.replace(/\n/g,""),x=x.replace("::::",""),16==S&&(y/=2),n+="SMSC::::"+g+"\nSender::::"+v+"\nTimeStamp::::"+M+"\nTP_PID::::"+T+"\nTP_DCS::::"+f+"\nTP_DCS-popis::::"+m+"Message::::"+x+"\nLength::::"+y}else{n="Type::::Status Report\n";var d=HexToNum(e.substr(r,2));r+=2;var h=HexToNum(e.substr(r,2));h%2!=0&&(h+=1),r+=2;var p=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+h));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==p&&(v="+"+v),r+=h;var M=semiOctetToString(e.substr(r,14)),w=M.substring(0,2),H=M.substring(2,4),N=M.substring(4,6),k=M.substring(6,8),C=M.substring(8,10),F=M.substring(10,12),I=M.substring(12,14);M=N+"/"+H+"/"+w+" "+k+":"+C+":"+F+" GMT +"+I/4,r+=14;var D=semiOctetToString(e.substr(r,14)),B=D.substring(0,2),U=D.substring(2,4),E=D.substring(4,6),O=D.substring(6,8),P=D.substring(8,10),_=D.substring(10,12),j=M.substring(12,14);D=E+"/"+U+"/"+B+" "+O+":"+P+":"+_+" GMT +"+j/4,r+=14;var R=e.substr(r,2);n+="SMSC::::"+g+"\nSender::::"+v+"\nMessageRef::::"+d+"\nTimeStamp::::"+M+"\nTimeStamp2::::"+D+"\nStatus Byte::::"+R}return n}function change(t){var e=t.value.length;e>maxkeys&&(t.value=t.value.substring(0,maxkeys),alerted=!0,e=maxkeys),window.status="Characters left : "+(maxkeys-e)}function DCS_Bits(t){var e=7,r=HexToNum(t);switch(192&r){case 0:switch(12&r){case 4:e=8;break;case 8:e=16}break;case 192:switch(48&r){case 32:e=16;break;case 48:4&r||(e=8)}}return e}function tpDCSMeaning(t){var e=t,r=HexToNum(t);switch(192&r){case 0:if(e=32&r?"Compressed Text\n":"Uncompressed Text\n",16&r)switch(e+="MClass::",3&r){case 0:e+="0\n";break;case 1:e+="1\n";break;case 2:e+="2\n";break;case 3:e+="3\n"}else e+="MClass::No class\n";switch(e+="Alphabet::::",12&r){case 0:e+="Default\n";break;case 4:e+="8bit\n";break;case 8:e+="UCS2(16)bit\n";break;case 12:e+="Reserved\n"}break;case 64:case 128:e="Reserved coding group\n";break;case 192:switch(48&r){case 0:e="Message waiting group\n",e+="Discard\n";break;case 16:e="Message waiting group\n",e+="Store Message. Default Alphabet\n";break;case 32:e="Message waiting group\n",e+="Store Message. UCS2 Alphabet\n";break;case 48:e="Data coding message class\n",e+=4&r?"Default Alphabet\n":"8 bit Alphabet\n"}}return e}function checkFlag(t){t.checked?(document.pduToStringForm.valid.disabled=!1,document.pduToStringForm.valid.value="170",document.getElementById("validy").innerHTML=cValid("170")):(document.pduToStringForm.valid.disabled=!0,document.pduToStringForm.valid.value="",document.getElementById("validy").innerHTML="")}function Validity(t){return isNaN(parseInt(t))?(t=0,document.pduToStringForm.valid.value=t):(t=parseInt(t),0>t&&(t=0,document.pduToStringForm.valid.value=t),t>255&&(t=255,document.pduToStringForm.valid.value=t)),cValid(t)}function cValid(t){var e,r="";t=parseInt(t),143>=t?e=5*(t+1):167>=t?(e=(t-143)/2+12,e*=60):196>=t?(e=t-166,e*=1440):(e=t-192,e*=10080);var n,s,a,i;return n=e%60,s=e/60,a=s/24,i=a/7,s%=24,a%=7,0!=parseInt(i)&&(r+=parseInt(i)+"w "),0!=parseInt(a)&&(r+=parseInt(a)+"d "),0!=parseInt(s)&&(r+=parseInt(s)+"h "),0!=n&&(r+=n+"m "),r}function binToInt(t){for(var e=0,r=parseInt(t.length)-1,n=0;n<t.length;n++)"1"==t.charAt(n)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,n=parseInt(t),s=n.toString(r),a=s.length;e>a;a++)s="0"+s;return s}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function stringToPDU(t,e,r,n,s,a,i,u){var o=n,g="",b="",c="",l=0,d=0,h="",p="";0!=r&&(h="81","+"==r.substr(0,1)?(h="91",r=r.substr(1)):"0"!=r.substr(0,1)&&(h="91"),r.length%2!=0&&(r+="F"),p=semiOctetToString(r),l=(h+""+p).length/2,d=l),10>l&&(l="0"+l);var v;v=i?u?"3100":"2100":u?"1100":"0100";var T="81";"+"==e.substr(0,1)?(T="91",e=e.substr(1)):"0"!=e.substr(0,1)&&(T="91");var f=intToHex(e.length);e.length%2!=0&&(e+="F");var m=semiOctetToString(e),A="00",y=0;switch(-1!=s&&(y=16|s),o){case 7:break;case 8:y=4|y;break;case 16:y=8|y}var S=intToHex(y),x="";u&&(x=intToHex(a));var M;if(7==o){M=intToHex(t.length);for(var w=0;w<=t.length;w++){if(w==t.length){""!=b&&(c=c+""+intToHex(binToInt(b)));break}var H,N=intToBin(getSevenBit(t.charAt(w)),7);0!=w&&w%8!=0?(g=N.substring(7-w%8),H=g+b,c=c+""+intToHex(binToInt(H)),b=N.substring(0,7-w%8)):b=N.substring(0,7-w%8)}}else if(8==o){M=intToHex(t.length);for(var k=0,w=0;w<t.length;w++)k=getEightBit(t.charCodeAt(w)),c=c+""+ToHex(k)}else if(16==o){M=intToHex(2*t.length);for(var C=0,w=0;w<t.length;w++)C=get16Bit(t.charCodeAt(w)),c=c+""+ToHex((65280&C)>>8)+ToHex(255&C)}var F=l+h+p+v+f+T+m+A+S+x+M,I=F+c,D=I.length/2-d-1;return D+"\n"+I}sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","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","ä","ö","ñ","ü","à","á");var calculation="",maxkeys=160,alerted=!1;sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","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","ä","ö","ñ","ü","à");var calculation="",maxkeys=160,alerted=!1;
|
1
|
+
function binToInt(t){for(var e=0,r=parseInt(t.length)-1,s=0;s<t.length;s++)"1"==t.charAt(s)&&(e+=Math.pow(2,r)),r--;return e}function intToBin(t,e){for(var r=2,s=parseInt(t),n=s.toString(r),a=n.length;e>a;a++)n="0"+n;return n}function HexToNum(t){var e=MakeNum(t.substring(0,1)),r=0;return t.length>1&&(r=MakeNum(t.substring(1,2))),"X"==r?"00":16*e+1*r}function MakeNum(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"A":return 10;case"B":return 11;case"C":return 12;case"D":return 13;case"E":return 14;case"F":return 15;default:return 16}return 16}function intToHex(t){var e="0123456789ABCDEF";for(h="",t=parseInt(t),j=0;j<=3;j++)h+=e.charAt(t>>8*j+4&15)+e.charAt(t>>8*j&15);return h.substring(0,2)}function ToHex(t){var e="0123456789ABCDEF",r="";return r=e.charAt(15&t),t>>=4,r=e.charAt(15&t)+r}function getSevenBit(t){for(var e=0;e<sevenbitdefault.length;e++)if(sevenbitdefault[e]==t)return e;return 0}function getEightBit(t){return t}function get16Bit(t){return t}function phoneNumberMap(t){if(t>="0"&&"9">=t)return t;switch(t.toUpperCase()){case"*":return"A";case"#":return"B";case"A":return"C";case"B":return"D";case"C":return"E";default:return"F"}return"F"}function phoneNumberUnMap(t){if(t>="0"&&"9">=t)return t;switch(t){case 10:return"*";case 11:return"#";case 12:return"A";case 13:return"B";case 14:return"C";default:return"F"}return"F"}function semiOctetToString(t){for(var e="",r=0;r<t.length;r+=2){var s=t.substring(r,r+2);e=e+phoneNumberMap(s.charAt(1))+phoneNumberMap(s.charAt(0))}return e}function getUserMessage(t,e){var r="";octetArray=new Array,restArray=new Array,septetsArray=new Array;var s=1,n=0,a=0,i="",u="<table border=1 ><tr><td align=center width=75><b>Hex</b></td>",b="<tr><td align=center width=75> <b> Octets </b></td>",g="<table border=1 ><tr><td align=center width=75><b>septets</b></td>",c="<tr><td align=center width=75><b>Character</b></td>";calculation="";for(var o=0;o<t.length;o+=2){var l=t.substring(o,o+2);r+=intToBin(HexToNum(l),8),o%14==0&&0!=o&&(u+="<td align=center width=75>+++++++</td>"),u=u+"<td align=center width=75>"+l+"</td>"}u+="<td align=center width=75>+++++++</td>";for(var o=0;o<r.length;o+=8)octetArray[n]=r.substring(o,o+8),restArray[n]=octetArray[n].substring(0,s%8),septetsArray[n]=octetArray[n].substring(s%8,8),o%56==0&&0!=o&&(b+="<td align=center width=75> </td>"),b=b+"<td align=center width=75><span style='background-color: #FFFF00'>"+restArray[n]+"</span>"+septetsArray[n]+"</td>",s++,n++,8==s&&(s=1);b+="<td align=center width=75> </td>";for(var o=0;o<restArray.length;o++)o%7==0?(0!=o&&(i+=sevenbitdefault[binToInt(restArray[o-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[o-1]+"</span> </td>",c=c+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[o-1])]+" </td>",a++),i+=sevenbitdefault[binToInt(septetsArray[o])],g=g+"<td align=center width=75> "+septetsArray[o]+" </td>",c=c+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[o])]+" </td>",a++):(i+=sevenbitdefault[binToInt(septetsArray[o]+restArray[o-1])],g=g+"<td align=center width=75> "+septetsArray[o]+"<span style='background-color: #FFFF00'>"+restArray[o-1]+" </span></td>",c=c+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[o]+restArray[o-1])]+" </td>",a++);return a!=e?(i+=sevenbitdefault[binToInt(restArray[o-1])],g=g+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[o-1]+"</span> </td>",c=c+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[o-1])]+" </td>"):(g+="<td align=center width=75>+++++++</td>",c+="<td align=center width=75> </td>"),calculation="Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+u+"</tr>"+b+"</tr></table>"+g+"</tr>"+c+"</tr></table>",i}function getUserMessage16(t,e){var r="";calculation="Not implemented";for(var s=0;s<t.length;s+=4){var n=t.substring(s,s+2),a=t.substring(s+2,s+4);r+=""+String.fromCharCode(256*HexToNum(n)+HexToNum(a))}return r}function getUserMessage8(t,e){var r="";calculation="Not implemented";for(var s=0;s<t.length;s+=2){var n=t.substring(s,s+2);r+=""+String.fromCharCode(HexToNum(n))}return r}function getPDUMetaInfo(t){var e=t,r=0,s="";if("AT"==e.substr(0,2))for(var n=0;n<e.length;n++)if(10==e.charCodeAt(n)){e=e.substr(n+1);break}for(var a="",n=0;n<e.length;n++)16!=MakeNum(e.substr(n,1))&&(a+=e.substr(n,1));e=a;var i=HexToNum(e.substring(0,2)),u=e.substring(2,2+2*i),b=u.substring(0,2),g=u.substring(2,2+2*i);0!=i&&(g=semiOctetToString(g),("F"==g.substr(g.length-1,1)||"f"==g.substr(g.length-1,1))&&(g=g.substring(0,g.length-1)),91==b&&(g="+"+g));var c=2*i+2;r=c;var o=e.substr(r,2);r+=2,32==(32&HexToNum(o))&&(s+="Receipt requested");var l=0;if(64==(64&HexToNum(o))&&(l=1,s+="Data Header"),1==(3&HexToNum(o))||3==(3&HexToNum(o))){3==(3&HexToNum(o))&&(s="Unknown Message");var d=HexToNum(e.substr(r,2));r+=2;var p=HexToNum(e.substr(r,2));p%2!=0&&(p+=1),r+=2;var h=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+p));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v),r+=p;var f=e.substr(r,2);r+=2;var m=e.substr(r,2),T=tpDCSMeaning(m);r+=2;var A;switch(24&HexToNum(o)){case 0:A="Not Present";break;case 16:A="Rel "+cValid(HexToNum(e.substr(r,2))),r+=2;break;case 8:A="Enhanced - Not Decoded",r+=14;break;case 24:A="Absolute - Not Decoded",r+=14}var y=HexToNum(e.substr(r,2));r+=2;var N=DCS_Bits(m),w="Undefined format";7==N?w=getUserMessage(e.substr(r,e.length-r),y):8==N?w=getUserMessage8(e.substr(r,e.length-r),y):16==N&&(w=getUserMessage16(e.substr(r,e.length-r),y)),w=w.substr(0,y),16==N&&(y/=2),s=JSON.stringify({mtype:s,smsc:g,number:v,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y})}else if(0==(3&HexToNum(o))){var p=HexToNum(e.substr(r,2));r+=2;var h=e.substr(r,2);r+=2;var v;"D0"==h?(_sl=p,p%2!=0&&(p+=1),v=getUserMessage(e.substring(r,r+p),parseInt(_sl/2*8/7))):(p%2!=0&&(p+=1),v=semiOctetToString(e.substring(r,r+p)),("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v)),r+=p;var f=e.substr(r,2);r+=2;var m=e.substr(r,2),T=tpDCSMeaning(m);r+=2;var x=semiOctetToString(e.substr(r,14)),H=x.substring(0,2),M=x.substring(2,4),k=x.substring(4,6),S=x.substring(6,8),F=x.substring(8,10),C=x.substring(10,12);x=k+"/"+M+"/"+H+" "+S+":"+F+":"+C+" GMT ?",r+=14;var y=HexToNum(e.substr(r,2));r+=2;var N=DCS_Bits(m),w="Undefined format";7==N?w=getUserMessage(e.substr(r,e.length-r),y):8==N?w=getUserMessage8(e.substr(r,e.length-r),y):16==N&&(w=getUserMessage16(e.substr(r,e.length-r),y)),w=w.substr(0,y),16==N&&(y/=2),s=JSON.stringify({mtype:s||"Receive message",smsc:g,number:v,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y,receipt_at:x})}else{s="Status Report";var d=HexToNum(e.substr(r,2));r+=2;var p=HexToNum(e.substr(r,2));p%2!=0&&(p+=1),r+=2;var h=e.substr(r,2);r+=2;var v=semiOctetToString(e.substring(r,r+p));("F"==v.substr(v.length-1,1)||"f"==v.substr(v.length-1,1))&&(v=v.substring(0,v.length-1)),91==h&&(v="+"+v),r+=p;var x=semiOctetToString(e.substr(r,14)),H=x.substring(0,2),M=x.substring(2,4),k=x.substring(4,6),S=x.substring(6,8),F=x.substring(8,10),C=x.substring(10,12),I=x.substring(12,14);x=k+"/"+M+"/"+H+" "+S+":"+F+":"+C+" GMT +"+I/4,r+=14;var D=semiOctetToString(e.substr(r,14)),U=D.substring(0,2),_=D.substring(2,4),B=D.substring(4,6),O=D.substring(6,8),E=D.substring(8,10),R=D.substring(10,12),j=x.substring(12,14);D=B+"/"+_+"/"+U+" "+O+":"+E+":"+R+" GMT +"+j/4,r+=14;var J=e.substr(r,2);s=JSON.stringify({mtype:s,smsc:g,number:v,sms_id:d,validity:A,tp_pid:f,tp_dcs:m,tp_dcs_popis:T,message:w,mlength:y,sent_at:x,receipt_at:D,status:J})}return s}function stringToPDU(t,e,r,s,n,a,i,u){var b=s,g="",c="",o="",l=0,d=0,p="",h="";0!=r&&(p="81","+"==r.substr(0,1)?(p="91",r=r.substr(1)):"0"!=r.substr(0,1)&&(p="91"),r.length%2!=0&&(r+="F"),h=semiOctetToString(r),l=(p+""+h).length/2,d=l),10>l&&(l="0"+l);var v;v=i?u?"3100":"2100":u?"1100":"0100";var f="81";"+"==e.substr(0,1)?(f="91",e=e.substr(1)):"0"!=e.substr(0,1)&&(f="91");var m=intToHex(e.length);e.length%2!=0&&(e+="F");var T=semiOctetToString(e),A="00",y=0;switch(-1!=n&&(y=16|n),b){case 7:break;case 8:y=4|y;break;case 16:y=8|y}var N=intToHex(y),w="";u&&(w=intToHex(a));var x;if(7==b){x=intToHex(t.length);for(var H=0;H<=t.length;H++){if(H==t.length){""!=c&&(o=o+""+intToHex(binToInt(c)));break}var M,k=intToBin(getSevenBit(t.charAt(H)),7);0!=H&&H%8!=0?(g=k.substring(7-H%8),M=g+c,o=o+""+intToHex(binToInt(M)),c=k.substring(0,7-H%8)):c=k.substring(0,7-H%8)}}else if(8==b){x=intToHex(t.length);for(var S=0,H=0;H<t.length;H++)S=getEightBit(t.charCodeAt(H)),o=o+""+ToHex(S)}else if(16==b){x=intToHex(2*t.length);for(var F=0,H=0;H<t.length;H++)F=get16Bit(t.charCodeAt(H)),o=o+""+ToHex((65280&F)>>8)+ToHex(255&F)}var C=l+p+h+v+m+f+T+A+N+w+x,I=C+o,D=I.length/2-d-1;return JSON.stringify({size:D,pdu:I})}function DCS_Bits(t){var e=7,r=HexToNum(t);switch(192&r){case 0:switch(12&r){case 4:e=8;break;case 8:e=16}break;case 192:switch(48&r){case 32:e=16;break;case 48:4&r||(e=8)}}return e}function tpDCSMeaning(t){var e=t,r=HexToNum(t);switch(192&r){case 0:if(e=32&r?"Compressed Text\n":"Uncompressed Text\n",16&r)switch(e+="class:",3&r){case 0:e+="0\n";break;case 1:e+="1\n";break;case 2:e+="2\n";break;case 3:e+="3\n"}else e+="class: No class\n";switch(e+="Alphabet:",12&r){case 0:e+="Default\n";break;case 4:e+="8bit\n";break;case 8:e+="UCS2(16)bit\n";break;case 12:e+="Reserved\n"}break;case 64:case 128:e="Reserved coding group\n";break;case 192:switch(48&r){case 0:e="Message waiting group\n",e+="Discard\n";break;case 16:e="Message waiting group\n",e+="Store Message. Default Alphabet\n";break;case 32:e="Message waiting group\n",e+="Store Message. UCS2 Alphabet\n";break;case 48:e="Data coding message class\n",e+=4&r?"Default Alphabet\n":"8 bit Alphabet\n"}}return e}function Validity(t){return isNaN(parseInt(t))?t=0:(t=parseInt(t),0>t&&(t=0),t>255&&(t=255)),cValid(t)}function cValid(t){var e,r="";t=parseInt(t),143>=t?e=5*(t+1):167>=t?(e=(t-143)/2+12,e*=60):196>=t?(e=t-166,e*=1440):(e=t-192,e*=10080);var s,n,a,i;return s=e%60,n=e/60,a=n/24,i=a/7,n%=24,a%=7,0!=parseInt(i)&&(r+=parseInt(i)+"w "),0!=parseInt(a)&&(r+=parseInt(a)+"d "),0!=parseInt(n)&&(r+=parseInt(n)+"h "),0!=s&&(r+=s+"m "),r}sevenbitdefault=new Array("@","£","$","¥","è","é","ù","ì","ò","Ç","\n","Ø","ø","\r","Å","å","Δ","_","Φ","Γ","Λ","Ω","Π","Ψ","Σ","Θ","Ξ","€","Æ","æ","ß","É"," ","!",'"',"#","¤","%","&","'","(",")","*","+",",","-",".","/","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","ä","ö","ñ","ü","à");var calculation="",maxkeys=160,alerted=!1;
|
@@ -0,0 +1,809 @@
|
|
1
|
+
/* Script written by Swen-Peter Ekkebus, edited by Ing. Milan Chudik.
|
2
|
+
*
|
3
|
+
* Further fixes and functionality by Andrew Alexander:
|
4
|
+
* Fix message length issues, handle +xx & 0xx phone codes, added bit length options,
|
5
|
+
* display 8 & 16 bit messages, reformat interface, deal with embedded spaces in hex,
|
6
|
+
* allow leading AT command in input, implemented some support for alpanumeric senders...
|
7
|
+
*
|
8
|
+
* ekkebus[at]cs.utwente.nl
|
9
|
+
* Feel free to use it, please don't forget to link to the source ;)
|
10
|
+
*
|
11
|
+
*
|
12
|
+
* www.rednaxela.net - Feel free to use this code as you wish.
|
13
|
+
* Version 1.5 r9aja
|
14
|
+
*
|
15
|
+
* Official BPS develop tool
|
16
|
+
*
|
17
|
+
* (c) BPS & co, 2003
|
18
|
+
*/
|
19
|
+
//Array with "The 7 bit defaultalphabet"
|
20
|
+
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', 'ä', 'ö', 'ñ', 'ü', 'à');
|
21
|
+
// Variable that stores the information to show the user the calculation of the translation
|
22
|
+
var calculation = "";
|
23
|
+
var maxkeys = 160;
|
24
|
+
var alerted = false;
|
25
|
+
// function te convert a bit string into a integer
|
26
|
+
function binToInt(x) //sp
|
27
|
+
{
|
28
|
+
var total = 0;
|
29
|
+
var power = parseInt(x.length) - 1;
|
30
|
+
for (var i = 0; i < x.length; i++) {
|
31
|
+
if (x.charAt(i) == '1') {
|
32
|
+
total = total + Math.pow(2, power);
|
33
|
+
}
|
34
|
+
power--;
|
35
|
+
}
|
36
|
+
return total;
|
37
|
+
}
|
38
|
+
// function to convert a integer into a bit String
|
39
|
+
function intToBin(x, size) //sp
|
40
|
+
{
|
41
|
+
var base = 2;
|
42
|
+
var num = parseInt(x);
|
43
|
+
var bin = num.toString(base);
|
44
|
+
for (var i = bin.length; i < size; i++) {
|
45
|
+
bin = "0" + bin;
|
46
|
+
}
|
47
|
+
return bin;
|
48
|
+
}
|
49
|
+
// function to convert a Hexnumber into a 10base number
|
50
|
+
function HexToNum(numberS) {
|
51
|
+
var tens = MakeNum(numberS.substring(0, 1));
|
52
|
+
var ones = 0;
|
53
|
+
if (numberS.length > 1) // means two characters entered
|
54
|
+
ones = MakeNum(numberS.substring(1, 2));
|
55
|
+
if (ones == 'X') {
|
56
|
+
return "00";
|
57
|
+
}
|
58
|
+
return (tens * 16) + (ones * 1);
|
59
|
+
}
|
60
|
+
// helper function for HexToNum
|
61
|
+
function MakeNum(str) {
|
62
|
+
if ((str >= '0') && (str <= '9'))
|
63
|
+
return str;
|
64
|
+
switch (str.toUpperCase()) {
|
65
|
+
case "A":
|
66
|
+
return 10;
|
67
|
+
case "B":
|
68
|
+
return 11;
|
69
|
+
case "C":
|
70
|
+
return 12;
|
71
|
+
case "D":
|
72
|
+
return 13;
|
73
|
+
case "E":
|
74
|
+
return 14;
|
75
|
+
case "F":
|
76
|
+
return 15;
|
77
|
+
default:
|
78
|
+
return 16;
|
79
|
+
}
|
80
|
+
return 16;
|
81
|
+
}
|
82
|
+
//function to convert integer to Hex
|
83
|
+
function intToHex(i) //sp
|
84
|
+
{
|
85
|
+
var sHex = "0123456789ABCDEF";
|
86
|
+
h = "";
|
87
|
+
i = parseInt(i);
|
88
|
+
for (j = 0; j <= 3; j++) {
|
89
|
+
h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
|
90
|
+
sHex.charAt((i >> (j * 8)) & 0x0F);
|
91
|
+
}
|
92
|
+
return h.substring(0, 2);
|
93
|
+
}
|
94
|
+
|
95
|
+
function ToHex(i) {
|
96
|
+
var sHex = "0123456789ABCDEF";
|
97
|
+
var Out = "";
|
98
|
+
Out = sHex.charAt(i & 0xf);
|
99
|
+
i >>= 4;
|
100
|
+
Out = sHex.charAt(i & 0xf) + Out;
|
101
|
+
return Out;
|
102
|
+
}
|
103
|
+
|
104
|
+
function getSevenBit(character) //sp
|
105
|
+
{
|
106
|
+
for (var i = 0; i < sevenbitdefault.length; i++) {
|
107
|
+
if (sevenbitdefault[i] == character) {
|
108
|
+
return i;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
return 0;
|
112
|
+
}
|
113
|
+
|
114
|
+
function getEightBit(character) {
|
115
|
+
return character;
|
116
|
+
}
|
117
|
+
|
118
|
+
function get16Bit(character) {
|
119
|
+
return character;
|
120
|
+
}
|
121
|
+
|
122
|
+
function phoneNumberMap(character) {
|
123
|
+
// return character;
|
124
|
+
if ((character >= '0') && (character <= '9')) {
|
125
|
+
return character;
|
126
|
+
}
|
127
|
+
switch (character.toUpperCase()) {
|
128
|
+
case '*':
|
129
|
+
return 'A';
|
130
|
+
case '#':
|
131
|
+
return 'B';
|
132
|
+
case 'A':
|
133
|
+
return 'C';
|
134
|
+
case 'B':
|
135
|
+
return 'D';
|
136
|
+
case 'C':
|
137
|
+
return 'E';
|
138
|
+
// case '+':
|
139
|
+
// return '+'; // An exception to fit with current processing ...
|
140
|
+
default:
|
141
|
+
return 'F';
|
142
|
+
}
|
143
|
+
return 'F';
|
144
|
+
}
|
145
|
+
|
146
|
+
function phoneNumberUnMap(chararacter) {
|
147
|
+
if ((chararacter >= '0') && (chararacter <= '9')) {
|
148
|
+
return chararacter;
|
149
|
+
}
|
150
|
+
switch (chararacter) {
|
151
|
+
case 10:
|
152
|
+
return '*';
|
153
|
+
case 11:
|
154
|
+
return '#';
|
155
|
+
case 12:
|
156
|
+
return 'A';
|
157
|
+
case 13:
|
158
|
+
return 'B';
|
159
|
+
case 14:
|
160
|
+
return 'C';
|
161
|
+
default:
|
162
|
+
return 'F';
|
163
|
+
}
|
164
|
+
return 'F';
|
165
|
+
}
|
166
|
+
// function to convert semioctets to a string
|
167
|
+
function semiOctetToString(inp) //sp
|
168
|
+
{
|
169
|
+
var out = "";
|
170
|
+
for (var i = 0; i < inp.length; i = i + 2) {
|
171
|
+
var temp = inp.substring(i, i + 2);
|
172
|
+
out = out + phoneNumberMap(temp.charAt(1)) + phoneNumberMap(temp.charAt(0));
|
173
|
+
}
|
174
|
+
return out;
|
175
|
+
}
|
176
|
+
//Main function to translate the input to a "human readable" string
|
177
|
+
function getUserMessage(input, truelength) // Add truelength AJA
|
178
|
+
{
|
179
|
+
var byteString = "";
|
180
|
+
octetArray = new Array();
|
181
|
+
restArray = new Array();
|
182
|
+
septetsArray = new Array();
|
183
|
+
var s = 1;
|
184
|
+
var count = 0;
|
185
|
+
var matchcount = 0; // AJA
|
186
|
+
var smsMessage = "";
|
187
|
+
var calculation1 = "<table border=1 ><tr><td align=center width=75><b>Hex</b></td>";
|
188
|
+
var calculation2 = "<tr><td align=center width=75> <b> Octets </b></td>";
|
189
|
+
var calculation3 = "<table border=1 ><tr><td align=center width=75><b>septets</b></td>";
|
190
|
+
var calculation4 = "<tr><td align=center width=75><b>Character</b></td>";
|
191
|
+
calculation = "";
|
192
|
+
//Cut the input string into pieces of2 (just get the hex octets)
|
193
|
+
for (var i = 0; i < input.length; i = i + 2) {
|
194
|
+
var hex = input.substring(i, i + 2);
|
195
|
+
byteString = byteString + intToBin(HexToNum(hex), 8);
|
196
|
+
if ((i % 14 == 0 && i != 0)) {
|
197
|
+
calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
|
198
|
+
}
|
199
|
+
calculation1 = calculation1 + "<td align=center width=75>" + hex + "</td>";
|
200
|
+
}
|
201
|
+
calculation1 = calculation1 + "<td align=center width=75>+++++++</td>";
|
202
|
+
// make two array's these are nessesery to
|
203
|
+
for (var i = 0; i < byteString.length; i = i + 8) {
|
204
|
+
octetArray[count] = byteString.substring(i, i + 8);
|
205
|
+
restArray[count] = octetArray[count].substring(0, (s % 8));
|
206
|
+
septetsArray[count] = octetArray[count].substring((s % 8), 8);
|
207
|
+
if ((i % 56 == 0 && i != 0)) {
|
208
|
+
calculation2 = calculation2 + "<td align=center width=75> </td>";
|
209
|
+
}
|
210
|
+
calculation2 = calculation2 + "<td align=center width=75><span style='background-color: #FFFF00'>" + restArray[count] + "</span>" + septetsArray[count] + "</td>";
|
211
|
+
s++;
|
212
|
+
count++;
|
213
|
+
if (s == 8) {
|
214
|
+
s = 1;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
calculation2 = calculation2 + "<td align=center width=75> </td>";
|
218
|
+
// put the right parts of the array's together to make the sectets
|
219
|
+
for (var i = 0; i < restArray.length; i++) {
|
220
|
+
if (i % 7 == 0) {
|
221
|
+
if (i != 0) {
|
222
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])];
|
223
|
+
calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i - 1] + "</span> </td>";
|
224
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i - 1])] + " </td>";
|
225
|
+
matchcount++; // AJA
|
226
|
+
}
|
227
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i])];
|
228
|
+
calculation3 = calculation3 + "<td align=center width=75> " + septetsArray[i] + " </td>";
|
229
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i])] + " </td>";
|
230
|
+
matchcount++; // AJA
|
231
|
+
} else {
|
232
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])];
|
233
|
+
calculation3 = calculation3 + "<td align=center width=75> " + septetsArray[i] + "<span style='background-color: #FFFF00'>" + restArray[i - 1] + " </span>" + "</td>"
|
234
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(septetsArray[i] + restArray[i - 1])] + " </td>";
|
235
|
+
matchcount++; // AJA
|
236
|
+
}
|
237
|
+
}
|
238
|
+
if (matchcount != truelength) // Don't forget trailing characters!! AJA
|
239
|
+
{
|
240
|
+
smsMessage = smsMessage + sevenbitdefault[binToInt(restArray[i - 1])];
|
241
|
+
calculation3 = calculation3 + "<td align=center width=75><span style='background-color: #FFFF00'> " + restArray[i - 1] + "</span> </td>";
|
242
|
+
calculation4 = calculation4 + "<td align=center width=75> " + sevenbitdefault[binToInt(restArray[i - 1])] + " </td>";
|
243
|
+
} else // Blank Filler
|
244
|
+
{
|
245
|
+
calculation3 = calculation3 + "<td align=center width=75>+++++++</td>";
|
246
|
+
calculation4 = calculation4 + "<td align=center width=75> </td>";
|
247
|
+
}
|
248
|
+
//Put all the calculation info together
|
249
|
+
calculation = "Conversion of 8-bit octets to 7-bit default alphabet<br><br>" + calculation1 + "</tr>" + calculation2 + "</tr></table>" + calculation3 + "</tr>" + calculation4 + "</tr></table>";
|
250
|
+
return smsMessage;
|
251
|
+
}
|
252
|
+
|
253
|
+
function getUserMessage16(input, truelength) {
|
254
|
+
var smsMessage = "";
|
255
|
+
calculation = "Not implemented";
|
256
|
+
// Cut the input string into pieces of 4
|
257
|
+
for (var i = 0; i < input.length; i = i + 4) {
|
258
|
+
var hex1 = input.substring(i, i + 2);
|
259
|
+
var hex2 = input.substring(i + 2, i + 4);
|
260
|
+
smsMessage += "" + String.fromCharCode(HexToNum(hex1) * 256 + HexToNum(hex2));
|
261
|
+
}
|
262
|
+
return smsMessage;
|
263
|
+
}
|
264
|
+
|
265
|
+
function getUserMessage8(input, truelength) {
|
266
|
+
var smsMessage = "";
|
267
|
+
calculation = "Not implemented";
|
268
|
+
// Cut the input string into pieces of 2 (just get the hex octets)
|
269
|
+
for (var i = 0; i < input.length; i = i + 2) {
|
270
|
+
var hex = input.substring(i, i + 2);
|
271
|
+
smsMessage += "" + String.fromCharCode(HexToNum(hex));
|
272
|
+
}
|
273
|
+
return smsMessage;
|
274
|
+
}
|
275
|
+
// Function to get SMSmeta info information from PDU String
|
276
|
+
function getPDUMetaInfo(inp) {
|
277
|
+
var PDUString = inp;
|
278
|
+
var start = 0;
|
279
|
+
var out = "";
|
280
|
+
// Silently Strip leading AT command
|
281
|
+
if (PDUString.substr(0, 2) == "AT") {
|
282
|
+
for (var i = 0; i < PDUString.length; i++) {
|
283
|
+
if (PDUString.charCodeAt(i) == 10) {
|
284
|
+
PDUString = PDUString.substr(i + 1);
|
285
|
+
break;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
}
|
289
|
+
// Silently strip whitespace
|
290
|
+
var NewPDU = "";
|
291
|
+
for (var i = 0; i < PDUString.length; i++) {
|
292
|
+
if (MakeNum(PDUString.substr(i, 1)) != 16) {
|
293
|
+
NewPDU = NewPDU + PDUString.substr(i, 1);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
PDUString = NewPDU;
|
297
|
+
var SMSC_lengthInfo = HexToNum(PDUString.substring(0, 2));
|
298
|
+
var SMSC_info = PDUString.substring(2, 2 + (SMSC_lengthInfo * 2));
|
299
|
+
var SMSC_TypeOfAddress = SMSC_info.substring(0, 2);
|
300
|
+
var SMSC_Number = SMSC_info.substring(2, 2 + (SMSC_lengthInfo * 2));
|
301
|
+
if (SMSC_lengthInfo != 0) {
|
302
|
+
SMSC_Number = semiOctetToString(SMSC_Number);
|
303
|
+
// if the length is odd remove the trailing F
|
304
|
+
if ((SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'F') || (SMSC_Number.substr(SMSC_Number.length - 1, 1) == 'f')) {
|
305
|
+
SMSC_Number = SMSC_Number.substring(0, SMSC_Number.length - 1);
|
306
|
+
}
|
307
|
+
if (SMSC_TypeOfAddress == 91) {
|
308
|
+
SMSC_Number = "+" + SMSC_Number;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
var start_SMSDeleivery = (SMSC_lengthInfo * 2) + 2;
|
312
|
+
start = start_SMSDeleivery;
|
313
|
+
var firstOctet_SMSDeliver = PDUString.substr(start, 2);
|
314
|
+
start = start + 2;
|
315
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x20) == 0x20) {
|
316
|
+
out += "Receipt requested";
|
317
|
+
}
|
318
|
+
var DataHeader = 0;
|
319
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x40) == 0x40) {
|
320
|
+
DataHeader = 1;
|
321
|
+
out += "Data Header";
|
322
|
+
}
|
323
|
+
// bit1 bit0 Message type
|
324
|
+
// 0 0 SMS DELIVER (in the direction SC to MS)
|
325
|
+
// 0 0 SMS DELIVER REPORT (in the direction MS to SC)
|
326
|
+
// 1 0 SMS STATUS REPORT (in the direction SC to MS)
|
327
|
+
// 1 0 SMS COMMAND (in the direction MS to SC)
|
328
|
+
// 0 1 SMS SUBMIT (in the direction MS to SC)
|
329
|
+
// 0 1 SMS SUBMIT REPORT (in the direction SC to MS)
|
330
|
+
// 1 1 Reserved
|
331
|
+
// This needs tidying up!! AJA
|
332
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 1 || (HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) // Transmit Message
|
333
|
+
{
|
334
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 3) {
|
335
|
+
out = "Unknown Message"; //Treat as Deliver
|
336
|
+
}
|
337
|
+
var MessageReference = HexToNum(PDUString.substr(start, 2));
|
338
|
+
start = start + 2;
|
339
|
+
// length in decimals
|
340
|
+
var sender_addressLength = HexToNum(PDUString.substr(start, 2));
|
341
|
+
if (sender_addressLength % 2 != 0) {
|
342
|
+
sender_addressLength += 1;
|
343
|
+
}
|
344
|
+
start = start + 2;
|
345
|
+
var sender_typeOfAddress = PDUString.substr(start, 2);
|
346
|
+
start = start + 2
|
347
|
+
var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
|
348
|
+
if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
|
349
|
+
sender_number = sender_number.substring(0, sender_number.length - 1);
|
350
|
+
}
|
351
|
+
if (sender_typeOfAddress == 91) {
|
352
|
+
sender_number = "+" + sender_number;
|
353
|
+
}
|
354
|
+
start += sender_addressLength;
|
355
|
+
var tp_PID = PDUString.substr(start, 2);
|
356
|
+
start += 2;
|
357
|
+
var tp_DCS = PDUString.substr(start, 2);
|
358
|
+
var tp_DCS_desc = tpDCSMeaning(tp_DCS);
|
359
|
+
start += 2;
|
360
|
+
var ValidityPeriod;
|
361
|
+
switch ((HexToNum(firstOctet_SMSDeliver) & 0x18)) {
|
362
|
+
case 0: // Not Present
|
363
|
+
ValidityPeriod = "Not Present";
|
364
|
+
break;
|
365
|
+
case 0x10: // Relative
|
366
|
+
ValidityPeriod = "Rel " + cValid(HexToNum(PDUString.substr(start, 2)));
|
367
|
+
start += 2;
|
368
|
+
break;
|
369
|
+
case 0x08: // Enhanced
|
370
|
+
ValidityPeriod = "Enhanced - Not Decoded";
|
371
|
+
start += 14;
|
372
|
+
break;
|
373
|
+
case 0x18: // Absolute
|
374
|
+
ValidityPeriod = "Absolute - Not Decoded";
|
375
|
+
start += 14;
|
376
|
+
break;
|
377
|
+
}
|
378
|
+
// Commonish...
|
379
|
+
var messageLength = HexToNum(PDUString.substr(start, 2));
|
380
|
+
start += 2;
|
381
|
+
var bitSize = DCS_Bits(tp_DCS);
|
382
|
+
var userData = "Undefined format";
|
383
|
+
if (bitSize == 7) {
|
384
|
+
userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength);
|
385
|
+
} else if (bitSize == 8) {
|
386
|
+
userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength);
|
387
|
+
} else if (bitSize == 16) {
|
388
|
+
userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength);
|
389
|
+
}
|
390
|
+
userData = userData.substr(0, messageLength);
|
391
|
+
if (bitSize == 16) {
|
392
|
+
messageLength /= 2;
|
393
|
+
}
|
394
|
+
|
395
|
+
out = JSON.stringify({mtype: out, smsc: SMSC_Number, number: sender_number, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength});
|
396
|
+
//out += "SMSC#" + SMSC_Number + "\nReceipient:" + sender_number + "\nValidity:" + ValidityPeriod + "\nTP_PID:" + tp_PID + "\nTP_DCS:" + tp_DCS + "\nTP_DCS-popis:" + tp_DCS_desc + "\nMessage:" + userData + "\nLength:" + messageLength;
|
397
|
+
} else // Receive Message
|
398
|
+
if ((HexToNum(firstOctet_SMSDeliver) & 0x03) == 0) // Receive Message
|
399
|
+
{
|
400
|
+
//out = "Receive Message\n";
|
401
|
+
// length in decimals
|
402
|
+
var sender_addressLength = HexToNum(PDUString.substr(start, 2));
|
403
|
+
start = start + 2;
|
404
|
+
var sender_typeOfAddress = PDUString.substr(start, 2);
|
405
|
+
start = start + 2
|
406
|
+
var sender_number;
|
407
|
+
if (sender_typeOfAddress == "D0") {
|
408
|
+
_sl = sender_addressLength;
|
409
|
+
if (sender_addressLength % 2 != 0) {
|
410
|
+
sender_addressLength += 1;
|
411
|
+
}
|
412
|
+
sender_number = getUserMessage(PDUString.substring(start, start + sender_addressLength), parseInt(_sl / 2 * 8 / 7));
|
413
|
+
} else {
|
414
|
+
if (sender_addressLength % 2 != 0) {
|
415
|
+
sender_addressLength += 1;
|
416
|
+
}
|
417
|
+
sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
|
418
|
+
if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
|
419
|
+
sender_number = sender_number.substring(0, sender_number.length - 1);
|
420
|
+
}
|
421
|
+
if (sender_typeOfAddress == 91) {
|
422
|
+
sender_number = "+" + sender_number;
|
423
|
+
}
|
424
|
+
}
|
425
|
+
start += sender_addressLength;
|
426
|
+
var tp_PID = PDUString.substr(start, 2);
|
427
|
+
start += 2;
|
428
|
+
var tp_DCS = PDUString.substr(start, 2);
|
429
|
+
var tp_DCS_desc = tpDCSMeaning(tp_DCS);
|
430
|
+
start += 2;
|
431
|
+
var timeStamp = semiOctetToString(PDUString.substr(start, 14));
|
432
|
+
// get date
|
433
|
+
var year = timeStamp.substring(0, 2);
|
434
|
+
var month = timeStamp.substring(2, 4);
|
435
|
+
var day = timeStamp.substring(4, 6);
|
436
|
+
var hours = timeStamp.substring(6, 8);
|
437
|
+
var minutes = timeStamp.substring(8, 10);
|
438
|
+
var seconds = timeStamp.substring(10, 12);
|
439
|
+
timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT ?"; //+" + timezone/4;
|
440
|
+
start += 14;
|
441
|
+
// Commonish...
|
442
|
+
var messageLength = HexToNum(PDUString.substr(start, 2));
|
443
|
+
start += 2;
|
444
|
+
var bitSize = DCS_Bits(tp_DCS);
|
445
|
+
var userData = "Undefined format";
|
446
|
+
if (bitSize == 7) {
|
447
|
+
userData = getUserMessage(PDUString.substr(start, PDUString.length - start), messageLength);
|
448
|
+
} else if (bitSize == 8) {
|
449
|
+
userData = getUserMessage8(PDUString.substr(start, PDUString.length - start), messageLength);
|
450
|
+
} else if (bitSize == 16) {
|
451
|
+
userData = getUserMessage16(PDUString.substr(start, PDUString.length - start), messageLength);
|
452
|
+
}
|
453
|
+
userData = userData.substr(0, messageLength);
|
454
|
+
if (bitSize == 16) {
|
455
|
+
messageLength /= 2;
|
456
|
+
}
|
457
|
+
out = JSON.stringify({mtype: out || "Receive message", smsc: SMSC_Number, number: sender_number, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength, receipt_at: timeStamp});
|
458
|
+
//out += "SMSC#" + SMSC_Number + "\nSender:" + sender_number + "\nTimeStamp:" + timeStamp + "\nTP_PID:" + tp_PID + "\nTP_DCS:" + tp_DCS + "\nTP_DCS-popis:" + tp_DCS_desc + "\nMessage:" + userData + "\nLength:" + messageLength;
|
459
|
+
} else {
|
460
|
+
out = "Status Report";
|
461
|
+
var MessageReference = HexToNum(PDUString.substr(start, 2)); // ??? Correct this name
|
462
|
+
start = start + 2;
|
463
|
+
// length in decimals
|
464
|
+
var sender_addressLength = HexToNum(PDUString.substr(start, 2));
|
465
|
+
if (sender_addressLength % 2 != 0) {
|
466
|
+
sender_addressLength += 1;
|
467
|
+
}
|
468
|
+
start = start + 2;
|
469
|
+
var sender_typeOfAddress = PDUString.substr(start, 2);
|
470
|
+
start = start + 2
|
471
|
+
var sender_number = semiOctetToString(PDUString.substring(start, start + sender_addressLength));
|
472
|
+
if ((sender_number.substr(sender_number.length - 1, 1) == 'F') || (sender_number.substr(sender_number.length - 1, 1) == 'f')) {
|
473
|
+
sender_number = sender_number.substring(0, sender_number.length - 1);
|
474
|
+
}
|
475
|
+
if (sender_typeOfAddress == 91) {
|
476
|
+
sender_number = "+" + sender_number;
|
477
|
+
}
|
478
|
+
start += sender_addressLength;
|
479
|
+
var timeStamp = semiOctetToString(PDUString.substr(start, 14));
|
480
|
+
// get date
|
481
|
+
var year = timeStamp.substring(0, 2);
|
482
|
+
var month = timeStamp.substring(2, 4);
|
483
|
+
var day = timeStamp.substring(4, 6);
|
484
|
+
var hours = timeStamp.substring(6, 8);
|
485
|
+
var minutes = timeStamp.substring(8, 10);
|
486
|
+
var seconds = timeStamp.substring(10, 12);
|
487
|
+
var timezone = timeStamp.substring(12, 14);
|
488
|
+
timeStamp = day + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds + " GMT +" + timezone / 4;
|
489
|
+
start += 14;
|
490
|
+
var timeStamp2 = semiOctetToString(PDUString.substr(start, 14));
|
491
|
+
// get date
|
492
|
+
var year2 = timeStamp2.substring(0, 2);
|
493
|
+
var month2 = timeStamp2.substring(2, 4);
|
494
|
+
var day2 = timeStamp2.substring(4, 6);
|
495
|
+
var hours2 = timeStamp2.substring(6, 8);
|
496
|
+
var minutes2 = timeStamp2.substring(8, 10);
|
497
|
+
var seconds2 = timeStamp2.substring(10, 12);
|
498
|
+
var timezone2 = timeStamp.substring(12, 14);
|
499
|
+
timeStamp2 = day2 + "/" + month2 + "/" + year2 + " " + hours2 + ":" + minutes2 + ":" + seconds2 + " GMT +" + timezone2 / 4;
|
500
|
+
start += 14;
|
501
|
+
var mStatus = PDUString.substr(start, 2);
|
502
|
+
//out += "SMSC#\n" + SMSC_Number + "\nSender:\n" + sender_number + "\nMessage Ref#:\n" + MessageReference + "\nTimeStamp:\n" + timeStamp + "\nTimeStamp2:\n" + timeStamp2 + "\nStatus Byte: " + mStatus;
|
503
|
+
out = JSON.stringify({mtype: out, smsc: SMSC_Number, number: sender_number, sms_id: MessageReference, validity: ValidityPeriod, tp_pid: tp_PID, tp_dcs: tp_DCS, tp_dcs_popis: tp_DCS_desc, message: userData, mlength: messageLength, sent_at: timeStamp, receipt_at: timeStamp2, status: mStatus});
|
504
|
+
}
|
505
|
+
return out;
|
506
|
+
}
|
507
|
+
|
508
|
+
function stringToPDU(inpString, phoneNumber, smscNumber, size, mclass, valid, receipt, vFlag) // AJA fixed SMSC processing
|
509
|
+
{
|
510
|
+
var bitSize = size;
|
511
|
+
var octetFirst = "";
|
512
|
+
var octetSecond = "";
|
513
|
+
var output = "";
|
514
|
+
//Make header
|
515
|
+
var SMSC_INFO_LENGTH = 0;
|
516
|
+
var SMSC_LENGTH = 0;
|
517
|
+
var SMSC_NUMBER_FORMAT = "";
|
518
|
+
var SMSC = "";
|
519
|
+
if (smscNumber != 0) {
|
520
|
+
SMSC_NUMBER_FORMAT = "81"; // national
|
521
|
+
if (smscNumber.substr(0, 1) == '+') {
|
522
|
+
SMSC_NUMBER_FORMAT = "91"; // international
|
523
|
+
smscNumber = smscNumber.substr(1);
|
524
|
+
} else if (smscNumber.substr(0, 1) != '0') {
|
525
|
+
SMSC_NUMBER_FORMAT = "91"; // international
|
526
|
+
}
|
527
|
+
if (smscNumber.length % 2 != 0) {
|
528
|
+
// add trailing F
|
529
|
+
smscNumber += "F";
|
530
|
+
}
|
531
|
+
SMSC = semiOctetToString(smscNumber);
|
532
|
+
SMSC_INFO_LENGTH = ((SMSC_NUMBER_FORMAT + "" + SMSC).length) / 2;
|
533
|
+
SMSC_LENGTH = SMSC_INFO_LENGTH;
|
534
|
+
}
|
535
|
+
if (SMSC_INFO_LENGTH < 10) {
|
536
|
+
SMSC_INFO_LENGTH = "0" + SMSC_INFO_LENGTH;
|
537
|
+
}
|
538
|
+
var firstOctet; // = "1100";
|
539
|
+
if (receipt) {
|
540
|
+
if (vFlag) {
|
541
|
+
firstOctet = "3100"; // 18 is mask for validity period // 10 indicates relative
|
542
|
+
} else {
|
543
|
+
firstOctet = "2100";
|
544
|
+
}
|
545
|
+
} else {
|
546
|
+
if (vFlag) {
|
547
|
+
firstOctet = "1100";
|
548
|
+
} else {
|
549
|
+
firstOctet = "0100";
|
550
|
+
}
|
551
|
+
}
|
552
|
+
var REIVER_NUMBER_FORMAT = "81"; // national
|
553
|
+
if (phoneNumber.substr(0, 1) == '+') {
|
554
|
+
REIVER_NUMBER_FORMAT = "91"; // international
|
555
|
+
phoneNumber = phoneNumber.substr(1); //,phoneNumber.length-1);
|
556
|
+
} else if (phoneNumber.substr(0, 1) != '0') {
|
557
|
+
REIVER_NUMBER_FORMAT = "91"; // international
|
558
|
+
}
|
559
|
+
var REIVER_NUMBER_LENGTH = intToHex(phoneNumber.length);
|
560
|
+
if (phoneNumber.length % 2 != 0) {
|
561
|
+
// add trailing F
|
562
|
+
phoneNumber += "F";
|
563
|
+
}
|
564
|
+
var REIVER_NUMBER = semiOctetToString(phoneNumber);
|
565
|
+
var PROTO_ID = "00";
|
566
|
+
var DCS = 0;
|
567
|
+
if (mclass != -1) // AJA
|
568
|
+
{
|
569
|
+
DCS = mclass | 0x10;
|
570
|
+
}
|
571
|
+
switch (bitSize) {
|
572
|
+
case 7:
|
573
|
+
break;
|
574
|
+
case 8:
|
575
|
+
DCS = DCS | 4;
|
576
|
+
break;
|
577
|
+
case 16:
|
578
|
+
DCS = DCS | 8;
|
579
|
+
break;
|
580
|
+
}
|
581
|
+
var DATA_ENCODING = intToHex(DCS);
|
582
|
+
// var DATA_ENCODING = "00"; // Default
|
583
|
+
// if (bitSize == 8)
|
584
|
+
// {
|
585
|
+
// DATA_ENCODING = "04";
|
586
|
+
// }
|
587
|
+
// else if (bitSize == 16)
|
588
|
+
// {
|
589
|
+
// DATA_ENCODING = "08";
|
590
|
+
// }
|
591
|
+
var VALID_PERIOD = ""; // AA
|
592
|
+
if (vFlag) {
|
593
|
+
VALID_PERIOD = intToHex(valid); // AA
|
594
|
+
}
|
595
|
+
var userDataSize;
|
596
|
+
if (bitSize == 7) {
|
597
|
+
userDataSize = intToHex(inpString.length);
|
598
|
+
for (var i = 0; i <= inpString.length; i++) {
|
599
|
+
if (i == inpString.length) {
|
600
|
+
if (octetSecond != "") // AJA Fix overshoot
|
601
|
+
{
|
602
|
+
output = output + "" + (intToHex(binToInt(octetSecond)));
|
603
|
+
}
|
604
|
+
break;
|
605
|
+
}
|
606
|
+
var current = intToBin(getSevenBit(inpString.charAt(i)), 7);
|
607
|
+
var currentOctet;
|
608
|
+
if (i != 0 && i % 8 != 0) {
|
609
|
+
octetFirst = current.substring(7 - (i) % 8);
|
610
|
+
currentOctet = octetFirst + octetSecond; //put octet parts together
|
611
|
+
output = output + "" + (intToHex(binToInt(currentOctet)));
|
612
|
+
octetSecond = current.substring(0, 7 - (i) % 8); //set net second octet
|
613
|
+
} else {
|
614
|
+
octetSecond = current.substring(0, 7 - (i) % 8);
|
615
|
+
}
|
616
|
+
}
|
617
|
+
} else if (bitSize == 8) {
|
618
|
+
userDataSize = intToHex(inpString.length);
|
619
|
+
var CurrentByte = 0;
|
620
|
+
for (var i = 0; i < inpString.length; i++) {
|
621
|
+
CurrentByte = getEightBit(inpString.charCodeAt(i));
|
622
|
+
output = output + "" + (ToHex(CurrentByte));
|
623
|
+
}
|
624
|
+
} else if (bitSize == 16) {
|
625
|
+
userDataSize = intToHex(inpString.length * 2);
|
626
|
+
var myChar = 0;
|
627
|
+
for (var i = 0; i < inpString.length; i++) {
|
628
|
+
myChar = get16Bit(inpString.charCodeAt(i));
|
629
|
+
output = output + "" + (ToHex((myChar & 0xff00) >> 8)) + (ToHex(myChar & 0xff));
|
630
|
+
}
|
631
|
+
}
|
632
|
+
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;
|
633
|
+
var PDU = header + output;
|
634
|
+
var AT = (PDU.length / 2 - SMSC_LENGTH - 1); // Add /2 for PDU length AJA - I think the SMSC information should also be excluded
|
635
|
+
// var bStep=18;
|
636
|
+
// for(var breakUp=1;breakUp*bStep < PDU.length;breakUp++)
|
637
|
+
// {
|
638
|
+
// PDU = PDU.substr(0,breakUp*bStep+breakUp-1) + " " + PDU.substr(breakUp*bStep+breakUp-1);
|
639
|
+
// }
|
640
|
+
//CMGW
|
641
|
+
return JSON.stringify({size: AT, pdu: PDU});
|
642
|
+
}
|
643
|
+
|
644
|
+
function DCS_Bits(tp_DCS) {
|
645
|
+
var AlphabetSize = 7; // Set Default
|
646
|
+
var pomDCS = HexToNum(tp_DCS);
|
647
|
+
switch (pomDCS & 192) {
|
648
|
+
case 0:
|
649
|
+
if (pomDCS & 32) {
|
650
|
+
// tp_DCS_desc="Compressed Text\n";
|
651
|
+
} else {
|
652
|
+
// tp_DCS_desc="Uncompressed Text\n";
|
653
|
+
}
|
654
|
+
switch (pomDCS & 12) {
|
655
|
+
case 4:
|
656
|
+
AlphabetSize = 8;
|
657
|
+
break;
|
658
|
+
case 8:
|
659
|
+
AlphabetSize = 16;
|
660
|
+
break;
|
661
|
+
}
|
662
|
+
break;
|
663
|
+
case 192:
|
664
|
+
switch (pomDCS & 0x30) {
|
665
|
+
case 0x20:
|
666
|
+
AlphabetSize = 16;
|
667
|
+
break;
|
668
|
+
case 0x30:
|
669
|
+
if (pomDCS & 0x4) {;
|
670
|
+
} else {
|
671
|
+
AlphabetSize = 8;
|
672
|
+
}
|
673
|
+
break;
|
674
|
+
}
|
675
|
+
break;
|
676
|
+
}
|
677
|
+
return (AlphabetSize);
|
678
|
+
}
|
679
|
+
|
680
|
+
function tpDCSMeaning(tp_DCS) {
|
681
|
+
var tp_DCS_desc = tp_DCS;
|
682
|
+
var pomDCS = HexToNum(tp_DCS);
|
683
|
+
switch (pomDCS & 192) {
|
684
|
+
case 0:
|
685
|
+
if (pomDCS & 32) {
|
686
|
+
tp_DCS_desc = "Compressed Text\n";
|
687
|
+
} else {
|
688
|
+
tp_DCS_desc = "Uncompressed Text\n";
|
689
|
+
}
|
690
|
+
if (!(pomDCS & 16)) // AJA
|
691
|
+
{
|
692
|
+
tp_DCS_desc += "class: No class\n";
|
693
|
+
} else {
|
694
|
+
tp_DCS_desc += "class:";
|
695
|
+
switch (pomDCS & 3) {
|
696
|
+
case 0:
|
697
|
+
tp_DCS_desc += "0\n";
|
698
|
+
break;
|
699
|
+
case 1:
|
700
|
+
tp_DCS_desc += "1\n";
|
701
|
+
break;
|
702
|
+
case 2:
|
703
|
+
tp_DCS_desc += "2\n";
|
704
|
+
break;
|
705
|
+
case 3:
|
706
|
+
tp_DCS_desc += "3\n";
|
707
|
+
break;
|
708
|
+
}
|
709
|
+
}
|
710
|
+
tp_DCS_desc += "Alphabet:";
|
711
|
+
switch (pomDCS & 12) {
|
712
|
+
case 0:
|
713
|
+
tp_DCS_desc += "Default\n";
|
714
|
+
break;
|
715
|
+
case 4:
|
716
|
+
tp_DCS_desc += "8bit\n";
|
717
|
+
break;
|
718
|
+
case 8:
|
719
|
+
tp_DCS_desc += "UCS2(16)bit\n";
|
720
|
+
break;
|
721
|
+
case 12:
|
722
|
+
tp_DCS_desc += "Reserved\n";
|
723
|
+
break;
|
724
|
+
}
|
725
|
+
break;
|
726
|
+
case 64:
|
727
|
+
case 128:
|
728
|
+
tp_DCS_desc = "Reserved coding group\n";
|
729
|
+
break;
|
730
|
+
case 192:
|
731
|
+
switch (pomDCS & 0x30) {
|
732
|
+
case 0:
|
733
|
+
tp_DCS_desc = "Message waiting group\n";
|
734
|
+
tp_DCS_desc += "Discard\n";
|
735
|
+
break;
|
736
|
+
case 0x10:
|
737
|
+
tp_DCS_desc = "Message waiting group\n";
|
738
|
+
tp_DCS_desc += "Store Message. Default Alphabet\n";
|
739
|
+
break;
|
740
|
+
case 0x20:
|
741
|
+
tp_DCS_desc = "Message waiting group\n";
|
742
|
+
tp_DCS_desc += "Store Message. UCS2 Alphabet\n";
|
743
|
+
break;
|
744
|
+
case 0x30:
|
745
|
+
tp_DCS_desc = "Data coding message class\n";
|
746
|
+
if (pomDCS & 0x4) {
|
747
|
+
tp_DCS_desc += "Default Alphabet\n";
|
748
|
+
} else {
|
749
|
+
tp_DCS_desc += "8 bit Alphabet\n";
|
750
|
+
}
|
751
|
+
break;
|
752
|
+
}
|
753
|
+
break;
|
754
|
+
}
|
755
|
+
return (tp_DCS_desc);
|
756
|
+
}
|
757
|
+
|
758
|
+
function Validity(valid) {
|
759
|
+
var byValidityPeriod = 0;
|
760
|
+
if (isNaN(parseInt(valid))) {
|
761
|
+
valid = 0;
|
762
|
+
} else {
|
763
|
+
valid = parseInt(valid);
|
764
|
+
if (valid < 0) {
|
765
|
+
valid = 0;
|
766
|
+
}
|
767
|
+
if (valid > 255) {
|
768
|
+
valid = 255;
|
769
|
+
}
|
770
|
+
}
|
771
|
+
return cValid(valid);
|
772
|
+
}
|
773
|
+
|
774
|
+
function cValid(valid) {
|
775
|
+
var value, out = "";
|
776
|
+
valid = parseInt(valid);
|
777
|
+
if (valid <= 143) {
|
778
|
+
value = (valid + 1) * 5; // Minutes
|
779
|
+
} else if (valid <= 167) {
|
780
|
+
value = ((valid - 143) / 2 + 12); // Hours
|
781
|
+
value *= 60; // Convert to Minutes
|
782
|
+
} else if (valid <= 196) {
|
783
|
+
value = valid - 166; // days
|
784
|
+
value *= 60 * 24; // Convert to Minutes
|
785
|
+
} else {
|
786
|
+
value = valid - 192; // Weeks
|
787
|
+
value *= 7 * 60 * 24; // Convert to Minutes
|
788
|
+
}
|
789
|
+
var mins, hours, days, weeks;
|
790
|
+
mins = value % 60;
|
791
|
+
hours = value / 60;
|
792
|
+
days = hours / 24;
|
793
|
+
weeks = days / 7;
|
794
|
+
hours %= 24;
|
795
|
+
days %= 7;
|
796
|
+
if (parseInt(weeks) != 0) {
|
797
|
+
out += parseInt(weeks) + "w ";
|
798
|
+
}
|
799
|
+
if (parseInt(days) != 0) {
|
800
|
+
out += parseInt(days) + "d ";
|
801
|
+
}
|
802
|
+
if (parseInt(hours) != 0) {
|
803
|
+
out += parseInt(hours) + "h ";
|
804
|
+
}
|
805
|
+
if (mins != 0) {
|
806
|
+
out += mins + "m ";
|
807
|
+
}
|
808
|
+
return out;
|
809
|
+
}
|