mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
Use static allocation, add convenience overloads which take String
This commit is contained in:
parent
49dc457fe5
commit
7fbb4831da
@ -25,14 +25,14 @@ License (MIT license):
|
|||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#define LWIP_OPEN_SRC
|
||||||
#include "ESP8266SSDP.h"
|
#include "ESP8266SSDP.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "ip_addr.h"
|
|
||||||
#include "user_interface.h"
|
#include "user_interface.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
}
|
}
|
||||||
|
#include "lwip/ip_addr.h"
|
||||||
#include "lwip/igmp.h"
|
#include "lwip/igmp.h"
|
||||||
|
|
||||||
//#define DEBUG_SSDP Serial
|
//#define DEBUG_SSDP Serial
|
||||||
@ -43,31 +43,20 @@ extern "C" {
|
|||||||
#define SSDP_URI_SIZE 2
|
#define SSDP_URI_SIZE 2
|
||||||
#define SSDP_BUFFER_SIZE 64
|
#define SSDP_BUFFER_SIZE 64
|
||||||
|
|
||||||
#define SSDP_UUID_SIZE 37
|
|
||||||
#define SSDP_SCHEMA_URL_SIZE 64
|
|
||||||
#define SSDP_FRIENDLY_NAME_SIZE 64
|
|
||||||
#define SSDP_SERIAL_NUMBER_SIZE 32
|
|
||||||
#define SSDP_PRESENTATION_URL_SIZE 128
|
|
||||||
#define SSDP_MODEL_NAME_SIZE 64
|
|
||||||
#define SSDP_MODEL_URL_SIZE 128
|
|
||||||
#define SSDP_MODEL_VERSION_SIZE 32
|
|
||||||
#define SSDP_MANUFACTURER_SIZE 64
|
|
||||||
#define SSDP_MANUFACTURER_URL_SIZE 128
|
|
||||||
|
|
||||||
static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250);
|
static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250);
|
||||||
|
|
||||||
const char* _ssdp_response_template =
|
static const char* _ssdp_response_template =
|
||||||
"HTTP/1.1 200 OK\r\n"
|
"HTTP/1.1 200 OK\r\n"
|
||||||
"EXT:\r\n"
|
"EXT:\r\n"
|
||||||
"ST: upnp:rootdevice\r\n";
|
"ST: upnp:rootdevice\r\n";
|
||||||
|
|
||||||
const char* _ssdp_notify_template =
|
static const char* _ssdp_notify_template =
|
||||||
"NOTIFY * HTTP/1.1\r\n"
|
"NOTIFY * HTTP/1.1\r\n"
|
||||||
"HOST: 239.255.255.250:1900\r\n"
|
"HOST: 239.255.255.250:1900\r\n"
|
||||||
"NT: upnp:rootdevice\r\n"
|
"NT: upnp:rootdevice\r\n"
|
||||||
"NTS: ssdp:alive\r\n";
|
"NTS: ssdp:alive\r\n";
|
||||||
|
|
||||||
const char* _ssdp_packet_template =
|
static const char* _ssdp_packet_template =
|
||||||
"%s" // _ssdp_response_template / _ssdp_notify_template
|
"%s" // _ssdp_response_template / _ssdp_notify_template
|
||||||
"CACHE-CONTROL: max-age=%u\r\n" // SSDP_INTERVAL
|
"CACHE-CONTROL: max-age=%u\r\n" // SSDP_INTERVAL
|
||||||
"SERVER: Arduino/1.0 UPNP/1.1 %s/%s\r\n" // _modelName, _modelNumber
|
"SERVER: Arduino/1.0 UPNP/1.1 %s/%s\r\n" // _modelName, _modelNumber
|
||||||
@ -75,7 +64,7 @@ const char* _ssdp_packet_template =
|
|||||||
"LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL
|
"LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
const char* _ssdp_schema_template =
|
static const char* _ssdp_schema_template =
|
||||||
"HTTP/1.1 200 OK\r\n"
|
"HTTP/1.1 200 OK\r\n"
|
||||||
"Content-Type: text/xml\r\n"
|
"Content-Type: text/xml\r\n"
|
||||||
"Connection: close\r\n"
|
"Connection: close\r\n"
|
||||||
@ -120,17 +109,6 @@ const char* _ssdp_schema_template =
|
|||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
SSDPClass::SSDPClass(){
|
SSDPClass::SSDPClass(){
|
||||||
_uuid = (char*)os_malloc(SSDP_UUID_SIZE);
|
|
||||||
_schemaURL = (char*)os_malloc(SSDP_SCHEMA_URL_SIZE);
|
|
||||||
_friendlyName = (char*)os_malloc(SSDP_FRIENDLY_NAME_SIZE);
|
|
||||||
_presentationURL = (char*)os_malloc(SSDP_PRESENTATION_URL_SIZE);
|
|
||||||
_serialNumber = (char*)os_malloc(SSDP_SERIAL_NUMBER_SIZE);
|
|
||||||
_modelName = (char*)os_malloc(SSDP_MODEL_NAME_SIZE);
|
|
||||||
_modelNumber = (char*)os_malloc(SSDP_MODEL_VERSION_SIZE);
|
|
||||||
_modelURL = (char*)os_malloc(SSDP_MODEL_URL_SIZE);
|
|
||||||
_manufacturer = (char*)os_malloc(SSDP_MANUFACTURER_SIZE);
|
|
||||||
_manufacturerURL = (char*)os_malloc(SSDP_MANUFACTURER_URL_SIZE);
|
|
||||||
|
|
||||||
_uuid[0] = '\0';
|
_uuid[0] = '\0';
|
||||||
_modelNumber[0] = '\0';
|
_modelNumber[0] = '\0';
|
||||||
_friendlyName[0] = '\0';
|
_friendlyName[0] = '\0';
|
||||||
@ -146,17 +124,6 @@ SSDPClass::SSDPClass(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
SSDPClass::~SSDPClass(){
|
SSDPClass::~SSDPClass(){
|
||||||
os_free(_uuid);
|
|
||||||
os_free(_schemaURL);
|
|
||||||
os_free(_friendlyName);
|
|
||||||
os_free(_presentationURL);
|
|
||||||
os_free(_serialNumber);
|
|
||||||
os_free(_modelName);
|
|
||||||
os_free(_modelNumber);
|
|
||||||
os_free(_modelURL);
|
|
||||||
os_free(_manufacturer);
|
|
||||||
os_free(_manufacturerURL);
|
|
||||||
_pending = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::begin(){
|
void SSDPClass::begin(){
|
||||||
@ -207,7 +174,7 @@ void SSDPClass::_send(ssdp_method_t method){
|
|||||||
SSDP_INTERVAL,
|
SSDP_INTERVAL,
|
||||||
_modelName, _modelNumber,
|
_modelName, _modelNumber,
|
||||||
_uuid,
|
_uuid,
|
||||||
(uint8_t)(ip & 0xFF), (uint8_t)((ip >> 8) & 0xFF), (uint8_t)((ip >> 16) & 0xFF), (uint8_t)((ip >> 24) & 0xFF), _port, _schemaURL
|
IP2STR(&ip), _port, _schemaURL
|
||||||
);
|
);
|
||||||
|
|
||||||
_server.endPacket();
|
_server.endPacket();
|
||||||
@ -216,7 +183,7 @@ void SSDPClass::_send(ssdp_method_t method){
|
|||||||
void SSDPClass::schema(WiFiClient client){
|
void SSDPClass::schema(WiFiClient client){
|
||||||
uint32_t ip = WiFi.localIP();
|
uint32_t ip = WiFi.localIP();
|
||||||
client.printf(_ssdp_schema_template,
|
client.printf(_ssdp_schema_template,
|
||||||
(uint8_t)(ip & 0xFF), (uint8_t)((ip >> 8) & 0xFF), (uint8_t)((ip >> 16) & 0xFF), (uint8_t)((ip >> 24) & 0xFF), _port,
|
IP2STR(&ip), _port,
|
||||||
_friendlyName,
|
_friendlyName,
|
||||||
_presentationURL,
|
_presentationURL,
|
||||||
_serialNumber,
|
_serialNumber,
|
||||||
@ -259,14 +226,14 @@ uint8_t SSDPClass::update(){
|
|||||||
else state = URI;
|
else state = URI;
|
||||||
cursor = 0;
|
cursor = 0;
|
||||||
|
|
||||||
}else if(cursor < SSDP_METHOD_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
|
} else if(cursor < SSDP_METHOD_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
|
||||||
break;
|
break;
|
||||||
case URI:
|
case URI:
|
||||||
if(c == ' '){
|
if(c == ' '){
|
||||||
if(strcmp(buffer, "*")) state = ABORT;
|
if(strcmp(buffer, "*")) state = ABORT;
|
||||||
else state = PROTO;
|
else state = PROTO;
|
||||||
cursor = 0;
|
cursor = 0;
|
||||||
}else if(cursor < SSDP_URI_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
|
} else if(cursor < SSDP_URI_SIZE - 1){ buffer[cursor++] = c; buffer[cursor] = '\0'; }
|
||||||
break;
|
break;
|
||||||
case PROTO:
|
case PROTO:
|
||||||
if(cr == 2){ state = KEY; cursor = 0; }
|
if(cr == 2){ state = KEY; cursor = 0; }
|
||||||
@ -298,7 +265,7 @@ uint8_t SSDPClass::update(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(state != ABORT){ state = KEY; header = START; cursor = 0; }
|
if(state != ABORT){ state = KEY; header = START; cursor = 0; }
|
||||||
}else if(c != '\r' && c != '\n'){
|
} else if(c != '\r' && c != '\n'){
|
||||||
if(header == START){
|
if(header == START){
|
||||||
if(strncmp(buffer, "MA", 2) == 0) header = MAN;
|
if(strncmp(buffer, "MA", 2) == 0) header = MAN;
|
||||||
else if(strcmp(buffer, "ST") == 0) header = ST;
|
else if(strcmp(buffer, "ST") == 0) header = ST;
|
||||||
@ -320,50 +287,50 @@ uint8_t SSDPClass::update(){
|
|||||||
if(_pending && (millis() - _process_time) > _delay){
|
if(_pending && (millis() - _process_time) > _delay){
|
||||||
_pending = false; _delay = 0;
|
_pending = false; _delay = 0;
|
||||||
_send(NONE);
|
_send(NONE);
|
||||||
}else if(_notify_time == 0 || (millis() - _notify_time) > (SSDP_INTERVAL * 1000L)){
|
} else if(_notify_time == 0 || (millis() - _notify_time) > (SSDP_INTERVAL * 1000L)){
|
||||||
_notify_time = millis();
|
_notify_time = millis();
|
||||||
_send(NOTIFY);
|
_send(NOTIFY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setSchemaURL(char *url){
|
void SSDPClass::setSchemaURL(const char *url){
|
||||||
strcpy(_schemaURL, url);
|
strlcpy(_schemaURL, url, sizeof(_schemaURL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setHTTPPort(uint16_t port){
|
void SSDPClass::setHTTPPort(uint16_t port){
|
||||||
_port = port;
|
_port = port;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setName(char *name){
|
void SSDPClass::setName(const char *name){
|
||||||
strcpy(_friendlyName, name);
|
strlcpy(_friendlyName, name, sizeof(_friendlyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setURL(char *url){
|
void SSDPClass::setURL(const char *url){
|
||||||
strcpy(_presentationURL, url);
|
strlcpy(_presentationURL, url, sizeof(_presentationURL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setSerialNumber(char *serialNumber){
|
void SSDPClass::setSerialNumber(const char *serialNumber){
|
||||||
strcpy(_serialNumber, serialNumber);
|
strlcpy(_serialNumber, serialNumber, sizeof(_serialNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setModelName(char *name){
|
void SSDPClass::setModelName(const char *name){
|
||||||
strcpy(_modelName, name);
|
strlcpy(_modelName, name, sizeof(_modelName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setModelNumber(char *num){
|
void SSDPClass::setModelNumber(const char *num){
|
||||||
strcpy(_modelNumber, num);
|
strlcpy(_modelNumber, num, sizeof(_modelNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setModelURL(char *url){
|
void SSDPClass::setModelURL(const char *url){
|
||||||
strcpy(_modelURL, url);
|
strlcpy(_modelURL, url, sizeof(_modelURL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setManufacturer(char *name){
|
void SSDPClass::setManufacturer(const char *name){
|
||||||
strcpy(_manufacturer, name);
|
strlcpy(_manufacturer, name, sizeof(_manufacturer));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSDPClass::setManufacturerURL(char *url){
|
void SSDPClass::setManufacturerURL(const char *url){
|
||||||
strcpy(_manufacturerURL, url);
|
strlcpy(_manufacturerURL, url, sizeof(_manufacturerURL));
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDPClass SSDP;
|
SSDPClass SSDP;
|
||||||
|
@ -33,6 +33,17 @@ License (MIT license):
|
|||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
|
|
||||||
|
#define SSDP_UUID_SIZE 37
|
||||||
|
#define SSDP_SCHEMA_URL_SIZE 64
|
||||||
|
#define SSDP_FRIENDLY_NAME_SIZE 64
|
||||||
|
#define SSDP_SERIAL_NUMBER_SIZE 32
|
||||||
|
#define SSDP_PRESENTATION_URL_SIZE 128
|
||||||
|
#define SSDP_MODEL_NAME_SIZE 64
|
||||||
|
#define SSDP_MODEL_URL_SIZE 128
|
||||||
|
#define SSDP_MODEL_VERSION_SIZE 32
|
||||||
|
#define SSDP_MANUFACTURER_SIZE 64
|
||||||
|
#define SSDP_MANUFACTURER_URL_SIZE 128
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NONE,
|
NONE,
|
||||||
SEARCH,
|
SEARCH,
|
||||||
@ -48,16 +59,25 @@ class SSDPClass{
|
|||||||
uint8_t update();
|
uint8_t update();
|
||||||
void schema(WiFiClient client);
|
void schema(WiFiClient client);
|
||||||
|
|
||||||
void setName(char *name);
|
void setName(const String& name) { setName(name.c_str()); }
|
||||||
void setURL(char *url);
|
void setName(const char *name);
|
||||||
void setSchemaURL(char *url);
|
void setURL(const String& url) { setURL(url.c_str()); }
|
||||||
|
void setURL(const char *url);
|
||||||
|
void setSchemaURL(const String& url) { setSchemaURL(url.c_str()); }
|
||||||
|
void setSchemaURL(const char *url);
|
||||||
|
void setSerialNumber(const String& serialNumber) { setSerialNumber(serialNumber.c_str()); }
|
||||||
|
void setSerialNumber(const char *serialNumber);
|
||||||
|
void setModelName(const String& name) { setModelName(name.c_str()); }
|
||||||
|
void setModelName(const char *name);
|
||||||
|
void setModelNumber(const String& num) { setModelNumber(num.c_str()); }
|
||||||
|
void setModelNumber(const char *num);
|
||||||
|
void setModelURL(const String& url) { setModelURL(url.c_str()); }
|
||||||
|
void setModelURL(const char *url);
|
||||||
|
void setManufacturer(const String& name) { setManufacturer(name.c_str()); }
|
||||||
|
void setManufacturer(const char *name);
|
||||||
|
void setManufacturerURL(const String& url) { setManufacturerURL(url.c_str()); }
|
||||||
|
void setManufacturerURL(const char *url);
|
||||||
void setHTTPPort(uint16_t port);
|
void setHTTPPort(uint16_t port);
|
||||||
void setSerialNumber(char *serialNumber);
|
|
||||||
void setModelName(char *name);
|
|
||||||
void setModelNumber(char *num);
|
|
||||||
void setModelURL(char *url);
|
|
||||||
void setManufacturer(char *name);
|
|
||||||
void setManufacturerURL(char *url);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WiFiUDP _server;
|
WiFiUDP _server;
|
||||||
@ -67,16 +87,16 @@ class SSDPClass{
|
|||||||
unsigned long _notify_time;
|
unsigned long _notify_time;
|
||||||
|
|
||||||
uint16_t _port;
|
uint16_t _port;
|
||||||
char *_schemaURL;
|
char _schemaURL[SSDP_SCHEMA_URL_SIZE];
|
||||||
char *_uuid;
|
char _uuid[SSDP_UUID_SIZE];
|
||||||
char *_friendlyName;
|
char _friendlyName[SSDP_FRIENDLY_NAME_SIZE];
|
||||||
char *_serialNumber;
|
char _serialNumber[SSDP_SERIAL_NUMBER_SIZE];
|
||||||
char *_presentationURL;
|
char _presentationURL[SSDP_PRESENTATION_URL_SIZE];
|
||||||
char *_manufacturer;
|
char _manufacturer[SSDP_MANUFACTURER_SIZE];
|
||||||
char *_manufacturerURL;
|
char _manufacturerURL[SSDP_MANUFACTURER_URL_SIZE];
|
||||||
char *_modelName;
|
char _modelName[SSDP_MODEL_NAME_SIZE];
|
||||||
char *_modelURL;
|
char _modelURL[SSDP_MODEL_URL_SIZE];
|
||||||
char *_modelNumber;
|
char _modelNumber[SSDP_MODEL_VERSION_SIZE];
|
||||||
|
|
||||||
void _send(ssdp_method_t method);
|
void _send(ssdp_method_t method);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user