/* * Background thread for playing stream. */ THREAD(Scanner, arg) { TCPSOCKET *sock; RADIOSTATION *rsp; uint8_t rs; uint32_t rx_to = 10000UL; NutThreadSetPriority(128); NutSleep(10000); for (;;) { for (rs = 0; rs < MAXNUM_STATIONS; rs++) { NutSleep(2000); if (rs == radio.rc_rstation || rs == radio.rc_cstation) continue; rsp = &station[rs]; if (rsp->rs_ip == 0 || rsp->rs_port == 0 || radio.rc_off) { continue; } /* Delay if this isn't the first connection. */ if (rsp->rs_name) { printf("%lu bytes free\n", NutHeapAvailable()); NutSleep(30000); } /* Create a socket. */ if ((sock = NutTcpCreateSocket()) == 0) { break; } NutTcpSetSockOpt(sock, SO_RCVTIMEO, &rx_to, sizeof(rx_to)); /* Connect the stream server. */ printf("[Scan %s:%u]\n", inet_ntoa(rsp->rs_ip), rsp->rs_port); if (NutTcpConnect(sock, rsp->rs_ip, rsp->rs_port) == 0) { /* Process header from server. */ if (ScanStreamHeader(sock, rsp) == 0) { if (rsp->rs_scantitle) { free(rsp->rs_scantitle); rsp->rs_scantitle = 0; } if (rsp->rs_metaint) { if ((rsp->rs_scantitle = ReadMetaTitle(sock, rsp->rs_metaint)) != 0) { printf("%03u: %s\n", rs, rsp->rs_scantitle); rsp->rs_scandead = 0; } else rsp->rs_scandead = 1; } else rsp->rs_scandead = 0; } else rsp->rs_scandead = 1; } else { rsp->rs_scandead = 1; printf("[SERR=%d]\n", NutTcpError(sock)); } NutTcpCloseSocket(sock); } } NutSleep(30000); }
TCPSOCKET* SocketCreate(TCPSOCKET *sock,u_short mss,u_long rx_to,u_short tcpbufsiz) { if ((sock = NutTcpCreateSocket()) == 0) { puts("Error: Can't create socket"); for(;;); } /*Set socket options. Failures are ignored.*/ if (NutTcpSetSockOpt(sock, TCP_MAXSEG, &mss, sizeof(mss))) printf("Sockopt MSS failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVTIMEO, &rx_to, sizeof(rx_to))) printf("Sockopt TO failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVBUF, &tcpbufsiz, sizeof(tcpbufsiz))) printf("Sockopt rxbuf failed\n"); return sock; }
FILE *TcpHostConnectStream(TCPSOCKET *sock, const char *host, uint16_t port, uint32_t tmo) { /* Set socket options. Failures are ignored. */ NutTcpSetSockOpt(sock, SO_RCVTIMEO, &tmo, sizeof(tmo)); /* Connect the stream server. */ if (TcpHostConnect(sock, host, port)) { return NULL; } /* Associate a binary stream with the socket. */ return _fdopen((int) ((intptr_t) sock), "r+b"); }
/*! * \brief Start an POP3 session. * * Applications may use the following basic sequence to retrieve an email: * * \code * #include <pro/pop3c.h> * * POP3CLIENTSESSION *pop3; * char *line; * * pop3 = NutPop3Connect(ip, 110); * if (pop3) { * NutPop3Login(pop3, "luser", "secret"); * if (NutPop3RetrieveMsg(pop3, 1) == 0) { * do { * line = NutPop3ReceiveResponse(pop3); * } while (line && strcmp(line, ".")); * } * NutPop3Disconnect(pop3); * } * \endcode * * \param ip IP address of the host to connect. * \param port Port number to connect. Typically port 110 is used by POP3. * * \return A pointer to a newly create \ref POP3CLIENTSESSION structure, * if the server is connected and ready to accept commands. * Otherwise a NULL pointer is returned. */ POP3CLIENTSESSION *NutPop3Connect(uint32_t ip, uint16_t port) { POP3CLIENTSESSION *si; si = calloc(1, sizeof(*si)); if (si) { si->pop3_sock = NutTcpCreateSocket(); if (si->pop3_sock && NutTcpConnect(si->pop3_sock, ip, port) == 0) { uint32_t tmo = POP3_TIMEOUT; NutTcpSetSockOpt(si->pop3_sock, SO_RCVTIMEO, &tmo, sizeof(tmo)); si->pop3_stream = _fdopen((int) ((intptr_t) si->pop3_sock), "r+b"); if (si->pop3_stream) { const char *rsp = NutPop3ReceiveResponse(si); if (rsp) { char *cp = strchr(rsp, '<'); if (cp) { si->pop3_stamp = strdup(cp); if (si->pop3_stamp) { cp = strchr(si->pop3_stamp, '>'); if (cp) { *++cp = '\0'; } else { free(si->pop3_stamp); si->pop3_stamp = NULL; } } } return si; } } } NutPop3Disconnect(si); free(si); } return NULL; }
/* * Main application entry. */ int play_stream(RADIO_STREAM rStream) { TCPSOCKET *sock; FILE *stream; u_long baud = DBG_BAUDRATE; u_long radio_ip = inet_addr(rStream.radio_ip); u_short tcpbufsiz = TCPIP_BUFSIZ; u_long rx_to = TCPIP_READTIMEOUT; u_short mss = TCPIP_MSS; u_long metaint; /* * Register UART device and assign stdout to it. */ NutRegisterDevice(&DBG_DEVICE, 0, 0); freopen(DBG_DEVNAME, "w", stdout); _ioctl(_fileno(stdout), UART_SETSPEED, &baud); /* * Display system information. */ printf("\n\nMedianut Tuotrial Part 3 - Nut/OS %s - " CC_STRING "\n", NutVersionString()); printf("%u bytes free\n\n", NutHeapAvailable()); /* * Register LAN device. */ if (NutRegisterDevice(&DEV_ETHER, 0x8300, 5)) { puts("Error: No LAN device"); for (; ;); } puts("configure LAN"); /* * Configure LAN. */ if (ConfigureLan("eth0")) { for (; ;); } puts("create a TCP socket"); /* * Create a TCP socket. */ if ((sock = NutTcpCreateSocket()) == 0) { puts("Error: Can't create socket"); for (; ;); } puts("set socket options"); /* * Set socket options. Failures are ignored. */ if (NutTcpSetSockOpt(sock, TCP_MAXSEG, &mss, sizeof(mss))) printf("Sockopt MSS failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVTIMEO, &rx_to, sizeof(rx_to))) printf("Sockopt TO failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVBUF, &tcpbufsiz, sizeof(tcpbufsiz))) printf("Sockopt rxbuf failed\n"); puts("connect the radio station"); /* * Connect the radio station. */ radio_ip = inet_addr(rStream.radio_ip); stream = ConnectStation(sock, rStream.radio_ip, rStream.radio_port, &metaint, rStream); send_message(rStream.radio_ip, rStream.radio_port, &metaint); /* * Play the stream. */ if (stream) { puts("playing stream"); PlayMp3Stream(stream, metaint); fclose(stream); } NutTcpCloseSocket(sock); NutThreadKill(); NutThreadDestroy(); return; puts("Reset me!"); for (; ;); }
int send_message(u_long ip, u_short port, u_long *metaint){ int rc; FILE *stream; u_char *line; u_char *cp; TCPSOCKET *sock; u_long baud = DBG_BAUDRATE; // u_long radio_ip = inet_addr(RADIO_IPADDR); u_short tcpbufsiz = TCPIP_BUFSIZ; u_long rx_to = TCPIP_READTIMEOUT; u_short mss = TCPIP_MSS; puts("create a TCP socket"); /* * Create a TCP socket. */ if ((sock = NutTcpCreateSocket()) == 0) { puts("Error: Can't create socket"); for (; ;); } puts("set socket options"); /* * Set socket options. Failures are ignored. */ if (NutTcpSetSockOpt(sock, TCP_MAXSEG, &mss, sizeof(mss))) printf("Sockopt MSS failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVTIMEO, &rx_to, sizeof(rx_to))) printf("Sockopt TO failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVBUF, &tcpbufsiz, sizeof(tcpbufsiz))) printf("Sockopt rxbuf failed\n"); /* * Connect the TCP server. */ printf("Connecting %s:%u...","83.128.250.123" , 8080); if ((rc = NutTcpConnect(sock, inet_addr("83.128.250.123"), 8080))) { printf("Error: Connect failed with %d\n", NutTcpError(sock)); return 0; } puts("OK"); if ((stream = _fdopen((int) sock, "r+b")) == 0) { puts("Error: Can't create stream"); return 0; } /* * Send the HTTP request. */ printf("GET %s HTTP/1.0\n\n", "/api/telegram"); fprintf(stream, "GET %s HTTP/1.0\r\n", "/api/telegram"); fprintf(stream, "Host: %s\r\n", "83.128.250.123"); fprintf(stream, "User-Agent: Ethernut\r\n"); fprintf(stream, "Accept: */*\r\n"); fprintf(stream, "Connection: close\r\n"); fputs("\r\n", stream); fflush(stream); /* * Receive the HTTP header. */ line = malloc(MAX_HEADERLINE); while (fgets(line, MAX_HEADERLINE, stream)) { /* * Chop off the carriage return at the end of the line. If none * was found, then this line was probably too large for our buffer. */ cp = strchr(line, '\r'); if (cp == 0) { puts("Warning: Input buffer overflow"); continue; } *cp = 0; /* * The header is terminated by an empty line. */ if (*line == 0) { break; } printf("%s\n", line); } putchar('\n'); free(line); return 0; }
void startStream(void) { printf("------starting stream-----\n"); stopAlarm=0; TCPSOCKET *sock; FILE *stream; u_long baud = DBG_BAUDRATE; u_long radio_ip = inet_addr(RADIO_IPADDR); u_short tcpbufsiz = TCPIP_BUFSIZ; u_long rx_to = TCPIP_READTIMEOUT; u_short mss = TCPIP_MSS; u_long metaint; /* * Register UART device and assign stdout to it. */ NutRegisterDevice(&DBG_DEVICE, 0, 0); freopen(DBG_DEVNAME, "w", stdout); _ioctl(_fileno(stdout), UART_SETSPEED, &baud); /* * Display system information. */ //printf("\n\nMedianut Tuotrial Part 3 - Nut/OS %s - " CC_STRING "\n", NutVersionString()); printf("%u bytes free\n\n", NutHeapAvailable()); // /* // * Register LAN device. // */ //if(NutRegisterDevice(&DEV_ETHER, 0x8300, 5)) { // puts("Error: No LAN device"); // for(;;); //} /* * Configure LAN. */ if(ConfigureLan("eth0")) { for(;;); } /* * Create a TCP socket. */ if ((sock = NutTcpCreateSocket()) == 0) { puts("Error: Can't create socket"); for(;;); } /* * Set socket options. Failures are ignored. */ if (NutTcpSetSockOpt(sock, TCP_MAXSEG, &mss, sizeof(mss))) printf("Sockopt MSS failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVTIMEO, &rx_to, sizeof(rx_to))) printf("Sockopt TO failed\n"); if (NutTcpSetSockOpt(sock, SO_RCVBUF, &tcpbufsiz, sizeof(tcpbufsiz))) printf("Sockopt rxbuf failed\n"); /* * Connect the radio station. */ radio_ip = inet_addr(RADIO_IPADDR); stream = ConnectStation(sock, radio_ip, RADIO_PORT, &metaint); /* * Play the stream. */ if(stream) { puts("testingstart"); PlayMp3Stream(stream, metaint); fclose(stream); } NutTcpCloseSocket(sock); VsPlayerStop(); //Tell the thread that he needs to exit //Make sure the thread is gone, so wait half a second NutSleep(500); //Close the stream fclose(stream); puts("Reset me!"); for(;;) { NutSleep(100); } }
THREAD(bin_cmd_thread0, arg) { uint8_t count = 0; TCPSOCKET * sock; char buff[256]; uint32_t time = 15000; NutThreadSetPriority(TCP_BIN_SERVER_PRI); if(THISINFO)printf("CMD:Thraed running...\r\n"); while(1) { //if(THISINFO)printf("Start Create Socket(%d)\r\n",count++); sock = NutTcpCreateSocket(); if(sock == 0) { if(THISERROR)printf("CMD:Create socket failed!\r\n"); continue; } NutTcpSetSockOpt(sock,SO_RCVTIMEO,&time,sizeof(uint32_t)); if(THISINFO)printf("CMD: NutTcpAccept at port %d\r\n",gwork_port); if(NutTcpAccept(sock,gwork_port)) { NutTcpCloseSocket(sock); if(THISERROR)printf("CMD:NutTcpAccept Timeout! NutTcpCloseSocket and reaccept.\r\n"); continue; } if(THISINFO)printf("CMD:Tcp Accept one connection.\r\n"); count = 0; while(1) { int len = NutTcpReceive(sock,buff,sizeof(buff)); if(len == 0) { if(THISINFO)printf("Tcp Recieve timeout.\r\n"); if(++count == 1) { if(THISINFO)printf("Tcp Send Io Out Data.\r\n"); //NutTcpSend(sock,"OK",strlen("OK")); { //都继电器状态的模拟请求。 uint8_t buffer[sizeof(CmdHead)] = {0x01,0x00,0x00,0x00,0x00,0x00,0x00}; CmdGetIoOutValue(sock,(CmdHead *)buffer,sizeof(buffer)); } } if(++count >= 3) { if(THISINFO)printf("Close Command Socket\r\n"); break; } } else if(len == -1) { int error = NutTcpError(sock); if(THISERROR)printf("CMD:Tcp Receive ERROR(%d)\r\n",error); if(error == ENOTCONN) { if(THISERROR)printf("CMD:Socket is not connected,break connecting\r\n"); break; } else { if(THISERROR)printf("CMD:Socket is unknow error,break connecting\r\n"); break; } } else if(len > 0) { //printf("Get One Tcp packet length(%d)\r\n",len); BinCmdPrase(sock,buff,len); } } NutTcpCloseSocket(sock); } }