-
• #2
Hi! What you're doing looks fine - although I'm not sure the console log you posted actually matches the code that you posted up?
Are you sure you're not calling
initGPRS
more than once? I don't see it called at all in the code, but if it were called multiple times it would definitely cause a memory leak.Looking at the module the
Uncaught Error: 0, CLOSED already registered
message would seem to be caused by the module not actually sending the line0, CLOSED
when the request finishes. I don't know if that's some difference between the SIM808 and SIM900 or not, but it might be I need to make a few tweaks to the module to get it to handle that properly.Please could you run
sim.gprs.at.debug()
, make a request, then post what gets printed up here?Hopefully it'll allow me to make some changes to the module to fix the issue.
-
• #3
Hi Gordon,
although I'm not sure the console log you posted actually matches the code that you posted up?
Yes I Just clean it up to be easier to see the important data.
Are you sure you're not calling initGPRS more than once? I don't see it called at all in the code, but if it were called multiple times it would definitely cause a memory leak.
I am calling it only once manually from the left side of the IDE when the SIM808 is ready - Just for testing.
AT Debug:
>sim.gprs.at.debug() ={ line: "", lineCallback: undefined, handlers: { "+RECEIVE": function (b) { ... }, "+D": function (b) { ... } }, lineHandlers: { }, waiting: [ ], dataCount: 0 }
First request:
>testGet1() ["AT+CIPSTART=0,\"TCP\",\"http://www.pur3.co.uk\",80\r\n" =undefined ] "\r\nOK\r\n" ] "\r\n0, CONNECT OK\r\n" ] "\r\n> " ] "\r\n0, SEND " ] "OK\r\n" ] "\r\n+RECEIVE,0,134" ] "8:\r\nHTTP/1.1 200 OK\r\nDate: Thu, 31 Dec 2020 11:09:20 GMT\r\nServer: Apache/2.4.18 (Ubuntu)\r\nVary: Accept-Encoding\r\nConnection: close\r\nContent-Type: text/html;charset=UT" ] "\r\n+RECEI" ] "VE,0,1348:\r\n/h1> \r\n<!--\t\t<form method=\"get\" class=\"searchform\" action=\"search.php\">\r\n\t\t\t<div><input type=\"text\" name=\"text\" class=\"textbox\" />" ] "\r\n+RECEIVE," ] "0,1325:\r\na wide variety of platforms. For more information, please see the <a href=\"About\"><span>About</span></a> page.<br />\n<br />\n<strong>We also develop the&nbs" ["AT+CIPCLOSE=0,1\r\n" Got Response with statuscode: 200 Error Flags [ ] ========== FREE MEMORY - GET1 885 ========== ] "\r\n0, CLOSE OK\r\n"
Second request:
>testGet1() ["AT+CIPSTART=0,\"TCP\",\"http://www.pur3.co.uk\",80\r\n" =undefined ] "\r\nOK\r\n" Uncaught Error: 0, CLOSED already registered at line 1 col 44 if(m[a])throw Error(a+" already registered");m[a]=d ^ in function "registerLine" called from line 2 col 432 ...;g[a]=void 0;l=!1;return""});else return g[a]=void 0,"" ^ in function "c" called from line 1 col 25 e=void 0;var u;c&&(u=c(t))?(e=k,c=u):clearTimeout(h);void 0=... ^ in function "e" called from line 2 col 16 k=!0);k||e&&e(h)}b=b.substr(a+1);if(k&&f)return d("");"\n"==... ^ in function called from system ] "\r\n0, CONNECT OK\r\n" ] "\r\n> " ] "\r\n0, SEND" ] " OK\r\n" ] "\r\n+RECEIVE,0,134" ] "8:\r\nHTTP/1.1 200 OK\r\nDate: Thu, 31 Dec 2020 11:09:43 GMT\r\nServer: Apache/2.4.18 (Ubuntu)\r\nVary: Accept-Encoding\r\nConnection: close\r\nContent-Type: text/html;charset=U" ] "\r\n+RECEI" ] "VE,0,1348:\r\n/h1> \r\n<!--\t\t<form method=\"get\" class=\"searchform\" action=\"search.php\">\r\n\t\t\t<div><input type=\"text\" name=\"text\" class=\"textbox\" />\r\n" ] "\r\n+RECEIVE" ] ",0,1325:\r\na wide variety of platforms. For more information, please see the <a href=\"About\"><span>About</span></a> page.<br />\n<br />\n<strong>We also develop the&nbs" ["AT+CIPCLOSE=0,1\r\n" Got Response with statuscode: 200 Error Flags [ ] ========== FREE MEMORY - GET1 750 ========== ] "\r\n0, CLOSE OK\r\n"
Thank you,
-
• #4
Great - thanks! I'll look into this - it seems that your module reports
0, CLOSE
and not0, CLOSED
- so it may be a reasonably simple fix -
• #5
Hi - please can you try re-uploading your code and see if that fixes it? I just updated the
SIM900
module -
• #6
Hi, thank you Gordon,
Now I'm getting this error:
["AT+CIPSTART=1,\"TCP\",\"http://www.pur3.co.uk\",80\r\n" ] "\r\nOK\r\n" Uncaught Error: 1, CLOSE already registered at line 1 col 44 if(m[a])throw Error(a+" already registered");m[a]=d ^ in function "registerLine" called from line 2 col 429 ...;g[a]=void 0;l=!1;return""});else return g[a]=void 0,"" ^ in function "c" called from line 1 col 25 e=void 0;var u;c&&(u=c(t))?(e=k,c=u):clearTimeout(h);void 0=... ^ in function "e" called from line 2 col 16 k=!0);k||e&&e(h)}b=b.substr(a+1);if(k&&f)return d("");"\n"==... ^ in function called from system ] "\r\n1, CONNEC" ] "T OK\r\n" ] "\r\n> " ] "\r\n1" ] ", SEND OK\r\n" ] "\r\n+RECEIVE,1,1348:\r\nHTT" ] "\r\n+RECEIVE,1" ] ",1348:\r\n/h1> \r\n<!--\t\t<form method=\"get\" class=\"searchform\" action=\"search.php\">\r\n\t\t\t<div><input type=\"text\" name=\"text\" class=\"textbox\" />\r\n \t\t\t<input type=\"submit\" name=\"search\" cla" ] "\r\n+" ] "RECEIVE,1,1325:\r\na wide variety of platforms. For more information, please see the <a href=\"About\"><span>About</span></a> page.<br />\n<br />\n<strong>We also de" ["AT+CIPCLOSE=1,1\r\n" Got Response with statuscode: 200 Error Flags [ ] ========== FREE MEMORY - GET1 148 ========== ] "\r\n1, CLOSE OK\r\n" >
-
• #7
Ok - was there anything that came before that?
Please can you try changing your
require("SIM900")
torequire("https://raw.githubusercontent.com/espruino/EspruinoDocs/sim808/devices/SIM900.js")
?I made some other tweaks that would fix this I think but I don't want to push them fully live until you've tested them :)
-
• #8
Testing...
-
• #10
Great! I'll merge that in :)
-
• #11
Until ... :)
It's definitely a lot better but I did some more tests, I shut down the remote service while continuing the POST requests to it (every 30 seconds), I got a 'no response' message as expected but it seems to be a memory leak here.
BTW, 1 is when the service is up and running...Loading 12442 bytes from flash... Running onInit()... >initGPRS() =undefined ========== FREE MEMORY BEFORE STARTING REQUESTS: 928 ========== Response: 1 ========== FREE MEMORY - POST 664 ========== Response: 1 ========== FREE MEMORY - POST 664 ========== Response: 1 ========== FREE MEMORY - POST 664 ========== Response: 1 ========== FREE MEMORY - POST 664 ========== ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 563 ========== ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 473 ========== New interpreter error: LOW_MEMORY,MEMORY ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 152 ========== ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 430 ========== ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 434 ========== ERROR: Error processing Serial data handler - removing it. Execution Interrupted during event processing. New interpreter error: CALLBACK ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 136 ========== ERROR: Ctrl-C while processing interval - removing it. Execution Interrupted during event processing. >
With Debug (Service down all time):
Loading 12442 bytes from flash... Running onInit()... >initGPRS() =undefined ========== FREE MEMORY BEFORE STARTING REQUESTS: 927 ========== >sim.gprs.at.debug() ={ line: "", lineCallback: undefined, handlers: { "+RECEIVE": function (b) { ... }, "+D": function (b) { ... } }, lineHandlers: { "0, CLOSE": function (b) { ... }, "1, CLOSE": function (b) { ... }, "2, CLOSE": function (b) { ... }, "3, CLOSE": function (b) { ... }, "4, CLOSE": function (b) { ... } }, waiting: [ ], dataCount: 0 } ["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ["AT+CIPSTART=1,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ["AT+CIPSTART=2,\"TCP\",\"fake.server.com\",80\r\n" New interpreter error: LOW_MEMORY,MEMORY ] "\r\nOK\r\n" ] "\r\n0, CONNECT FAIL\r\n" ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 152 ========== ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 430 ========== ["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n1, CONNECT FAIL\r\n" ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 434 ========== ["AT+CIPSTART=1,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n2, CONNECT FAIL\r\n" ["AT+CIPSTART=2,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ERROR: Error processing Serial data handler - removing it. Execution Interrupted during event processing. New interpreter error: CALLBACK ERROR: { "code": -15, "message": "no response" } ========== FREE MEMORY - ERROR POST 136 ========== ["AT+CIPSTART=2,\"TCP\",\"fake.server.com\",80\r\n" ERROR: Ctrl-C while processing interval - removing it. Execution Interrupted during event processing. >
-
• #12
Strange... However from the dump it looks a lot like the SIM808 is trying to connect for a while before it gives up? Maybe there's a 60 second connection timeout internally?
So what's happening is you're trying to post every 30 seconds, so you're queueing up multiple requests before the last ones have finished.
What happens if you just stop making more HTTP requests (maybe with
testGet1 = function(){}
) then wait 5 minutes and see how much memory is used? -
• #13
The default timeout seems to be 120 seconds? from simcom.
https://simcom.ee/documents/SIM808/SIM800%20Series_AT%20Command%20Manual_V1.09.pdfAnyway,
GET requeststestGet1 = function() {}
worked fine every 30 seconds even when the service was down.
POST requests in other hand, I tried requests every 130 seconds for more than 10 hours when the service was up. I started with 666 free memory and finished with 451. This leak occurred only once, from 666 to 451 with "no response" message.
There were more "no response" messages but the leak occurred only on one of them.I will do the same test with POST requests, service down, 5 minutes interval and see if still there any memory leak.
Is there a way to specify a 30 seconds timeout in the GET/POST requests from http module?
Thank you.
-
• #14
Is there a way to specify a 30 seconds timeout in the GET/POST requests from http module?
There's no timeout built in to Espruino itself I'm afraid, but you may well be able to issue an AT command to the SIM808 that will configure the timeout?
Worst case it might be possible to do a bit of a hack to force the closure of the socket after a timeout, but hopefully it won't come to that.
-
• #15
I think it's ok.
I'll see how it goes in the long term.
Thank you Gordon. -
• #16
Hello again,
Still testing this modulehttps://raw.githubusercontent.com/espruino/EspruinoDocs/sim808/devices/SIM900.js
I don't know if this related to the request timeout but I'm posting data every 10 minutes, at first this works ok, but when I got
{"code":-15,"message":"no response"}
response so after 10 minutes, the next request will begin with this error message.Uncaught Error: 0, CONNECT OK already registered at line 1 col 44 if(h[a])throw Error(a+" already registered");h[a]=b ^ in function "registerLine" called from line 1 col 174 ...CONNECT FAIL'),socks[a]=!0}),at.registerLine(a+', CONNECT FA... ^ in function "c" called from line 1 col 25 g=void 0;var b;c&&(b=c(a))?(g=e,c=b):clearTimeout(d);void 0=... ^ in function "g" called from line 2 col 4 g(f)}b=b.substr(a+1);if(p&&d)return q("");"\n"==b[0]&&(b=b.s... ^ in function called from system
It might work, but over time after couple requests this getting worse and the majority of the responses are 'no response' with the error above.
What I'm trying to establish for now is to find the best way for stable connection and requests so I can continue my project knowing I have reliable way dealing with this.
All test I did are when there is a good cellular signal.
I tried those 2 scenarios with same results:
1:- gprs = require('https://.../devices/SIM900.js').connect(Serial1... - ONCE
- gprs.connect('', '', '', (err)... - ONCE
- gprs.getIP((err, ip) - ONCE
- require("http").request(options, (res) - EVERY 10 MINUTES
2:
- gprs = require('https://.../devices/SIM900.js').connect(Serial1... - ONCE
- gprs.connect('', '', '', (err)... - EVERY 10 MINUTES
- gprs.getIP((err, ip) - EVERY 10 MINUTES
- require("http").request(options, (res) - EVERY 10 MINUTES
- "AT+CIPSHUT" command (deactivate gprs) - EVERY 10 MINUTES
Your help is greatly appreciated..
Michael. - gprs = require('https://.../devices/SIM900.js').connect(Serial1... - ONCE
-
• #17
Can you try now and see if it's any better please?
-
• #18
Hi,
I'm still getting the error, this is how it looks using the second scenario when
at.debug
enabled["AT+CSTT=\"apn.net\", \"\", \"\"\r\n" ] "\r\nO" ] "K\r\n" ["AT+CIICR\r\n" ] "\r\nOK" ] "\r\n" ["AT+CIFSR\r\n" ] "\r\n" ] "ip.ip.ip.ip\r\n" ["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n0, CONNECT O\r\n" ] "\r\n0, CLOSED\r\n" ERROR: {"code":-15,"message":"no response"} ] "\r\nS" ] "HUT OK\r\n"
And then after 10 minutes
["AT+CSTT=\"apn.net\", \"\", \"\"\r\n" ] "\r\nOK" ] "\r\n" ["AT+CIICR\r\n" ] "\r\nO" ] "K\r\n" ["AT+CIFSR\r\n" ] "\r\n" ] "ip.ip.ip.ip\r\n" ["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" Uncaught Error: 0, CONNECT OK already registered at line 1 col 44 if(h[a])throw Error(a+" already registered");h[a]=b ^ in function "registerLine" called from line 1 col 174 ...CONNECT FAIL'),socks[a]=!0}),at.registerLine(a+', CONNECT FA... ^ in function "c" called from line 1 col 25 g=void 0;var b;c&&(b=c(a))?(g=e,c=b):clearTimeout(d);void 0=... ^ in function "g" called from line 2 col 4 g(f)}b=b.substr(a+1);if(p&&d)return q("");"\n"==b[0]&&(b=b.s... ^ in function called from system ] "\r\n0, CONNEC" ] "T OK\r\n" ] "\r\n> " ] "\r\n0, SE" ] "ND OK\r\n\r\n+RECEIVE,0,159:\r\nHTTP/1.1 200 OK\r\nConnection: close\r\nDate: Mon, 18 Jan 2021 15:47:55 GMT\r\nContent-Type: application/json; charset=" ["AT+CIPCLOSE=0,1\r\n" ] "\r\n0, CLOSE OK\r\n" ["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n0," ] " CONNECT OK\r\n" ] "\r\n> " ] "\r\n0, SEN" ] "D OK\r\n\r\n+RECEIVE,0,159:\r\nHTTP/1.1 200 OK\r\nConnection: close\r\nDate: Mon, 18 Jan 2021 15:48:08 GMT\r\nContent-Type: application/json; charset=u" ["AT+CIPCLOSEE=0,1\r\n" ] "\r\n0, CLOSE OK\r\n" ] "\r\n" ] "SHUT OK\r\n"
Thank you
-
• #19
Ahh, sorry - this time I updated the
master
branch, notsim808
and didn't spot the different link. Please can you tryrequire("https://raw.githubusercontent.com/espruino/EspruinoDocs/master/devices/SIM900.js")
-
• #20
Thank you @Gordon! It's better now.
There is a similar bug with
Uncaught Error: 0, SEND OK already registered
Here is 2 examples..
Example 1:
["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n0, CONNECT OK\n" ] "\r\n0, CLOED\r\n" ] "\r\nERROR\r\n"
then every 10 minutes
["AT+CIPSTART=1,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n1, CONNECT OK\r\n" ] "\r\n1, CLOSED\r\n" ERROR: {"code":-15,"message":"no response"} Uncaught Error: 0, SEND OK already registered at line 1 col 44 if(h[a])throw Error(a+" already registered");h[a]=b ^ in function "registerLine" called from line 1 col 254 ...+', SEND FAIL'),busy=!1,''}),at.registerLine(a+', SEND FAIL'... ^ in function called from system
when the sockets debug look like this
{ "socks": [ true ], "sockData": [ "", "", "", "", "", "0124": "undefined" ] }
Example 2:
["AT+CIPSTART=0,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n0, CONNECT OK\r\n" ] "\r\n> " ] "\r\n0, END OK\r\n" ] "\r\n+RE" ] "CEIVE,0,124:\r\nHTTP/1.1 408 Request Timeout\r\nConnection: close\r\nDate: Thu, 21 Jan 2021 14:32:35 GMT\r\nContent-Length: 0\r\n\r\n" ] "\r\n, CLOSED\r" ] "\n"
then every 10 minutes
["AT+CIPSTART=1,\"TCP\",\"fake.server.com\",80\r\n" ] "\r\nOK\r\n" ] "\r\n1, CONNECT OK\r\n" ] "\r\n1, CLOSED\r\n" ERROR: {"code":-15,"message":"no response"} Uncaught Error: 0, SEND OK already registered at line 1 col 44 if(h[a])throw Error(a+" already registered");h[a]=b ^ in function "registerLine" called from line 1 col 254 ...+', SEND FAIL'),busy=!1,''}),at.registerLine(a+', SEND FAIL'... ^ in function called from system
when the sockets debug look like this
{ "socks": [ true, undefined ], "sockData": [ "", "", "", "", "" ] }
Thanks again.
-
• #21
Are you sure you have a good connection from the SIM808 to the board (including ground?). It's looking like the reason things are going wrong is data is getting lost. For example
0, CLOED
should be0, CLOSED
and for your last one you get, CLOSED
without a socket number. -
• #23
Serial2.setup(9600, { tx: 16, rx: 17 }); var at = require('AT').connect(Serial2); setInterval(() => { at.debug(); at.write('AT/r/n'); }, 3000);
How do I get the response in string format.
I'm getting debug output like this: "\u00C1\u00DD?\u00F2?\u00FF" -
• #24
I'm getting debug output like this: "\u00C1\u00DD?\u00F2?\u00FF"
That might be a sign that the baud rate is wrong? Are you sure the module uses 9600 baud?
-
• #25
With the sim900 module the result is OK!
Serial2.setup(9600, { tx: 16, rx: 17 }); var gprs = require('SIM900').connect(Serial2, undefined, function (err) { if (err) throw err; gprs.connect('APN', 'USER', 'PASSWORD', function (err) { if (err) throw err; gprs.getIP(function (err, ip) { if (err) throw err; console.log(ip); }); }); });
After sending the above code I use RELP and get the result below:
>gprs.at.cmd("AT\r\n") ["AT\r\n" =undefined ] "\r\nOK\r\n" >
I would like to know using the sim900 module how do I check if the connection is ok with the APN network and how do I reconnect after disconnection.
Ex:
while(!gprs.networkConnect){ gprs.reconnect() }
How do I do this with the sim900 module? Sorry if the question is stupid!
Hello,
I'm using MDBT42 flashed with the latest firmware (2v08) and I'm experiencing a strange behavior with http module.
After everything initialized using
require('SIM900')
I got ~1300 free memory and then I started getting \posting data from\to a server every 30 seconds and after the first successful response and starting from the second request I'm getting this error but I'm still getting successful responses...... while the free memory decrease every request.
After a couple of minutes I got those errors:
The issue is the same using GET and POST.
Am I doing it wrong?
Is there any better way to do this interval thing?
Here is the full code for my trials.
Thank you.