//------------------------------------------------------------------------------- // TCP listen, put GET request to the server //------------------------------------------------------------------------------- err_t ICACHE_FLASH_ATTR tc_listen(TCP_SERV_CONN *ts_conn) { uint16 len = 0; uint8 *buf = NULL; struct buf_fini *p = NULL; if(iot_data_processing != NULL) { p = web_fini_init(1); // prepare empty buffer, filled with 0 if(p == NULL) return 1; tc_parse_buf(&p->ts_conn, iot_data_processing->iot_request, os_strlen(iot_data_processing->iot_request)); if(p->web_conn.webflag & SCB_USER) { // cancel send #if DEBUGSOO > 4 os_printf("iot-skip!\n"); #endif tc_close(); os_free(p); return 2; } buf = p->web_conn.msgbuf; len = p->web_conn.msgbuflen; } #if DEBUGSOO > 4 tcpsrv_print_remote_info(ts_conn); os_printf("tc_listen, send(%d): %s\n", len, buf); #endif err_t err = tcpsrv_int_sent_data(ts_conn, buf, len); os_free(p); return err; }
//------------------------------------------------------------------------------- // TCP recv (TCP->bufi) //------------------------------------------------------------------------------- err_t ICACHE_FLASH_ATTR mdb_tcp_recv(TCP_SERV_CONN *conn) { #if DEBUGSOO > 1 tcpsrv_received_data_default(conn); #endif err_t err = ERR_OK; if (conn == NULL || conn->pbufi == NULL) return err; if (conn->sizei < sizeof(smdbmbap)) return err; smdbmbap * p = (smdbmbap *)conn->pbufi; Swapws((uint16 *)p, sizeof(smdbmbap)>>1); // перекинем hi<>lo // у блока MBAP нет данных или это что-то не то? да -> ждем новый MBAP if (p->pid != 0 || p->len == 0 || p->len > 253) { return err; } // не полный или некорректный запрос? uint32 len = p->len + sizeof(smdbmbap); if (len < conn->sizei) { return err; } smdbtcp * o = (smdbtcp *) os_malloc(sizeof(smdbtcp)); if(o != NULL) { os_memcpy(o, conn->pbufi, len); os_free(conn->pbufi); conn->pbufi = NULL; if (o->adu.id <= 1) { // номер устройства = 1 o->adu.id = 1; // всегда к нам, мы не сетевой бридж... o->mbap.len = MdbFunc(&o->adu, o->mbap.len); // обработать сообщение PDU len = o->mbap.len + sizeof(smdbmbap); Swapws((uint16 *)o, sizeof(smdbmbap)>>1); // перекинем hi<>lo #if DEBUGSOO > 1 tcpsrv_print_remote_info(conn); os_printf("send %u bytes\n", len); #endif err = tcpsrv_int_sent_data(conn, (uint8 *)o, len); // передать ADU в стек TCP/IP os_free(o); }