//------------------------------------------------------------------------------- // 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); }
//------------------------------------------------------------------------------- // TCP receive response from server //------------------------------------------------------------------------------- err_t ICACHE_FLASH_ATTR tc_recv(TCP_SERV_CONN *ts_conn) { #if DEBUGSOO > 1 tcpsrv_received_data_default(ts_conn); #endif tcpsrv_unrecved_win(ts_conn); uint8 *pstr = ts_conn->pbufi; sint32 len = ts_conn->sizei; #if DEBUGSOO > 4 os_printf("IOT_Rec(%u): %s\n", len, pstr); #endif os_memset(iot_last_status, 0, sizeof(iot_last_status)); os_strncpy(iot_last_status, (char *)pstr, mMIN(sizeof(iot_last_status)-1, len)); // status/error iot_last_status_time = get_sntp_time(); if(len >= sizeof(key_http_ok1) + 3 + sizeof(key_http_ok2)) { if(os_memcmp(pstr, key_http_ok1, sizeof(key_http_ok1)-1) == 0 && os_memcmp(pstr + sizeof(key_http_ok1)-1 + 3, key_http_ok2, sizeof(key_http_ok2)-1) == 0) { // Check - 200 OK? #if DEBUGSOO > 4 os_printf(" - 200\n"); #endif uint8 *nstr = web_strnstr(pstr, "\r\n\r\n", len); // find body if(nstr != NULL) { pstr = nstr + 4; // body start len -= nstr - pstr; // body size uint8 *nstr = web_strnstr(pstr, "\r\n", len); // find next delimiter if(nstr != NULL) *nstr = '\0'; if(ahextoul(pstr)) { // not 0 = OK tc_init_flg &= ~TC_RUNNING; // clear run flag iot_data_processing->last_run = system_get_time(); #if DEBUGSOO > 4 os_printf("Ok!!!\n"); #endif } } } } //ts_conn->flag.rx_null = 1; // stop receiving data tc_close(); return ERR_OK; }