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