This is one of those projects I always wanted to do. How do you use modem AT commands and make a TCP connection using a GPRS board? After struggling for a while and reading lot of documents from various places, I was able to do this. There are many blogs on the net covering this topic, but most of them either do not provide full details, or in many places specific answers have been provided to queries but not full details. I’m not claiming that this is the only blog that has the full details, just that I was not able to find a good one.
What do you need
To start this project, you will need the following:
- A GSM-GPRS board. I bought one from sunrom.com. This board can be interfaced with RS-232 DB9 connector. The rest of the required items assume that the board you have, also interface using a RS-232 connector
- A laptop with spare USB port (I’m assuming your laptop does not have RS-232 port. I have not seen a laptop with RS-232 port in over last 10 years)
- A USB to RS-232 board. Please note, this should not be a USB-to-RS232 (TTL), but a full USB-to-RS232. The output should be RS232 voltage ranges (around +/-12V). This is due to the fact that the board I had, allowed interfacing with RS-232. If your board has TTL interfaces, please get a US-to-RS232 (TTL) interface. The one I have was bought from Nex-Robotics
- A RS-232 cable (please ensure you get the right combination of male/female). My USB-to-RS232 adapter had male output and GPRS board had female input. Thus, I got one RS232 cable with male/female combination.
- A SIM card that has data plan
- A power supply for your GPRS board. Generally, the GPRS boards require 2 Amp supply. So please read the board specifications and get the power supply accordingly. I made the mistake of not reading the specs right and got a 1 Amp supply. I had trouble exchanging data.
- A terminal program like Terminal.exe. You can download this from the Sunrom website. Look at the bottom right of this page.
How to setup
- First of all you need to install the driver and setup your USB-to-RS232 adapter. This is dependent upon the adapter you have. Please contact your seller for the installation driver and details.
- Once you install, there should be a virtual COM port available on your machine. I have a windows laptop and it shows under “Devices and Printers”.
- Next, insert the SIM card in your GPRS board and power on. These boards generally come with some sort of indicator LEDs that will tell you when the registration is successful. The one I have, has a green LED that blinks at 3 sec period to indicate the board is ready. So again, read the board specification.
- Connect the RS232 cable between the adapter and the board.
- Bring up the terminal.exe. It should show available COM ports. Select the COM port that represents your USB-to-RS232 adapter. Now comes the tricky part. You need to know what is the Baud rate. After many attempts and multiple blog site visits, I found that perhaps (I’m still not sure) 19200 is the default setting for Sim 900. I have been using that and it works like a charm.
In Terminal.exe tool, you have a text box at the bottom. You enter AT commands in that text box. Please ensure, you have the checkbox labeled “+CR” (to the right of the textbox) checked. Every AT command needs to be terminated by \r\n (CR + LF) combination. You enter the command and click the “Send” button. The response is visible in the area above the textbox.
The command sequence
Now comes the interesting part. Given below is a list of AT commands that you must fire in the exact given sequence to connect to a webserver using TCP over GPRS. The symbol => indicates the command you need to enter, <= indicates the response received from the SIM900. Text within /** **/ are my comments for further explanation. The response may contains additional information than what is shown here. I have listed down only the important part of the response that you need to be aware of.
Also, please note, send the commands in uppercase only.
Here is the sequence:
/** First test if everything is okay **/
=> AT
<= AT /** This should come back. SIM900 default is to echo back commands you enter **/
<= OK /** This string should tell you all is well**/
=>AT+CPIN? /**This is to check if SIM is unlocked. This sample assumes unlocked SIMs**/
<= +CPIN: READY /** If your response contains this, then it means SIM is unlocked and ready**/
=>AT+CREG? /**This checks if SIM is registered or not**/
<=+CREG: 0,1 /**This string in the response indicates SIM is registered**/
=>AT+CGATT? /**Check if GPRS is attached or not**/
<=+CGATT: 1 /**A response containing this string indicates GPRS is attached**/
=>AT+CIPSHUT /**Reset the IP session if any**/
<=SHUT OK /**This string in the response represents all IP sessions shutdown.**/
=>AT+CIPSTATUS /**Check if the IP stack is initialized**/
<=STATE: IP INITIAL /**This string in the response indicates IP stack is initialized**/
=>AT+CIPMUX=0 /**To keep things simple, I’m setting up a single connection mode**/
<=OK /**This string indicates single connection mode set successfully at SIM 900**/
=>AT+CSTT= “APN”, “UNAME”, “PWD” /**Start the task, based on the SIM card you are using, you need to know the APN, username and password for your service provider**/
<= OK /**This response indicates task started successfully**/
=> AT+CIICR /**Now bring up the wireless. Please note, the response to this might take some time**/
<=OK /**This text in response string indicates wireless is up**/
=>AT+CIFSR /**Get the local IP address. Some people say that this step is not required, but if I do not issue this, it was not working for my case. So I made this mandatory, no harm.**/
<= xxx.xxx.xxx.xxx /**If previous command is successful, you should see an IP address in the response**/
=>AT+CIPSTART= “TCP” , “www.vishnusharma.com”, “80” /**Start the connection, TCP, domain name, port**/
<= CONNECT OK /**This string in the response indicates TCP connection established**/
=>AT+CIPSEND /**Request initiation of data sending (the request)**/
<= > /**The response should be the string “>” to indicate, type your data to send**/
=> xxxxxx /**Just type anything for now**/
=>#026 /**Now type the sequence #026. This tells the terminal.exe to send the hex code 0x1a (which is Ctrl+Z) to indicate end of data sending**/
<= xxxxxxxxxx /**You should get some response back from the server…it would generally be a complain that the request string was not valid…but that is a different subject…you have established the connection**/
/**To close the connection**/
=>AT+CIPSHUT /**Request shutting down of the current connections**/
<=SHUT OK /**Indicates shutdown successful**/
Troubleshooting
You can get many errors during this exercise and I cannot possibly think of all of them. A few key ones are given below:
- You get junk characters – It can either be due to baud rate mismatch or because of lose connections. Initially, I used hookup wires to connect the two DB9 connectors but I got junk. I replaced the wires with a DB9 cable and the problem was gone.
- You get an error when you issue the command – Either your command sequence is wrong, or you have entered an invalid command. Sometimes, you need to power cycle your SIM900 board and start again.
We can provide the same SIM900 modem at half price. Please do visit us at http://hacktronics.co.in
hello sir . can you please tell me how to upload any data on my drop box account using sim900 and atmega16.
I looked at dropbox API briefly. I’m afraid, this is too complicated a task using an ATMega16. Dropbox needs HTTPS, therefore, your first task is to find out an HTTPS (SSL) implementation for ATMega16. AT first, you might want to check PolarSSL and see if they support what you need. Once you have SSL support, you can then go on to use HTTPS. But a tough one indeed. Good Luck 🙂
Hello Sir, I I have to send data to a server. But I am not getting how to make a server on my computer or where I am sending data, how to collect it on a server. Can you provide me some tutorial link or some help. Thanks in advance.
You need to first create a basic website, using either ASP.NET, PHP or Java. Whatever is your choice of programming language. Let me explain this using ASP.NET.
Create a simple page in ASP.NET called sim900.aspx. You can host this page in an IIS website. Let’s assume that the IIS website is hosted on 10.10.10.10 IP address. Therefore, the URL you need to call would be http://10.10.10.10/sim900.aspx
To start simple, you can pass values in the URL. For example, if your sensor is measuring temperature, you can pass the value as http://10.10.10.10/sim900.aspx?temp=35.45
In the ASPX page, you can write code to read the querystring parameter “temp”. How to do this is available at http://www.webpronews.com/aspnet-working-with-query-strings-2007-01
Remember, you need to issue a GET request from SIM 900 for this to work.
Once you succeed in this, you should ideally try to move to POST request.
Hope this helps.
Sir,
I didn’t understand
“Remember, you need to issue a GET request from SIM 900 for this to work.
Once you succeed in this, you should ideally try to move to POST request.”
GET is to check the reply from Server. Why is it important for transmitting data. Can you please explain. Thanks.
In order to work with a web server, you need to issue a request to it. There are various types of requests, like GET, PUT, POST etc. When you issue a request, you must specify what is the request type. A GET request type is the simplest. Thus start with the GET request type. The syntax for GET request will be available online, but basically, you need to type something like GET / HTTP/1.1 to tell the server that the request type is GET.
Hello sir. In what format should I send GET data from SIM900A (AT commands),so that a php file on server end can insert it into a database.
You can decide what is your format. If you know PHP, then you can extract and parse the data. But generally, I woulud suggest JSON, if possible, else plain/text.
Dear Vishnu Sharma,
how the data post in mysql server using rest api using HTTP AT Commands and how to send variable data in Particular httppara URL can you tell me exact syntax for that
see http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands
1.What happens when we give the time(time.sleep(0.5)) delay in one AT-command to another AT-Command
2.Is that really required from each other can you explain clearly
3.I was tested without time delay(time.sleep) to start to end but unable communicate errors will accured
4.Can u send GET method AT-commands for Ardunio code
Ans 1: For me, a small time delay between two AT commands was working. If I issued AT commands without time delay, they would randomly fail.
Ans 2: Time delay is not really required (theoritically) for all cases. There are exceptions like when you ask to attach GPRS you must wait for the module to complete the time-taking task. Giving a time delay before issuing the next AT command really depends on the type of AT command you have issued
Ans 3: As I said in Ans 1, I too was getting errors if I did not give time delay. Perhaps, that is how the module works. It needs some time to execute the command.
Ans 4: For an Arduino sample, see http://www.ayomaonline.com/programming/quickstart-sim800-sim800l-with-arduino/
Hi Vishnu,
I am trying to transfer data to HTTPS webpage using SIM900, but HTTPS AT commands returns error. On contacting simcom they told a new firmware build supporting HTTPS, SSL stack is required, but didn’t get any further information from them.
Have you tried HTTPS data transfer, could you please help me proceed further.
Regards,
Ben
Hi Ben,
I have not tried HTTPS. However, I found a document about Sim900 HTTPS commands on the net at the link http://mt-system.ru/sites/default/files/sim900_https_at_command_set_v1_00.pdf
This document states that Sim900, Sim900A, Sim900B and Sim900D models have HTTPS support.
Look at page # 6 for a HTTPS GET command example. Hope this helps
Hi Vishnu,
the default Baud rate for SIM900 is “auto-baunding”, according to the SIM900_AT_Commands Manual V1.06 page 43 (AT+IPR=0).
Nice application you have presented.
Best Regards
Kostas
I am using th following sequence of commands on the hyper-terminal and I’m receiving data at the terminal. But when I create a dial up connection using this modem I get error 692. It would be kind of you to explain it to me…
AT+CGATT=1
AT+CGDCONT=1,”IP”,”BSNLNET”
AT+CSTT=”bsnlnet”,””,””
AT+CIICR
AT+CIFSR
AT+CIPSTATUS
AT+CIPHEAD=1
AT+CIPSTART=”TCP”,”www.google.com”,”80”
AT+CIPSEND
>GET http://www.google.com/preferences?hl=en HTTP/1.1(ctrl+m)(ctrl+j)(ctrl+m)(ctrl+j)(ctrl+z)
Data comes here
A quick check on the net reveals that error 692 means hardware failure/error. See http://support.microsoft.com/kb/314846 for additional troubleshooting help.
If the modem is able to start a TCP/IP connection, then may be, that part works, but the dial up part is bad.
I changed the serial adapter and and tried to do the same… But i get the same error… Data comes at the hyper-terminal but dial up fails. Have you tried making a dial-up? If so could you please tell me settings that you used for the dial-up?
I apologize. I have not tried a dial-up connection. I have only used the GPRS as that was my requirement
hello sir ,
i wants to upload some data on a ftp server coming from rs485 using sim900. please help me regarding this.
I have not done FTP, but this should also be similar. You should read the document at http://www.reyax.com/Module/GSM/SIM900D/AN_SIM900_FTP_HTTP_AT_COMMANDS_USER_GUIDE_beta_V1.00.pdf It provides information on how to do FTP using SIM900 and what are the commands. You may want to check if your chip is supported in this document.
thanks sir.
if i wants to send data on any client server and i am having ip and port address of that server then how to send data on that server in tcp format.
Your question is not very clear. If you want to read webpages using TCP/IP (HTTP) then you should read the SIM900 TCP/IP Application note. It is available publicly.
how much data can be send through this
my application wants to send 2000bytes of data does it possible with this
as I was trying but not more than 200 bytes are transmitting
I do not think there is a limit like that. You should be able to send lots of data. The problem may be in internal buffer of Sim900. You may want to read the Sim900 documentation to find out buffer limitations.
Hi Vishu
Can you suggest some solution for this as my data is of 2000 bytes which can not be reduce . Please
Thank you
Let us discuss this over email.
My email ID is Vishnu@vishnusharma.com
Please send details at my email
Hello Vishnu,
I am having trouble trying to get HTTP POST method to work. The recorded log is below. This has been bothering me for days. Please let me know as to where i am making the error.
Thanks,
Vinay
at+sapbr=3,1,”Contype”,”GPRS”
OK
at+sapbr=3,1,”APN”,”CMNET”
OK
at+sapbr=1,1
ERROR
at+sapbr=0,1
OK
at+sapbr=1,1
OK
at+httpssl=0
OK
at+httpinit
OK
at+httppara=”CID”,1
OK
at+httppara=”url”,”http://www.dizzylion.in/test/vinaypost.php”
OK
at+httpdata=10,10000
DOWNLOAD
name=vinay
OK
at+httpaction=1
OK
+HTTPACTION:1,406,226
at+httpread
+HTTPREAD:226Not Acceptable!Not Acceptable!
An appropriate representation of the requested resource could not be found on this server.
This error was generated by Mod_Security.OK
Vinay,
I have not tried this level of details yet. I read the V 1.03 of Sim900 module and it looks like your commands for HTTP are incorrect. Please read the HTTP commands from page # 196 of the v 1.03 manual. The response returned contains the HTTP status code 406 (+HTTPACTION = , , )
Status code 406 means not acceptable. This can happen for multiple reasons (including invalid params and data length). Your param part does not look correct. Please revisit that part.
Hello!
I´m trying to send a https GET request but I don´t find the way. Any one know how to do this after a https connect??
Thanks for all
I have not tried HTTPS, but there is a separate manual titled SIM900 HTTPS AT Command Set. That contains all the details of working with HTTPS. Based on the document, I can say that SSL 3.0 and TLS 1.0 are supported (SSL client only support)
Take a look at the tutorial at http://www.cooking-hacks.com/documentation/tutorials/arduino-gprs-gsm-quadband-sim900 Simply use the HTTPS commands for initialization and setup from the manual. Other steps should be same.
Hi,
I was being told by someone that the module has size limit. And I have to split data into pieces before sending them to remote server via gprs, then assemble it back on the server side.
However, I have searched through the SIM900 manual and the only thing I found is this:
“Flow control is very important for correct communication between the GSM engine and DTE. For in the case such as a data or fax call, the sending device is transferring data faster than the receiving side is ready to accept. When the receiving buffer reaches its capacity, the receiving device should be capable to cause the sending device to pause until it catches up.”
I am not quite sure if the above is anything related to my question..
What’s your thoughts?
James,
You are mixing multiple things. I know for sure that SIM900 has a buffer size, but I cannot find what is that size. Given the fact that you will control Sim900 via some other device (an Arduino, PC etc.), you may also be limited by the controlling device buffer size(for example, Arduino buffer is 64 bytes if I’m not wrong). Thus, the right way to look at it is as follows:
1. What is the buffer size of my microcontroller. That buffer must be less than or equal to Sim900. A 64 byte buffer is safe to use.
2. Once I send data to the Sim900 module, how long should I wait before sending next set of data to allow Sim900 to process it.
3. Should I use RTS/CTS pins for flow control.
My best bet at answering these questions are:
1. The buffer size is indeed important. But I have not found Sim900 buffer size information. When I use Arduino, I use 64 bytes and when I use Netduino, I have used up to 128 bytes. Both have worked.
2. I generally use the send, wait, send method as this keeps my program simple. When you are using AT command set, you know when the send has ended (as the control will return only after that). Post that, I wait for a few seconds (about 2-5) and then send again. Not the best strategy, but it works in my case.
3. RTS/CTS is something I do not use as this complicates the H/W design and programming. In some cases, you may not even get these pins (e.g. US to RS 232 TTL converters)
Hope this clarifies
Thanks for your explanation.
If I understand correctly, I can send the stream of data (image in my case) within the buffer limit to sim900 module with delay in between.
Should I worry about data assembling on the server side? Or the TCP/IP protocol will take care that part?
Since you are splitting the data in the application layer, you need to have a way to re-assemble the data on the server side. You need to know that the data that arrived on the server side is partial and there is more to come. You also need to know when you receive the last chunk after which, you can assemble all the bytes and save the image in a repository. This, you have to take care on the server side.
Hi Friends,
I am using this sim900A module and trying to interface directly with Arduino Uno with by connecting GSM_TX –>Rx of arduino and GSM_RX –> TX of arduino.but when i send AT commands from Hyperterminal it works fine and while sending commands from Arduino microcontroller via Code i am not getting reply from GSM Sim900A module.
Does i need external MAX232 circuit to interface with Arduino board ?
What is the voltage level of onboard DB9 of sim900A?
Please check the shield/breakout board datasheet. If it has a DB9 connector, then most probably it needs a level converter. Check the datasheet of the board. Arduinos are 5V compatible and some shield work on 3.3 or can tolerate 5V (not all, check the datasheet again).
is the post number is same for all gsm module..
or where should we get this port number,,,…
pls help me out…?
Raji,
The question is not very clear. If you are referring to the port number 80, then here is the answer…The port number has got nothing to do with the GSM module. It is the port number on which the web server is listening. By default, any HTTP website is hosted on port number 80. Similarly, any HTTPS website is hosted on port 443. If your administrator has hosted the website on a different port, then check with your administrator (sometimes, they are hosted on port 8080. Not very common for public sites though.)
Hi can you provide me with the sim900 firmware that supports https. It’s not available on sim900 site.
Sorry I do not have Sim900 firmware. The only way to do this is to get from Simcom. Another alternative is to select a different model. I know that Sim5360 is one such model that supports SSL. Check with Simcom directly or from resellers about this model.
sir , i am using sim 900 . i have already sent some data to a sever from it by using tcpip connection.now i want to send the data repeatedly to that remote server . So please tell me which AT commands are required to repeat to send the data again and again to that server from gsm module by using tcpip connection
Naresh,
I’m not aware of any Sim900 command that can repeat the last command. Also, I’m not sure why you want to do this (as this could be considered spam).
You should have a loop in your code to repeatedly call the Sim900 functions to send data
Hi Vishnu,
Can please help me out using the same concept in TI Tiva C series tm4c1294ncpdt please…
Regards,
Austin
Austin,
I do not have access to a TM4C1294NCPDT. I did look at the datasheet of this IC. Given that you control Sim900 over a UART, all you need in your controller is a UART port. The datasheet of this IC states that this has 8 UARTs. So this should not be a problem. You should simply use the UART of the TI chip and issue the commands in the sequence outlined in this blog.
Hello Sir ,
can you please help me out regarding apn setting .
I am working on a project , on which I have to change APN of my device according to service provider without using any external hardware , So please can you mail me some AT commands (flow) by which I can get the APN of any sim card.
Thanks & Regards
Gaurav Saraswat
Gaurav,
You can create various profiles and specify one profile during connection. What I have not understood is how you want to change the APN without external H/W? Your question is not clear.
Hi Austin..
Did you get the code for Tiva-C series TM4C1294NCPDT? If yes, please help me out.
Dear Sir,
Can you help me with the time taken from start of the modem to sending 20 bytes data to shutdown of the module. What to do if the module is hanged. Please tell best case execution time and worst case execution time. regards
If I assume start means starting with power on then configuration and then finally send data, then it could be about 2 to 3 mins. Of this, 90% would be initialization (as my experience shows you need to give about 2 secs delay during initialization between each init sequence command).
If the module hangs, you may try soft reset. In my case, soft reset was not working, so I (bad solution but works everytime) put a relay form which the Sim900 module was being powered. If the module hangs, I simply switch the relay to power off the module and then power it on again (a hard reset)
Sir, i am using Sim900A for GET / HTTP1.1 request and sending a sensor data; when i sent the sequence of AT commands using Terminal the response was “SEND OK HTTP/1.1 200 OK “and data was send properly, but when i am using same with arduino uno i get “SEND OK HTTP/1.1 404 Not Found”.Please help !!!
Sent detailed response to your mail. Check that.
Sir, thanks for the reply …:)
i am facing same problem some times it gives or sometimes its working fine please help me
This is a difficult question to answer. Can you please provide more details.
i use quaktel M95 GSM module
i send one packet via TCP but server gives this type of responce
everything i checked complete URL eventhough i received error
10:41:43.2691702- GRESP: IPD145:HTTP/1.1 404 Not Found
10:41:43.2882190- Content-Length: 31
10:41:43.3092765- Server: Microsoft-HTTPAPI/2.0
10:41:43.3330274- Date: Thu, 24 Aug 2017 05:14:09 GMT
10:41:43.3541497- Sorry, that page does not exist
10:41:43.3701280- GCMD: AT+QICLOSE
When you get HTTP 404 (Not found) response, then it means, primarily, the URL you are calling does not exist. This error indicates that the request from the module is reaching the web server, but the web server is unable to find the resource (pointed to by the URL) on the web server. Please double-check the URL ,request parameters and request method (GET/POST etc.)
Thank you so much for your reply
Yes sir I checked URL many times but sometimes it gives this type of response otherwise it’s working fine ,is there any possibility URL corruption on network?
Because parallely I use other devices with same URL and it’s working fine.
it gives this response two days continuously
This is a difficult one. My best guess is that there is some data corruption that happens during transmission. You can either try to re-transmit or create a smaller size payload.
sir i am able to send a data to MQTT server using TCP connection with the help of AT+CIPSEND but i don’t know how to receive data back from the server for that wheather we should need use another command for receiving purpose please let me know sir.
Thank You in advance
In this case, you can receive data only as a response to a request. This blog gives example of a client and not a server. When you send a request using CIPSEND, if your service is configured to respond back, the same command will return response. See https://arduino.stackexchange.com/questions/32567/get-data-from-website-with-esp8266-using-at-commands for an example
Hi vishnu,
thank u for your valuable post.
i have two doubts here.
1.why should we use #026 at the end of the data , instead can we send direct hex code ?? can u please inform me, whats that exactly means?
2.if we try to send AT+CIICR command SIM900A module ,its respond with error: +PDP Deact, why?
Answer 1 : You need to send the hex code 0x26 to instruct Sim900 that data has ended. To send hex using Terminal program, you need to use the syntax #026
Answer 2 : Difficult question. There could be many reasons, but to start with, use a local sim that has good reception. Sometimes I have seen this with roamin SIM.
Thank u vishnu,
AT+CIPMUX={0 for single mode , 1 for multimode connection}, here i bit confused, 1.whats that means?
2.i am not getting how data transfer occurs in both cases?
3. How it works exactly?
thanks
Hello,
Did you fix this PDP problem?
Nope. Changing SIM and moving to an area with better reception worked so never tried anything else.
4. And how many multiple connections can be done by using SIM900?
I’m afraid, I have always used single connetion. You need to read the datasheet for this information on how multiple connections work.
RAVI:
Hello sir,
i am using sim900 gsm and i can usig UDP protocol, i sent data but i can,t view that data sir so what i do, please help me because now going BE final year project sir
You should try the commands on the program Terminal.exe
Any response back is written back on the screen and you should be able to view
i am using sim900 gsm and i can usig UDP protocol, i sent data but i can’t view that data sir so what i do, please help me because now going BE final year project sir
AT
OK
AT+CPIN?
+CPIN: READY
OK
AT+CSQ
+CSQ: 31,0
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGATT?
+CGATT: 1
OK
AT+CIPSHUT
SHUT OK
AT+CIPSTATUS
ERROR
AT+CIPSTATUS
OK
STATE: IP INITIAL
AT+CIPMUX=0
OK
AT+CSTT=”APN”,”b33_15774390″,”9819936969″
OK
AT+CIIR
ERROR
AT+CIICR
OK
AT+CIFSR
10.109.41.32
AT+CIPSTART=”UDP”,sql305.byethost33.com”,”80″
ERROR
AT+CIPSTART=”UDP”,”sql305.byethost33.com”,”80″
OK
CONNECT OK
at
OK
at+CIPSEND
> SIM900 UDP TEST
SEND OK
You are using UDP but port is 80. While this is not wrong, but mostly, 80 is used for HTTP. Please check your connection parameters.
above the comment i used sir
above the comment i used sir, but server can’t reply the acknowledgement.
–> =>AT+CIPSTART= “TCP” , “www.vishnusharma.com”, “80” /**Start the connection, TCP, domain name, port**/
Can I use raw TCP socket and port other than standard HTTP, 80?
If it is HTTP request (GET/POST) then it will send unnecessary HTTP headers. Will it not be redundant where GPRS data charges are high?
I’m confused between choosing raw TCP socket or HTTP.
Please help.
I have used UDP packets successfully. You should be able to do raw TCP. It’s upto you to decide what is your requirement.
You decide what is the trade-off you want to take. If operational costs (e.g. GPRS data plan cost) is important to you, then use raw TCP.
If simplicity is important to you then use HTTP…etc.
Hello,iam using airtel sim,i’ve trying to connect the modem to n/w witjh the command at+cstt=”airtelgprs.com,””,”””but it is showing error,any solution pls..
The APN seems to be correct. Are you issuing the commands in the right sequence?
Thanks for the reply, yeah im done with that command it works fine, but i need to send data to a webpage any suggestions…
Hi,
Please tell me which commands you followed. I am facing same problem.
Sir, I am having trouble making a server for this. I have installed IIS as you stated in a comment above. Now I am creating a website to put on this server on ASP.NET. Now, I am stuck on how to put code in the server that can handle UDP packets.
Secondly, your code is for TCP, can you tell what changed do I have to do for UDP. I am using SIM900D with Arduino Mega 2560. Thanks in advance.
If you want UDP packets, you need to create a UDP server. For that, you do not need IIS. I’m not sure which comment you picked up. But for UDP, you can create a UDP listener on a port and accept packets. There are numerous examples on the internet to use UDP listeners.
Thanks for your kind reply. It is the third comment from the top, by divyansh. Okay, I didn’t know that we don’t need IIS for this, actually I am a beginner and working on my final year project that is why a bit confused. Okay, I am now searching for UDP listner as you said. I will be needing your help on how to send UDP packets from SIM900D, after I create a UDP listener. Regards.
I have realized that using UDP would not be suitable because I cannot take riskt to reverse the sequence of data as I am building a tracker application. So I am now focussing on TCP. I am searching for TCP listener on internet and trying to create a TCP listner and then send TCP data to it from my SIM900D.
If you want to work with TCP, then use IIS and create an HTTP endpoint. It is much easier
Thanks. What is HTTP endpoint? How can I create it with IIS? I have installed IIS but I don’t know what to do further. Can you guide a little?
Well, unfortunately, the answer to this question will not fit this little reply box 🙂
My suggestion is that you talk to a web developer who can help you on this.
You can get in touch with any web developer (Java, PHP, .NET etc.)
Unfortunately, I am not getting anyone to help, thats why I asked here. If you could give me a link to a tutorial or something, I would be really thankful
Start here http://www.asp.net/get-started
I have searched on internet and manged to send data to my web server using HTTP GET request. But I am facing the problem that, when I turn on my Arduino and GSM module, the data is sent through GET request on the server only the first time. Afterwards, the data is not shown up on the server. I am trying to send the data every 10 seconds, so I initiate HTTP GET request in a loop after every 10 seconds. SIM900 replies with +HTTPACTION:0,200 that means there is no error, then why the data is not received on web server after the first attempt?
Interesting. Have you checked on the sending side how many bytes were transferred (I think you can use AT+CIPSEND)
Also, what do you see on the server logs? Do you see the entry for subsequent GET requests
No, I have figured out that the problem is with the response of the GET request. When I use AT+HTTPREAD (just to check), the code hangs there and reading the response never ends and it stays in the while loop that is reading the response, and thats why I am unable to initiate second GET request. I am wondering whether the problem is from the server side? Is it sending the correct response after receiving a GET request? How to check that?
As per the documentation, you need to issue a write command AT+HTTPREAD=
The response is +HTTPREAD:
You can issue an HTTPREAD only when AT+HTTPACTION=0 or AT+HTTPDATA is executed.
For a get, you do not need to issue an HTTPREAD. Simply CIPSEND response will give you the results.
I am using AT+HTTPACTION=0 to send the get request, thats why I am using AT+HTTPREAD. Can I use AT+CIPSEND after AT+HTTPACTION=0?
If you are only doing a HTTP GET, maybe, first try with CIPSEND and see what you are getting
Hey, I got successful with AT+CIPSEND. my issue is resolved. Now, the problem is, TCP connection is automatically closed, I don’t know how. I have written the code for TCP connection in the setup function, so that it should establish connection in the start, then in the loop function, I have used CIPSEND. But CIPSEND failes after sending two or three times, that means TCP connection was closed. How to keep a check that if a connection is there or not? any AT COMMAND for that? Thanks in advance
Is port 80 the default port for TCP? I have made a free php server on 000webhost.com and I have my php file there. I have assigned port 80 in code, but I only receive data sometimes. The same code works and if I check it again after sometime, it doesn’t work. I mean, it is successful from the device but not always received on the server. Can it be a port issue? or something else?
HTTP works on TCP. The default port provided to HTTP is 80. If it works for you at port 80, then it is not a port issue, but something else.
Data is always sent from here but not always received. I was running the code yesterday and it was going, but today it is not going. I am very upset in diagnosing the issue. Can you help me if I send you the code? Thanks in advance
OK. Send me the code
Hi,
Im trying to send an email through SIM900 gsm modem using AT+EMAILCID=1
comands but it gives error..any solution
Apologize. I have never tried sending email from the module. You need to check the data sheet for that
Hi frnds, Im trying to send a data to website using HTTP Post but it shows error type 500 .. please help me
If you are getting “500 Internal Server Error”, then it means the error is on the server side. Please fix the server side.
I learned much from this forum… got a pretty uncommon data task to prove, and should be quite an unorthodox method to enhance mission scope via GPRS data call, as opposed to the status quo of point-to-point telemetry radio links, and their inherent limitations of range and propagation.
I won’t bug you now, as Im hacking with what ive learned here 1st…better for my development you know…But want to thank you in advance in the event I have a query for something. I will keep any such requests light, and carry my burdens stubbornly, as it will make me stronger.
Thank you for the unexpected perspective in my quest, as I just grazed this place in a cluster search for something else….It really had a huge effect on where and how Im taking the solution!
Hi Vishnu,GPRS connectivity works perfectly. I am able to send data from SIM900A modem to computer. But the issue is if I keep the SIM900A and PC ON for 1 day and next day I come, I will not be able to send data from SIM900A modem to PC. For this to happen, I need to physically switch OFF and ON the SIM900A modem. I want this should work perfectly without a power cycle. Please let me know, how to achieve this? Your quick help will be highly appreciated. Regards, Kishore
Some boards come with a “RESET” pin. Rather than doing a full power cycle, you can simply pull the reset pin low for a few seconds, and then switch it back again. Only as a last resort, you will need to do a power cycle. To automate that, I power the Sim900 via a relay. To power cycle I simply switch on the relay from my microcontroller. That will energize the relay and cut-off power supply. Then after few seconds, the microcontroller de-energizes the relay
A board with reset pin can be found here http://www.rhydolabz.com/index.php?main_page=product_info&products_id=1080
Thanks. Is there any AT command to reset SIM900A?
hello sir,
I used your explantions to open a connection with GPRS, it works well. thanks
But now I need to send data (like small picture) which can have 0x1A somewhere as value.
But the “AT+CIPSEND” command will stop to read/send the bytes after this 0x1A …
How can I solve that ?
Thanks for your help
You can either do an HTTP post (which is the right thing to do if I understand your requirement) or you can first convert the image bytes into a Base64 array and then send it across.
Hi Vishnu,
thanks for the information. am very new to gsm/gprs and need your help in this.
I need to communicate between two gprs modems. how can I establish a link between them for data exchange. please help.
Well, the solution depends on many things. Without know what you are trying to do, I can only make a guess.
You can either simply send SMS from one module to another or you can make one module as HTTP server and another module as HTTP client.
Dear Vishnu, I have same question. What I want to do this to control radio control toy over GPRS. I need to generate different PWM signal at toy, by sending command from control side. SMS will be very slow and not reliable. Can we setup direct connection between 2 GSM/GPRS module? Or can HTTP server/client thing work?
Toy control over GPRS is not a good design I guess. You should look for alternatives
Thanks Vishnu, However, I would like to figure how can I send command over HTTP server/client connections. By the way, is there anyway to setup like VPN between 2 connections and control like in LAN environment?
Thanks in advance. 🙂
I have no idea what you are asking. Can you please clarify
Myself R.lakshmikanth,. i much interested to the knowing the concept of gprs. I try to store the data from temperature and humidity which is interface to controller 8051 by using GPRS modem. I follow the steps as you mention in site .I got error at command AT+CIPSEND . if i enter the command then i did’nt get response from terminal . I did’nt understand what to do. can you please guide me. if i spell any wrong don’t mind. Hope am waiting for reply.
thanks in advance
AT+CIPSEND should give you back > If you are not getting it, then perhaps there is something else wrong in the initialization or you are not reading it right. Very difficult to pinpoint without doing it myself though
Hi Vishnu..Thanks a lot for this blog. I would like to know about AT+CIPRXGET. With above reference, I could send data on server. Now I want to receive data through TCP. Can you please suggest me related to this matter?
To receive data, you need to setup a server at the SIM 900 side. Then you need a client application that can perform a GET/POST on the server
Hi, when you say “setup a server”, do you mean use “AT+CIPSERVER” AT Command ? Thank you in advance
When I say “setup a server”, I do mean using the “AT+CIPSERVER” command. Your device, that is using the Sim900 should be listening on a port (generally 80) and should have opened a TCP listener. Look at http://bit.ly/1HF2ozw for a slightly related topic.
after sending http header using “AT+CIPSEND” command, I am not able to receive anything through GSM/GPRS modem. why? server must response something to this.
can you please help me with this?
I’m not sure if I understood the question correctly. But once you do CIPSEND, you should wait for sometime to get the > prompt. Only after that, you can send / receive data
How can we know whether GSM modem have GPRS settings ? Is their any specific AT commands to recognize the GPRS data.
You can use the command AT+CGATT and check the response
Can we send a string to server without using any application protocol like http?
Yes you can. HTTP is an application protocol that runs over TCP. You can write your own TCP/UDP based listener (server) and then, your client can send any byte array to the server.
Thankyou.
Can we connect to a local IP?
The IP address that you get from your data provider, is a public IP. From that, you cannot connect to local IP. Those are completely two different networks.
I tried to send strings to a socket server program (sockettest 3.0) from the gprs module but when enter the command AT+CIPSTART=”TCP”,”my public IP”,”port number for server”. it shows connection fail, all the previous commands get executed without any error and my module gets a Ip address by AT+CIFSR.
Is their a problem from the module side or server side?
This is a difficult question to answer. There are too many things that could go wrong. For starters, assuming all the previous steps really succeed (you should recheck), check if the IP address and port are reachable.
While configuring sim900 as server using AT+CIPSERVER=1,”port” command,how server (sim 900) knows if client cannot establish the connection to server and should restart the module?
The server cannot know that the client is not able to connect. For server restart, you should have an independent restart logic.
Hi, could you please tell me how can use gprs module with websockets + Arduino. if there is any solution for this please share with us. thank you.
Arduino is based on 8-bit controller. If I understand you right, you want to open a websocket on arduino and connect with a remote server. If that is the case, what you are trying to do is a little too much for Arduino. I’m not sure if you can do this easily. If you are still interested, I found a link about Arduino and WebSocket – http://www.openchapters.com/chapter_4.html (I have not read this to see applicability to your case. Just a simple web search)
Hi I am also searching for the same if u get any help then please post here
Hello Mr Vishnu Sharma,
I read all your posts and replies. I am very proud of you and the way you reply to different peoples. If every one on the web was simple and humble as you are, I am sure this whole would have moved us to another dimension of the love of one another. Keep on with good work!! I pray that GOD bless you more in your live. Honestly I have not try or tested your code yet but will test it latter. Have a fantastic day and stayed blessed.
Alain St Etienne
Thanks
hello sir , I want to access the google maps using sim900 and arduino , how its possible guide me in this ?
To access google maps, you need to use HTTPS and call the web services (e.g. https://www.googleapis.com/geolocation/v1/geolocate?key=API_KEY )
This is very difficult, but possible. You should read about the HTTPS support for Sim900
Hi Mr. Vishnu,
Your blog post was very informative. My application requires a full duplex connection at all times, I managed to get my SIM900 to transmit data to my server via TCP/IP, however I ran into problems when i tried to transmit data from server to SIM900 as the sim card i used has a dynamic ip, is there a way around this. It would be really helpful.
Thanks Again
Your Sim900 will get assigned a dynamic IP address everytime it connects. You can get a static IP address but that is a very involved process.
The way around this is to try out the following options:
1. Respond back only when the client sends a request
2. If you want your server to call the client, then do the following:
a. Everytime client establishes a internet connection, send the client IP address to the server
b. Use the IP address available at the server side to send messages to the client.
The option #2 can be either custom built, or you can check with a service like duckdns.org
Hi,
I am also looking for similar application. If I Use HTTP in place of TCP/IP., is that works for full duplex communication?
I’m afraid your understanding is not correct. HTTP is an application level protocol that uses TCP/IP underneath. Therefore, when you use HTTP, you are actually using TCP/IP. If you want to fully understand the stack, look at the OSI Layers. It will give you a great understanding of networking stacks.
Thank you. I understood the OSI layers. I will use HTTP commands to send the data from the device to server. How can I send the commands from server to the remote device? I have studied your earlier postings, I Can not use static IP. If I use public IP or private APN SIM cards, getting IP address from the device is difficult task. Can you suggest the some technique to have continuous duplex communication between device and server.
OK. On the next question on how to send data to the device from the server – This is a complex topic and there are numerous ways of doing it. The easiest way is as follows:
1. The device queries the server for next commands periodically (let’s say every 15 mins)
2. The server responds with the new settings/command in the response.
You should start with the above scheme. Getting a static IP is way too complex in India.
Hi vishnu,
Thanks for your details about the SIM 900 modem ,i have one doubt..
How to send a get command from SIM900 modem?
i’ve followed the sequence as follows but it does’nt yield any results
AT
OK
AT+CIPSHUT
SHUT OK
AT+CIPMUX=0
OK
AT+CSTT=”airtelgprs.com”,””,””
OK
AT+CIICR
OK
AT+CIFSR
100.71.189.141
AT+CIPSTART=”TCP”,”api.thingspeak.com”,”80″
OK
AT+CIPSEND
ERROR
CONNECT OK
GET https://api.thingspeak.com/channels/20468/fields/1/last
CLOSED
After the connect ok it does not gives any info about it has sent the command or not
please suggest some tonic for this…
Thanks..
There is clearly an ERROR response that I can see after AT+CIPSEND . Have you checked if all parameters are correct. Also, you are issuing HTTPS command and not an HTTP command. You need to read the Sim900 document on how to work with HTTPS as that requires TLS support along with certificate exchanges.
Thanks for your valuable idea…
it works great…
Hi,
what can i do if i don’t want to receive new sms message notifications when im reading the serial port???
I am not sure if I understood your question right. Still, for Sim900, have you checked the command AT+CNMI
Hi Vishnu, maybe you can help me.
I’m trying to use SIM900 as a server. After the AT+CIPSERVER=1,80 command, the module returns STATE: SERVER LISTENING. The local IP is in 10.xxx range.
Previously I’ve got the module Internet IP using NO-IP.COM and it is in the 191.xxx range.
Trying to connect to the 191.xxx IP from my computer always result in TIMEOUT.
SIM900 continues to show STATE: SERVER LISTENING.
Tryed other port numbers but the result is the same.
Is there something I can do to make this work?
Thanks for your help!
Mark,
I also struggled to get the AT+CIPSERVER command working for us on the Sim900 module. I could get to “SERVER LISTENING” (both single, as well as multiple connection mode). Using the AT+CIFSR command, I was able to check that the module was getting a public IP. However, I could never connect to it 😦
After a lot of search, I remember reading a forum, where some field testing engineers stated that the firmware had an issue. If I can recollect it right (about 2 yrs ago), the firmware version was “B10” (I’m not sure though).
One way to test this, could be to use another module and see if AT+CIPSERVER works (as I know that module supports this command). It it does, then your Sim900 is bad. (Worst possible case, you can try out ESP8266, if it is for learning)
Thanks for your prompt answer.
Today I updated the SIM900 firmware to “B13” version, the last I could find.
Unfortunately, it didn’t change anything. Maybe the cell operator is blocking inbound connections. Next test will be with different Simcards.
Thanks again!
Mark,
I think your guess is right. The cell operator might be clocking such inbound connections. If you are able to get this working, I would love to hear from you (that will help me add to my learning)
-Thanks
Got it working, finally!
Tried using simcards from other operators and found one that works. That one shows me an external IP address, the same reported by NO-IP service.
So the conclusion is: it depends on the operator’s simcard permissions.
If the AT+CIFSR command gives you a local IP address, chances are that inbound connections will be blocked.
Thanks.
Fantastic. This finally resolves a long-standing question. Thank you for the update.
hi ,
using SIM800 and facing same issue. i am using SIM card with Public static IP . always getting CISFR response with static Public IP only.
I’m not sure if I understood your question. Do you mean to say, that you have a SIM card that is enabled for static public IP? If yes, then CIFSR will always give you the same value. Alternatively, if you meant that you are trying to connect to a public static IP (the remote IP) and then AT+CIFSR is still giving you the same value for IP, then this is fine. Sometimes, the cell tower will not recycle the IP address assigned to your SIM card very quickly.
Hello!
I am using SIM900A module. I have finished working of SMS send/receive, TCP communication for bidirectional way (Client/receive) and UDP for sending data from client to server. I am getting error while doing UDP as a server. Can anyone suggest me steps for running UDP as server?
Thanks in advance!
The problem with server is that you need an IP address where incoming data is allowed. I know that a large number of data service providers do not allow that. Recently, when I had to do this, the network provider asked for a separate connection where incoming (or server mode) is allowed.
If I understand your context right, you have not tried running a TCP server (e.g. HTTP web server on port 80). Can you please confirm if my understanding is correct.
Hello Vishnu,
Thanks for a reply.
Actually I have successfully run TCP server. In fact, I have successfully done TCP Client/server module. But the only problem is that of UDP server. I have also followed steps mentioned on your blog by Mr Mark Jordan but the same issue.
Thanks in advance!
I see the same here. Only TCP connections pass to the SIM900 server. UDP seems to be blocked somewhere.
OK. Then perhaps you can first check if your service provider is blocking incoming connections before you try to debug. Good luck on this.
Hi Vishnu,
Thanks for the article, I am using sim900a gprs to send and get data from server, I am able to send and get data from server properly.
But when I am reading HTTP response from server using AT+HTTPREAD, it is able to read upto 20min after that my controller is hanging.
Can you suggest any solutions for this.
i am using this below commands
AT+CSQ
OK
AT+CGATT?
OK
AT+CIPMUX
OK
AT+SAPBR=3,1,”CONTYPE”,”GPRS”
OK
AT+SAPBR=3,1,”APN”,”CMNET”
OK
AT+SAPBR=1,1
OK
AT+HTTPINIT
OK
AT+HTTPPARA=”URL”,”myurl.com/?Data=Gb00001111″
OK
AT+HTTPACTION=0
OK
AT+HTTPREAD
OK
I’m not sure I understand the term “reading for 20 mins”. If you are reading the response “stream”, then perhaps, it is getting timed out. Ideally, you should read in chunks. Make many calls, and exchange small data
Hi Vishnu,
My response from server is just 12char (Gb00000000ET).
thanks for the response.
hi vishnu, i m using MOXA oncell G2110,
i have executed AT+CGDCONT=1,”IP”,”rcomnet” command with OK
but m getting error for this command AT+CIPSHUT which is shutting the previous ip which have been establised..
AT+CIPSHUT is designed to shutdown the current IP session (if any). The command is doing exactly what it is supposed to do. Check your command sequence. You should reconnect after shutdown (cleanup)
podrias ayudarme a crear una websocket?, no tengo ni la menor idea de como hacerlo
Sorry, can you please write the question in English. I do not recognize the language used
I want to receive weather data in one glance. but I manage to set it up. and I have the hots and domain. you can help?
To receive weather data, you need to have subscription for something called a “Weather API”. You need to make HTTP (or HTTPS) calls to the Weather API to get the weather data. One such weather data provider is http://openweathermap.org/api
Thanks, but my problem is not getting the data.
I want is an example of a web service (server) where to send the data periodically. and a client example.
prefiblemente php, data is in plain text, about 10 strings each.
Apologize, I think you are looking for a full working solution complete with client and server. For that, I guess you need to search the web or pay someone to do it for you 🙂
how to check status of data connection in gprs.
The question is not very clear. You should be able to issue the AT+CIPSTATUS command. It will return the current connection status.
Hi Vishnu, about this data connection status, I think SIM900 has a firmware bug. Several times a TCP connection stops passing data without notice, both on server side and client side. The SIM900 in client mode reports (CIPSTATUS) CONNECTED but doesn’t receive any data sent by the server. The server also reports connected. SIM900 can be stuck in this state for hours. If I tell SIM900 to close the TCP connection and connect again, it resumes receiving data. It seems there is some inactivity timeout somewhere that breaks the link but doesn’t disconnect the TCP link when there is no data flowing for some time. Have you seen this behavior?
I have not seen this behavior specifically on Sim900, but on other connectivity modules, I have indeed experienced this. Everything succeeds but data returned is null. I still do not know the reason clearly, but I also do think it has to do with timeouts and how it is internally managed (along with socket timeouts internally). All my applications take the approach of CONNECT -> SEND -> RECEIVE (if any) -> DISCONNECT in an infinite loop. This works all the time.
how to check the status data connection in gprs command
Use the AT+CIPSTATUS command
hi M. Sharma ,
how i can know “APN” “UNAME” and “PWD” plz ?
APN is dependent on your data provider. For example, in India, if I use a SIM card from the company named “Airtel”, then generally, the APN is airtelgprs.com For the specific provider in your country, please check with the company.
The UNAME and PWD are also provided by your data connection provider. Please call the SIM card company and get the details.
thank you very much
Hey Vishnu, I’m the person who contacted you via Twitter.
I’m working with a Telit GT864 PY module and I’m trying to get it to send POST requests. I’ve been trying to follow your guide, but the module won’t accept the CIPSHUT or the CIPSTATUS commands, it says “Command unrecognized”. Are these steps important in order to get the module to send the requests? Are there other commands that I could use that get me the same results? Help is greatly appreciated.
CIPSHUT ensures that the current IP session (if any) is closed. CIPSTATUS gives you the status of the IP stack. These two together, help you write better and robust code (so that you can take alternative/corrective action if IP stack is not available). I quickly checked the Telit AT command guide (https://www.falcom.de/uploads/media/Telit_AT_Commands_Reference_Guide_r5_02.pdf) and I do not find any mention of these two commands. This explains why they are not being accepted. This also means you need to do the following:
1. Read the Telit AT command guide (Url above) and use appropriate commands
2. Read a blog/page that specifically talks about Telit. A quick google search gave me http://m2msupport.net/m2msupport/at-command-tester-tutorial-for-gsm-gps-playground/ and http://www.janus-rc.com/Documentation/Telit_IP_Easy_User_Guide_r13.pdf.
hello Vishnu
I have some questions:
1 / I read all the reviews but I did not find a complete example to read data via HTTP, plz give us a complete example, and if you can with two method
2 / I want to send data (coordinates of a mobile (from a GPS)) to the PC for display on Google maps, plz can you advise me what is the most effective methodological
Best regards
Follow these steps:
1. Build a simple web server. In that web server, build a page that is designed to accept HTTP “GET” requests. (Ideally it should be POST, but I’m making this simple for you).
2. Assume that the path of the page is http://www.hatem-server.com/gpspage.aspx
3. Now, write the code in the page to accept the GPS longitude and GPS latitude.
4. Call this URL http://www.hatem-server.com/gpspage.aspx?lng=%5BYour Longitude Value]&lat=[Your latitude Value] from your Sim900 based device
5. When this URL is called, the longitude and latitude values will be available to your page named gpspage.aspx
6. Extract the querystring parameters and store them in database for further use.
plz how i can call this URl ?
If you are using Sim900, then look at the AT command manual. You should see commands like AT+HTTPPARA, AT+HTTPDATA and AT+HTTPACTION. These commands can help you
ok thanks 🙂
Hi Vishnu,
I am using Arduino and GSM module. The GSM/ GPRS modem is connected via 12V/ 1A adapter. I uploaded a code for SMS/ Voice call on Arduino. It works fine. But when I try to make a data call, it does not work. Shows up ERROR. Or simply does not connect. I tried via Arduino, Terminal Software (Error connecting port.) and even online AT command tester (Error connecting port). I got a USB-to-RS232 (DB9) connector too. No use. Can you suggest something to get me out of here?
This is a difficult one. There could be many things that can go wrong. A few of them could be:
1. Can the module operate at 1A. I know Sim 900 can take upto 2A. Check voltage/current requirements of the module
2. Does the module support GPRS in the given band
3. Does your data plan support GPRS
4. Does the module firmware need any update
5. Are you issuing the right command set and in the right sequence
Hi Vishnu,
Thanks for the prompt reply. The invaluable advice you gave was all that I was looking for. I have been looking for the answers to the pointers you gave. Here they are:
1. I am not able to get any information about this module. Though I have been doing some hit-and-trials. As shared before, I connected via 12V/1A adapter. It shows ERROR. I changed the adapter to 12V/1.5A. Any AT commands (even simple AT) returns nothing. So, I have concluded that the module does not support >1A. But I don’t have an adapter < 1A. 😦
2. Module's support on GPRS band is as good as SIM900A's support on GPRS band. So, it does support 900/1800 MHz band. (Ref. http://www.simcom.eu/index.php?m=termekek&prime=1&sub=40&id=0000000155)
3. The SIM I am using support GPRS, and the same band. I checked.
4. There have been several updates from the firmware version (Rev. 1137) my module has. Though I am not so sure if they are exactly what is blocking me, but I will still give it a shot. (Will post an update on this.)
5. I am issuing commands in the same sequence as in this tutorial. Though for test purposes, I have done them one by one.
Coming back to 12v/1A, I reduced my code to
1. AT
2. AT+GSV (version inquiry about firmware)
3. AT+CGATT?
for this, I get the response as below:
AT
AT+GSV
AT
OK
AT+GSV
SIMCOM_Ltd
SIMCOM_SIM900A
Revision:1137AT+CGATT?
AT
OK
AT+GSV
SIMCOM_Ltd
SIMCOM_SIM900A
Revision:1137AT
OK
AT+GSV
SIMCOM_Ltd
SIMCOM_SIM900A
Revision:1137
[I have reduced newline here.]
So, apparently, I am not getting any response for "AT+CGATT?". I did further HnT, I am able to find that if I issue single command, it will respond. But not so when I issue 2 commands. I suspect there is something wrong with the serial communication as well. Even though I am flushing the stream after every response, I get the same reply from the modem, again.
The command and response pattern does not seem right. If I understood the response pattern right, I’m not sure why the response is repeated thrice.
You should send one command, then read the response, then the next and so on. Between every command, keep a gap of 2 seconds and see if it works
hi Vishnu
i want to send data with AT+HTTPDATA (sim800) and post, can u give me an exemple for site script php wich can receive data with request GET
I do not know PHP. Here is an example in ASP.NET http://www.dotnetperls.com/querystring on how to read the querystring variables
Sir,
I am trying to connect to my website “www.xxxxxxx.com”
It shows connect ok
But I wrote a html script and tried to connect to “www.xxxxxx/my.html”
It shows error CONNECT FAIL
What is the reason?
1. From your comment, the path you have provided is “www.xxxxxx/my.html”. This looks wrong, unless it is a typing mistake. The path should have been “www.xxxx.com/my.html”
2. Are you able to access the page when you type “www.xxxx.com/my.html” in the browser
3. In your HTTP GET, you need to provide the relative path “/my.html”. Are you sure your command is right
Hi i want to make arduino + Gsm module a webserver and want get request on that gsm server so that m able to control appliances to on off. So plz tell me is it possible ? And how?
Hi m using SIM 900 and arduino. And i want to make arduino+gsm module a webserver so through http get request m able to switch on off my appliance. Plz help
For a GSM module to be able to listen to a port, you need a static IP (alternatively, the complex method of DNS updates for name resolution). Getting a static IP on a SIM card, is not an easy process even for businesses. The easier way, is to create a GSM client, that will poll the server and check whether to switch on/off the device. There are more ways, like using CoAP with an edge router etc.,but then, you will have to start from scratch I guess.
Thanks for the reply
is there any other solution like 3G shields etc for acting as a web-server ?
but i think same case is there because m using a Sim there or is it not?
To act as a server, your device needs to listen on an IP address and a port number. The IP address and port must be searchable by the routers and DNS system. Additionally, your network provider must allow for incoming connections. This has nothing to do with 2G or 3G.
Thanks for the reply again
so how is it possible to control appliances from web using the controller and gsm shiled ?
Mahesh, this is a difficult question to answer in this tiny reply box! It requires considering a lot of different variable, legal aspects and design. Something, that needs great amount of discussion and time. As an alternative, have a polling system, that keeps checking for next command from server. That could get you started much faster, although, not the most efficient and will bring in longer lag.
You are perhaps trying to do something similar to what is given here http://coaplivetest.coapsharp.com/TryOnline But then, it uses ethernet.
Thanks vishnu for clearing things… M still working and hope so reply with some solution
Hai Vishnu,
Am Using SIM908 quad band GSM/GPRS which combines GPS technology.For initial setup same procedure to be followed for this devise? and how to get latitude and longitude?
The initial setup perhaps would be similar. For finer nuances and knowing Lat/Long, please read the AT command datasheet for the module.
Hi Vishnu,
Can you let me know how to read this values in webserver ? what configuration can be done in website.
Thanks in advance
I’m not sure if I understood the question correctly. Perhaps, your module is calling a web server and is passing the sensor values in the querystring…perhaps you are making a call to http://www.example.com/sensor?measurement=100.00
Now, probably, you want to read the value of the parameter name measurement on the server side. If my understanding is correct, then you simply need to use the programming language capability to read-off querystring parameters.
For example, if your website is built using ASP.NET , you can read it as string=Request.QueryString[“measurement”]. It depends on what programming language you have used to write your webserver.
For an ASP.NET example look at http://www.dotnetperls.com/querystring
Yes Vishnu ji Thanks for the reply.
I want to read the message on the server side.I have used php and html language to write webserver.
please can i get php code on server side to read messages?
Apologize. I do not know PHP. I’m a Java/C# programmer. But you should be able to find this on the net. A simple search gives me this relevant thread http://stackoverflow.com/questions/4153218/how-to-read-the-query-string-in-php-and-html
Hii Vishnu,
I want to control actuators from my pc through http, knowing that I can use the HTTP get and post communication, how to do that PLZ ?
Well, this would need a very long answer. In short, have a HTTP server run on your device, ensure it is accessible from your PC and then simply send GET/POST commands to the device from your PC browser. Not sure what is the question
Hi Vishnu,
Thanks for your contribution to this comumunity.
I want to ask you, I’m having trouble getting the ‘SEND OK’ during a TCP connection. I do get the CONNECT OK.
Let me detail you my steps:
1. After I issue the AT+CIPSEND I get the ‘>’ char.
2. Later I send my data for example ‘V1=234’ and add the CTR+Z ascii with NO 0x0A new line.
3. I wait for the SEND OK reply but the module does not reply with this.
What I think is :
1. Is it enought only printing the CTR+Z as for example serial.write(0x1A)
2. am I missing an 0x0A character?
Thanks !
Victor,
I do not think you need the 0x0A character. Ensure you are indeed sending CTRL+Z as the last character. Nothing after that.
Good afternoon,
the AT + CREG command?
I’m getting an answer + CREG: 0.2
that seems to be rather not registered, right?
What should I do?
If response to AT+CREG comes back as :0,2 then it means not registered and the module is not searching for a provider to register. This generally means the network operator, whose SIM card you are using, does not have coverage in that area. To double check, put the SIM in a phone and see if the phone is able to register to network
thank you very much
sir
i am using sim 900a gprs module
by using your commands below
AT
OK
AT+CIPSHUT
SHUT OK
AT+CIPMUX=0
OK
AT+CSTT=”bsnlnet”,””,””
OK
AT+CIICR
OK
AT+CIFSR
100.71.189.141
AT+CIPSTART=”TCP”,”api.thingspeak.com”,”80″
OK
CONNECT OK
upto now it was cleared…
but failed to upload data to the speaking things channel..
i am using the AT+CIPSEND but it was not responding to my commands to send temperature value “which is 5 characters like 30.23 “to channel…
PUT https://api.thingspeak.com/channels/75579
api_key=SDRCPWY8V7ZY18DP
i have to send my data to channel 1 using this api key…
please suggest me the commands to send data
I do not know about ThingSpeak. I do not use it. However, I read the API documentation and clearly, I can see that you are doing it wrongly. To update a channel feed, you need to call the URL https://api.thingspeak.com/update?api_key=XXXXX&field1=YYYYY
The key that you use, defines the channel to which the feed will be updated. Please read the ThingSpeak API documentation to properly use it.
Hi Vishnu,
Did you note that sometimes SIM900 TCP connections seems to get “suspended” forever?
The server gets TCP CLOSED but the SIM900 does not!
It seem the operator doesn’t inform SIM900 that the TCP connection closed.
I had to implement some ACK/NACK protocol between SIM900 and the remote server to get more reliability in the connection.
In other cases I had to make SIM900 connect, send the info, receive some info and disconnect.
It seems a firmware bug, but I’m using the latest B15 version.
Hi Mark,
I never use Sim900 over TCP (HTTP) and I do not use it in a way where it is connected to the network for long term. So I have not noticed this (or I may have missed noticing this problem). I use Constrained Application Protocol (CoAP) over UDP. My code almost always opens a connection, sends data, optionally waits for an acknowledgement (based on exchange type, CON or NON) and then disconnects. If connection/send fails multiple times, I reset the entire Sim900 module (using PWRKEY) and start the whole process again.
-Thanks,
Vishnu
Hi All,
I have been working on sim 800L but no any result some AT commands do work but if i try to call or send sms error comes up my location is Nigeria where we have MTN-nigeria, Airtel, Glo Nigeria so I need help.
Abu,
You need to check if you have network. If I’m correct, Nigeria GSM band is 900/1800. First check if network is available, then try to issue commands. Also check the UART settings.
-Vishnu
This was very helpful. I combined this with some other resources and created a post on stack exchange, including an example you can test with http://www.posttestserver.com, so you can test without needing your own server.
http://electronics.stackexchange.com/questions/231224/posting-to-php-server-using-sim900-gprs-with-at-commands/231225#231225
Hi Good morning All,
I am tested SIM800 with help of minicom , everything happening proper.
We have written serial program(with same baud , parity ,data , stop and parity) to send same AT commands, whatever message we have sent , same AT command replying(if we write “AT\r\n” message to serial port ,read message also AT, if we write “AT+CPIN?” message to serial port ,real message also same as send message”)
please do needful at earliest.
Regards
Mahendra
Have you disabled echo. When echo is enabled, any command you send, the same command will also come back in response. To disable echo, you can issue the command ATE0 .
hey mr.sharma
i am using the sim900a for gprs connection
here i sent all AT commandS successfully and i have create my website through http://www.000webhost.com
now when i send AT+CIPSEND than it gives responce > and after i send the massage with cntrl+z and it gives the response ur massage is sent but when i open the webpage on browzer i didnt see my massage than how can i see the massage i have no idea about that wht happen next?
That is not how websites work Mahesh. When you send your data from the Sim900 to the webserver, you need to have a program on the webserver that will accept your request and then, store it in some kind of database. Then, you need to have another program written on the server that you can execute by calling a URL. For example, let’s say your website is at http://www.mygreatwebsite.com. You can write a program on the server side that will be called when you visit the URL http://www.mygreatwebsite.com/runmycode , which in turn will instruct the web server to excute your code which in turn will read the data from the database and then return the result as an HTML.
hello sir,
i have a sim900a module, its work properly 2-3 months ago, but now it is not going to connect to network. if connection be establish in any how then modules power off automatically and connection being lost.
please suggest whats a problem.
I have never come across this problem, but a quick search on google tells me, that this could be a power supply issue. Please check if during bursts, if the voltage dips too much (I guess below 3V). If that is the case, then the module will automatically shut down
HELLO SIR ,
I m trying to send the data to ip address but I can’t send data
I using this cmt at+cipstart=”tcp”,”202.88.228.171″,”8080″
<<ok .please replay for solution
From your post, it is not clear as to what error you are getting. You need to first check that a TCP port 8080 is indeed open at the IP 202.88.228.171
Additionally, you also need to ensure that the TCP listener is designed to return you data.
hello sir,
i want to send data into the thingspeak server can you mention steps
I apologize. I have not used the ThingSpeak servers and do not know how to send data. I have only used the http://www.coapworks.com CoAP services to send/receive data.
Hello Sir, Your blog is interesting and educative, please keep it up.
Am working on internet based based wireless electronics notce board and am experiences some challenges. Please I have two questions Sir;
1. How do I create a web server on a microcontroller so that I can use my internet
enabled mobile phone and log into the server through the address and update
messages to the board through internet.
2. How do I achieve the system using SIM 900 and a Microcontroller without
connecting the system to a PC. The SIM 900 will serve as internet service
provider and the microcontroller will perform the required operation. Please I
appreciate any help and advice you will render to me in other to achieve this.
Thanks.
1. Creating a web server on the microcontroller is not a trivila task. You should include existing implementations (e.g. wolfSSL or simpler Tuxgraphics)
2. I think you are confusing…when you say Sim900 will serve as “Internet Service Provider”. All you want to do perhaps, is when you device switches on, the Sim900 acts like a web server and you can type in the URL in your PC/mobile phone and configure. This requires that whenever Sim900 connects to the network, it is given a pre-defined (static) IP address by the mobile tower. This is generally not granted by any network operator and is a complex procedure to obtain one.
With a cellular device, you should design your system around a process where your device is a client and connects to a remote server. That is much easier to achieve.
Thank you so much Sir for your Prompt reply. I think I have used the wrong terms. I mean that the SIM 900 will provide internet access to the system while the microcontroller acts as the main server. Also is there any other way I can go about this task with only the SIM 900 and the microcontroller without having to connect to a PC remote server. Any suggestions will be of great help. Thank you Sir in advance for your reply.
Generally, what people do, is to have another WiFi chip in the system. The Wifi chip opens up as an access point. You can have your webserver implemented, and people can connect to your device using WiFi. Any query to internet can be routed through the Sim900. Look at a good WiFi chip called AMW006 from Zentri Corp.
Thank you Sir for your kind suggestions I will check it out.
I am trying to test TCP connection on SIM900.
1. I have created a GPRS connection and got the IP address for my idea sim.
2. I got the IP address of my laptop from myipaddress
3. I run the socket test version 3 program and created a socket with port no 555
4. I tried to connect the TCP connection with a command
AT+CIPSTART=”TCP”,”XXX.XXX.XXX.XXX”,”555″ (where XXX.XXX.XXX.XXX was ip address of my laptop)
5. I get response as OK but never get “CONNECT OK” why?
Always I get CONNECT FAIL (TCP CLOSES) after some time. BUT I Never get “CONNECT OK” response.
Please help
Deshpande
You will never get to connect like this.. If your laptop a part of internal network (e.g. IP address is of type 192.xxx/172.xxx/10.xxx) then its internal. The Sim900 cannot reach unless you have network translation. The only way is to have your machine exposed to internet (generally via a static IP and no firewall on the ip/port).
Hi Vishnu…
My project uses GPRS communication. How can we assign the APN parameter if I don’t know the service provider previously. I mean, the network going to be used is unknown, only the client knows it (whether AIRTEL,BSNL,Vodafone or any other). How can it be handled via same firmware??
The way I do it is as follows:
1. I always build my device with a USB/COM port provision
2. I write a PC application.
3. User connects the device to the PC
4. User enters all the required configuration parameters in the PC application
5. The PC application sends the data to the device (connected via USB/COM port)
6. The device stores the data in the EEPROM
After this, the device can read from EEPROM and work.
Your case is “field configuration” for which, what I described above is the most common method.
I’m trying to connect a SIM800 module to a server using a VPN between them.
At the moment, I communicate them using http get request from the SIM800 to the server (i want to update to https to improve security, it doesnt seem to much complicate with the AT commands manual).
The thing is, i dont know if its posible to connect to the VPN using this GPRS module. Does anyone tried it before?
When we achieved the VPN connection, Will we be able to continue doing the same https GET request ? or Do you advise any other method to improve the security and amount of data traffic?
BTW, very good blog.
You are mixing multiple things. Using HTTPS is not the same as having a VPN. Having a VPN is something that the private network owner creates. When you use the public network of the cellular service provider, you do no get a VPN. You need to talk to the cellular service provide if you want VPN between your device and the server (because the carrier is your cellular network owner). In most cases, this will be denied.
The best you can do, is to have some form of authentication and use HTTPS. That way, the authentication process will ensure server is talking to the right device and with HTTPS, you will have secure communication.
hi guys,
i am planning to make my dynamic IP static by giving a domain name. I made it possible using duckdns. But since my IP is dynamic i have to update my IP to duckdns website which is also possible. But i have an issue, i am not always getting +PDP: DEACT when the IP expires. Is there any way to notify me about the IP expiring. I am not preferring CIPSTATUS command. I prefer notification instead
Hi Alex,
I have never tried this on my own. But theoretically, +PDP:DEACT is an unsolicited result code. You should be getting this. One command to control the URC is AT+CGEREP . Have you tried tinkering around with this. Additionally, I would also suggest that you should have both approaches in the code – depend on URC and periodically, also check for the PDP activation status. Only then, this will be fool-proof.
-Thanks
Assalamualaikum, It is great that you release good informative videos which help many over the internet. Actually I would like to know how I can implement FOTA (Firmware update over the Air) for Pic micro controller with GSM kit. please advise.
I have never done this on my own, but here is a possible solution:
1. Setup a webserver with a webpage that can be called by the GSM module. Let’s call it http://www.fota.com/firmware.aspx
2. The webpage named firmware.aspx, when called, will return the bytes of the new firmware to the caller in the response
3. On your device side, using the GSM module, make an HTTP call to the page http://www.fota.com/firmware.aspx
4. This page will return the firmware bytes which you can temporarily store on your device (may be a local RAM)
5. Now, perform firmware upgrade of your PIC microcontroller. I do not use PIC microcontroller, so this you should check in the datasheet. You already have the new firmware locally available to you (either in a separate RAM or in the PIC memory itself)
Hope this helps.
Hi Vishue Sharma!
please help me and say me how to can read the answer from my serial (sim9oo) after command AT in special the command AT+CIPSTART, this one conect me to my server. i want to turn on some led with this condition and know if my sim900 is conect with my server … if the sim 900 is conect the answer will be “CONECT OK” after i can send my information to server … how can i put this condition? thanks por you help !
Fernando,
If I understood you right, you want to turn on an LED after you receive CONNECT OK response after issuing AT+CIPSTART command. You should be simply able to read the UART response after sending the AT+CIPSTART command and check in the returned string, if CONNECT OK string is present or not.
Alternatively, if you want to check continuously whether your Sim900 is connected to the server or not, you can issue the command AT+CIPSTATUS command and know the status of the current IP connection.
Hope I understood your problem correctly.
Hey vishnu sir! I am doing the same project using sim 808 module .Can u tell me about the baud rate to be set in that case?Thanks in advance
If you read the datasheet of Sim808 (https://cdn-shop.adafruit.com/datasheets/SIM808_Hardware+Design_V1.00.pdf), on page #32, section 4.6.1, it provides all the supported baud rates. This module supports audobauding, and by default, the module is in audobauding. Going by the datasheet, this module can support 1200,2400,4800,9600,19200,38400,57600 and 115200kbps.
Hi Vishnu,
First of all, thank you very much for all the support that you provide in the blog. I have learned many things after reading the logs.
I am a new bee with the GPRS. I am using SIM900 module. I can call a phone number and send a SMS message now. But I can not get an access to the internet yet. I have checked some AT commands as follows:
AT+SAPBR=3,1,”APN”,”internet”
OK
AT+SAPBR=1,1
OK
AT+SAPBR=0,1
OK
AT+HTTPINIT
OK
AT+HTTPPARA=”CID”,1
OK
AT
OK
AT+CIICR
ERROR
AT+CIFSR
ERROR
However I don’t know clearly username and password. Could you please send me your suggestions how to connect to the internet. (Not: Simcard is registered and connected to the internet. However using a GPRS module, I can not. Why?
Waiting for your valuable suggestions.
Thanks.
The method I have provided is different from what you are using (You are using the profile based connection method). So, either you switch to my method, or for a profile based method can you please check this blog http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands
Hi Vishnu, maybe you can help me to solve a problem I’m having on a SIM340 based device I made years ago. Those devices were working ok until last year. Now some of them are not connecting anymore to the TCP server. I send the CIPSTART command and the SIM340 responds OK as usual. A couple seconds later the module send “ERROR: 1” and “STATE: IP STATUS”. Have tried SIM cards from different operators but no luck, same error. Googled for a solution but found nothing.
Any ideas?
Thanks.
Mark
Hi Mark,
This is a difficult one to solve ! I can only make a best case guess. If all of them were working and now some of them are no longer connecting, then my best guess is that something in the external environment has changed (Very rare that the module is past its life and not good anymore, but a possibility). Sim900 was a replacement of Sim300/340. Now, even Sim900 has reached end-of-life. The two most common factors, that I can guess (from experience) is the carrier properties. Sim340 is a 2G module, check the following – Do you have 2G network in your area for the given provider. If all modules are using data from same network provider, then this may not be the case. Did you run out of data limit for the device. Almost all these modules require PTCRB and carrier approval. I found an old datasheet for Sim340, and it states that this module has PTCRB approval. In addition, you still need carrier approval. If the module is not approved by the carrier, after a while, they might reject connection requests. Check if this is the case.
I once had a similar problem, where a device working for two years suddenly stopped and CIPSTART was failing. I spent a lot of time debugging without any luck. I realized only a few days later, that the phone company that provided me the SIM card had closed 2G operation in my area. I solved it by using another SIM card from a different company which still supported 2G.
See if you can find out such environmental factors .Good luck.
Hi Vishnu, I have made some more tests and found the culprit seems to be the server. The SIM340D connects to other computers flawless. The “ERROR: 1” only shows when connecting to the server it used to connect.
It is interesting that several SIM900 based devices continue to connect to the same server!
Will ask the server admin for a solution.
Thanks for your comment.
Hi. I need your help. I bought sim900 module. I’m trying to send an email with attachment (jpg and bmp) through SMTP. I receive email, but file is corrupted. After opening corrupted file with HEX editor, I found out that sim900 automatically adds CR(carriage return) and LF(line feed) to the file. That causes corruption of file. I also updated firmware to the latest one. How I may fix this problem? Is there any AT command to stop this?
Hi Orkhan,
I have not tried the email commands. You can look at the SMTP support for AT commands at the doucment http://simcom.ee/documents/SIM900/SIM900_Email_AT%20Command%20Manual_V1.04.pdf . On page #21, there is a sequence of steps to read the data. See if that can help you.
I am trying to test TCP connection on SIM800L.
1. I have created a GPRS connection.
2. I tried to connect the TCP connection with a command
AT+CIPSTART=”TCP”,”XXX.XXX.free.fr”,”80″
3. I get response as OK but never get “CONNECT OK” why?
Always I get Reboot on SIM800L. BUT I Never get “CONNECT OK” response.
Please help
I looked at the AT command datasheet for Sim800 (https://cdn-shop.adafruit.com/datasheets/sim800_series_at_command_manual_v1.01.pdf). On page #183, the documentation for AT+CIPSTART is given. Here, it is clearly written that you will get OK if the argument format is correct. You get CONNECT OK, only when connection is successful. It seems, that the AT+CIPSTART command parameters are correct, but the connection is failing because the domain/port is wrong. Also, the connection might fail if the DNS resolution fails. To check this, you can try out with an IP address first and see if you get CONNECT OK
Hallo Vishnu… Do you have any email where I contact to you?? I got fews questions about SIM900
It would be difficult to share my email in the comment responses due to spam possibilities. I have sent an email to the address using which you posted the comment.
Hi, I have been trying to connect the GSM module and for some reason I have been getting error in at+cipstart command while the rest of the commands have given expected output.
What is the error you are getting? If the CIFSR command is giving you the IP address, you need to check the DNS and port number. Do you really have a server listening on it. You may try to use the IP address instead of the DNS.
It’s very helpful
My project is to send some data from gsm sim900 arduino shield to the out platform orome other website
Can I get the code and guide lines from you
My project is on arduino 🙂
Hi,
I apologize. I have not understood the question. Looks like error in typing; what does “the out platform orome other website” mean.
Hi Vishnu,
Thanks for the amazing post.. It’s so helpful..
I’m trying to post data from the Arduino to a server using your method.. But i can’t..
This is the response..
Please help me to fix this..
Thanks,
Chitraveer Akhil
AT+CGATT=1
OK
AT+CIPMUX=0
OK
AT+CSTT=”www”
OK
AT+CIICR
OK
AT+CIFSR
10.173.228.135
AT+CIPSTART=”TCP”,”test.server.com”,”8080″
OK
AT+CIPSEND=2048
ERROR
STATE: TCP CLOSED
CONNECT FAIL
POST http://test.server.com/Listener/receiver/insert h
The request is not being completed..It is not printing the other commands such as
HOST:http://test.server.com
Content-Type:application/JSON
Content-Length:readings.length()
Reading
Help me to fix this..
1. In AT+CSTT, you are only passing the APN name. If there is no userid and password, pass blanks. I have seen some subsequent commands fail if we do pass blanks (I dont know why). So,in your case it should be AT+CSTT=”www”,,
2. STATE: TCP CLOSED indicates that the server is not listening on port 8080. You should first use IP address and port number. Then, if that works, then use the domain name and the port number. Additionally, check if server is listening on port 8080, and even if it is, check for any firewall settings that might block incoming connections
Thanks for the reply Vishnu.. But still the same error is happening..
AT+CGATT=1
OK
AT+CIPMUX=0
OK
AT+CSTT=”www”,,
OK
AT+CIICR
OK
AT+CIFSR
10.109.140.203
AT+CIPSTART=”TCP”,”xx.x.x.xx”,”80″
OK
CONNECT OK
CLOSED
AT+CIPSEND
ERROR
The server is not blocked.. The port number is 80(not 8080).. Thanks for that..
POST http://test.server.com/Listener/receiver/insert h
The request is not being completed..It is not printing the other commands such as
HOST:http://test.server.com
Content-Type:application/JSON
Content-Length:readings.length()
The comments are been stopped.
It is not completing the other commands such as
“{ \”testId\” : 1, \”testval\” : 1, \”valTest\” : 12.983027, \”dataTest\” : 80.2594\” }}”;
Thanks,
Chitraveer Akhil
T
OK
AT+CPIN?
+CPIN: READY
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGATT=1
OK
AT+CIPSHUT
SHUT OKAT
OK
AT+CPIN?
+CPIN: READY
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGATT=1
OK
AT+CIPSHUT
SHUT OK
AT+CIPSTATUS
OK
STATE: IP INITIAL
AT+CIPMUX=0
OK
AT+CSTT=”www”,,
OK
AT+CIICR
OK
AT+CIPSTART=”TCP”,”10.0.1.13″
ERROR
AT+CIPSEND
ERROR
POST /obdListener/obdreceiver/insert HTTP/1.1
HOST:/test.motordata.ch
ERROR
Content-Type:application/JSON
SIM900A R11.0
ERROR
{ “ve180
AT+CIPSHUT
SHUT OK
This is the complete result I got..
The port is in open state..
AT+CIPSTATUS
OK
STATE: IP INITIAL
AT+CIPMUX=0
OK
AT+CSTT=”www”,,
OK
AT+CIICR
OK
AT+CIPSTART=”TCP”,”xx.x.x.xx””80″
ERROR
AT+CIPSEND
ERROR
POST /Listener/receiver/insert HTTP/1.1
HOST:/test.server.com
ERROR
Content-Type:application/JSON
SIM900A R11.0
ERROR
{ “ve180
AT+CIPSHUT
SHUT OK
The TCP port number is 80..
The server is in open state..
Help me to fix this Vishnu..
Thanks,
Chitraveer Akhil
After CIPSEND, you need to wait for > character in the response before you can send anything. Additionally, it looks like you want to leverage HTTP. To simplify, you should use HTTP commands. A great blog post is http://www.raviyp.com/embedded/194-sim900-gprs-http-at-commands for such a need.
I have to know about , whats the difference between sending data by HTTP POST and CIPSEND, both does a same work.
CIPSEND is low level command generally used for raw TCP/UDP socket. You can use this for HTTP requests also. HTTP POST is specifically designed for HTTP exchange only. It is nothing bur a wrapper over CIPSEND. Just makes it easier to do HTTP exchange over TCP sockets by hiding all low level stuff.
Hello, first of all thank you for the really helpful article, I’ve been searching for something like this for a long time. I’d like to ask two questions on this topic, I’d really appreciate if you’d some time to reply.
First, we’d like to use the GPRS modem in a way where we don’t use AT+CIPSEND commands, but setup a kind of *trabsoarebt* mode, where we just send the raw data via serial connection and the modem will transparently forward it via it’s set up TCP connection. This mode could be ended with the +++ sequence. Somewhere I’ve read about it being possible, but I’m unsure about it’s wide support.
Secondly, I’d like to ask how could one setup a modem as a server, so it would start to listen on a given TCP port and transparently send the received data via serial.
We’d use this setup in an embedded system to communicate between devices, each having a GPRS modem installed in it.
Answer to Q1: Zoltan, you can always use the transparent mode and send/receive raw bytes over TCP/UDP. For all my IoT projects, I use the CoAPSharp library. I create a CoAP request, convert that into bytes and then, send it over the UDP connection using Sim900. To do this, you need to set the transparent mode (use AT+CIPMODE=1). After you get the IP address, you can start the task (use AT+CIPSTART) and wait for CONNECT in the response. From this point onwards, you can send the raw bytes. To read the response, keep polling the serial port (or setup serial port for interrupt mode). Once done, to close the data mode, you can write +++ to the serial port and wait for about 500 milliseconds. The module will come back to command mode. I have done this multiple times (using Sim900, Sim800) and this works.
Answer to Q2: If you want to create a server in your module, then tough luck. You need a data plan that allows you to open an incoming port. In my country, this is nearly impossible (unless you work for the government perhaps). However, if you do get a SIM card that supports incoming connections, then I guess you can simply read from the serial port (polling or interrupt) after setting it into transparent mode.
Thank you for the quick and detailed answers, it was really helpful. We have all the SIM cards in a private APN network, and all of them have their own static IP address, I should’ve mentioned that, sorry. Could you please help in two more follow-up questions?
1. How to configure the modem to have static IP address?
2. Is it possible to store all the configuration in the modem, like APN name, username, password and the static IP address? Or do I have to feed it from upper level every time the modem starts up?
3. Sorry your answer about the modem acting as server wasn’t completely clear to me. How exactly can I make the modem start listening to a given port and put it into transparent mode afterwards? I know that after this I can simply poll the serial port, the question is about the modem side.
Thank you in advance.
1. To configure the modem to have static IP address, can you please check AT+CGDCONT. Such things can perhaps be controlled using PDP context (I have not used this, so if you try this out, please let me know)
2. Some AT commands do store the parameter values in NV RAM. I always use an EEPROM in my design which allows me to store all such values in a single place.
3. To configure the modem to act as a server, check the command AT+CIPSERVER. An excellent application note on TCP server can be found at http://www.propox.com/download/docs/SIM900_Application_Note.pdf
Hello bro,
I have made a project which is arduino and GSM900 based which is displaying some data(numerical) on lcd,so now i want to see that data on my laptop on a webpage or on single page software so would you plz tell me any way through which i can do so?
Most simplistic approach:
1. Create a website with at-least one page to view and one page to accept data
2. Let’s assume that page that accepts data has a URL http://mywebsite.com/acceptdata
3. Using the concepts presented here, send data to the page in point #2. For simplicity, if you are using HTTP GET, then sending the temperature could look like http://mywebsite.com/acceptdata?temperature=25.00
4. When the URL in point #3 is called, extract the querystring named “temperature” and store the value (25.00) in your database.
5. Now, to view the stored value, create the viewer page and lets say the URL is http://mywebsite.com/viewdata
6. When the URL in point #5 is typed in the browser, the code of the page, queries the database and renders the data on the page.
Thanks for your response,
Bro, do you think changing of a value is also possible through that webpage for suppose there is a formula which i am using for calculation just like “a+b” and want to change value of “a” occasionally through that webpage is it possible? to do so?
again i do really appreciate your quick reply
If I understand your question right, on your micro, you have a formula like a+b=c, where “a” could be a constant and current value is lets say 30. Now, on the webpage, you can store the value of “a”. Your micro can do a HTTP “GET” to retrieve that value.
All this is already available via the IoT platform CoAPWorks (http://www.coapworks.com). If instead of HTTP, you use CoAP then each fo the things people ask for (e.g. storing a value on webpage, getting configuration values etc) are all available via this platform via CoAP protocol.
Hi Sir,
I am created the TCP connection and proceed for data sending.. but how to send a message from Android app.. that’s how to access that GSM modem like via IP address or port or what?? .. please help me
Dear Rahul,
I apologize. I have not understood your question at all. Can you please rephrase and elaborate what are you trying to do.
Hello Sir, am trying to implement the SIM900 to send data as sms using Atmega32 USART. The problem is, am having much difficulty getting the module to communicate with the microcontoller. Is there any help you can render sir?
The question is not very clear. Still, I’ll make an attempt. If there is a communication problem between the module and your micro, then do the following:
1. Check the baud rate and UART settings (parity, stop bit etc.)
2. How are you connecting to the UART. Check the cables. This is one big cause of bad connection.
3. Read this application note to know how to send SMS http://www.rhydolabz.com/documents/gps_gsm/sim900_sms_app_note.pdf
hello sir…good afternoon..
im using same steps as you mention.and i aslo successful to send data to thingspeak for some duration
.but now i get this error–HTTP/1.1 400 Bad Request
Server: nginx/1.9.3
after SEND OK reply on serial monitor ..why this error occures …is their any range problems.
HTTP/1.1 400 Bad Request means that your syntax (and/or input data) is malformed. It is not following the rules specified by thingspeak. I would suggest that you read the documentation of thingspeak and make adjustments as required.
thank you sir ..can you suggest me from where i get detailed documentation
1. Pick a language of your choice
2. Search for topics related to database programming in that language.
hello, My project is energy meter monitoring over IOT, in this i am have to send the data on webpage using gsm sim900, i’ve to make a webpage where the data is constantly changing, but i am not sure how to do this. Please help
1. Select a programming language (PHP,Java, .NET)
2. Select an appropriate hosting provider (PHP hosting, Java hosting, .NET hosting)
3. Create a webpage that accepts HTTP POST
4. In that page, extract posted data
5. Create a database (Oracle, SQL , MySQL)
6. Ensure hosting provider also gives you the required database
7. In your webpage, after extracting the POST’ed data, save in the database
8. Create another webpage
9. In that webpage, select the data from the database
10. Write code in the webpage to show the data in appropriate manner
but how values will come in database from energy meter using gsm900?
When the GSM module posts the data, the page will extract the data and that page will have database insert/update codebase.
Hello, Sir I want to sent data from my gsm module to a website which keeps on changing every 30sec.
What should i do to display the data in the textbox in .net, And i don’t want to use database
Not a good option, but given your restrictions, here is what you can do:
1. Create a page to which the module will post data. Let’s say, the URL is http://example.com/receive_data
2. Once data is received by the page above, it can parse and extract the data and forward to a page with URL http://example.com/show_data
3. The page in step 2 can then show the data in a text box and it will get refreshed everytime new data is received from the module
I created a web page!!
But how will the gsm900 will send data on the website?
And i also want to know how will the data be parsed and extracted ?
Hi! This is a brilliant blog and comments make it even better. I am using SIM808 for a vehicle tracking system. I am faced by 2 constraints.
First, I cannot upload a packet of more than 255 bytes.
Second, the port is automatically Closed after a successful CIPSEND. So I have to do CIPSTART every cycle.
These 2 constraints induce a very tough situation in which I can only send small packets to server, that also not continuously but a gap of 30-40 seconds! What could be the possible solutions?
1. The maximum length as per datasheet is 1460 bytes. You can query how much data can be sent by calling AT+CIPSEND?
2. See this document http://simcom.ee/documents/SIM900/SIM900_TCPIP_Application%20Note_V1.02.pdf
3. The remote server might disconnect after you send data. This happens, when there is no response sent by the remote server. Check your remote server
Hey Vishnu! Thanks for your kind reply. I figured method to send 1k bytes.
My server actually sends a response string, but still the connection is “CLOSED” after complete response message is received.
It may be because the server is closing the connection. HTTP is a request response mechanism. So servers by default will close the connection. Check https://en.wikipedia.org/wiki/HTTP_persistent_connection and see if my theory is correct regarding your problem.
Thanks Vishnu, what could be the possible reasons if the device is sending SMS but not uploading data? I guess the APN name. But then, another device is uploading data with the same firmware.
If other, same model device is uploading data with the same firmware, then here are possible things I can think of:
1. Module firmware problem
2. Settings problem (either APN, baud rate etc.)
3. Hardware problem (e.g. too many errors in TX/RX)
Check where exactly it is failing, then only we can debug this better.
At+cipstart=”TCP”,”api.thingspeak.com”, “80”
Connect ok
At+cipsend
Get https://………..Key…Value
#026
Send ok
But data not shown on thingspeak
I apologize. I do not use Thingspeak. You should check their documentation. I’m sure you are missing something.
Hi sir,
I am working on tracking system and I am using SIM808. I have hosted my websocket server on heroku and trying to connect that using Sim808 and I tried to console id of socket clients connect to server but when i try to connect to server from sim808 I get CONNECT OK response but connection gets closed after sometime and server does not console any socket id
AT
OK
AT+CIPSHUT
SHUT OK
AT+CIPMUX=0
OK
AT+CGATT=1
OK
AT+CSTT=”www”,””,””
OK
AT+CIICR
OK
AT+CIFSR
10.95.12.88
AT+CIPSTART=”TCP”,”**************”,”80″
OK
CONNECT OK
AT+CIPSTATUS
OK
STATE: CONNECT OK
CLOSED
AT+CIPSTATUS
OK
STATE: TCP CLOSED
+CMTI: “SM”,5
The +CMTI:”SM”,5 indicates that there is a message waiting in the buffer. Have you checked your code on the server side. Most common mistake programmers do, while writing socket code, is to not handle the incoming socket properly after an “accept”, thereby, leaving the handle as orphan. Check your server side code first and then come back to this code if server side is fine.
yes i tried to connect the server from different mobile phones and it console the ids
Akshay,
I apologize for not being able to understand the problem. What is the meaning of “console the ids”. Also, is the server publicly available for me to check?
HI EVERY ONE , I AM USING THE UC20 GSM/GPRS MODEM AND TRY TO CONNECT WITH SERVE BUT GET FAIL.
FOLLOWING PROCESS I DO AND THE MESSAGE I GET IS BELLOW PLEASE GUIDE WHAT MISTAKE I DO.
.AT+QIACT=1
.
.AT+QIACT=1
.OK
.AT+QIACT?
.AT+QIACT?
.+QIACT: 1,1,1,”10.210.65.138″
.
.OK
.AT+QIOPEN=1,1,”TCP”,”www.facebook.com”,80,0,2
.AT+QIOPEN=1,1,”TCP”,”www.facebook.com”,80,0,2
.CONNECT
.AT+QISEND=1
.HTTP/1.1 400 Bad Request
.Content-Type: text/html; charset=utf-8
.Date: Fri, 21 Apr 2017 08:43:16 GMT
.Connection: close
.Content-Length: 2959
.
… . Facebook | Error. . . . . . . . . html, body {. color: #141823;. background-color: #e9eaed;. font-family: Helvetica, Lucida Grande, Arial,. Tahoma, Verdana, sans-serif;. margin: 0;. padding: 0;. text-align: center;. }.. #header {. height: 30px;. padding-bottom: 10px;. padding-top: 10px;. text-align: center;. }.. #icon {. width: 30px;. }.. h1 {. font-size: 18px;. }.. p {. font-size: 13px;. }.. #footer {. border-top: 1px solid #ddd;. color: #9197a3;. font-size: 12px;. padding: 5px 8px 6px 0;. }. . . . . . . . . . Sorry, something went wrong.. . We’re working on it and we’ll get it fixed as soon as we can.. . . Go Back. . . Facebook. . © 2017. . . ·. Help Center. . . . . document.getElementById(‘back’).onclick = function() {. if (history.length > 1) {. history.back();. return false;. }. };.. // Adjust the display based on the window size. if (window.innerHeight < 80 || window.innerWidth < 80) {. // Blank if window is too small. document.body.style.display = 'none';. };. if (window.innerWidth < 200 || window.innerHeight < 150) {. document.getElementById('back-link').style.display = 'none';. document.getElementById('help-link').style.display = 'none';. };. if (window.innerWidth < 200) {. document.getElementById('sorry').style.fontSize = '16px';. };. if (window.innerWidth < 150) {. document.getElementById('promise').style.display = 'none';. };. if (window.innerHeight < 150) {. document.getElementById('sorry').style.margin = '4px 0 0 0';. document.getElementById('sorry').style.fontSize = '14px';. document.getElementById('promise').style.display = 'none';. };. . ..
.NO CARRIER
In fact, you have received a response from the facebook website. The response indicates you have successfully made a request, but one or more mandatory parameters in the request is missing. To test, try calling a more simple page, something that simply returns very small data and has no dependency. Perhaps a blank HTML page.
The “NO CARRIER” that you receive, even after a successful response from facebook, perhaps means there could be some syntax error in the commands you are issuing. Check with the datasheet once again.
Hi sir i checked my arduino and gsm sim808 code everything works fine with socket test application and I am able to send gnss data but my server hosted on heroku does not recognize my device
///index.html inside script tag in body
socket.on(‘new message’,function(data){
var html=”;
for(i=0;i<data.length;i++){
var users_id=$('#users');
html += '’+data[i]+”;
$(“#client-connect”).html(html);
}
});
///app.js
client.push(socket.id);
socket.emit(‘new message’,client);
Please help me
Thanks in advance
I apologize, I do not know much about nodeJs. I’m a C#/Java person so please check this server side issue with someone who knows nodeJS.
ok sir thank you
hi Vishnu ,
i have created TCP server in SIM800H to receive Command from Cloud getway while using HTTP for sending Data to Cloud. i have two issue :
1) cloud getway expecting acknowledge as 200,OK for each request generated to SIMCOM device , but SIMCOM not generating ACK. (getway is LWM2M and getway awaiting ACK for OBSERVE command)
2) TCP server, which created for receiving Command , is suddenly stopped getting Command from cloud . it again receiving after GPRS Init only.
Satish,
There is not enough technical details for me to clearly outline what is the problem. Therefore, as a first attempt, here are some generic reasons:
1. Are you running Sim800H as a TCP server? If yes, then please understand, across the world, generic SIM cards do not support incoming connections. You need special permission to have a SIM card that allows incoming connections. Did you get that permission? (or are you a part of a testing / certification team simulating the tower in your lab)
2. When you say ACK is expected for OBSERVE, this is a CoAP concept. Are you using CoAP protocol (since I’m aware that LWM2M uses it). If yes, then your SIM800H should have opened a UDP server on port 5683 and not TCP or HTTP.
3. As stated in point #1, incoming connections are not allowed in a SIM card, so any incoming request will be dropped.
Your setup and use of protocol at different levels is not very clear for a 100% accurate resolution to the problem. Check the above and let me know if it help, otherwise, send more details.
Hi Vishnu ,
Thanks for Reply , find my point to point to response:
1) yes ,we got Special Permission from SIM operator , and they provided with static public IP. after permission we are able to receive Command generated from Cloud getaway.
2) this is OMA LwM2M and we are using JSON script . UDP is not preferable due to security concern.
3) we are receiving command from Cloud getway as below log but cloud not receiving HTTP ACK ( 200,OK) from our Device ( SIMCOM)
in below LOG first device sending “details” to cloud successfully and then Cloud sending “OBSERVE” on TCP server
——————————
AT+HTTPDATA=405,120000
DOWNLOAD
{“adaptLayerId”:”862877030295321″,”details”:{“device/0/endPointClientName”:”862877030295321″,”connectivity/0/network bearer”:”0″,”connectivity/0/radio signal strength”:”0″,”connectivity/0/IP address”:”223.224.195.6″,”connectivity/0/IP address type”:”IPv4″,”connectivity/0/APN”:”PRIVATEAPN”,”connectivity/0/periodic data interval”:”300″,”connectivity/0/ICCID number”:”00″,”connectivity/0/phone number”:”0″,}}
OK
AT+HTTPACTION=1
OK
REMOTE IP: 52.36.175.231
+IPD,277:POST /devices HTTP/1.1
Content-Length: 97
Host: 223.224.195.6:1010
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.2 (Java/1.7.0_97)
Accept-Encoding: gzip,deflate
{“write”:[{“string”:”OBSERVE”,”resource”:”66504/0/0″,”endPointClientNames”:[“862877030295321”]}]}
——————————————
In order for your device to be able to send the HTTP Status code 200 (OK), the device must be either configured to run as an HTTP server, or you need to manually set that response code. When I look at the AT command manual at http://gprsbee.com/wp-content/uploads/2015/05/sim800_series_at_command_manual_v101.pdf I do not see any HTTP command to set the response code. Also, when I read it, it seems the commands AT+HTTPXXXX are for HTTP client and not server. To set the module as a server, you perhaps need to use AT+CIPSERVER. Have you done that? If not, the try checking with some application not on how to run the module as a server.
Is there any GSM/GSPR Module available which can be configured as HTTP server ? kindly confirm .
I am doing AT+ CIPSERVER but I believe it is TCP server not HTTP server so Module is not responding as 200,OK.
HTTP server is a higher level protocol (Application layer in OSI layer). It works on top of TCP/IP (lower layers). I’m not aware if any module implements HTTP server. You need a separate library for that.
Hi sir is there is any way with which arduino can use sim808 gprs connection to connect to server
Sim808 should be very similar to Sim900. Just look at the Sim808 AT command manual. Follow the commands in this blog and if there are any minor changes, make them as per the AT command manual. In fact, if you visit the manufacturers website, on Sim808, they have given the link to Sim800 datasheet. Its all the same.
yes i followed that but i want to share the connection with arduino wanted to do the same thing as ethernet does.
For that, you need to implement the networking stack. For example, you can write ‘BSD style’ socket API and underneath you can provide a simplistic imlpementation (e.g. SLIP protocol). This is a huge task and not something that you can do with ATMEGA328p kind of controllers.
Not a good option, but given your restrictions, here is what you can do:
1. Create a page to which the module will post data. Let’s say, the URL is http://example.com/receive_data
2. Once data is received by the page above, it can parse and extract the data and forward to a page with URL http://example.com/show_data
3. The page in step 2 can then show the data in a text box and it will get refreshed everytime new data is received from the module
You gave me this ans to my solution on April 5th post as Prashant!
I have following query:
I created a web page!!
But how will the gsm900 will send data on the website?
And i also want to know how will the data be parsed and extracted ?
When you call AT+CIPSEND and after the > prompt, you can make a HTTP GET call as :
GET http://example.com/sim900/http_get_test.aspx?p1=XXXX&p2=YYYY HTTP/1.0 (see http://m2msupport.net/m2msupport/atcipsend-send-data-through-tcp-or-udp-connection/)
Now, in the URL, after the ? you will see p1 and p2 are two named variables and respective values as XXXX and YYYY.
When the http_get_test.aspx page is called, you can extract the parameters from the Request variable. How to get the querystring data is specific to the programming language you are using. So do a google search for extracting the querystring variable for your programming language.
AT+CIPSTART=”TCP”,”express-arduino.herokuapp.com”,”80″
OK
CONNECT OK
AT+CIPSEND
GET http://express-arduino.herokuapp.com HTTP/1.1
Accept:*/*
Host:express-arduino.herokuapp.com
SEND OK
HTTP/1.1 400 Bad Request
Connection: close
Server: Cowboy
Date: Wed, 03 May 2017 10:19:44 GMT
Content-Length: 0
CLOSED
What could be an issue
HTTP 400 – Bad Request means that the request sent to the server is missing something or is corrupted. When I type the URL http://express-arduino.herokuapp.com/ (GET request), I see a webpage. If you indeed wanted webpage HTML content to be returned, check what other parameters the GET request needs. Alternatively, you should first test with a basic HTML page (perhaps a blank page).
ok sir thanks and which parameter is missing please let me know because i tried all possibilities
Akshay,
I apologize, I do not use the herokuapp.com website. It seems you already have an account with them. So please check their documentation.
Hello Mr Vishnu Sharma , i’m using STM32F4discovery and i want to send a picture(76Kbytes) to a webserver using SIM900, can you tell me how can i send these enormous quantity of data using SIM900? And thank you
First take the picture and store it locally (in an external RAM or SD card).
Then use one of these two methods:
1. Open a TCP connection and perform byte transfer. Create a simple protocol that could be; always send 32 bytes. First byte is start indicator, second byte is sequence number, followed by data bytes. Second last byte is true/false to indicate if more data is coming in. Last byte is a CRC.So 28 bytes of data and 4 bytes of metadata
2. Open an HTTP connection. Post 32 bytes as per the scheme given above. To make it easier, convert the bytes to Base64 string and then simply post them as a string value or a parameter.
Hi i need to send data to server by using HTTP.
How is it possible, i am using SIM800.
You should look at Sim800 IP application note. URL is https://cdn-shop.adafruit.com/datasheets/sim800_series_ip_application_note_v1.00.pdf
Hi
when I use this code then I got the error
the line code is
AT+CIPSTART= “TCP” , “www.vishnusharma.com”, “80”
Difficult to say more without the error details. Anyways, check AT command manual for error codes associated with CIPSTART. Also, the domain http://www.vishnusharma.com is redirected to another. Try a domain that is not redirected…something simpler like thepersonalpage.me
Try removing the spaces before and after the commas.
Sir I have to access internet from SIM800L module using Airtel sim card and transmit that internet data over wifi through ESP8266 wifi module so that I can access internet in my smart phone through wifi.please tell me how this can be made
If I understood you right you are trying to create a cellular dongle. If yes, then this is a hugely complex task requiring much more than what I guess you can provide as a single person. You need to do something called “Bridge Architecture”. On one end, you will have the cellular modem, and on another end, you need the WiFi modem. Every request coming to WiFi modem, should be translated to appropriate commands for the cellular modem. This is similar to writing a proxy server for protocol translation. Some pointers can be obtained from https://www.u-blox.com/sites/default/files/products/documents/WiFi-CellularIntegration_AppNote_%28UBX-14003264%29.pdf
hi sir,
u r article is really interesting,i need help from u sir
how to send image data to server using lpc1768 or any controller via GSM/GPRS.
actually this is possible or not?
Read some of my early comments on this blogs. Other people have asked similar questions and I have responded.
sir i got the output but small problem here,
AT+CIPSTART=”TCP”,”XXXXXXXXXXX”,”80″ OK
CONNECT OK
AT+CIPSEND > msgsendfromisoft
SEND OK
but this sending(msgsendfromisoft) massage not shown in local TCP sever
You need to send a valid request to the server. I’m assuming that you are connecting to a HTTP web server (since you have mentioned port as 80). In that case, your request is invalid. Instead here is an example to send a HTTP GET request:
GET http://www.m2msupport.net/m2msupport/http_get_test.php HTTP/1.0
PLEASE HELP
im using below code but always respond with error after sending the data using CIPSEND
AT+CREG?
AT+CGACT?
AT+CMEE=1
AT+CGATT=1
AT+CSTT=”etisalat”
AT+CIICR
AT+CIFSR
AT+CIPSTART=”TCP”,”34.202.124.xx”,”443″
AT+CIPSEND
PUT /Thingworx/Things/etiajmp_mohamedkhalil1711/Properties/mykidname?appKey=58b3eb57-36ef-4f59-aa45-79b60099b052 HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip,deflate
Connection: keep-alive
Content-Length: 21
Content-Type: application/json
Host: 34.202.124.206
{“mykidname” : “Amr”}
#26
below is the response i always get after enabling the tcp and sending the data
AT+CIPSTART=”TCP”,”34.202.124.206″,”443″
OK
CONNECT OK
TCP connection success
AT+CIPSEND
> PUT /Thingworx/Things/etiajmp_mohamedkhalil1711/Properties/mykidname?appKey=58b3eb57-36ef-4f59-aa45-79b60099b052 HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip,deflate
Connection: keep-alive
Content-Length: 21
Content-Type: application/json
Host: 34.202.124.206
{“mykidname” : “Amr”}
#26
ERROR
CLOSED
TCP connection is closed by remote server
There could be many reasons for this:
1. Incorrect IP address
2. Incorrect port
3. Port and service mismatch (e.g. asking for SSL on port 80)
4. Incorrect input data format (the data you supply after CIPSEND)
First, send a simple request and check connectivity, before starting to add headers and data. One step at a time.
please how do i install TCP listener on my server that is designed to return data.send by my sim800 to my vb application on computer
What higher level protocol are you using? HTTP? If yes, then simply pick an HTTP server (e.g Apache, IIS) and write a webpage (in Java, C#). If you are simply sending raw bytes and not using the HTTP commands, then you can write a TCP listener in the language of your choice (see C# example here https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx) and ensure that the IP address on which this is listening, is available publicly.
Hello Vishnu
The blog was of great help. Thank you!
I’m using the Arduino Serial Monitor to send AT commands. Can you please tell me how to send the Ctrl+z after typing in the message in AT+CIPSEND?. I tried typing in #026 and 0x1A. But they didn’t work.
Does this help: https://stackoverflow.com/questions/16132971/how-to-send-ctrlz-in-c
Hello Vishnu, This is a very helpful blog.
I’m using SIM900 with Arduino Serial Monitor to send AT+Commands. I followed your commands but I have an error on the APN part:
AT
OK
AT+CGATT?
+CGATT: 1
OK
AT+CIPSHUT
SHUT OK
AT+CIPSTATUS
OK
STATE: IP INITIAL
AT+CIPMUX=0
OK
AT+CSTT= “http.globe.com.ph123”, “”, “”
ERROR
AT+CSTT= “APN”, “”, “”
ERROR
AT+CSTT= “http.globe.com.ph123”, “”, “”
ERROR
AT+CSTT=“http.globe.com.ph123”,“”,“”
ERROR
___________________________
Please help me to figure what’s wrong here. Thank you.
Your APN is 100% wrong. Please check with your network provider (company that gave you the SIM card) and get the correct APN
hi Sir
i am currently working on sim900A modem for sending json data using post method.
i had used http AT commands but getting NO HTTP PDU error (+HTTPACTION: 1,600,0), The sequence i followed with their result are follows:
AT
OK
AT+CPIN?
+CPIN: READY
AT+CREG?
+CREG: 0,1
AT+CGATT?
+CGATT:1
AT+CIPSHUT
SHUT OK
AT+CSTT=”airtelgprs.com”,””,””
OK
AT+CIICR
OK
AT+CIFSR
XXX.XXX.XXX.XXX
AT+SAPBR=3,1,”CONTYPE”,”GPRS”
OK
AT+SAPBR=3,1,”APN”,”airtelgprs.com”
OK
AT+SAPBR=1,1
OK
AT+SAPBR=2,1
+SAPBR:1,1,XXX.XXX.XXX.XXX
AT+HTTPINIT
OK
AT+HTTPPARA=”CID”,1
OK
AT+HTTPPARA=”URL”,”dev.iotrek.in/rest/gsm”
OK
AT+HTTPPARA=”CONTENT”,”application/json”
OK
AT+HTTPDATA=200,5000
OK
DOWNLOAD
{“meters”[{“watts”:0,”pf”:0,”voltage”:29.01,”kwh_h”:0,”kwh_l”:1.322,”amps”:0,”freq”:50.06,”data_ts”:”18-10-2017 16:17:09″,”meter_id”:”218″}]}
OK
AT+HTTPACTION=1
OK
+HTTPACTION;1,600,0
please help me with this.
thanks
thnx problem solved
I apologize. Have been travelling this week and thus the delay. It would be great if you can share what you did to solve the problem. It will help us all.
Hi guys,
I need latest version of SIM900 EAT firmware, I think it is 1137B04SIM900M64_ST_DTMF_JD_EAT.
Could someone help me to get it? I will be deeply grateful.
thanks,
Jose.
For the firmware, you need to check the SimCom website.
Hey Vishnu!
I want to make a device that connects to the GPRS across most states in India, and on any common 2G/3G SIM card provider like Airtel, Idea or Vodafone.
Is there a common APN that works for all? If not, how do I change APN in code on the fly? SMS / UART? But I would avoid that.
Please suggest.
For each provider, you will end up with a different APN. There is no way to have a single APN that works across all. You need to have a separate application that can provide the APN during device configuration based on the SIM card use. This APN can then be saved in an EEPROM. I do it this way only. I let the user select a SIM card (from a list of pre-approved providers) and then, I have a device configuration application which the end-user uses to provide the APN.
Dear Sir,
I worked with sim900 and reserved a static IPs from the operator and get my own APN to work in it .
I made all steps of sending GPRS packet from sim900 as client to anther Sim900 as server and all was very well.
But sometimes when reaching to command of start connection at+cipstart , the command will get connect fail after 75 seconds.
and if I make a ping to this IP , at+cipstart command will be responded by connect ok.
and then if I shutdown and reconnect again , all thing will be ok
so what is the reason of it ? Is it form the operator network?
why did it work when pinging the IP only for the first time ?
I was never able to get a static IP from the operator, so I have never tried this. Looking at your situation, it seems, the server times out waiting for incoming connection. Have you tried keeping the connection alive by simply pinging with a very small message at regular intervals.
thank you for quick replay 🙂 .
yes , i tried this. it was worked perfectly.
but it isn’t a logical practical solution to my statusbecause ,in my work , there are thousands of sim900 modules need to connect to my server.
it is a huge load on the network to make the server pings to all these thousands of sim900 even if one time per day to every module.
Is there anther solution?
I think if i change the operator network to anther network in my country like vodafone , may solve this problem . what is your opinion ?
1. If there are thousands of clients planned to connect to this Sim900 based server, then this does not look the right design. It would be too much for your Sim900 to handle the load
2. If there are thousands of clients planned to connect to this Sim900…then, assuming that within a 24 hour period each client connects only once, then it means, every 86.4 seconds (for 1000 clients), one incoming connection will be received. Does the server timeout before 86.4 seconds. If not, then you are perhaps anyways good to go.
3. Most network operators will work on specifications. I doubt that anyone would give you a large timeout. You should first check Sim900 folks if you can control the timeout and then check with operator if they can increase the timeout.
Hello Sir,
I am used SIM900A. After Successfully connected with TCP server. How can I check the connection is alive or not?
Also How much time the connection alive ?
1. How can I check the connection is alive or not? – Check section #9 in application note at http://simcom.ee/documents/SIM900/SIM900_TCPIP_Application%20Note_V1.02.pdf
2. How much time the connection alive ? – I do not have a clear answer that specifically relates to Sim900, but as per RFC 5482 TCP User Timeout Option March 2009 – In the absence of an application-specified user timeout, the TCP specification [RFC0793] defines a default user timeout of 5 minutes.
Dear sir,
Thanks for your blog,helped a lot.
I want to connect sim900 to my project and want to monitor if SIM900 is disconnected accidentally or replugged,How can i do that using code??
Your reply would help.
Thanks..
have you tried CIPSTATUS or unsolicited messages
Hello vishnu
Need some help in creating a listener. Our client has a modem which can send data to a particular port on an ip. we need to listen to that data and import in our database tables.
We have a php server, can u please guide us to a sample code of a socket listener in php.
I am really in need of help.
Thanks
Ashish
I’m not a PHP developer, but here is one example I could find on the internet http://php.net/manual/en/sockets.examples.php
I need the how to read the data from tcp ip after we send the data from gprs modem thorugh at commands
or how to show on webpage
AT+CIPSTART=”TCP”,”www.prashantgajjar.in”,”80″
CONNECT OK
AT+CIPSEND=6#013
>HELLLOO
OK
I have domin http://www.prashantgajjar.in as linux platform
Please send any PHP code to read the “Helloo” and view on webpage
Prashant
9727768337
Well this is a big ask for sending PHP code. Such code to extract data from posted page is available on internet. Just Google “PHP read POST variables”
I have some space on cloud and i want to send data on server but it has user name and password then how can send data on that server.
suppose i want to send data on server so where i put its user name and password
There are many ways to send credentials data to a URL:
1. Use HTTP headers
2. Use HMAC-SHA256 method
3. Send an API key
Hello Sir,
I am used SIM7600E. which is the command for TCP connection over GPRS?
A complete list of datasheets and documents are available at https://simcom.ee/documents/?dir=SIM7600E Check the AT command manual for this module
HI,
I have to setup the remote control of a MCU application.
On field the MCU is based on an ATMEGA 1284P. The MCU is completed with a GPRS modem based on the SIM808 module.
The MCU setups a TCPIP connection with a remote SERVER at its IP address and port. At the MCU side I followed your explanation step by step (VERY USEFUL. THANKS A LOT).
The connection with the SERVER takes place regularly, the JSON string from the ATMEGA 1284P to the server is sent properly and the GUI APP at the server side receives the JSON and update the GUI interface properly, as expected.
Therefore, the remote monitoring at the server side works perfectly, continuously, and forever (until the SERVER is not stopped).
The GUI APP is written is Qt C++. The MCU code is written in AVRstudio C.
When the SERVER (aka the Qt APP running on the SERVER), tries to send back a JSON, at the ATMEGA1284P:
1. I receive a string into the UART buffer.
2. If I parse it, it is like expected but the GPRS modem never releases the SEND OK.
3. Without SEND OK received, I cannot send any other JSON and update the remote monitor.
4. The only way to go out is the reset of the modem and cancel the TCPIP session.
After the reset it is again possible to send all the JSON wanted, but at the first tentative to send a JSON from the Qt APP to the ATMEGA1284P the modem becomes blocked and does not accept any other AT command.
I have to reset it.
It doesn’t matter the length of the JSON has to leave the SERVER, short or long always the same matter, the JSON arrives but the modem never releases the SEND OK.
Why the APP at the SERVER SIDE, when sends a JSON to the client blocks the GPRS modem? Is there any handshake to do at the Server side before to send a JSON to the MCU?
How the TCPIP layer at the Server side informs that it is ready to accept a string to send to the client? At the MCU side after the AT+CIPSEND, the TCPIP layer releases a prompt > and only after this prompt it is possible to send the JSON. When the transmission is successfully completed (received by the SERVER) the TCPIP layer releases a SEND OK, really the OK to send a new JSON. Nothing similar at the SERVER side?
I have not find any useful explanation on how and when the SERVER can send a JSON back to the MCU. Immediately after the JSON from the MCU is received and without any care about any prompts from the TCPIP layer?
If at the ATMEGA MCU side I am quite skilled, my ability with the Server code is limited.
Of course I can post the C code about the MCU but nothing is different from your implementation.
I think the trouble is at the SERVER side and not at the MCU side.
Thank you for any help.
On page #6 and #7 of this document https://cdn-shop.adafruit.com/product-files/2637/SIM800+Series_TCPIP_Application+Note_V1.01.pdf it says, after data is sent successfully to the server, a “SEND OK” is sent to the MCU. If data is received from the remote server, it will also be returned. After you send data, you must send “Ctrl+Z” to the module to indicate end of transmission. So, you need to put the JSON after the “>” prompt and then in the end “Ctrl-Z” (Hex 26) byte to indicate end of transmission. Then this data is received at the server. The server after receipt, should send back the response an then close the connection. If the connection is closed by server before it sends a reponse, then you will perhaps not get any SEND OK.
The best way to check if your server code is wrong, is to first do a test with some known website (e.g. try sending one or two requests to http://www.google.com and see is that works). If request to Google.com works, then error is on your server code, else it is on the MCU side.
I use the AT command AT+CIPSEND= there is the = I add at the end.
It is one of the option of the CIPSEND command.
Exactly AT+CIPSEND=617 where 617 is exactly the length of the JSON I have to send. In this case the prompt ‘>’ is not needed (it is one of the option of the CIPSEND command).
And everything works fine until I don’t try to send back something from the server to the client.
At the server side I can visualize all the JSON sent by the client. And they are perfect.
Works fine means I receive the SEND OK even if I don’ t send the prompt ‘>’.
When from the server, after I have received the JSON, I send anything to the client, the SERVER OK is never released and the connection becomes blocked.
The problem is:
at what time, at the server side and after I received the JSON, can I send something to the client? When I want? When I have received the JSON? Or do I have to wait the JSON is sent back to the client (calculating the needed time)
Using AT+CIPSEND= is not simple. There are other commands you have to issue, for example, another variant is AT+CIPSEND=, where denotes the connection number, but then, the module has to be in quick send mode. Also, if you use the fixed length method, you are responsible for querying and acknowledging. It is best that you wait for the > prompt and then send. This will keep things simple. If you still insist, try to see if AT+CIPRXGET can give you the response.
of course I can send both codes. for the ATMEGA and for the Win PC
sir,
how to send data continuously to a mobile app through GSM
Send to a central server from the device and on the mobile app, download continuously from the server
Hello sir,
Please, I want help from you. I am a first-year engineering student. My project is to send sensor data to aws using Arduino and GSM with the MQTT protocol. I really don’t know how to code this stuff. Please at least provide a simple Arduino code which is going to upload potentiometer value to aws server but using only MQTT protocol. Your any help is appreciable.
Thank you.
Palak,
This is the right time for you to learn. So, read the code from different places and build your system. If other people do it for you, then how do you become an engineer 🙂
Hello sir,
Thanks for your reply.
Actually, I read basic of MQTT on HiveMQ website and read some blogs on the internet. I also read the packet structure of the MQTT protocol on MQTT website, so I have basic knowledge of this packet structure.
I also search on the internet but these using only libraries provided by Github developers and most examples only include ESP32 modules to send data to MQTT server. Hence it becomes tedious part to understand how actual data going from module to server.
Please sir, at least help me to send the “CONNECT” packet to the server using Arduino and GSM. And when broker sends “CONNACK” packet in response to “CONNECT” packet it should display on the serial monitor. once I get this idea of such programming I will do later part of programming. It will be very helpful to me.
Please sir, give me some suggestion and help me to code. Your any help is appreciable.
Thank you.
If you are using Arduino, then you need to find MQTT library for Arduino. One example is here https://www.digikey.com/en/maker/blogs/2018/how-to-use-basic-mqtt-on-arduino
OK..Thank you for your reply.
hi vishnu, i need to connect two gprs modules to server and client is this is possible?
You can configure one modem as client. That should be easy as demonstrated in this blog. You can technically establish another modem as TCP server. See section 2.1.3 in this document http://www.python-exemplary.com/download/sim800_series_tcpip_application_note_v1.00.pdf
While setting up the modem as a TCP server is technically possible, most service providers block this mode. You need to get a special SIM card from your provider that will allow this. Not an easy thing to do. Generally, you need to represent a legal business and get into a business deal (my experience). They do not give this to individuals.
Hello sir,
I am sending temperature values to the io.adafruit.com server and its working fine. By using TCP/IP commands I’m continuously sending these commands by using Arduino to see values/data on the server. And this working fine.
My question is, when I’m sending some values or data from the server to sim900A then I’m not able to see data on my Arduino. Which AT commands are used to see whether sim900A receives data or not?
I know how to send data to the server but don’t know how to retrieve data that is coming on sim900A.
Your help is appreciable.
Thank you.
1. When you send data to Adafruit website via Sim900, you can get a response (HTTP reply)
2. You cannot receive data from Adafruit website on to your Sim900 without the request being initiated first from Sim900
3. To receive data from outside, your Arduino needs to configure Sim900 as a HTTP server, however, almost all SIM providers block that. In my case, I needed special permission from the mobile network provider for this.
Therefore, your Sim900 must first send a HTTP request to the external server and only then, it can read the response back. Entities from outside cannot send a message to your Sim900 unless it acts as a server.
Hello sir,
I want to post some data to server using SIM 800A,For that i need to set up TLS connection. So i have to enable AT+CIPSSL=1 or AT+HTTPSSL=1(tcp or http)..but i am not able to connect to server. i a getting CLOSE OK response after CIPSTART (incase of TCP)..Does Sim 800A has preinstalled SSL certificate? or Do i need to install SSL certificate?I tried importing certificate using AT+SSLSETCERT=”file” but everytime import fails..
If i use HTTP i am getting 606 error..sir can you please help me with this?
I have not tried this, but I guess this is because of perhaps certificate issues.
Hello Sir,
I want to post some data to TLS server from SIM800A.If i enable SSL function using AT+CIPSSL=1,when i execute CIPSTART command i am getting response as CLOSE OK,it is not connecting.If i use http i am getting network error after AT+HTTPACTION=1,Does sim 800A supports TLS connection?If so why am i not getting ?Do i need to upgrade the firmware ? or if i have to import the SSL certificate how i can do?please help me with this.
Hi sir, I am trying to send data to php server.The gsm responds properly until the tcp connection establishment (At+cipstart) Can you help
Can you please elaborate. What is the meaning of ‘GSM reponds until AT+CIPSTART’. What happens after that? Module hangs, or you get connection timeout, or you get no connection, or you get HTTP error…There are many possibilities. Please elaborate.