Simple code for comunication via TCP between the mbed and PC.

Dependencies:   EthernetInterface SimpleSocket mbed-rtos mbed

Fork of SimpleSocketExamples by Hiroshi Yamaguchi

Committer:
numeral369
Date:
Wed Dec 17 16:06:00 2014 +0000
Revision:
1:016774025718
Parent:
0:6dc3cfd058c6
A simple code for comunication via TCP between the Mbed and a PC

Who changed what in which revision?

UserRevisionLine numberNew 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 }