diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/ESP8266mDNS.cpp index 687f88623..92b041098 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/ESP8266mDNS.cpp @@ -85,7 +85,7 @@ static const IPAddress MDNS_MULTICAST_ADDR(224, 0, 0, 251); static const int MDNS_MULTICAST_TTL = 1; static const int MDNS_PORT = 5353; -MDNSResponder::MDNSResponder() : _conn(0) { _services = 0; } +MDNSResponder::MDNSResponder() : _conn(0) { _services = 0; _arduinoAuth = false; } MDNSResponder::~MDNSResponder() {} bool MDNSResponder::begin(const char* domain){ @@ -101,8 +101,6 @@ bool MDNSResponder::begin(const char* domain){ _hostName[i] = tolower(domain[i]); _hostName[n] = '\0'; - os_strcpy(_boardName, ARDUINO_BOARD); - // Open the MDNS socket if it isn't already open. if (!_conn) { uint32_t ourIp = _getOurIp(); @@ -372,7 +370,10 @@ void MDNSResponder::_parsePacket(){ return _reply(responseMask, (serviceName), (protoName), servicePort); } - +void MDNSResponder::enableArduino(uint16_t port, bool auth){ + _arduinoAuth = auth; + addService("arduino", "tcp", port); +} void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint16_t port){ int i; @@ -439,24 +440,53 @@ void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint1 // TXT Response if(replyMask & 0x4){ - if(replyMask & 0x8){//send the name - uint8_t txtHead[2] = {0xC0, (uint8_t)(36 + serviceLen)}; - _conn->append(reinterpret_cast(txtHead), 2); + if(replyMask & 0x8){ + uint8_t txtHead[10] = { + 0xC0, (uint8_t)(36 + serviceLen),//send the name + 0x00, 0x10, //Type TXT + 0x80, 0x01, //Class IN, with cache flush + 0x00, 0x00, 0x11, 0x94, //TTL 4500 + }; + _conn->append(reinterpret_cast(txtHead), 10); } - uint8_t boardNameLen = os_strlen(_boardName); - - uint8_t txt[24] = { - 0x00, 0x10, //Type TXT - 0x80, 0x01, //Class IN, with cache flush - 0x00, 0x00, 0x11, 0x94, //TTL 4500 - 0x00, 0x0e, //DATA LEN - (uint8_t)(6 + boardNameLen), //strlen(board=) + strlen(boardName) - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x3d //board= - }; - _conn->append(reinterpret_cast(txt), 17); - _conn->append(reinterpret_cast(_boardName), boardNameLen); + if(strcmp(reinterpret_cast("arduino"), service) == 0){ + //arduino + //arduino service dependance should be removed and properties abstracted + const char *tcpCheckExtra = "tcp_check=no"; + uint8_t tcpCheckExtraLen = os_strlen(tcpCheckExtra); + + const char *sshUploadExtra = "ssh_upload=no"; + uint8_t sshUploadExtraLen = os_strlen(sshUploadExtra); + + char boardName[64]; + const char *boardExtra = "board="; + os_sprintf(boardName, "%s%s\0", boardExtra, ARDUINO_BOARD); + uint8_t boardNameLen = os_strlen(boardName); + char authUpload[16]; + const char *authUploadExtra = "auth_upload="; + os_sprintf(authUpload, "%s%s\0", authUploadExtra, reinterpret_cast((_arduinoAuth)?"yes":"no")); + uint8_t authUploadLen = os_strlen(authUpload); + + uint16_t textDataLen = (1 + boardNameLen) + (1 + tcpCheckExtraLen) + (1 + sshUploadExtraLen) + (1 + authUploadLen); + uint8_t txt[2] = {(uint8_t)(textDataLen >> 8), (uint8_t)(textDataLen)}; //DATA LEN + _conn->append(reinterpret_cast(txt), 2); + + _conn->append(reinterpret_cast(&boardNameLen), 1); + _conn->append(reinterpret_cast(boardName), boardNameLen); + _conn->append(reinterpret_cast(&authUploadLen), 1); + _conn->append(reinterpret_cast(authUpload), authUploadLen); + _conn->append(reinterpret_cast(&tcpCheckExtraLen), 1); + _conn->append(reinterpret_cast(tcpCheckExtra), tcpCheckExtraLen); + _conn->append(reinterpret_cast(&sshUploadExtraLen), 1); + _conn->append(reinterpret_cast(sshUploadExtra), sshUploadExtraLen); + } else { + //not arduino + //we should figure out an API so TXT properties can be added for services + uint8_t txt[2] = {0,0}; + _conn->append(reinterpret_cast(txt), 2); + } } // SRV Response diff --git a/libraries/ESP8266mDNS/ESP8266mDNS.h b/libraries/ESP8266mDNS/ESP8266mDNS.h index a2fd17d24..5958c40d1 100644 --- a/libraries/ESP8266mDNS/ESP8266mDNS.h +++ b/libraries/ESP8266mDNS/ESP8266mDNS.h @@ -77,12 +77,14 @@ public: void addService(String service, String proto, uint16_t port){ addService(service.c_str(), proto.c_str(), port); } + + void enableArduino(uint16_t port, bool auth=false); private: struct MDNSService * _services; UdpContext* _conn; char _hostName[128]; - char _boardName[64]; + bool _arduinoAuth; uint32_t _getOurIp(); uint16_t _getServicePort(char *service, char *proto); diff --git a/libraries/ESP8266mDNS/keywords.txt b/libraries/ESP8266mDNS/keywords.txt index 4a538e080..6b2f03951 100644 --- a/libraries/ESP8266mDNS/keywords.txt +++ b/libraries/ESP8266mDNS/keywords.txt @@ -17,6 +17,7 @@ MDNS KEYWORD1 begin KEYWORD2 update KEYWORD2 addService KEYWORD2 +enableArduino KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/platform.txt b/platform.txt index 58ba9edfa..ca99e858c 100644 --- a/platform.txt +++ b/platform.txt @@ -92,18 +92,18 @@ recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).* tools.esptool.cmd=esptool tools.esptool.cmd.windows=esptool.exe tools.esptool.path={runtime.platform.path}/tools/esptool -#runtime.tools.esptool.path - -tools.mkspiffs.cmd=mkspiffs -tools.mkspiffs.cmd.windows=mkspiffs.exe -tools.mkspiffs.path={runtime.platform.path}/tools/mkspiffs -#runtime.tools.mkspiffs.path +tools.esptool.network_cmd=python +tools.esptool.network_cmd.windows=python.exe tools.esptool.upload.protocol=esp tools.esptool.upload.params.verbose=-vv tools.esptool.upload.params.quiet= tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" -ca 0x00000 -cf "{build.path}/{build.project_name}.bin" -tools.esptool.network.pattern=python "{path}/espota.py" -i "{serial.port}" -p "{network.port}" -f "{build.path}/{build.project_name}.bin" +tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin" + +tools.mkspiffs.cmd=mkspiffs +tools.mkspiffs.cmd.windows=mkspiffs.exe +tools.mkspiffs.path={runtime.platform.path}/tools/mkspiffs tools.espota.cmd=python tools.espota.cmd.windows=python.exe diff --git a/tools/espota.py b/tools/espota.py index c5b7f5010..bea72910d 100755 --- a/tools/espota.py +++ b/tools/espota.py @@ -29,7 +29,7 @@ FLASH = 0 SPIFFS = 100 -def serve(remoteAddr, remotePort, filename, command = FLASH): +def serve(remoteAddr, remotePort, password, filename, command = FLASH): # Create a TCP/IP socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serverPort = 48266 @@ -44,7 +44,7 @@ def serve(remoteAddr, remotePort, filename, command = FLASH): content_size = os.path.getsize(filename) logging.info('Upload size: %d', content_size) - message = '%d %d %d\n' % (command, serverPort, content_size) + message = '%s %d %d %d\n' % (password, command, serverPort, content_size) # Wait for a connection logging.info('Sending invitation to: %s', remoteAddr) @@ -131,6 +131,16 @@ def parser(): ) parser.add_option_group(group) + # auth + group = optparse.OptionGroup(parser, "Authentication") + group.add_option("-a", "--auth", + dest = "auth", + help = "Set authentication password.", + action = "store", + default = "" + ) + parser.add_option_group(group) + # image group = optparse.OptionGroup(parser, "Image") group.add_option("-f", "--file", @@ -190,7 +200,7 @@ def main(args): command = SPIFFS # end if - return serve(options.esp_ip, options.esp_port, options.image, command) + return serve(options.esp_ip, options.esp_port, options.auth, options.image, command) # end main