Simple code for comunication via TCP between the mbed and PC.
Dependencies: EthernetInterface SimpleSocket mbed-rtos mbed
Fork of SimpleSocketExamples by
examples/supertweet.cpp@0:6dc3cfd058c6, 2013-02-04 (annotated)
- Committer:
- yamaguch
- Date:
- Mon Feb 04 09:29:18 2013 +0000
- Revision:
- 0:6dc3cfd058c6
modified to use SimpleSocket/EthernetInterface
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yamaguch | 0:6dc3cfd058c6 | 1 | #include "SimpleSocket.h" |
yamaguch | 0:6dc3cfd058c6 | 2 | #include <ctype.h> |
yamaguch | 0:6dc3cfd058c6 | 3 | |
yamaguch | 0:6dc3cfd058c6 | 4 | void encodeBase64(char *ibuf, char *obuf); |
yamaguch | 0:6dc3cfd058c6 | 5 | int encodeFormUrl(char *s, char *t); |
yamaguch | 0:6dc3cfd058c6 | 6 | |
yamaguch | 0:6dc3cfd058c6 | 7 | void supertweet() { |
yamaguch | 0:6dc3cfd058c6 | 8 | ClientSocket client("66.180.175.246", 80); // api.supertweet.net |
yamaguch | 0:6dc3cfd058c6 | 9 | |
yamaguch | 0:6dc3cfd058c6 | 10 | char user[16], password[16], message[64] = {}; |
yamaguch | 0:6dc3cfd058c6 | 11 | printf("user => "); |
yamaguch | 0:6dc3cfd058c6 | 12 | scanf("%s", user); |
yamaguch | 0:6dc3cfd058c6 | 13 | printf("password => "); |
yamaguch | 0:6dc3cfd058c6 | 14 | scanf("%s", password); |
yamaguch | 0:6dc3cfd058c6 | 15 | printf("message => "); |
yamaguch | 0:6dc3cfd058c6 | 16 | int c = 0; |
yamaguch | 0:6dc3cfd058c6 | 17 | while (c < ' ' || 0x7E < c) |
yamaguch | 0:6dc3cfd058c6 | 18 | c = getc(stdin); |
yamaguch | 0:6dc3cfd058c6 | 19 | ungetc(c, stdin); |
yamaguch | 0:6dc3cfd058c6 | 20 | for (int i = 0; i < sizeof(message) - 1 && (c = getc(stdin)) >= ' '; i++) |
yamaguch | 0:6dc3cfd058c6 | 21 | message[i] = c; |
yamaguch | 0:6dc3cfd058c6 | 22 | |
yamaguch | 0:6dc3cfd058c6 | 23 | char credential[48], credential2[64], message2[256]; |
yamaguch | 0:6dc3cfd058c6 | 24 | |
yamaguch | 0:6dc3cfd058c6 | 25 | sprintf(credential, "%s:%s", user, password); |
yamaguch | 0:6dc3cfd058c6 | 26 | encodeBase64(credential, credential2); |
yamaguch | 0:6dc3cfd058c6 | 27 | encodeFormUrl(message, message2); |
yamaguch | 0:6dc3cfd058c6 | 28 | |
yamaguch | 0:6dc3cfd058c6 | 29 | const char *request = |
yamaguch | 0:6dc3cfd058c6 | 30 | "POST /1/statuses/update.xml HTTP/1.1\r\n" |
yamaguch | 0:6dc3cfd058c6 | 31 | "Host: api.supertweet.net\r\n" |
yamaguch | 0:6dc3cfd058c6 | 32 | "Authorization: Basic %s\r\n" |
yamaguch | 0:6dc3cfd058c6 | 33 | "Content-Length: %d\r\n" |
yamaguch | 0:6dc3cfd058c6 | 34 | "Content-Type: application/x-www-form-urlencoded\r\n" |
yamaguch | 0:6dc3cfd058c6 | 35 | "\r\n" |
yamaguch | 0:6dc3cfd058c6 | 36 | "status=%s"; |
yamaguch | 0:6dc3cfd058c6 | 37 | |
yamaguch | 0:6dc3cfd058c6 | 38 | client.printf(request, credential2, strlen(message2) + 7, message2); |
yamaguch | 0:6dc3cfd058c6 | 39 | printf(request, credential2, strlen(message2) + 7, message2); |
yamaguch | 0:6dc3cfd058c6 | 40 | printf("\n"); |
yamaguch | 0:6dc3cfd058c6 | 41 | |
yamaguch | 0:6dc3cfd058c6 | 42 | while (client) { |
yamaguch | 0:6dc3cfd058c6 | 43 | if (client.available()) { |
yamaguch | 0:6dc3cfd058c6 | 44 | while (client.available()) { |
yamaguch | 0:6dc3cfd058c6 | 45 | char response[128] = {}; |
yamaguch | 0:6dc3cfd058c6 | 46 | client.read(response, sizeof(response) - 1); |
yamaguch | 0:6dc3cfd058c6 | 47 | printf("%s", response); |
yamaguch | 0:6dc3cfd058c6 | 48 | } |
yamaguch | 0:6dc3cfd058c6 | 49 | client.close(); |
yamaguch | 0:6dc3cfd058c6 | 50 | } |
yamaguch | 0:6dc3cfd058c6 | 51 | } |
yamaguch | 0:6dc3cfd058c6 | 52 | printf("\ndone\n"); |
yamaguch | 0:6dc3cfd058c6 | 53 | } |
yamaguch | 0:6dc3cfd058c6 | 54 | |
yamaguch | 0:6dc3cfd058c6 | 55 | int encodeFormUrl(char *s, char *t) { |
yamaguch | 0:6dc3cfd058c6 | 56 | char *head = t; |
yamaguch | 0:6dc3cfd058c6 | 57 | for (char c; (c = *s) != 0; s++) |
yamaguch | 0:6dc3cfd058c6 | 58 | switch (c) { |
yamaguch | 0:6dc3cfd058c6 | 59 | case '\r': |
yamaguch | 0:6dc3cfd058c6 | 60 | break; |
yamaguch | 0:6dc3cfd058c6 | 61 | case ' ' : |
yamaguch | 0:6dc3cfd058c6 | 62 | *t++ = '+'; |
yamaguch | 0:6dc3cfd058c6 | 63 | break; |
yamaguch | 0:6dc3cfd058c6 | 64 | default: |
yamaguch | 0:6dc3cfd058c6 | 65 | t += sprintf(t, isalnum(c) ? "%c" : (c == '\n') ? "\r%c" : "%%%02X", c); |
yamaguch | 0:6dc3cfd058c6 | 66 | } |
yamaguch | 0:6dc3cfd058c6 | 67 | *t = '\0'; |
yamaguch | 0:6dc3cfd058c6 | 68 | return t - head; |
yamaguch | 0:6dc3cfd058c6 | 69 | } |
yamaguch | 0:6dc3cfd058c6 | 70 | |
yamaguch | 0:6dc3cfd058c6 | 71 | void encodeBase64(char ibuf[], int length, char *obuf) { |
yamaguch | 0:6dc3cfd058c6 | 72 | const char BASE64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
yamaguch | 0:6dc3cfd058c6 | 73 | int i, j; |
yamaguch | 0:6dc3cfd058c6 | 74 | for (i = j = 0; j < length; j += 3, i += 4) { |
yamaguch | 0:6dc3cfd058c6 | 75 | long a = ibuf[j] << 16 | (j + 1 < length ? ibuf[j + 1] << 8 : 0) | (j + 2 < length ? ibuf[j + 2] : 0); |
yamaguch | 0:6dc3cfd058c6 | 76 | for (int k = 3; k >= 0; k--, a >>= 6) |
yamaguch | 0:6dc3cfd058c6 | 77 | obuf[i + k] = (j + k - 1) < length ? BASE64[a & 63] : '='; |
yamaguch | 0:6dc3cfd058c6 | 78 | } |
yamaguch | 0:6dc3cfd058c6 | 79 | obuf[i] = '\0'; |
yamaguch | 0:6dc3cfd058c6 | 80 | } |
yamaguch | 0:6dc3cfd058c6 | 81 | |
yamaguch | 0:6dc3cfd058c6 | 82 | void encodeBase64(char *ibuf, char *obuf) { |
yamaguch | 0:6dc3cfd058c6 | 83 | encodeBase64(ibuf, strlen(ibuf), obuf); |
yamaguch | 0:6dc3cfd058c6 | 84 | } |