bool EspDrv::sendDataUdp(uint8_t sock, const char* host, uint16_t port, const uint8_t *data, uint16_t len) { LOGDEBUG2(F("> sendDataUdp:"), sock, len); LOGDEBUG2(F("> sendDataUdp:"), host, port); char cmdBuf[40]; sprintf_P(cmdBuf, PSTR("AT+CIPSEND=%d,%u,\"%s\",%u"), sock, len, host, port); //LOGDEBUG1(F("> sendDataUdp:"), cmdBuf); espSerial->println(cmdBuf); int idx = readUntil(1000, (char *)">", false); if(idx!=NUMESPTAGS) { LOGERROR(F("Data packet send error (1)")); return false; } espSerial->write(data, len); idx = readUntil(2000); if(idx!=TAG_SENDOK) { LOGERROR(F("Data packet send error (2)")); return false; } return true; }
bool EspDrv::sendData(uint8_t sock, const uint8_t *data, uint16_t len, bool appendCrLf) { LOGDEBUG2(F("> sendData:"), sock, len); char cmdBuf[20]; sprintf_P(cmdBuf, PSTR("AT+CIPSEND=%d,%d"), sock, len); espSerial->println(cmdBuf); int idx = readUntil(1000, (char *)">", false); if(idx!=NUMESPTAGS) { LOGERROR(F("Data packet send error (1)")); return false; } espSerial->write(data, len); idx = readUntil(2000); if(idx!=TAG_SENDOK) { LOGERROR(F("Data packet send error (2)")); return false; } return true; }
bool EspDrv::startClient(const char* host, uint16_t port, uint8_t sock, uint8_t protMode) { LOGDEBUG2(F("> startClient"), host, port); // TCP // AT+CIPSTART=<link ID>,"TCP",<remote IP>,<remote port> // UDP // AT+CIPSTART=<link ID>,"UDP",<remote IP>,<remote port>[,<UDP local port>,<UDP mode>] // for UDP we set a dummy remote port and UDP mode to 2 // this allows to specify the target host/port in CIPSEND int ret; if (protMode==TCP_MODE) ret = sendCmd(F("AT+CIPSTART=%d,\"TCP\",\"%s\",%u"), 5000, sock, host, port); else if (protMode==SSL_MODE) { // better to put the CIPSSLSIZE here because it is not supported before firmware 1.4 sendCmd(F("AT+CIPSSLSIZE=4096")); ret = sendCmd(F("AT+CIPSTART=%d,\"SSL\",\"%s\",%u"), 5000, sock, host, port); } else if (protMode==UDP_MODE) ret = sendCmd(F("AT+CIPSTART=%d,\"UDP\",\"%s\",0,%u,2"), 5000, sock, host, port); return ret==TAG_OK; }
int firefuse_open(const char *path, struct fuse_file_info *fi) { if (is_cv_path(path)) { return cve_open(path, fi); } if (is_cnc_path(path)) { return cnc_open(path, fi); } LOGDEBUG1("firefuse_open(%s)", path); int result = 0; if (strcmp(path, STATUS_PATH) == 0) // "/status" { verifyOpenR_(path, fi, &result); } else if (strcmp(path, CONFIG_PATH) == 0) // "/config.json" { verifyOpenR_(path, fi, &result); } else if (strcmp(path, HOLES_PATH) == 0) // "/holes" { verifyOpenR_(path, fi, &result); fi->fh = (uint64_t) (size_t) fopen("/var/firefuse/config.json", "r"); if (!fi->fh) { result = -ENOENT; } } else if (strcmp(path, ECHO_PATH) == 0) // "/echo" { verifyOpenRW(path, fi, &result); } else if (strcmp(path, FIRELOG_PATH) == 0) // "/firelog" { verifyOpenRW(path, fi, &result); } else if (strcmp(path, FIRESTEP_PATH) == 0) // "/firestep" { verifyOpenRW(path, fi, &result); } else { result = -ENOENT; } switch (-result) { case ENOENT: LOGERROR1("firefuse_open(%s) error ENOENT", path); break; case EACCES: LOGERROR1("firefuse_open(%s) error EACCES", path); break; default: if (fi->fh) { fi->direct_io = 1; } LOGDEBUG2("firefuse_open(%s) OK flags:%0x", path, fi->flags); break; } return result; }
bool EspDrv::startClient(const char* host, uint16_t port, uint8_t sock, uint8_t protMode) { LOGDEBUG2(F("> startClient"), host, port); int ret; if (protMode==TCP_MODE) ret = sendCmd(F("AT+CIPSTART=%d,\"TCP\",\"%s\",%d"), 5000, sock, host, port); else ret = sendCmd(F("AT+CIPSTART=%d,\"UDP\",\"%s\",%d"), 5000, sock, host, port); return ret==TAG_OK; }
uint16_t EspDrv::availData(uint8_t connId) { //LOGDEBUG(bufPos); // if there is data in the buffer if (_bufPos>0) { if (_connId==connId) return _bufPos; else if (_connId==0) return _bufPos; } int bytes = espSerial->available(); if (bytes) { //LOGDEBUG1(F("Bytes in the serial buffer: "), bytes); if (espSerial->find((char *)"+IPD,")) { // format is : +IPD,<id>,<len>:<data> // format is : +IPD,<ID>,<len>[,<remote IP>,<remote port>]:<data> _connId = espSerial->parseInt(); // <ID> espSerial->read(); // , _bufPos = espSerial->parseInt(); // <len> espSerial->read(); // " _remoteIp[0] = espSerial->parseInt(); // <remote IP> espSerial->read(); // . _remoteIp[1] = espSerial->parseInt(); espSerial->read(); // . _remoteIp[2] = espSerial->parseInt(); espSerial->read(); // . _remoteIp[3] = espSerial->parseInt(); espSerial->read(); // " espSerial->read(); // , _remotePort = espSerial->parseInt(); // <remote port> espSerial->read(); // : LOGDEBUG(); LOGDEBUG2(F("Data packet"), _connId, _bufPos); if(_connId==connId || connId==0) return _bufPos; } } return 0; }
bool EspDrv::startClient(const char* host, uint16_t port, uint8_t sock, uint8_t protMode) { LOGDEBUG2(F("> startClient"), host, port); // TCP // AT+CIPSTART=<link ID>,"TCP",<remote IP>,<remote port> // UDP // AT+CIPSTART=<link ID>,"UDP",<remote IP>,<remote port>[,<UDP local port>,<UDP mode>] // for UDP we set a dummy remote port and UDP mode to 2 // this allows to specify the target host/port in CIPSEND int ret; if (protMode==TCP_MODE) ret = sendCmd(F("AT+CIPSTART=%d,\"TCP\",\"%s\",%u"), 5000, sock, host, port); else ret = sendCmd(F("AT+CIPSTART=%d,\"UDP\",\"%s\",0,%u,2"), 5000, sock, host, port); return ret==TAG_OK; }
// Overrided sendData method for __FlashStringHelper strings bool EspDrv::sendData(uint8_t sock, const __FlashStringHelper *data, uint16_t len, bool appendCrLf) { LOGDEBUG2(F("> sendData:"), sock, len); char cmdBuf[20]; uint16_t len2 = len + 2*appendCrLf; sprintf_P(cmdBuf, PSTR("AT+CIPSEND=%d,%u"), sock, len2); espSerial->println(cmdBuf); int idx = readUntil(1000, (char *)">", false); if(idx!=NUMESPTAGS) { LOGERROR(F("Data packet send error (1)")); return false; } //espSerial->write(data, len); PGM_P p = reinterpret_cast<PGM_P>(data); for (int i=0; i<len; i++) { unsigned char c = pgm_read_byte(p++); espSerial->write(c); } if (appendCrLf) { espSerial->write('\r'); espSerial->write('\n'); } idx = readUntil(2000); if(idx!=TAG_SENDOK) { LOGERROR(F("Data packet send error (2)")); return false; } return true; }
uint16_t EspDrv::availData(uint8_t connId) { //LOGDEBUG(bufPos); // if there is data in the buffer if (_bufPos>0) { if (_connId==connId) return _bufPos; else if (_connId==0) return _bufPos; } int bytes = espSerial->available(); if (bytes) { //LOGDEBUG1(F("Bytes in the serial buffer: "), bytes); if (espSerial->find((char *)"+IPD,")) { // format is : +IPD,<id>,<len>:<data> _connId = espSerial->parseInt(); espSerial->read(); // read the ',' character _bufPos = espSerial->parseInt(); espSerial->read(); // read the ':' character LOGDEBUG(); LOGDEBUG2(F("Data packet"), _connId, _bufPos); if(_connId==connId || connId==0) return _bufPos; } } return 0; }
static int firestep_readchar(int c) { switch (c) { case EOF: inbuf[inbuflen] = 0; inbuflen = 0; LOGERROR1("firestep_readchar %s[EOF]", inbuf); return 0; case '\n': inbuf[inbuflen] = 0; if (inbuflen) { // discard blank lines if (strncmp("{\"sr\"",inbuf, 5) == 0) { LOGDEBUG2("firestep_readchar %s (%dB)", inbuf, inbuflen); } else { LOGINFO2("firestep_readchar %s (%dB)", inbuf, inbuflen); } } else { inbufEmptyLine++; if (inbufEmptyLine % 1000 == 0) { LOGWARN1("firestep_readchar skipped %ld blank lines", inbufEmptyLine); } } inbuflen = 0; break; case '\r': // skip break; case 'a': case 'A': case 'b': case 'B': case 'c': case 'C': case 'd': case 'D': case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'h': case 'H': case 'i': case 'I': case 'j': case 'J': case 'k': case 'K': case 'l': case 'L': case 'm': case 'M': case 'n': case 'N': case 'o': case 'O': case 'p': case 'P': case 'q': case 'Q': case 'r': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': case 'W': case 'x': case 'X': case 'y': case 'Y': case 'z': case 'Z': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': case '-': case '_': case '/': case '{': case '}': case '(': case ')': case '[': case ']': case '<': case '>': case '"': case '\'': case ':': case ',': case ' ': case '\t': if (c == '{') { if (jsonDepth++ <= 0) { jsonLen = 0; } ADD_JSON(c); } else if (c == '}') { ADD_JSON(c); if (--jsonDepth < 0) { LOGWARN1("Invalid JSON %s", jsonBuf); return 0; } } else { ADD_JSON(c); } if (inbuflen >= INBUFMAX) { inbuf[INBUFMAX] = 0; LOGERROR1("firestep_readchar overflow %s", inbuf); break; } else { inbuf[inbuflen] = c; inbuflen++; LOGTRACE2("firestep_readchar %x %c", (int) c, (int) c); } break; default: // discard unexpected character (probably wrong baud rate) LOGTRACE2("firestep_readchar %x ?", (int) c, (int) c); break; } return 1; }
int firefuse_create(const char *path, mode_t mode, struct fuse_file_info *fi) { LOGDEBUG2("firefuse_create(%s,%o)", path, mode); return 0; }