comunika_gsm 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/comunika_gsm.rb +14 -0
- data/lib/comunika_gsm/gsm.rb +68 -0
- data/lib/comunika_gsm/js/pdu.js +1601 -0
- data/lib/comunika_gsm/js/pdu.min.js +1 -0
- data/lib/comunika_gsm/pdu.rb +110 -0
- data/lib/comunika_gsm/sms.rb +54 -0
- data/lib/comunika_gsm/version.rb +3 -0
- metadata +107 -0
@@ -0,0 +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=parseInt(t).toString(2),n=r.length;n<e;n++)r="0"+r;return r}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"&&t<="9")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"&&t<="9")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"&&t<="9")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>",b="<table border=1 ><tr><td align=center width=75><b>septets</b></td>",g="<tr><td align=center width=75><b>Character</b></td>";calculation="";for(l=0;l<t.length;l+=2){var c=t.substring(l,l+2);r+=intToBin(HexToNum(c),8),l%14==0&&0!=l&&(u+="<td align=center width=75>+++++++</td>"),u=u+"<td align=center width=75>"+c+"</td>"}u+="<td align=center width=75>+++++++</td>";for(l=0;l<r.length;l+=8)octetArray[s]=r.substring(l,l+8),restArray[s]=octetArray[s].substring(0,n%8),septetsArray[s]=octetArray[s].substring(n%8,8),l%56==0&&0!=l&&(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>",s++,8==++n&&(n=1);o+="<td align=center width=75> </td>";for(var l=0;l<restArray.length;l++)l%7==0?(0!=l&&(i+=sevenbitdefault[binToInt(restArray[l-1])],b=b+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[l-1]+"</span> </td>",g=g+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[l-1])]+" </td>",a++),i+=sevenbitdefault[binToInt(septetsArray[l])],b=b+"<td align=center width=75> "+septetsArray[l]+" </td>",g=g+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[l])]+" </td>",a++):(i+=sevenbitdefault[binToInt(septetsArray[l]+restArray[l-1])],b=b+"<td align=center width=75> "+septetsArray[l]+"<span style='background-color: #FFFF00'>"+restArray[l-1]+" </span></td>",g=g+"<td align=center width=75> "+sevenbitdefault[binToInt(septetsArray[l]+restArray[l-1])]+" </td>",a++);return a!=e?(i+=sevenbitdefault[binToInt(restArray[l-1])],b=b+"<td align=center width=75><span style='background-color: #FFFF00'> "+restArray[l-1]+"</span> </td>",g=g+"<td align=center width=75> "+sevenbitdefault[binToInt(restArray[l-1])]+" </td>"):(b+="<td align=center width=75>+++++++</td>",g+="<td align=center width=75> </td>"),calculation="Conversion of 8-bit octets to 7-bit default alphabet<br><br>"+u+"</tr>"+o+"</tr></table>"+b+"</tr>"+g+"</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(a=0;a<e.length;a++)if(10==e.charCodeAt(a)){e=e.substr(a+1);break}for(var s="",a=0;a<e.length;a++)16!=MakeNum(e.substr(a,1))&&(s+=e.substr(a,1));var i=HexToNum((e=s).substring(0,2)),u=e.substring(2,2+2*i),o=u.substring(0,2),b=u.substring(2,2+2*i);0!=i&&("F"!=(b=semiOctetToString(b)).substr(b.length-1,1)&&"f"!=b.substr(b.length-1,1)||(b=b.substring(0,b.length-1)),91==o&&(b="+"+b)),r=2*i+2;var g=e.substr(r,2);r+=2,32==(32&HexToNum(g))&&(n+="Type::::Receipt requested\n");if(64==(64&HexToNum(g))&&(1,n+="Type::::Data Header\n"),1==(3&HexToNum(g))||3==(3&HexToNum(g))){3==(3&HexToNum(g))&&(n="Type::::Unknown Message\nTreat as Deliver\n");S=HexToNum(e.substr(r,2));r+=2,(l=HexToNum(e.substr(r,2)))%2!=0&&(l+=1),r+=2;x=e.substr(r,2);r+=2,"F"!=(d=semiOctetToString(e.substring(r,r+l))).substr(d.length-1,1)&&"f"!=d.substr(d.length-1,1)||(d=d.substring(0,d.length-1)),91==x&&(d="+"+d),r+=l;h=e.substr(r,2);r+=2;T=tpDCSMeaning(p=e.substr(r,2));r+=2;var c;switch(24&HexToNum(g)){case 0:c="Not Present";break;case 16:c="Rel "+cValid(HexToNum(e.substr(r,2))),r+=2;break;case 8:c="Enhanced - Not Decoded",r+=14;break;case 24:c="Absolute - Not Decoded",r+=14}m=HexToNum(e.substr(r,2));r+=2;y="Undefined format";7==(A=DCS_Bits(p))?y=getUserMessage(e.substr(r,e.length-r),m):8==A?y=getUserMessage8(e.substr(r,e.length-r),m):16==A&&(y=getUserMessage16(e.substr(r,e.length-r),m)),y=y.substr(0,m),16==A&&(m/=2),0==n.length&&(n="Type::::Message:\n"),n+="SMSC::::"+b+"\nReceipient::::"+d+"\nValidity::::"+c+"\nTP_PID::::"+h+"\nTP_DCS::::"+p+"\nTP_DCS-popis::::"+T+"Message::::"+y+"\nLength::::"+m}else if(0==(3&HexToNum(g))){var l=HexToNum(e.substr(r,2));r+=2;x=e.substr(r,2);r+=2;var d;"D0"==x?(_sl=l,l%2!=0&&(l+=1),d=getUserMessage(e.substring(r,r+l),parseInt(_sl/2*8/7))):(l%2!=0&&(l+=1),"F"!=(d=semiOctetToString(e.substring(r,r+l))).substr(d.length-1,1)&&"f"!=d.substr(d.length-1,1)||(d=d.substring(0,d.length-1)),91==x&&(d="+"+d)),r+=l;var h=e.substr(r,2);r+=2;var p=e.substr(r,2),T=tpDCSMeaning(p);r+=2;var f=(w=semiOctetToString(e.substr(r,14))).substring(0,2),v=w.substring(2,4);w=(M=w.substring(4,6))+"/"+v+"/"+f+" "+(H=w.substring(6,8))+":"+(N=w.substring(8,10))+":"+(k=w.substring(10,12))+" GMT ?",r+=14;var m=HexToNum(e.substr(r,2));r+=2;var A=DCS_Bits(p),y="Undefined format";7==A?y=getUserMessage(e.substr(r,e.length-r),m):8==A?y=getUserMessage8(e.substr(r,e.length-r),m):16==A&&(y=getUserMessage16(e.substr(r,e.length-r),m)),y=(y=(y=y.substr(0,m)).replace(/\n/g,"")).replace("::::",""),16==A&&(m/=2),n+="SMSC::::"+b+"\nSender::::"+d+"\nTimeStamp::::"+w+"\nTP_PID::::"+h+"\nTP_DCS::::"+p+"\nTP_DCS-popis::::"+T+"Message::::"+y+"\nLength::::"+m}else{n="Type::::Status Report\n";var S=HexToNum(e.substr(r,2));r+=2,(l=HexToNum(e.substr(r,2)))%2!=0&&(l+=1),r+=2;var x=e.substr(r,2);r+=2,"F"!=(d=semiOctetToString(e.substring(r,r+l))).substr(d.length-1,1)&&"f"!=d.substr(d.length-1,1)||(d=d.substring(0,d.length-1)),91==x&&(d="+"+d),r+=l;var w=semiOctetToString(e.substr(r,14)),f=w.substring(0,2),v=w.substring(2,4),M=w.substring(4,6),H=w.substring(6,8),N=w.substring(8,10),k=w.substring(10,12);w=M+"/"+v+"/"+f+" "+H+":"+N+":"+k+" GMT +"+w.substring(12,14)/4,r+=14;var C=semiOctetToString(e.substr(r,14)),F=C.substring(0,2),I=C.substring(2,4);r+=14,n+="SMSC::::"+b+"\nSender::::"+d+"\nMessageRef::::"+S+"\nTimeStamp::::"+w+"\nTimeStamp2::::"+(C=C.substring(4,6)+"/"+I+"/"+F+" "+C.substring(6,8)+":"+C.substring(8,10)+":"+C.substring(10,12)+" GMT +"+w.substring(12,14)/4)+"\nStatus Byte::::"+e.substr(r,2)}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=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?e=5*(t+1):t<=167?(e=(t-143)/2+12,e*=60):t<=196?(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=parseInt(t).toString(2),n=r.length;n<e;n++)r="0"+r;return r}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"&&t<="9")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,b="",g="",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"),d=l=(h+""+(p=semiOctetToString(r))).length/2),l<10&&(l="0"+l);var T;T=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 v=intToHex(e.length);e.length%2!=0&&(e+="F");var m=semiOctetToString(e),A=0;switch(-1!=s&&(A=16|s),o){case 7:break;case 8:A|=4;break;case 16:A|=8}var y=intToHex(A),S="";u&&(S=intToHex(a));var x;if(7==o){x=intToHex(t.length);for(H=0;H<=t.length;H++){if(H==t.length){""!=g&&(c=c+""+intToHex(binToInt(g)));break}var w=intToBin(getSevenBit(t.charAt(H)),7);0!=H&&H%8!=0?(b=w.substring(7-H%8),c=c+""+intToHex(binToInt(b+g)),g=w.substring(0,7-H%8)):g=w.substring(0,7-H%8)}}else if(8==o){x=intToHex(t.length);for(var M=0,H=0;H<t.length;H++)M=getEightBit(t.charCodeAt(H)),c=c+""+ToHex(M)}else if(16==o){x=intToHex(2*t.length);for(var N=0,H=0;H<t.length;H++)N=get16Bit(t.charCodeAt(H)),c=c+""+ToHex((65280&N)>>8)+ToHex(255&N)}var k=l+h+p+T+v+f+m+"00"+y+S+x+c;return k.length/2-d-1+"\n"+k}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;
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module ComunikaGsm
|
2
|
+
module PDU
|
3
|
+
include ComunikaGsm
|
4
|
+
def self.encode(params)
|
5
|
+
return unless params[:message]
|
6
|
+
return unless params[:number]
|
7
|
+
result = @@pdu_converter.call("stringToPDU",params[:message],params[:number],params[:smsc] || '',params[:ecoding] || 7,params[:sms_class] || 1,params[:valid],params[:deliver] || true,params[:valid_flag] || false)
|
8
|
+
PDU::PDUEncode.new(result)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.decode(pdu)
|
12
|
+
@@pdu_converter.call("getPDUMetaInfo", pdu)
|
13
|
+
end
|
14
|
+
|
15
|
+
class PDUEncode
|
16
|
+
attr_reader :size, :body
|
17
|
+
def initialize(pdu)
|
18
|
+
pdu = pdu.split(/\n/)
|
19
|
+
@size = pdu[0]; @body = pdu[1]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class PDUDecode
|
24
|
+
attr_accessor :id, :size, :pdu, :smsc, :number, :messageref, :status, :mtype,
|
25
|
+
:tp_pid, :tp_dcs_popis, :mclass, :alphabet, :message, :length, :validity, :connection, :mlenght
|
26
|
+
attr_writer :send_at, :discharge_at
|
27
|
+
def initialize(params)
|
28
|
+
@id = params[:id]; @size = params[:size]; @pdu = params[:pdu]; @mtype = params[:mtype]; @smsc = params[:smsc]
|
29
|
+
@number = params[:number]; @messageref = params[:messageref]; @send_at = params[:send_at]; @discharge_at = params[:discharge_at]
|
30
|
+
@status = params[:status]; @tp_pid = params[:tp_pid]; @tp_dcs_popis = params[:tp_dcs_popis]; @mclass = params[:mclass]
|
31
|
+
@alphabet = params[:alphabet]; @message = params[:message]; @length = params[:length]; @validity = params[:validity]
|
32
|
+
@connection = params[:connection]
|
33
|
+
end
|
34
|
+
|
35
|
+
def decode
|
36
|
+
msg = PDU.decode(self.pdu)
|
37
|
+
msg.downcase.split(/\n/).each do |m|
|
38
|
+
data = m.split(/\::::/)
|
39
|
+
case data[0].strip
|
40
|
+
when 'type'
|
41
|
+
set_mtype(data[1].strip)
|
42
|
+
when 'smsc'
|
43
|
+
@smsc = data[1].strip
|
44
|
+
when 'sender'
|
45
|
+
@number = data[1].strip
|
46
|
+
when 'messageref'
|
47
|
+
@messageref = data[1].strip
|
48
|
+
when 'timestamp'
|
49
|
+
@send_at = data[1].strip
|
50
|
+
when 'timestamp2'
|
51
|
+
@discharge_at = data[1].strip
|
52
|
+
when 'status byte'
|
53
|
+
@status = "0x#{data[1].strip}".to_i(16)
|
54
|
+
when 'tp_pid'
|
55
|
+
@tp_pid = data[1].strip
|
56
|
+
when 'tp_pid'
|
57
|
+
@tp_pid = data[1].strip
|
58
|
+
when 'tp_dcs'
|
59
|
+
@tp_dcs = data[1].strip
|
60
|
+
when 'tp_dcs-popis'
|
61
|
+
@tp_dcs_popis = data[1].strip
|
62
|
+
when 'mclass'
|
63
|
+
@mclass = data[1].strip
|
64
|
+
when 'alphabet'
|
65
|
+
@alphabet = data[1].strip
|
66
|
+
when 'message'
|
67
|
+
@message = data[1].strip
|
68
|
+
when 'length'
|
69
|
+
@length = data[1].strip
|
70
|
+
end
|
71
|
+
end
|
72
|
+
return self
|
73
|
+
end
|
74
|
+
|
75
|
+
def send_at
|
76
|
+
return @send_at.nil?
|
77
|
+
Time.parse(@send_at.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')).strftime('%Y/%m/%d %H:%M:%S')
|
78
|
+
end
|
79
|
+
|
80
|
+
def discharge_at
|
81
|
+
return if @discharge_at.nil?
|
82
|
+
Time.parse(@discharge_at.sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')).strftime('%Y/%m/%d %H:%M:%S')
|
83
|
+
end
|
84
|
+
|
85
|
+
def delete
|
86
|
+
@connection.cmd("AT+CMGD=#{@id}\r\n")
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def set_mtype(tp)
|
91
|
+
case tp
|
92
|
+
when 'receive message'
|
93
|
+
@mtype = "INCOMING"
|
94
|
+
when 'status report'
|
95
|
+
@mtype = 'REPORT'
|
96
|
+
when 'unknown message'
|
97
|
+
@mtype = 'UNKNOWN'
|
98
|
+
when 'receipt requested'
|
99
|
+
if @status.nil?
|
100
|
+
@mtype = 'INCOMING'
|
101
|
+
else
|
102
|
+
@mtype = "REPORT"
|
103
|
+
end
|
104
|
+
when 'data header'
|
105
|
+
@mtype = 'MULTIPART'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ComunikaGsm
|
2
|
+
module SMS
|
3
|
+
class Provider
|
4
|
+
attr_reader :gsm, :total
|
5
|
+
def initialize(port,debug=false)
|
6
|
+
@gsm = GSM.new(:port => port, :debug => debug)
|
7
|
+
@total = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def send_sms(msg)
|
11
|
+
return {id: nil, status: "ERROR", code: "304"} if msg[:number].length == 0
|
12
|
+
return {id: nil, status: "ERROR", code: "304"} if msg[:number].length < 11
|
13
|
+
return {id: nil, status: "ERROR", code: "503"} if msg[:message].length == 0
|
14
|
+
|
15
|
+
## GENERATE PDU TO MESSAGE ##
|
16
|
+
pdu = PDU.encode(:number => msg[:number].prepend("+55"), :smsc => msg[:smsc], :message => msg[:message])
|
17
|
+
|
18
|
+
# cmd("AT+CMGS=\"#{options[:number]}\"\r")
|
19
|
+
# res = cmd("#{options[:message][0..160]}#{26.chr}")
|
20
|
+
@gsm.cmd("AT+CMGS=#{pdu.size}\r")
|
21
|
+
res = @gsm.cmd("#{pdu.body}#{26.chr}")
|
22
|
+
|
23
|
+
sleep 3
|
24
|
+
while res.empty?
|
25
|
+
res = @gsm.wait
|
26
|
+
end
|
27
|
+
|
28
|
+
if res.include?('+CMGS')
|
29
|
+
res = res.scan(/\+(\S+)\: (\d+)\r\n/)
|
30
|
+
status = 'OK'
|
31
|
+
code = "-1"
|
32
|
+
id = res.first[1]
|
33
|
+
elsif res.include?('+CMS')
|
34
|
+
res = res.scan(/\+CMS (\S+)\: (\d+)/).first
|
35
|
+
status = 'ERROR'
|
36
|
+
code = res[1]
|
37
|
+
id = nil
|
38
|
+
end
|
39
|
+
{:id => id, :code => code, :status => status}
|
40
|
+
end
|
41
|
+
|
42
|
+
def messages
|
43
|
+
sms = @gsm.cmd("AT+CMGL=4\r\n")
|
44
|
+
msgs = sms.scan(/\+CMGL\:\s*?(\d+),\s*?(\d+),.*?\,s*?(\d+)\r\n(.*)/)
|
45
|
+
|
46
|
+
## IDS: 0 - ID, 1 -- ,2 - size, 3 - PDU
|
47
|
+
msgs.collect!{ |m| PDU::PDUDecode.new(connection: @gsm, id: m[0], size: m[2], pdu: m[3].chomp).decode }# rescue nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
## TODO create method reader sms and remove
|
54
|
+
## .sub(/(\d+)\D+(\d+)\D+(\d+)/, '\1/\2/20\3')
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: comunika_gsm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jefferson Silva
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: serialport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: execjs
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.7'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.7'
|
69
|
+
description: Comunication of with GSM modem
|
70
|
+
email:
|
71
|
+
- jefferson.silva@assertivasolucoes.com.br
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/comunika_gsm.rb
|
77
|
+
- lib/comunika_gsm/gsm.rb
|
78
|
+
- lib/comunika_gsm/js/pdu.js
|
79
|
+
- lib/comunika_gsm/js/pdu.min.js
|
80
|
+
- lib/comunika_gsm/pdu.rb
|
81
|
+
- lib/comunika_gsm/sms.rb
|
82
|
+
- lib/comunika_gsm/version.rb
|
83
|
+
homepage: ''
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.6.12
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Gem of use internal
|
107
|
+
test_files: []
|