Return to Snippet

Revision: 68404
at January 17, 2015 00:55 by Gupta86


Initial Code
#include<iostream>
#include<sstream>
#include<windows.h>
#include<wininet.h>

using namespace std;

string encode(string url);

int main(int argc, char** argv)
{
	// the SMS gateway's host
	// and port
	string host       = "localhost";     
	int port          = 9502;

	// username 
	// and password
	string username   = "admin";         
	string password   = "abc123";

	// message
	string message    = "This is a test SMS."; 

	// originator's phone number
	string originator = "+44555555555";    

	// recipient's phone number.
	// to send the SMS to multiple recipients, separate them by using commas without spaces
	string recipient  = "+44333333333";    
										 										 
	// preparing the HTTPRequest URL	
	stringstream url;					 
		url << "/api?action=sendmessage&username=" << encode(username);
		url << "&password=" << encode(password);
		url << "&recipient=" << encode(recipient);
		url << "&messagetype=SMS:TEXT&messagedata=" << encode(message);
		url << "&originator=" << encode(originator);
		url << "&responseformat=xml";

	// create socket
	HINTERNET inet = InternetOpen("Ozeki", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

	// open connection and bind it to the socket
	HINTERNET conn = InternetConnect(inet, host.c_str() , port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);

	// open the HTTP request
	HINTERNET sess = HttpOpenRequest(conn, "GET", url.str().c_str(), "HTTP/1.1", NULL, NULL, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

    // check errors  	
	int error = GetLastError();
	if(error == NO_ERROR)
	{
		// send HTTP request
		HttpSendRequest(sess, NULL, 0, NULL,0);

		// receive HTTP response

		int size = 1024;
		char *buffer = new char[size + 1];
		DWORD read;
		int rsize = InternetReadFile(sess, (void *)buffer, size, &read);
		string s = buffer;
		s = s.substr(0, read);

		// check status code
		int pos = s.find("<statuscode>0</statuscode>");
	
		// if statuscode is 0, write "Message sent." to output
		// else write "Error."
		if(pos > 0) cout << "Message sent." << endl;
		else cout << "Error." << endl;
	}

	system("pause");
}


// encoding converts characters that are not allowed in a URL into character-entity equivalent
string encode(string url)
{
	char *hex = "0123456789abcdef";
	stringstream s;

	for(unsigned int i = 0; i < url.length(); i++)
	{
		byte c = (char)url.c_str()[i];
		if( ('a' <= c && c <= 'z')
		|| ('A' <= c && c <= 'Z')
		|| ('0' <= c && c <= '9') ){
			s << c;
		} else {
			if(c == ' ') s << "%20";
			else
			s << '%' << (hex[c >> 4]) << (hex[c & 15]);
		}
	}
	
	return s.str();
}

Initial URL
http://www.ozekisms.com

Initial Description
Hey Guys,

This is a short and straightforward article (or let’s say „tip” or „mini-review”) that presents how to send SMS messages from your own C++ (Cpp / C plus plus) application through HTTP. You will see, it is gonna be really easy. I will focus on the necessary code, but I would like to draw your attention to all the hardware and software requirements that are essentially needed for SMS messaging.

Briefly about SMS technology for better understanding

If you are proficient in SMS technology, just skip this paragraph and move on to the next one. So well, if you want to send SMS messages from your C++ application, first you need to connect your software and an SMS gateway to each other. Why? Because your application let you compose the SMS messages (including the text, the recipient’s phone number, etc.), but if you want to send out the SMS, you need to connect to the SMSC (Short Message Service Center that stores, forwards, converts and delivers SMS messages). An SMS gateway is able to connect to the SMSC of the Mobile Service Provider via SMPP IP SMS connection or a GSM modem, so actually the SMS gateway can send out your message. To establish connection between the SMS gateway and the C++ application, I used HTTP requests and responses. For sending SMS messages through HTTP, your SMS gateway should have a built-in webserver (e.g. Ozeki NG – www.ozekisms.com). The built-in webserver allows you to send SMS messages from your C++ application by calling an URL (HTTP Get) or using the HTTP Post method.

So that, all you need to have for sending SMS from your C++ application using HTTP is Microsoft Visual Studio for C++ development, an SMS gateway and my code snippet!

Okay and finally a few lines about testing. To test your software by sending out SMS message(s) actually, you need to install a GSM modem connection or an IP SMS connection. Buti f you have not contracted with any mobile service provider (e.g. AT&T or T-Mobile), you can test the SMS sending by simulating it (e.g.  Ozeki NG provides „HTTP Server Connection” that can be used for this purpose). For more details related to the configuration of the SMS gateway, please contact the vendor of your SMS gateway.

Happy coding! :)

Initial Title
C++ SMS source code on how to send SMS text messages using HTTP

Initial Tags
http, post, c, code, text, c++

Initial Language
C++