void example_main() { ipstack::Interface* interface = setupEthernet(); if (interface==0) { // ethernet setup failed printf("No ethernet card found!\n"); while(1); } //ipstack::api::TCP_Socket<1514,1,128,2> socket; //alloc on stack (variant 2) new(&socket) IP::TCP_Socket<1514,1,128,2>; //explicitly call constructor for global object (only for variant 1) //socket.setAlarm(TCPAlarmTask0); socket.set_sport(80); //server (telnet port) while(1){ printf("Wait for request: Connect with \"http://%s:%u\"\n", "10.0.3.2", socket.get_sport()); socket.listen(); int i=1; char buffer[512]; char url[100]; memset(buffer, 0, 512); i = socket.receive(buffer, 512); char* input = buffer; /// Parse requested url (example: GET /infotext.html HTTP/1.1) /// if (memcmp(input, "GET", 3)==0) { input += 4; unsigned pos = 0; for (;pos<99;++pos) { char c = input[pos]; if (c == ' ') break; url[pos] = c; } url[pos] = 0; // last character is 0 to terminate the string input += pos + 1; // jump to the character after the whitespace after the url // printf("Content: %s\n", input); if (memcmp(input, "HTTP/1", 6)==0) { showPage(url, pos); } else { printf("Request failed: %s\n", url); parseError(buffer); } } else { parseError(buffer); } while(socket.close() == false); printf("Terminated\n"); } }
void setup() { Serial.begin(9600); setupEthernet(); setSyncInterval(NTP_TIME_SYNC_INTERVAL); setSyncProvider(getNtpTime); if(timeStatus()== timeNotSet) { Serial.println("Sync failed during start"); } else { Serial.println("Sync successfully during start"); } }
void Alpha::functionTaskTask0() { ipstack::Interface* interface = setupEthernet(); if (interface==0) { // ethernet setup failed System::haltsystem(); } // You can ping CiAO IP now by using // * ping 10.0.3.2 (for icmp ping) // * ping6 fe80::6655:44ff:fe33:2211%tap0 (for icmp ping with ipv6 on tap0 device) // * echoping -u 10.0.3.2 (for udp ping; use ipv4 addresses, ipv6 is not supported by echoping for udp) // * sendip -p ipv6 -p udp -us 5070 -ud 8 -d "Hello" -v fe80::6655:44ff:fe33:2211 (for ipv6 udp ping) // * telnet 10.0.3.2 (for testing the tcp reset capability; use ipv4 or ipv6 address) // * Send udp to port 88 to get it printed out // Setup test ipv6 address: we will ping that address (and test the ndp address resolution) ipstack::ipv6addr testipv6; if (!parse_ipv6_addr("fe80:0:0:0:a81a:54ff:fef0:3f", testipv6)) { System::haltsystem(); } ICMPv6_Socket &icmpv6instance = ICMPv6_Socket::instance(); icmpv6instance.ipv6.set_dst_addr(testipv6); // src address is determined automatically // Setup test ipv4 address: we will ping that address (and test the arp address resolution) UInt32 testipv4 = IPv4_Packet::convert_ipv4_addr(10,0,3,1); ICMPv4_Socket &icmpv4instance = ICMPv4_Socket::instance(); icmpv4instance.ipv4.set_dst_addr(testipv4); // src address has been set above SendBuffer* sbi; const char teststring[] = "HELLO"; IP::UDP_Socket<1514,1,128,2> socket; socket.set_sport(88); socket.bind(); // listen printf("Send IPv4 ping\n"); sbi = icmpv4instance.requestSendBuffer(ICMP_Packet::ICMP_HEADER_SIZE+sizeof(teststring)); if (sbi) { sbi->mark("IPv4 ping"); ICMP_Packet* icmp = (ICMP_Packet*)sbi->getDataPointer(); icmp->set_type(ICMP_Packet::ICMP_TYPE_ECHO_REQUEST); icmp->set_code(ICMP_Packet::ICMP_CODE_ECHO); sbi->writtenToDataPointer(ICMP_Packet::ICMP_HEADER_SIZE); sbi->write(teststring, sizeof(teststring)); icmpv4instance.send(sbi); } printf("Send IPv6 ping\n"); sbi = icmpv6instance.requestSendBuffer(ICMPv6_Packet::ICMP_HEADER_SIZE+sizeof(teststring)+sizeof(UInt32)); if (sbi) { sbi->mark("IPv6 ping"); ICMPv6_Packet* icmp = (ICMPv6_Packet*)sbi->getDataPointer(); icmp->set_type(ICMPv6_Packet::ICMP_TYPE_ECHO_REQUEST); icmp->set_code(ICMPv6_Packet::ICMP_CODE_ECHO_REQUEST); sbi->writtenToDataPointer(ICMPv6_Packet::ICMP_HEADER_SIZE); // write seq and id UInt32 idAndSeq = 0xcaffee; sbi->write(&idAndSeq, sizeof(idAndSeq)); // write payload sbi->write(teststring, sizeof(teststring)); icmpv6instance.send(sbi); } printf("Start udp listen on port %u\n", socket.get_sport()); while(1) { ReceiveBuffer* rbuffer = socket.receiveBlock(); ReceiveBufferUDPIPv6* ipv6udp = ReceiveBufferUDPIPv6::cast(rbuffer); ReceiveBufferUDPIPv4* ipv4udp = ReceiveBufferUDPIPv4::cast(rbuffer); if (ipv6udp) { printf("Received IPv6/UDP. Bytes: %u\n", rbuffer->getSize()); char ipstrbuffer[50] = {0}; ipstack::ipv6_addr_toString(ipv6udp->getRemoteInfo()->ipv6, ipstrbuffer); printf(" Remote IPv6-Address: %s, Port: %u\n", ipstrbuffer, ipv4udp->getRemoteInfo()->remoteport); } else if (ipv4udp) { printf("Received IPv4/UDP. Bytes: %u\n", rbuffer->getSize()); UInt8 a,b,c,d; IPv4_Packet::convert_ipv4_addr(ipv4udp->getRemoteInfo()->ipv4, a, b, c, d); printf(" Remote IPv4-Address: %u.%u.%u.%u, Port: %u\n", a,b,c,d, ipv4udp->getRemoteInfo()->remoteport); } else { printf("error, udp ip version unknown. Bytes: %u\n", rbuffer->getSize()); } ReceiveBuffer::free(rbuffer); } }
void pachube_in_out(){ if (minute() < last_connect) last_connect = minute(); if (request_pause){ if ((minute() - last_connect) > interval){ ready_to_update = true; reading_pachube = false; request_pause = false; found_status_200 = false; found_session_id = false; found_CSV = false; Serial.print("Ready to connect: "); Serial.println(minute()); Serial.print("interval: "); Serial.println(interval); } } if (ready_to_update){ Serial.println("Connecting..."); if (localClient.connect(remoteServer, 80) > 0) { // here we assign comma-separated values to 'data', which will update Pachube datastreams // we use all the analog-in values, but could of course use anything else millis(), digital // inputs, etc. . i also like to keep track of successful and failed connection // attempts, sometimes useful for determining whether there are major problems. sprintf(pachube_data,"%d,%d,%d-%d-%d %d:%d:%d",analogRead(0),analogRead(1), year(),month(),day(),hour(),minute(),second()); content_length = strlen(pachube_data); Serial.print("GET request to retrieve: "); Serial.println(pachube_data); localClient.print("GET /api/"); localClient.print(REMOTE_FEED_ID); localClient.print(".csv HTTP/1.1\nHost: pachube.com\nX-PachubeApiKey: "); localClient.print(PACHUBE_API_KEY); localClient.print("\nUser-Agent: Arduino (Pachube In Out v1.1)"); localClient.println("\n"); //Serial.println("finished GET now PUT, to update"); localClient.print("PUT /api/"); localClient.print(SHARE_FEED_ID); localClient.print(".csv HTTP/1.1\nHost: pachube.com\nX-PachubeApiKey: "); localClient.print(PACHUBE_API_KEY); localClient.print("\nUser-Agent: Arduino (Pachube In Out v1.1)"); localClient.print("\nContent-Type: text/csv\nContent-Length: "); localClient.print(content_length); localClient.print("\nConnection: close\n\n"); localClient.print(pachube_data); localClient.print("\n"); ready_to_update = false; reading_pachube = true; request_pause = false; interval = UPDATE_INTERVAL; // Serial.print("finished PUT: "); // Serial.println(millis()); } else { Serial.print("connection failed!"); Serial.print(++failures); found_status_200 = false; found_session_id = false; found_CSV = false; ready_to_update = false; reading_pachube = false; request_pause = true; last_connect = minute(); interval = RESET_INTERVAL; setupEthernet(); } } while (reading_pachube){ while (localClient.available()) { checkForResponse(); } if (!localClient.connected()) { disconnect_pachube(); } } }
int main() { setbuf(stdout, NULL); // no buffering for this filehandle char json[1024]; int content_length; int response_code; char buf[1024]; float amb_temp; setupEthernet(); // set time lcd.printf("Reading Time... "); ntp.setTime("time-c.nist.gov"); lcd.printf("Time set"); while(1) { // Loop char streamName[] = "amb-temp"; // Set value for stream you are using // GET Stream value response_code = getStream(streamName, json); content_length = readContentLength(json); pc.printf("GET Stream\r\nResponse: %d\r\nContent Length: %d\r\njson: %s\r\n\r\n", response_code, content_length, json); Thread::wait(5000); ///// // PUT value to Strem amb_temp = tmp.read(); sprintf(json, "{\"value\":\"%0.2f\"}", amb_temp); response_code = putStream(streamName, json); content_length = readContentLength(json); pc.printf("PUT Stream\r\nResponse: %d\r\nContent Length: %d\r\njson: %s\r\n\r\n", response_code, content_length, json); Thread::wait(5000); ////// // POST value(s) to Stream time_t seconds; seconds = time(NULL); // get current time from mbed RTC strftime(buf,40, "%Y-%m-%dT%H:%M:%S%z", localtime(&seconds)); amb_temp = tmp.read(); sprintf(json, "{ \"values\": [ {\"at\": \"%s\", \"value\":\"%0.2f\"} ] }", buf, amb_temp); response_code = postStream(streamName, json); content_length = readContentLength(json); pc.printf("POST Stream\r\nResponse: %d\r\nContent Length: %d\r\njson: %s\r\n\r\n", response_code, content_length, json); Thread::wait(5000); /////// // PUT Location to Feed sprintf(json, "{ \"name\": \"%s\", \"latitude\": \"%0.8f\", \"longitude\": \"%0.8f\", \"elevation\": \"%0.2f\" }", LOC_NAME, LOC_LAT, LOC_LONG, LOC_ELEV); response_code = putLocation(json); content_length = readContentLength(json); pc.printf("PUT Location\r\nResponse: %d\r\nContent Length: %d\r\njson: %s\r\n\r\n", response_code, content_length, json); Thread::wait(5000); /////// // GET Location of Feed response_code = getLocation(json); content_length = readContentLength(json); pc.printf("GET Location\r\nResponse: %d\r\nContent Length: %d\r\njson: %s\r\n\r\n", response_code, content_length, json); Thread::wait(5000); } eth.disconnect(); while(1) {} }