Пример #1
0
//-------------------------------------------------------------------------------
// 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;
}
Пример #2
0
//-------------------------------------------------------------------------------
// 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);
		}