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; }
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; }
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; }
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; }
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; }
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; }
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(); }
void link::close(const error_condition& condition) { set_error_condition(condition, pn_link_condition(pn_object())); close(); }
void session::close(const error_condition& condition) { set_error_condition(condition, pn_session_condition(pn_object())); close(); }