user943: I'm planning to build a device that would read some sensor data and send it via GPRS, eg. once per day. (Not that original, yeah.) But my problem is choosing a GSM/GPRS shield.
The official shield has a nice interface for doing an HTTP POST/GET. OTOH, the shield seems to be sold out (and would be quite expensive anyway).
There seem to be other shields available, but their code examples tend to look quite hacky: the device waits for an arbitrary moment and then hopes that the server is done. That's IMO both inefficient or unreliable.
My question: which GSM/GPRS shield would you recommend, with these features:
a sane library w/ examples, such as the official onean external antennabonus: a competitive priceanother bonus: hopefully a "real" shield, so no soldering required and a few pins still easily usable for the sensors.

user943: I ended up ordering an Elechouse board which uses the M10 chip. Found one on eBay for 59 USD. It appears to work fine with the official library.
As the manual says, it must be given external power - the USB cable isn't enough!

user11: That library should work with pretty much anything that has the M10 module on it.
I only have experience with the SIM900 modules. Found the cheapest one on EBay.
While interfacing with these things can be a challenge at first, you really just need to read the manual for all the AT commands and execute them. I've written a couple of functions that may help:
Note: you may safely replace all instances of DEBUG_PRINT and DEBUG_PRINTLN with Serial.print and Serial.println.
SoftwareSerial SIM900(7, 8);

/*
    Sends AT commands to SIM900 module.

    Parameter   Description
    command     String containing the AT command to send to the module
    timeout     A timeout, in milliseconds, to wait for the response

    Returns a string containing the response. Returns NULL on timeout.

*/
String SIMCommunication::sendCommand(String command, int timeout) {
    SIM900.listen();
    // Clear read buffer before sending new command
    while(SIM900.available()) { SIM900.read(); }

    SIM900.println(command);

    if (responseTimedOut(timeout)) {
        DEBUG_PRINT(F("sendCommand Timed Out: "));DEBUG_PRINTLN(command);
        return NULL;
    }

    String response = "";

    while(SIM900.available()) {
        response.concat((char)SIM900.read());
        delayMicroseconds(500);
    }

    return response;
}

/*
    Waits for a response from SIM900 for <ms> milliseconds

    Returns true if timed out without response. False otherwise.
*/
bool SIMCommunication::responseTimedOut(int ms) {
    SIM900.listen();

    int counter = 0;
    while(!SIM900.available() && counter < ms) {
        counter++;
        delay(1);
    }

    // Timed out, return null
    if (counter >= ms) {
        return true;
    }
    counter = 0;
    return false;
}


user1302: I would recommend the official Arduino GSM shield.

943: <p>I&#039;m planning to build a device that would read some sensor data and send it via GPRS, eg. once per day. (Not that original, yeah.) But my problem is choosing a GSM/GPRS shield.</p>

<p>The official shield has a <a href="http://arduino.cc/en/Guide/ArduinoGSMShield#toc10"><strong>nice interface for doing an HTTP POST/GET</strong></a>. OTOH, the shield seems to be sold out (and would be quite expensive anyway).</p>

<p>There seem to be other shields available, but their code examples tend to look <a href="http://www.seeedstudio.com/wiki/GPRS_Shield_V1.0#A_Simple_Source_Code_Examples"><strong>quite hacky</strong></a>: the device waits for an arbitrary moment and then hopes that the server is done. That&#039;s IMO both inefficient or unreliable.</p>

<p>My question: which GSM/GPRS shield would you recommend, with these features:</p>

<ul><li>a sane library w/ examples, such as the official one</li><li>an external antenna</li><li>bonus: a competitive price</li><li>another bonus: hopefully a &quot;real&quot; shield, so no soldering required and a few pins still easily usable for the sensors.</li></ul>
 943: <p>I ended up ordering an <a href="http://www.elechouse.com/elechouse/images/product/GSM_shield/GSM-GPRSModule.pdf" rel="nofollow"><strong>Elechouse board</strong></a> which uses the M10 chip. Found one on eBay for 59 USD. It appears to work fine with the official library.</p>

<p>As the manual says, it must be given external power - the USB cable isn't enough!</p>
 11: <p>That library should work with pretty much anything that has the M10 module on it.</p>

<p>I only have experience with the SIM900 modules. Found the cheapest one on EBay.</p>

<p>While interfacing with these things can be a challenge at first, you really just need to read the manual for all the AT commands and execute them. I've written a couple of functions that may help:</p>

<p>Note: you may safely replace all instances of <code>DEBUG_PRINT</code> and <code>DEBUG_PRINTLN</code> with <code>Serial.print</code> and <code>Serial.println</code>.</p>

<pre><code>SoftwareSerial SIM900(7, 8);

/*
    Sends AT commands to SIM900 module.

    Parameter   Description
    command     String containing the AT command to send to the module
    timeout     A timeout, in milliseconds, to wait for the response

    Returns a string containing the response. Returns NULL on timeout.

*/
String SIMCommunication::sendCommand(String command, int timeout) {
    SIM900.listen();
    // Clear read buffer before sending new command
    while(SIM900.available()) { SIM900.read(); }

    SIM900.println(command);

    if (responseTimedOut(timeout)) {
        DEBUG_PRINT(F("sendCommand Timed Out: "));DEBUG_PRINTLN(command);
        return NULL;
    }

    String response = "";

    while(SIM900.available()) {
        response.concat((char)SIM900.read());
        delayMicroseconds(500);
    }

    return response;
}

/*
    Waits for a response from SIM900 for &lt;ms&gt; milliseconds

    Returns true if timed out without response. False otherwise.
*/
bool SIMCommunication::responseTimedOut(int ms) {
    SIM900.listen();

    int counter = 0;
    while(!SIM900.available() &amp;&amp; counter &lt; ms) {
        counter++;
        delay(1);
    }

    // Timed out, return null
    if (counter &gt;= ms) {
        return true;
    }
    counter = 0;
    return false;
}
</code></pre>
 1302: <p>I would recommend the official <a href="http://arduino.cc/en/Main/ArduinoGSMShield" rel="nofollow">Arduino GSM shield</a>.</p>
