示例#1
0
bool GPRSHTTP::post_init(uint32_t content_length) {
    set_error_condition(SIM900_ERROR_NO_ERROR);
    if(content_length > _sim->max_http_post_size)
    {
        if(SIM900_DEBUG_OUTPUT)
        {
            SIM900_DEBUG_OUTPUT_STREAM->print("Specified Content Length: ");
            SIM900_DEBUG_OUTPUT_STREAM->print(content_length);
            SIM900_DEBUG_OUTPUT_STREAM->print(" is greater than the maximum allowed post size of ");
            SIM900_DEBUG_OUTPUT_STREAM->println(_sim->max_http_post_size);
        }
        set_error_condition(SIM900_ERROR_MAX_POST_DATA_SIZE_EXCEEDED);
        return false;
    }
    _sim->_serial->write("AT+HTTPDATA=");
    _sim->_serial->print(content_length, DEC);
    _sim->_serial->write(",");
    _sim->_serial->println(SIM900_HTTP_TIMEOUT, DEC);
    if(!_sim->waitFor("DOWNLOAD", true, NULL))
    {
        return false;
    }
    write_limit = content_length;
//	return _sim->_serial;
    return true;

}
示例#2
0
int GPRSHTTP::read()
{
    set_error_condition(SIM900_ERROR_NO_ERROR);
    unsigned long time = millis();
    int avail = 0;
    if(!_data_ready)
    {
        set_error_condition(SIM900_ERROR_DATA_NOT_READY);
        return SIM900_ERROR_DATA_NOT_READY;
    }
    if(read_count++ <= read_limit)
    {
        while((avail = available()) == false)
        {
            if((millis() - time) > SIM900_INPUT_TIMEOUT)
            {
                if(SIM900_DEBUG_OUTPUT)
                {
                    SIM900_DEBUG_OUTPUT_STREAM->println("The timeout was reached whilst trying to read the HTTP response.");
                }
                return SIM900_ERROR_TIMEOUT;
            }
        }
        if(avail > 0)
        {
            return _sim->_serial->read();
        } else
        {
            set_error_condition(avail);
            return avail;
        }
    }
    else
    {
        if(SIM900_DEBUG_OUTPUT)
        {
            set_error_condition(SIM900_ERROR_READ_LIMIT_EXCEEDED);
            SIM900_DEBUG_OUTPUT_STREAM->print("Read limit: ");
            SIM900_DEBUG_OUTPUT_STREAM->print(read_limit);
            SIM900_DEBUG_OUTPUT_STREAM->print(" has been exceed by read count: ");
            SIM900_DEBUG_OUTPUT_STREAM->println(read_count);
        }
    }
    return -1;
}
示例#3
0
int GPRSHTTP::peek()
{
    set_error_condition(SIM900_ERROR_NO_ERROR);
    if(read_count <= read_limit)
    {
        return _sim->_serial->peek();
    }
    else
    {
        if(SIM900_DEBUG_OUTPUT)
        {
            set_error_condition(SIM900_ERROR_READ_LIMIT_EXCEEDED);
            SIM900_DEBUG_OUTPUT_STREAM->print("Read limit: ");
            SIM900_DEBUG_OUTPUT_STREAM->print(read_limit);
            SIM900_DEBUG_OUTPUT_STREAM->print(" has been exceed by read count: ");
            SIM900_DEBUG_OUTPUT_STREAM->print(read_count);
        }
    }
    return -1;

}
示例#4
0
bool Sim900::is_valid_connection_settings(CONN settings)
{
    if(!(settings.cid >= 0 && settings.cid <= 5))
    {
        set_error_condition(SIM900_ERROR_INVALID_CID_VALUE);
        return false;
    }
    if(!is_valid_connection_type(settings.contype))
    {
        set_error_condition(SIM900_ERROR_INVALID_CONNECTION_TYPE);
        return false;
    }
    if(settings.apn != NULL && !(strlen(settings.apn) <= SIM900_MAX_CONNECTION_SETTING_CHARACTERS))
    {
        set_error_condition(SIM900_ERROR_CHARACTER_LIMIT_EXCEEDED);
        return false;
    }
    if(settings.user!= NULL && !(strlen(settings.user) <= SIM900_MAX_CONNECTION_SETTING_CHARACTERS))
    {
        set_error_condition(SIM900_ERROR_CHARACTER_LIMIT_EXCEEDED);
        return false;
    }
    if(settings.pwd != NULL && !(strlen(settings.pwd) <= SIM900_MAX_CONNECTION_SETTING_CHARACTERS))
    {
        set_error_condition(SIM900_ERROR_CHARACTER_LIMIT_EXCEEDED);
        return false;
    }
    if(settings.rate != NULL && !is_valid_connection_rate(settings.rate))
    {
        set_error_condition(SIM900_ERROR_INVALID_CONNECTION_RATE);
        return false;
    }
    return true;
}
示例#5
0
bool Sim900::lock()
{
    if(_lock == 0)
    {
        if(SIM900_DEBUG_OUTPUT) {
            SIM900_DEBUG_OUTPUT_STREAM->println("Locked....");
        }
        _lock = 1;
        return true;
    }
    set_error_condition(SIM900_ERROR_COULD_NOT_AQUIRE_LOCK);
    return false;
}
示例#6
0
GPRSHTTP* Sim900::createHTTPConnection(CONN settings, char URL[])
{
    set_error_condition(SIM900_ERROR_NO_ERROR);
    if(is_valid_connection_settings(settings) && lock()) {
        if(settings.contype != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"CONTYPE\",\"");
            _serial->write(settings.contype);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }
        if(settings.apn != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"APN\",\"");
            _serial->write(settings.apn);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }
        if(settings.user != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"USER\",\"");
            _serial->write(settings.user);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }
        if(settings.pwd != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"PWD\",\"");
            _serial->write(settings.pwd);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }
        if(settings.phone != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"PHONENUM\",\"");
            _serial->write(settings.phone);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }
        if(settings.rate != NULL)
        {
            _serial->write("AT+SAPBR=3,");
            _serial->print(settings.cid, DEC);
            _serial->write(",\"RATE\",\"");
            _serial->write(settings.rate);
            _serial->println("\"");
            waitFor("OK", true, NULL);
        }

        return new GPRSHTTP(this, settings.cid, URL);
    }
    return NULL;
}
示例#7
0
int Sim900::waitFor(char target[], bool dropLastEOL, String* data, unsigned long timeout)
{
    set_error_condition(SIM900_ERROR_NO_ERROR);
    if(SIM900_DEBUG_OUTPUT) {
        SIM900_DEBUG_OUTPUT_STREAM->print("Waiting for: ");
        SIM900_DEBUG_OUTPUT_STREAM->println(target);
    }
    unsigned long time = millis();
    int len = strlen(target);
    int test_len = len;
    if(test_len < 5)
    {
        test_len = 5;
    }
    int pos = 0;
    char tmp[test_len + 1];
    tmp[test_len] = NULL;
    char _tmp;
    bool concat = data != NULL;
    while(!compare(tmp, target, pos, len, test_len))
    {
        if(compare(tmp, "ERROR", pos, 5, test_len))
        {
            if(SIM900_DEBUG_OUTPUT) {
                SIM900_DEBUG_OUTPUT_STREAM->println("");
                SIM900_DEBUG_OUTPUT_STREAM->println("ERROR");
            }
            set_error_condition(SIM900_ERROR_MODEM_ERROR);
            return false;
        }
        if(_serial->available())
        {
            _tmp = _serial->read();
            if(SIM900_DEBUG_OUTPUT) {
                SIM900_DEBUG_OUTPUT_STREAM->write(_tmp);
            }
            if(concat) {
                data->concat(_tmp);
            }
            tmp[pos++ % test_len] = _tmp;
            time = millis();
        } else if((millis() - time) > timeout)
        {
            set_error_condition(SIM900_ERROR_TIMEOUT);
            if(SIM900_DEBUG_OUTPUT) {
                SIM900_DEBUG_OUTPUT_STREAM->println("");
                SIM900_DEBUG_OUTPUT_STREAM->print("Timed out waiting for: ");
                SIM900_DEBUG_OUTPUT_STREAM->println(target);
            }
            return false;
        }
    }
    if(dropLastEOL)
    {
        dropEOL();
    }
    if(SIM900_DEBUG_OUTPUT) {
        SIM900_DEBUG_OUTPUT_STREAM->println("");
        SIM900_DEBUG_OUTPUT_STREAM->println("Found it!");
    }
    return true;

}
void connection_engine::disconnected(const proton::error_condition& err) {
    set_error_condition(err, pn_transport_condition(unwrap(transport_)));
    read_close();
    write_close();
}
示例#9
0
void link::close(const error_condition& condition) {
    set_error_condition(condition, pn_link_condition(pn_object()));
    close();
}
示例#10
0
void session::close(const error_condition& condition) {
    set_error_condition(condition, pn_session_condition(pn_object()));
    close();
}