@@ -41,6 +41,16 @@ extern "C" {
41
41
#define SSDP_URI_SIZE 2
42
42
#define SSDP_BUFFER_SIZE 64
43
43
44
+ #define SSDP_UUID_SIZE 37
45
+ #define SSDP_FRIENDLY_NAME_SIZE 64
46
+ #define SSDP_SERIAL_NUMBER_SIZE 32
47
+ #define SSDP_PRESENTATION_URL_SIZE 128
48
+ #define SSDP_MODEL_NAME_SIZE 64
49
+ #define SSDP_MODEL_URL_SIZE 128
50
+ #define SSDP_MODEL_VERSION_SIZE 32
51
+ #define SSDP_MANUFACTURER_SIZE 64
52
+ #define SSDP_MANUFACTURER_URL_SIZE 128
53
+
44
54
static const IPAddress SSDP_MULTICAST_ADDR (239 , 255 , 255 , 250 );
45
55
46
56
const char * _ssdp_response_template =
@@ -58,7 +68,7 @@ const char* _ssdp_packet_template =
58
68
" %s" // _ssdp_response_template / _ssdp_notify_template
59
69
" CACHE-CONTROL: max-age=%u\r\n " // SSDP_INTERVAL
60
70
" SERVER: Arduino/1.0 UPNP/1.1 %s/%s\r\n " // _modelName, _modelNumber
61
- " USN: uuid:%s-%02X%02X%02X%02X%02X%02X \r\n " // _base, _mac[0], _mac[1], _mac[2], _mac[3], _mac[4], _mac[5]
71
+ " USN: uuid:%s\r\n " // _uuid
62
72
" LOCATION: http://%u.%u.%u.%u/ssdp/schema.xml\r\n " // WiFi.localIP()
63
73
" \r\n " ;
64
74
@@ -84,14 +94,13 @@ const char* _ssdp_schema_template =
84
94
" <modelURL>%s</modelURL>"
85
95
" <manufacturer>%s</manufacturer>"
86
96
" <manufacturerURL>%s</manufacturerURL>"
87
- " <UDN>%s-%02X%02X%02X%02X%02X%02X </UDN>" // uuid:UUID
97
+ " <UDN>%s</UDN>"
88
98
" </device>"
89
99
" </root>\r\n "
90
100
" \r\n " ;
91
101
92
102
SSDPClass::SSDPClass (){
93
- _base = (char *)os_malloc (SSDP_BASE_SIZE);
94
- _mac = (byte*)os_malloc (6 );
103
+ _uuid = (char *)os_malloc (SSDP_UUID_SIZE);
95
104
_friendlyName = (char *)os_malloc (SSDP_FRIENDLY_NAME_SIZE);
96
105
_presentationURL = (char *)os_malloc (SSDP_PRESENTATION_URL_SIZE);
97
106
_serialNumber = (char *)os_malloc (SSDP_SERIAL_NUMBER_SIZE);
@@ -101,6 +110,7 @@ SSDPClass::SSDPClass(){
101
110
_manufacturer = (char *)os_malloc (SSDP_MANUFACTURER_SIZE);
102
111
_manufacturerURL = (char *)os_malloc (SSDP_MANUFACTURER_URL_SIZE);
103
112
113
+ _uuid[0 ] = ' \0 ' ;
104
114
_modelNumber[0 ] = ' \0 ' ;
105
115
_friendlyName[0 ] = ' \0 ' ;
106
116
_presentationURL[0 ] = ' \0 ' ;
@@ -113,8 +123,7 @@ SSDPClass::SSDPClass(){
113
123
}
114
124
115
125
SSDPClass::~SSDPClass (){
116
- os_free (_base);
117
- os_free (_mac);
126
+ os_free (_uuid);
118
127
os_free (_friendlyName);
119
128
os_free (_presentationURL);
120
129
os_free (_serialNumber);
@@ -126,18 +135,26 @@ SSDPClass::~SSDPClass(){
126
135
_pending = false ;
127
136
}
128
137
129
- void SSDPClass::begin (char *base ){
138
+ void SSDPClass::begin (){
130
139
ip_addr_t ifaddr;
131
140
ip_addr_t multicast_addr;
132
141
133
142
_pending = false ;
134
- strcpy (_base, base);
135
143
136
- WiFi.macAddress (_mac);
137
144
ifaddr.addr = WiFi.localIP ();
138
145
multicast_addr.addr = (uint32_t ) SSDP_MULTICAST_ADDR;
139
146
igmp_joingroup (&ifaddr, &multicast_addr);
140
-
147
+
148
+ uint8_t mac[6 ];
149
+ WiFi.macAddress (mac);
150
+ uint32_t chipId = ESP.getChipId ();
151
+ sprintf (_uuid, " 38323636-4558-%04X-%04X-%02X%02X%02X%02X%02X%02X" ,
152
+ (chipId >> 16 ) & 0xFFFF , chipId & 0xFFFF ,
153
+ mac[0 ], mac[1 ], mac[2 ], mac[3 ], mac[4 ], mac[5 ]
154
+ );
155
+ #ifdef DEBUG_SSDP
156
+ DEBUG_SSDP.printf (" SSDP UUID: %s\n " , (char *)_uuid);
157
+ #endif
141
158
_server.begin (SSDP_PORT);
142
159
}
143
160
@@ -165,7 +182,7 @@ void SSDPClass::send(ssdp_method_t method){
165
182
(method == NONE)?_ssdp_response_template:_ssdp_notify_template,
166
183
SSDP_INTERVAL,
167
184
_modelName, _modelNumber,
168
- _base, _mac[ 0 ], _mac[ 1 ], _mac[ 2 ], _mac[ 3 ], _mac[ 4 ], _mac[ 5 ] ,
185
+ _uuid ,
169
186
(uint8_t )(ip & 0xFF ), (uint8_t )((ip >> 8 ) & 0xFF ), (uint8_t )((ip >> 16 ) & 0xFF ), (uint8_t )((ip >> 24 ) & 0xFF )
170
187
);
171
188
@@ -182,7 +199,7 @@ void SSDPClass::schema(WiFiClient client){
182
199
_modelURL,
183
200
_manufacturer,
184
201
_manufacturerURL,
185
- _base, _mac[ 0 ], _mac[ 1 ], _mac[ 2 ], _mac[ 3 ], _mac[ 4 ], _mac[ 5 ]
202
+ _uuid
186
203
);
187
204
}
188
205
0 commit comments