2018-03-16 16:27:22 +00:00

15 lines
7.4 KiB
JavaScript

function z(a){return{ip:a.charCodeAt(0)+"."+a.charCodeAt(1)+"."+a.charCodeAt(2)+"."+a.charCodeAt(3),port:a.charCodeAt(5)<<8|a.charCodeAt(4),len:a.charCodeAt(7)<<8|a.charCodeAt(6)}}function D(a){var b=a.indexOf(":");if(0>b)return a;var d=a.substring(5,b).split(",");d[1]|=0;var c=a.length-(b+1),e=d[0];if(v[e]){var m=(d[2]||"0.0.0.0").split(".").map(function(a){return 0|a}),A=0|d[3];g[e]+=String.fromCharCode(m[0],m[1],m[2],m[3],A&255,A>>8,c&255,c>>8)}if(c>=d[1])return g[e]+=a.substr(b+1,
d[1]),a.substr(b+d[1]+1);g[e]+=a.substr(b+1,c);f.getData(d[1]-c,function(a){g[e]+=a});return""}function w(a,b){if(b)return a(b);f.cmd("AT+CWMODE="+p+"\r\n",1E3,function(b){"no change"!=b&&"OK"!=b&&"WIFI DISCONNECT"!=b?a("CWMODE failed: "+(b?b:"Timeout")):a(null)})}function q(a){var b=a[0];void 0===e[b]&&e[5]?e[b]="Accept":"Wait"==e[b]?e[b]=!0:f.cmd("AT+CIPCLOSE="+b+"\r\n",1E3,function(a){e[b]=void 0})}function r(a){e[a[0]]=""!=g[a[0]]?"DataClose":void 0}function u(a,b){var d=0==p;p|=a;d?("1v91"==
process.version?(x.reset(),t.setup(115200,{rx:A3,tx:A2})):t.setup(115200,{rx:A3,tx:A2,cts:x}),f=require("AT").connect(t),f.register("+IPD",D),f.registerLine("0,CONNECT",q),f.registerLine("1,CONNECT",q),f.registerLine("2,CONNECT",q),f.registerLine("3,CONNECT",q),f.registerLine("4,CONNECT",q),f.registerLine("0,CLOSED",r),f.registerLine("1,CLOSED",r),f.registerLine("2,CLOSED",r),f.registerLine("3,CLOSED",r),f.registerLine("4,CLOSED",r),f.registerLine("WIFI CONNECTED",function(){n|=k.CLIENT;exports.emit("associated")}),
f.registerLine("WIFI GOT IP",function(){exports.emit("connected")}),f.registerLine("WIFI DISCONNECTED",function(){n&=~k.CLIENT;exports.emit("disconnected")}),exports.at=f,require("NetworkJS").create(B),f.cmd("\r\nAT+RST\r\n",1E4,function m(a){if("ready"==a||"Ready."==a)setTimeout(function(){f.cmd("ATE0\r\n",1E3,function F(a){if("ATE0"==a)return F;"OK"==a?f.cmd("AT+CIPDINFO=1\r\n",1E3,function(a){if("OK"!=a)return b("CIPDINFO failed: "+(a?a:"Timeout"));f.cmd("AT+CIPMUX=1\r\n",1E3,function(a){if("OK"!=
a)return b("CIPMUX failed: "+(a?a:"Timeout"));f.cmd("AT+UART_CUR=115200,8,1,0,2\r\n",500,function(a){if("OK"!=a)return b("UART_CUR failed: "+(a?a:"Timeout"));w(b)})})}):b("ATE0 failed: "+(a?a:"Timeout"))})},500);else if(void 0===a)b("No 'ready' after AT+RST");else return m}),digitalWrite(G,1),digitalWrite(y,1)):w(b)}function C(a,b){b=b||function(){};(p&=~a)?w(b,null):(t.removeAllListeners(),f=void 0,exports.at=void 0,digitalWrite(y,0),e=[],setTimeout(b,1))}var G=A13,y=A14,x=A15,t=Serial2;digitalWrite(y,
0);var k={CLIENT:1,AP:2},H=["open","wep","wpa_psk","wpa2_psk","wpa_wpa2_psk"],p=0,n=0,f,e=[],v=[],g=["","","","",""],B={create:function(a,b,d){if(!f||!n)return-1;if(void 0===a&&2!=d)return c=5,e[c]="Wait",g[c]="",f.cmd("AT+CIPSERVER=1,"+b+"\r\n",1E4,function(a){"OK"==a?e[c]=!0:(e[c]=void 0,setTimeout(function(){throw Error("CIPSERVER failed ("+(a?a:"Timeout")+")");},0))}),5;for(var c=0;void 0!==e[c];)c++;if(5<=c)return-7;g[c]="";e[c]="Wait";var h;2==d?(b?h="AT+CIPSTART="+c+',"UDP","255.255.255.255",'+
b+","+b+",2\r\n":e[c]="UDP",v[c]=!0):(h="AT+CIPSTART="+c+',"TCP",'+JSON.stringify(a)+","+b+"\r\n",delete v[c]);h&&f.cmd(h,1E4,function l(a){if("ALREADY CONNECTED"==a)return l;if("OK"!=a||!0!==e[c])e[c]=-6});return c},close:function(a){"Wait"==e[a]?e[a]="WaitClose":void 0!==e[a]&&(0>e[a]||"UDP"==e[a]?e[a]=void 0:f.cmd((5==a?"AT+CIPSERVER=0":"AT+CIPCLOSE="+a)+"\r\n",1E3,function(b){e[a]=void 0}))},accept:function(a){for(a=0;5>a;a++)if("Accept"==e[a])return e[a]=!0,a;return-1},recv:function(a,b,d){return g[a]?
(g[a].length>b?(d=g[a].substr(0,b),g[a]=g[a].substr(b)):(d=g[a],g[a]="","DataClose"==e[a]&&(e[a]=void 0)),d):0>e[a]?e[a]:e[a]?"":-1},send:function(a,b,d){if(!f)return-1;if(f.isBusy()||"Wait"==e[a])return 0;if(0>e[a])return e[a];if(!e[a])return-1;if("UDP"==e[a])return d=z(b),e[a]="Wait",f.cmd("AT+CIPSTART="+a+',"UDP","'+d.ip+'",'+d.port+","+d.port+",2\r\n",1E4,function(b){"OK"!=b&&(e[a]=-6)}),0;var c=b.length,h="";2==d&&(d=z(b),h=',"'+d.ip+'",'+d.port,b=b.substr(8,d.len),c=8+d.len);f.cmd("AT+CIPSEND="+
a+","+b.length+h+"\r\n",1E4,function l(c){if("OK"==c)return f.register("> ",function(){f.unregister("> ");f.write(b);return""}),l;if(c=="Recv "+b.length+" bytes"||"busy s..."==c)return l;"SEND OK"==c?("WaitClose"==e[a]&&B.close(a),e[a]=!0):(e[a]=void 0,f.unregister("> "))});e[a]="Wait";return c}};exports.connect=function(a,b,d){var c="";d=d||function(){};void 0!==b.password&&(c=b.password);u(k.CLIENT,function(b){if(b)return d(b);f.cmd("AT+CWJAP="+JSON.stringify(a)+","+JSON.stringify(c)+"\r\n",2E4,
function l(a){if(0<=["WIFI DISCONNECT","WIFI CONNECTED","WIFI GOT IP","+CWJAP:1"].indexOf(a))return l;"OK"!=a?setTimeout(d,0,"WiFi connect failed: "+(a?a:"Timeout")):setTimeout(d,0,null)})})};exports.disconnect=function(a){C(k.CLIENT,a)};exports.startAP=function(a,b,d){b=b||{};if(!b.password||8>b.password.length)throw Error("Password must be at least 8 characters");var c=b.password?"3":"0";if(b.authMode&&(c={open:0,wpa:2,wpa2:3,wpa_wpa2:4}[b.authMode],void 0===c))throw Error("Unknown authMode "+b.authMode);
void 0===b.channel&&(b.channel=5);u(k.AP,function(e){if(e)return d(e);f.cmd("AT+CWSAP="+JSON.stringify(a)+","+JSON.stringify(b.password)+","+b.channel+","+c+"\r\n",5E3,function(a){"OK"!=a?d("CWSAP failed: "+(a?a:"Timeout")):(n|=k.AP,d(null))})})};exports.stopAP=function(a){n&=~k.AP;C(k.AP,a)};exports.scan=function(a){var b=[];u(k.CLIENT,function(d){if(d)return a(d);f.cmdReg("AT+CWLAP\r\n",5E3,"+CWLAP:",function(a){a=a.slice(8,-1).split(",");b.push({ssid:JSON.parse(a[1]),authMode:H[a[0]],rssi:parseInt(a[2]),
mac:JSON.parse(a[3]),channel:JSON.parse(a[4])})},function(c){a(null,b)})})};exports.getIP=function(a){var b={};f.cmd("AT+CIFSR\r\n",1E3,function h(c){if(void 0===c)a("Timeout");else{if("+CIFSR:STAIP"==c.substr(0,12))b.ip=c.slice(14,-1);else if("+CIFSR:STAMAC"==c.substr(0,13))b.mac=c.slice(15,-1);else if("OK"==c){a(null,b);return}return h}})};exports.setIP=function(a,b){if("object"==typeof a&&a.ip){var d=[JSON.stringify(a.ip)];a.gw&&(d.push(JSON.stringify(a.gw)),d.push(JSON.stringify(a.netmask||"255.255.255.0")));
d="AT+CIPSTA_CUR="+d.join(",")+"\r\n";var c=3E3}else d="AT+CWDHCP_CUR=1,1\r\n",c=2E4;f.cmd(d,c,function(a){if("OK"==a)b(null);else return b("setIP failed: "+(a?a:"Timeout"))})};exports.getAPIP=function(a){var b={};f.cmd("AT+CIPAP_CUR?\r\n",1E3,function h(c){if(void 0===c)a("Timeout");else if("OK"==c)f.cmd("AT+CIPAPMAC_CUR?\r\n",1E3,function l(c){if(void 0===c)a("Timeout");else if("OK"==c)a(null,b);else return"+CIPAPMAC_CUR"==c.substr(0,14)&&(b.mac=JSON.parse(c.substr(10))),l});else return"+CIPAP_CUR"==
c.substr(0,10)&&(c=c.split(":"),"gateway"==c[1]&&"gw"==c[1],b[c[1]]=JSON.parse(c[2])),h})};exports.setAPIP=function(a,b){var d=[JSON.stringify(a.ip)];a.gw&&(d.push(JSON.stringify(a.gw)),d.push(JSON.stringify(a.netmask||"255.255.255.0")));f.cmd("AT+CIPAP_CUR="+d.join(",")+"\r\n",3E3,function(a){if("OK"==a)b(null);else return b("setAPIP failed: "+(a?a:"Timeout"))})};exports.setHostname=function(a,b){u(k.CLIENT,function(d){if(d)return b(d);f.cmd("AT+CWHOSTNAME="+JSON.stringify(a)+"\r\n",500,b)})};exports.ping=
function(a,b){var d;f.cmd('AT+PING="'+a+'"\r\n',1E3,function m(a){if(a&&"+"==a[0])return d=a.substr(1),m;"OK"==a?b(d):b()})};exports.turbo=function(a,b){var d=a?!0===a?921600:a:115200;f.cmd("AT+UART_CUR="+d+",8,1,0,2\r\n",500,function(a){"OK"!=a?b&&b("Baud rate switch to "+d+" failed: "+(a?a:"Timeout")):(t.setup(d,{rx:A3,tx:A2,cts:x}),b&&b(null))})};exports.debug=function(){return{wifiMode:p,connected:n,socks:e,sockData:g}}