mirror of
https://github.com/espruino/Espruino.git
synced 2025-12-08 19:06:15 +00:00
6 lines
2.9 KiB
JavaScript
6 lines
2.9 KiB
JavaScript
function l(){}function h(a,b){return new Promise(function(c,f){var m="";d.cmd(a+"\r\n",b||1E3,function p(b){if(void 0===b||"ERROR"==b)f(a+": "+b?b:"TIMEOUT");else if("OK"==b)c(m);else return m+=(m?"\n":"")+b,p})})}var d,g=[],e=" ".split(" "),k=!1,q={create:function(a,b){var c=0;if(void 0===a)return l("Server not implemented"),-1;for(;void 0!==g[c];)c++;if(6<=c)throw Error("No free sockets.");g[c]="Wait";e[c]="";k=!0;d.cmd("AT+QIOPEN=1,"+c+',"TCP",'+JSON.stringify(a)+","+b+",0,1\r\n",
|
|
1E4,function(a){"OK"!=a&&(g[c]=void 0,k=!1)});return c},close:function(a){void 0!==g[a]&&(e[a]="",d.cmd("AT+QICLOSE="+a+"\r\n",1E3,function(){g[a]=void 0}))},accept:function(a){return-1},recv:function(a,b){if(e[a]){if(e[a].length>b){var c=e[a].substr(0,b);e[a]=e[a].substr(b)}else c=e[a],e[a]="";return c}return g[a]?"":-1},send:function(a,b){if(k||d.isBusy()||"Wait"==g[a])return 0;if(!g[a])return-1;k=!0;d.cmd("AT+QISEND="+a+","+b.length+"\r\n",1E4,function m(f){l("AT+QISEND response "+JSON.stringify(f));
|
|
if("OK"==f)return d.register("> ",function(a){d.unregister("> ");d.write(b);return a.substr(2)}),m;"SEND OK"==f?k=!1:(d.unregister("> "),g[a]=null)});return b.length}},n={debug:function(a){l=a||void 0===a?function(a){print("[BG96]",a)}:function(){};return{socks:g,sockData:e,busy:k}},getVersion:function(a){h("AT+GMR").then(function(b){a(null,b)})["catch"](function(b){a(b)})},getIP:function(a){var b;d.cmd("AT+QISTATE=0,1\r\n",1E3,function(c){"OK"==c?a(null,b):c.startsWith("+QISTATE")?b=c.split(",")[2]:
|
|
a(null,c)})}};exports.connect=function(a,b,c){b=b||{};a.removeAllListeners();n.at=d=require("AT").connect(a);require("NetworkJS").create(q);d.register('+QIURC: "recv"',function(a){var b=a.indexOf("\r\n");if(0>b)return a;var f=a.split(",");a=a.substr(b+2);e[0|f[1]]+=a;l(f);d.getData((0|f[2])-a.length,function(a){e[0|f[1]]+=a});return""});d.registerLine('+QIURC: "closed"',function(a){g[0|a.substr(17)]=null;k=!1});d.registerLine("+QIOPEN: ",function(a){a=a.substr(9).split(",");g[0|a[0]]=0==a[1]?!0:void 0;
|
|
k=!1});d.registerLine("+CME ERROR",function(a){console.log(a)});h("ATE0").then(function(){return h("AT+CEREG=2")}).then(function(){return new Promise(function(a,c){var f=60,e=setInterval(function(){d.cmd(b.lte?"AT+CEREG?\r":"AT+CREG?\r",500,function(b){b=b.split(",")[1];if(1==b||5==b)clearInterval(e),a()});0>=f--&&(clearInterval(e),c("Timeout while registering."))},1E3)})}).then(function(a){return h("AT+CGATT=1",1E4)}).then(function(){return h("AT+CGREG?")}).then(function(a){var b=a.split(",")[1];
|
|
if(2==b)throw Error("GPRS still connecting, "+a);if(1!=b&&5!=b)throw Error("GPRS not registered, "+a);return h("AT+COPS?")}).then(function(a){var c=a.split(",")[2];if(!c)throw Error("No Operator, "+a);l("Operator "+c);return h("AT+QICSGP=1,1,"+JSON.stringify(b.apn||"")+","+JSON.stringify(b.username||"")+","+JSON.stringify(b.password||""),6E4)}).then(function(){return h("AT+QIACT=1",6E4)}).then(function(){c&&c(null)})["catch"](function(a){c&&c(a)});return n} |