Exemple #1
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);
		}
Exemple #2
0
//-------------------------------------------------------------------------------
// 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;
}