#include #include #include #include #include #include #include #include #include #include #ifdef PICO_SUPPORT_POLARSSL #include #endif #ifdef PICO_SUPPORT_CYASSL #include #endif #define MODEM "/dev/ttyUSB0" #define SPEED 236800 /* #define APN "gprs.base.be" */ #define APN "web.be" #define PASSWD "web" #define USERNAME "altran" /* #define DEBUG_FLOW */ static int fd = -1; static int idx; static int ping_on = 0; static struct pico_device *ppp = NULL; static void sigusr1_hdl(int signo) { fprintf(stderr, "SIGUSR1: Connecting!\n"); if (ppp) pico_ppp_connect(ppp); } static void sigusr2_hdl(int signo) { fprintf(stderr, "SIGUSR2/SIGINT: Disconnecting!\n"); if (ppp) pico_ppp_disconnect(ppp); if (signo == SIGINT) exit(0); } #ifdef PICO_SUPPORT_POLARSSL static void md5sum(uint8_t *dst, const uint8_t *src, size_t len) { md5(src, len, dst); } #endif #ifdef PICO_SUPPORT_CYASSL static void md5sum(uint8_t *dst, const uint8_t *src, size_t len) { Md5 md5; InitMd5(&md5); Md5Update(&md5, src, len); Md5Final(&md5, dst); } #endif int modem_read(struct pico_device *dev, void *data, int len) { int r; r = read(fd, data, len); #ifdef DEBUG_FLOW if (r > 0) { printf(" <<< "); for(idx = 0; idx < r; idx++) { printf(" %02x", ((uint8_t*)data)[idx]); } printf("\n"); } #endif return r; } int modem_write(struct pico_device *dev, const void *data, int len) { int r; #ifdef DEBUG_FLOW printf(" >>> "); for(idx = 0; idx < len; idx++) { printf(" %02x", ((uint8_t*)data)[idx]); } printf("\n"); #endif r = write(fd, data, len); return r; } int modem_set_speed(struct pico_device *dev, uint32_t speed) { struct termios term; if (tcgetattr(fd, &term) != 0) return 6; if (cfsetspeed(&term, B115200) != 0) return 7; if (tcsetattr(fd, TCSANOW, &term) != 0) return 8; printf("Speed set to 115200.\n"); return 0; } void cb_ping(struct pico_icmp4_stats *s) { char host[30]; pico_ipv4_to_string(host, s->dst.addr); if (s->err == 0) { dbg("%lu bytes from %s: icmp_req=%lu ttl=64 time=%lu ms\n", s->size, host, s->seq, s->time); } else { dbg("PING %lu to %s: Error %d\n", s->seq, host, s->err); } } static void cb_sock(uint16_t ev, struct pico_socket *s) { } static void ping(void) { struct pico_socket *s; struct pico_ip4 dst; pico_string_to_ipv4("80.68.95.85", &dst.addr); s = pico_socket_open(PICO_PROTO_IPV4, PICO_PROTO_TCP, cb_sock); pico_socket_connect(s, &dst, short_be(80)); pico_icmp4_ping("80.68.95.85", 10, 1000, 4000, 8, cb_ping); } int main(int argc, const char *argv[]) { const char *path = MODEM; const char *apn = APN; const char *passwd = PASSWD; const char *username = USERNAME; if (argc > 1) path = argv[1]; if (argc > 2) apn = argv[2]; if (argc > 3) passwd = argv[3]; fd = open(path, O_RDWR); if (fd < 0) return 1; fcntl(fd, F_SETFL, O_NONBLOCK); signal(SIGUSR1, sigusr1_hdl); signal(SIGUSR2, sigusr2_hdl); signal(SIGINT, sigusr2_hdl); pico_stack_init(); #if defined PICO_SUPPORT_POLARSSL || defined PICO_SUPPORT_CYASSL pico_register_md5sum(md5sum); #endif ppp = pico_ppp_create(); if (!ppp) return 2; pico_ppp_set_serial_read(ppp, modem_read); pico_ppp_set_serial_write(ppp, modem_write); pico_ppp_set_serial_set_speed(ppp, modem_set_speed); pico_ppp_set_apn(ppp, apn); pico_ppp_set_password(ppp, passwd); pico_ppp_set_username(ppp, username); pico_ppp_connect(ppp); while(1 < 2) { pico_stack_tick(); usleep(1000); if (ppp->link_state(ppp) && !ping_on) { ping_on++; ping(); } } }