# how do I send an sms?

**URL:** https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953
**Category:** Development tools
**Created:** [March 12, 2011, 6:35am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953 "2011-03-12T06:35:45Z")
**Posts on this page:** 19
**Page:** 1

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 12, 2011, 6:35am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/1 "2011-03-12T06:35:45Z")

</div>

I tried this but it didn’t work.

```auto
/* file: main.c */
#include "adl_global.h"
#include "generated.h"

/* variables */
static s8 sms_automaton_Handle_txt;

void SMS_AUTO_ctrl_Handler(u8 Event, u16 Nb)
{
    // Does nothing
}

bool SMS_AUTO_Handler(ascii *SmsTel, ascii *SmsTimeOrLength, ascii *SmsText)
{
    return FALSE;
}

void main_task ( void )
{
    // Subscribe to the SMS Service
    sms_automaton_Handle_txt = adl_smsSubscribe(SMS_AUTO_Handler, SMS_AUTO_ctrl_Handler, ADL_SMS_MODE_TEXT);
    adl_smsSend(sms_automaton_Handle_txt, "+628813227153", "SMS test", ADL_SMS_MODE_TEXT);
}
```

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 12, 2011, 1:27pm UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/2 "2011-03-12T13:27:57Z")

</div>

Rule 1 in any form of programming:

Never ignore the return values from API calls!

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 13, 2011, 5:24am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/3 "2011-03-13T05:24:02Z")

</div>

ok, the adl\_smsSubscribe return successfully but the adl\_smsSend said that “initialization not yet  
performed, or sending an SMS already in progress” (ADL\_RET\_ERR\_BAD\_STATE).  
what does it mean?  
if I should perform some initialization, what initialization should I perform?  
is it about mandatory API?  
I’ve search about mandatory API chapter but I couldn’t find it.

---

<div class="post-metadata">

### Author: ![manikandan.t](https://avatars.discourse-cdn.com/v4/letter/m/8baadc/32.png) [@manikandan.t](https://forum.sierrawireless.com/u/manikandan.t)
#### Post date: [March 14, 2011, 6:05am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/4 "2011-03-14T06:05:07Z")

</div>

> [@](#):
>
> ADL\_RET\_ERR\_BAD\_STATE

product is not ready to send an SMS  
(initialization not yet performed, or sending an SMS already in  
progress)

Here initialization implies GSM network registration . Check you are sending SMS after complete registration of network, also wait until last SMS has been sent.

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 14, 2011, 7:04am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/5 "2011-03-14T07:04:52Z")

</div>

> [@manikandan.t](#):
>
> > [@](#):
> >
> > ADL\_RET\_ERR\_BAD\_STATE
> 
> product is not ready to send an SMS  
> (initialization not yet performed, or sending an SMS already in  
> progress)
> 
> Here initialization implies GSM network registration . Check you are sending SMS after complete registration of network, also wait until last SMS has been sent.

by using adl\_simSubscribe function?

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 14, 2011, 2:22pm UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/6 "2011-03-14T14:22:15Z")

</div>

> [@cph](#):
>
> by using adl\_simSubscribe function?

Study the documentation for the adl\_simSubscribe function - does it give you all the information necessary to know when the unit is ready to send an SMS…?

Take a look through the FAQ/Wiki thread - in particular: [viewtopic.php?f=7&t=3766&start=15#p17708](https://forum.sierrawireless.com/viewtopic.php?f=7&t=3766&start=15#p17708)

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 15, 2011, 5:45am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/7 "2011-03-15T05:45:38Z")

</div>

here’s my code at the moment:

```auto
#include "adl_global.h"
#include "generated.h"

/* variables */
static s8 sms_automaton_Handle_txt;

void SMS_AUTO_ctrl_Handler(u8 Event, u16 Nb)
{
    switch (Event) {
    case ADL_SMS_EVENT_SENDING_ERROR:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): ADL_SMS_EVENT_SENDING_ERROR\r\n");
    	break;
    case ADL_SMS_EVENT_SENDING_MR:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): ADL_SMS_EVENT_SENDING_MR\r\n");
    	break;
    default:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): OK\r\n");
    	break;
    }
}

bool SMS_AUTO_Handler(ascii *SmsTel, ascii *SmsTimeOrLength, ascii *SmsText)
{
	ascii *foo = (ascii*)adl_memGet(50);

	if (foo != NULL) {
		wm_strcpy(foo, "\r\n");
		wm_strcpy(foo, SmsTel);
		wm_strcat(foo, " ");
		wm_strcat(foo, SmsText);
		wm_strcat(foo, "\r\n");
		adl_atSendResponse(ADL_AT_UNS, foo);
		adl_memRelease(foo);
	} else {
		adl_atSendResponse(ADL_AT_UNS, "\r\nout of memory.\r\n");
	}

    return FALSE;
}

void sim_Hdlr (u8 ev)
{
}

void main_task ( void )
{
    // Subscribe to the SMS Service
    sms_automaton_Handle_txt = adl_smsSubscribe(SMS_AUTO_Handler, SMS_AUTO_ctrl_Handler, ADL_SMS_MODE_TEXT);

    switch (adl_simSubscribe(sim_Hdlr, NULL)) {
    case ADL_RET_ERR_SERVICE_LOCKED:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_simSubscribe(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
    	break;
    case ADL_RET_ERR_ALREADY_SUBSCRIBED:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_simSubscribe(): ADL_RET_ERR_ALREADY_SUBSCRIBED\r\n");
    	break;
    case ADL_RET_ERR_PARAM:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_simSubscribe(): ADL_RET_ERR_PARAM\r\n");
    	break;
    default:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_simSubscribe(): OK\r\n");
    	break;
    }

    switch (sms_automaton_Handle_txt) {
    case ADL_RET_ERR_PARAM:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSubscribe(): ADL_RET_ERR_PARAM\r\n");
    	break;
    case ADL_RET_ERR_SERVICE_LOCKED:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSubscribe(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
    	break;
    default:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSubscribe(): OK\r\n");
    	break;
    }

    switch (adl_smsSend(sms_automaton_Handle_txt, "+628813227153", "SMS test", ADL_SMS_MODE_TEXT)) {
    case ADL_RET_ERR_PARAM:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_PARAM\r\n");
    	break;
    case ADL_RET_ERR_UNKNOWN_HDL:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_UNKNOWN_HDL\r\n");
    	break;
    case ADL_RET_ERR_BAD_STATE:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_BAD_STATE\r\n");
    	break;
    case ADL_RET_ERR_SERVICE_LOCKED:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
    	break;
    default:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): OK\r\n");
    	break;
    }
}
```

and here’s the result:  
 ![](http://i55.tinypic.com/6s748j.jpg)

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 15, 2011, 6:54am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/8 "2011-03-15T06:54:59Z")

</div>

Where in the code do you check to see that the unit is ready to send an SMS ❓

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 15, 2011, 7:07am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/9 "2011-03-15T07:07:41Z")

</div>

I have no idea how to do it.

---

<div class="post-metadata">

### Author: ![paruthiv](https://avatars.discourse-cdn.com/v4/letter/p/eb8c5e/32.png) [@paruthiv](https://forum.sierrawireless.com/u/paruthiv)
#### Post date: [March 16, 2011, 6:53am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/10 "2011-03-16T06:53:25Z")

</div>

Hi  
In your code make sure you wait for the specific +WIND indications before performing your operation.  
In this case you need to wait for +WIND:16 indication(which specifies that SMS and SMS CB services have been initialized).

Regards  
Paruthiv

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 16, 2011, 7:32am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/11 "2011-03-16T07:32:44Z")

</div>

> [@paruthiv](#):
>
> In your code make sure you wait for the specific +WIND indications before performing your operation.

No - there isn’t a specific +WIND: indication for this.

> [@](#):
>
> In this case you need to wait for +WIND:16 indication(which specifies that SMS and SMS CB services have been initialized).

This is necessary, but not sufficient.

This just indicates that the initialisation is complete on the module - it does not indicate that the module is GSM-Registered!

Again, the OP needs to spend time studying the AT Commands Guide to look at what commands & indications are available.

Specifically, AT+CREG queries the current registration state - and can be used to enable unsolicited indication when the state changes.

So the unit can either use AT+CREG to specifically check - or “poll” - the current registration state, or use the unsolicited notifications to maintain its own record of the state.

The ADL User Guide tells how to issue AT Commands, and how to monitor (or “subscribe” to) unsolicited indications.

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 20, 2011, 3:41am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/12 "2011-03-20T03:41:29Z")

</div>

> [@paruthiv](#):
>
> Hi  
> In your code make sure you wait for the specific +WIND indications before performing your operation.  
> In this case you need to wait for +WIND:16 indication(which specifies that SMS and SMS CB services have been initialized).
> 
> Regards  
> Paruthiv

thanks

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 28, 2011, 5:02am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/13 "2011-03-28T05:02:43Z")

</div>

it’s still not working.  
here’s my code:

```auto
#include "adl_global.h"
#include "generated.h"

void SMS_AUTO_ctrl_Handler(u8 Event, u16 Nb)
{
	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler()\r\n");
    switch (Event) {
    case ADL_SMS_EVENT_SENDING_ERROR:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): ADL_SMS_EVENT_SENDING_ERROR\r\n");
    	break;
    case ADL_SMS_EVENT_SENDING_MR:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): ADL_SMS_EVENT_SENDING_MR\r\n");
    	break;
    default:
    	adl_atSendResponse(ADL_AT_UNS, "\r\nSMS_AUTO_ctrl_Handler(): OK\r\n");
    	break;
    }
}

bool SMS_AUTO_Handler(ascii *SmsTel, ascii *SmsTimeOrLength, ascii *SmsText)
{
	ascii *foo = (ascii*)adl_memGet(50);

	if (foo != NULL) {
		wm_strcpy(foo, "\r\n");
		wm_strcpy(foo, SmsTel);
		wm_strcat(foo, " ");
		wm_strcat(foo, SmsText);
		wm_strcat(foo, "\r\n");
		adl_atSendResponse(ADL_AT_UNS, foo);
		adl_memRelease(foo);
	} else {
		adl_atSendResponse(ADL_AT_UNS, "\r\nout of memory.\r\n");
	}

    return FALSE;
}

bool unso_hdlr (adl_atUnsolicited_t *param)
{
	s8 sms_automaton_Handle_txt = adl_smsSubscribe(SMS_AUTO_Handler, SMS_AUTO_ctrl_Handler, ADL_SMS_MODE_TEXT);

	adl_atSendResponse(ADL_AT_UNS, "\r\nunso_hdlr(): OK\r\n");

	switch (adl_smsSend(sms_automaton_Handle_txt, "+628813227153", "SMS test", ADL_SMS_MODE_TEXT)) {
	case ADL_RET_ERR_PARAM:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_PARAM\r\n");
		break;
	case ADL_RET_ERR_UNKNOWN_HDL:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_UNKNOWN_HDL\r\n");
		break;
	case ADL_RET_ERR_BAD_STATE:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_BAD_STATE\r\n");
		break;
	case ADL_RET_ERR_SERVICE_LOCKED:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
		break;
	default:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_smsSend(): OK\r\n");
		break;
	}

	return(TRUE);
}

void main_task ( void )
{
    // TODO Insert your task initialization code here
	switch (adl_atUnSoSubscribe("+CREG: 1", unso_hdlr)) {
	case OK:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_atUnSoSubscribe(): OK\r\n");
		break;
	case ERROR:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_atUnSoSubscribe(): ERROR\r\n");
		break;
	case ADL_RET_ERR_SERVICE_LOCKED:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_atUnSoSubscribe(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
		break;
	default:
		adl_atSendResponse(ADL_AT_UNS, "\r\nadl_atUnSoSubscribe(): unknown error\r\n");
		break;
	}
}
```

and here’s the result:  
 ![](http://i53.tinypic.com/zx5r2c.jpg)

any suggestion?

---

<div class="post-metadata">

### Author: ![BenFT01](https://avatars.discourse-cdn.com/v4/letter/b/73ab20/32.png) [@BenFT01](https://forum.sierrawireless.com/u/BenFT01)
#### Post date: [March 28, 2011, 9:17am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/14 "2011-03-28T09:17:55Z")

</div>

Have you worked through the SW example code?

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 28, 2011, 9:33am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/15 "2011-03-28T09:33:01Z")

</div>

> [@cph](#):
>
> here’s the result

Really?

What you showed there doesn’t match the code that you posted - does it?

And what did I say about ignoring the return values from API calls…?

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 28, 2011, 2:47pm UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/16 "2011-03-28T14:47:52Z")

</div>

> [@BenFT01](#):
>
> Have you worked through the SW example code?

the example is for incoming sms

> [@awneil](#):
>
> > [@cph](#):
> >
> > here’s the result
> 
> Really?
> 
> What you showed there doesn’t match the code that you posted - does it?
> 
> And what did I say about ignoring the return values from API calls…?

I entered the command “AT+CREG=1” manually if that’s what you mean.

if I had to conclude what to do (the steps) to send a single sms after reading some hundreds of pages of a manual (or two), well I have to admit that I’m not that smart sir.

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 29, 2011, 7:06am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/17 "2011-03-29T07:06:24Z")

</div>

> [@I](#):
>
> What you showed there doesn’t match the code that you posted - does it?

This is the output that you showed:

This is the start of the code that you showed:

```auto
void main_task ( void )
{
    // TODO Insert your task initialization code here
   switch( adl_atUnSoSubscribe("+CREG: 1", unso_hdlr) ) {
   case OK:
      adl_atSendResponse( ADL_AT_UNS, 
      "\r\nadl_atUnSoSubscribe(): OK\r\n");
      break;

   case ERROR:
      adl_atSendResponse( ADL_AT_UNS, 
      "\r\nadl_atUnSoSubscribe(): ERROR\r\n");
      break;

   case ADL_RET_ERR_SERVICE_LOCKED:
      adl_atSendResponse( ADL_AT_UNS, 
      "\r\nadl_atUnSoSubscribe(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
      break;

   default:
      adl_atSendResponse( ADL_AT_UNS, 
      "\r\nadl_atUnSoSubscribe(): unknown error\r\n");
      break;
   }
}
```

None of those outputs appears in your picture, so I think it’s fair to say that the picture doesn’t match the code!

In your unso\_hdlr, you use the handle value before checking that it is valid:

```auto
bool unso_hdlr( adl_atUnsolicited_t *param )
{
   s8 sms_automaton_Handle_txt = adl_smsSubscribe( SMS_AUTO_Handler, 
                                     SMS_AUTO_ctrl_Handler, ADL_SMS_MODE_TEXT );

   adl_atSendResponse( ADL_AT_UNS, "\r\nunso_hdlr(): OK\r\n" );

   switch
   ( 
       adl_smsSend
       ( 
           sms_automaton_Handle_txt, // you haven't checked this!
           "+628813227153", 
           "SMS test", 
           ADL_SMS_MODE_TEXT
       ) 
   ) 
   {
```

---

<div class="post-metadata">

### Author: ![cph](https://avatars.discourse-cdn.com/v4/letter/c/838e76/32.png) [@cph](https://forum.sierrawireless.com/u/cph)
#### Post date: [March 29, 2011, 8:55am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/18 "2011-03-29T08:55:57Z")

</div>

> [@awneil](#):
>
> > [@I](#):
> >
> > What you showed there doesn’t match the code that you posted - does it?
> 
> This is the output that you showed:
> 
> This is the start of the code that you showed:
> 
> ```auto
> void main_task ( void )
> {
> // TODO Insert your task initialization code here
> switch( adl_atUnSoSubscribe("+CREG: 1", unso_hdlr) ) {
> case OK:
> adl_atSendResponse( ADL_AT_UNS, 
> "\r\nadl_atUnSoSubscribe(): OK\r\n");
> break;
> 
> case ERROR:
> adl_atSendResponse( ADL_AT_UNS, 
> "\r\nadl_atUnSoSubscribe(): ERROR\r\n");
> break;
> 
> case ADL_RET_ERR_SERVICE_LOCKED:
> adl_atSendResponse( ADL_AT_UNS, 
> "\r\nadl_atUnSoSubscribe(): ADL_RET_ERR_SERVICE_LOCKED\r\n");
> break;
> 
> default:
> adl_atSendResponse( ADL_AT_UNS, 
> "\r\nadl_atUnSoSubscribe(): unknown error\r\n");
> break;
> }
> }
> ```
> 
> None of those outputs appears in your picture, so I think it’s fair to say that the picture doesn’t match the code!
> 
> In your unso\_hdlr, you use the handle value before checking that it is valid:
> 
> ```auto
> bool unso_hdlr( adl_atUnsolicited_t *param )
> {
> s8 sms_automaton_Handle_txt = adl_smsSubscribe( SMS_AUTO_Handler, 
> SMS_AUTO_ctrl_Handler, ADL_SMS_MODE_TEXT );
> 
> adl_atSendResponse( ADL_AT_UNS, "\r\nunso_hdlr(): OK\r\n" );
> 
> switch
> ( 
> adl_smsSend
> ( 
> sms_automaton_Handle_txt, // you haven't checked this!
> "+628813227153", 
> "SMS test", 
> ADL_SMS_MODE_TEXT
> ) 
> ) 
> {
> ```

never mind, I finally figure it out. but thanks anyway.

I just wish there are some tutorials for a non-scientist person like me.

---

<div class="post-metadata">

### Author: ![awneil](https://avatars.discourse-cdn.com/v4/letter/a/49beb7/32.png) [@awneil](https://forum.sierrawireless.com/u/awneil)
#### Post date: [March 29, 2011, 11:39am UTC](https://forum.sierrawireless.com/t/how-do-i-send-an-sms/4953/19 "2011-03-29T11:39:13Z")

</div>

> [@cph](#):
>
> I just wish there are some tutorials for a non-scientist person like me.

So how about you conclude this thread by explaining what you did to get it going?  
That would benefit the next “non-scientist” to come along with the same question.

But what is it that you think is so “scientific” about this?

Programming is, in its very nature, a discipline that requires careful analysis, design and attention to detail. Not everyone is cut out to be a programmer…
