Skip to content

Commit 843e111

Browse files
author
Me No Dev
committed
mDNS, platform and espota.py changes for IDE Upload
mDNS responds with more TXT properties platform change to support OTA functions espota.py added authentication parameter IDE branch: https://github.com/me-no-dev/Arduino-1/tree/esp8266-ota
1 parent 7e8bcca commit 843e111

File tree

5 files changed

+74
-31
lines changed

5 files changed

+74
-31
lines changed

libraries/ESP8266mDNS/ESP8266mDNS.cpp

+50-20
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static const IPAddress MDNS_MULTICAST_ADDR(224, 0, 0, 251);
8585
static const int MDNS_MULTICAST_TTL = 1;
8686
static const int MDNS_PORT = 5353;
8787

88-
MDNSResponder::MDNSResponder() : _conn(0) { _services = 0; }
88+
MDNSResponder::MDNSResponder() : _conn(0) { _services = 0; _arduinoAuth = false; }
8989
MDNSResponder::~MDNSResponder() {}
9090

9191
bool MDNSResponder::begin(const char* domain){
@@ -101,8 +101,6 @@ bool MDNSResponder::begin(const char* domain){
101101
_hostName[i] = tolower(domain[i]);
102102
_hostName[n] = '\0';
103103

104-
os_strcpy(_boardName, ARDUINO_BOARD);
105-
106104
// Open the MDNS socket if it isn't already open.
107105
if (!_conn) {
108106
uint32_t ourIp = _getOurIp();
@@ -372,7 +370,10 @@ void MDNSResponder::_parsePacket(){
372370
return _reply(responseMask, (serviceName), (protoName), servicePort);
373371
}
374372

375-
373+
void MDNSResponder::enableArduino(uint16_t port, bool auth){
374+
_arduinoAuth = auth;
375+
addService("arduino", "tcp", port);
376+
}
376377

377378
void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint16_t port){
378379
int i;
@@ -439,24 +440,53 @@ void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint1
439440

440441
// TXT Response
441442
if(replyMask & 0x4){
442-
if(replyMask & 0x8){//send the name
443-
uint8_t txtHead[2] = {0xC0, (uint8_t)(36 + serviceLen)};
444-
_conn->append(reinterpret_cast<const char*>(txtHead), 2);
443+
if(replyMask & 0x8){
444+
uint8_t txtHead[10] = {
445+
0xC0, (uint8_t)(36 + serviceLen),//send the name
446+
0x00, 0x10, //Type TXT
447+
0x80, 0x01, //Class IN, with cache flush
448+
0x00, 0x00, 0x11, 0x94, //TTL 4500
449+
};
450+
_conn->append(reinterpret_cast<const char*>(txtHead), 10);
445451
}
446452

447-
uint8_t boardNameLen = os_strlen(_boardName);
448-
449-
uint8_t txt[24] = {
450-
0x00, 0x10, //Type TXT
451-
0x80, 0x01, //Class IN, with cache flush
452-
0x00, 0x00, 0x11, 0x94, //TTL 4500
453-
0x00, 0x0e, //DATA LEN
454-
(uint8_t)(6 + boardNameLen), //strlen(board=) + strlen(boardName)
455-
0x62, 0x6f, 0x61, 0x72, 0x64, 0x3d //board=
456-
};
457-
_conn->append(reinterpret_cast<const char*>(txt), 17);
458-
_conn->append(reinterpret_cast<const char*>(_boardName), boardNameLen);
459-
453+
if(strcmp(reinterpret_cast<const char*>("arduino"), service) == 0){
454+
//arduino
455+
//arduino service dependance should be removed and properties abstracted
456+
const char *tcpCheckExtra = "tcp_check=no";
457+
uint8_t tcpCheckExtraLen = os_strlen(tcpCheckExtra);
458+
459+
const char *sshUploadExtra = "ssh_upload=no";
460+
uint8_t sshUploadExtraLen = os_strlen(sshUploadExtra);
461+
462+
char boardName[64];
463+
const char *boardExtra = "board=";
464+
os_sprintf(boardName, "%s%s\0", boardExtra, ARDUINO_BOARD);
465+
uint8_t boardNameLen = os_strlen(boardName);
466+
467+
char authUpload[16];
468+
const char *authUploadExtra = "auth_upload=";
469+
os_sprintf(authUpload, "%s%s\0", authUploadExtra, reinterpret_cast<const char*>((_arduinoAuth)?"yes":"no"));
470+
uint8_t authUploadLen = os_strlen(authUpload);
471+
472+
uint16_t textDataLen = (1 + boardNameLen) + (1 + tcpCheckExtraLen) + (1 + sshUploadExtraLen) + (1 + authUploadLen);
473+
uint8_t txt[2] = {(uint8_t)(textDataLen >> 8), (uint8_t)(textDataLen)}; //DATA LEN
474+
_conn->append(reinterpret_cast<const char*>(txt), 2);
475+
476+
_conn->append(reinterpret_cast<const char*>(&boardNameLen), 1);
477+
_conn->append(reinterpret_cast<const char*>(boardName), boardNameLen);
478+
_conn->append(reinterpret_cast<const char*>(&authUploadLen), 1);
479+
_conn->append(reinterpret_cast<const char*>(authUpload), authUploadLen);
480+
_conn->append(reinterpret_cast<const char*>(&tcpCheckExtraLen), 1);
481+
_conn->append(reinterpret_cast<const char*>(tcpCheckExtra), tcpCheckExtraLen);
482+
_conn->append(reinterpret_cast<const char*>(&sshUploadExtraLen), 1);
483+
_conn->append(reinterpret_cast<const char*>(sshUploadExtra), sshUploadExtraLen);
484+
} else {
485+
//not arduino
486+
//we should figure out an API so TXT properties can be added for services
487+
uint8_t txt[2] = {0,0};
488+
_conn->append(reinterpret_cast<const char*>(txt), 2);
489+
}
460490
}
461491

462492
// SRV Response

libraries/ESP8266mDNS/ESP8266mDNS.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,14 @@ class MDNSResponder {
7777
void addService(String service, String proto, uint16_t port){
7878
addService(service.c_str(), proto.c_str(), port);
7979
}
80+
81+
void enableArduino(uint16_t port, bool auth=false);
8082

8183
private:
8284
struct MDNSService * _services;
8385
UdpContext* _conn;
8486
char _hostName[128];
85-
char _boardName[64];
87+
bool _arduinoAuth;
8688

8789
uint32_t _getOurIp();
8890
uint16_t _getServicePort(char *service, char *proto);

libraries/ESP8266mDNS/keywords.txt

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ MDNS KEYWORD1
1717
begin KEYWORD2
1818
update KEYWORD2
1919
addService KEYWORD2
20+
enableArduino KEYWORD2
2021

2122
#######################################
2223
# Constants (LITERAL1)

platform.txt

+7-7
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,18 @@ recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
9292
tools.esptool.cmd=esptool
9393
tools.esptool.cmd.windows=esptool.exe
9494
tools.esptool.path={runtime.platform.path}/tools/esptool
95-
#runtime.tools.esptool.path
96-
97-
tools.mkspiffs.cmd=mkspiffs
98-
tools.mkspiffs.cmd.windows=mkspiffs.exe
99-
tools.mkspiffs.path={runtime.platform.path}/tools/mkspiffs
100-
#runtime.tools.mkspiffs.path
95+
tools.esptool.network_cmd=python
96+
tools.esptool.network_cmd.windows=python.exe
10197

10298
tools.esptool.upload.protocol=esp
10399
tools.esptool.upload.params.verbose=-vv
104100
tools.esptool.upload.params.quiet=
105101
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"
106-
tools.esptool.network.pattern=python "{path}/espota.py" -i "{serial.port}" -p "{network.port}" -f "{build.path}/{build.project_name}.bin"
102+
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"
103+
104+
tools.mkspiffs.cmd=mkspiffs
105+
tools.mkspiffs.cmd.windows=mkspiffs.exe
106+
tools.mkspiffs.path={runtime.platform.path}/tools/mkspiffs
107107

108108
tools.espota.cmd=python
109109
tools.espota.cmd.windows=python.exe

tools/espota.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
SPIFFS = 100
3030

3131

32-
def serve(remoteAddr, remotePort, filename, command = FLASH):
32+
def serve(remoteAddr, remotePort, password, filename, command = FLASH):
3333
# Create a TCP/IP socket
3434
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3535
serverPort = 48266
@@ -44,7 +44,7 @@ def serve(remoteAddr, remotePort, filename, command = FLASH):
4444

4545
content_size = os.path.getsize(filename)
4646
logging.info('Upload size: %d', content_size)
47-
message = '%d %d %d\n' % (command, serverPort, content_size)
47+
message = '%s %d %d %d\n' % (password, command, serverPort, content_size)
4848

4949
# Wait for a connection
5050
logging.info('Sending invitation to: %s', remoteAddr)
@@ -131,6 +131,16 @@ def parser():
131131
)
132132
parser.add_option_group(group)
133133

134+
# auth
135+
group = optparse.OptionGroup(parser, "Authentication")
136+
group.add_option("-a", "--auth",
137+
dest = "auth",
138+
help = "Set authentication password.",
139+
action = "store",
140+
default = ""
141+
)
142+
parser.add_option_group(group)
143+
134144
# image
135145
group = optparse.OptionGroup(parser, "Image")
136146
group.add_option("-f", "--file",
@@ -190,7 +200,7 @@ def main(args):
190200
command = SPIFFS
191201
# end if
192202

193-
return serve(options.esp_ip, options.esp_port, options.image, command)
203+
return serve(options.esp_ip, options.esp_port, options.auth, options.image, command)
194204
# end main
195205

196206

0 commit comments

Comments
 (0)