Hallo Forum!
Ich arbeite mal (ausnahmsweise) wieder mit Arduino, da ich, ganz ehrlich, nicht der beste in
Arduino C++ stehe ich vor einem Problem:
Ich habe "meine" (eig. musste ich sie nur von WiFi auf Ethernet umschreiben) Bibliothek diese hat die Klasse WemoSwitch:
Und den "richtigen" Code:
Spoiler anzeigen
Nun gibt der Compiler (einige) Meldungen nach dem Schema:
Kurz:
Was kann ich nun tun?
Verschoben. ~Thunderbolt
Ich arbeite mal (ausnahmsweise) wieder mit Arduino, da ich, ganz ehrlich, nicht der beste in
Arduino C++ stehe ich vor einem Problem:
Ich habe "meine" (eig. musste ich sie nur von WiFi auf Ethernet umschreiben) Bibliothek diese hat die Klasse WemoSwitch:
C-Quellcode
- #ifndef WemoSwitch_H
- #define WemoSwitch_H
- #include <Arduino.h>
- #include <Ethernet.h>
- #include "CallbackFunction.h"
- #include "WebServer.h"
- class WemoSwitch {
- private:
- WebServer *server = NULL;
- EthernetUDP UDP;
- String serial;
- String persistent_uuid;
- String device_name;
- unsigned int localPort;
- TaskFuncPtr onCallback;
- TaskFuncPtr offCallback;
- void startWebServer();
- void handleEventservice(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete);
- void handleUpnpControl(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete);
- void handleRoot(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete);
- void handleSetupXml(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete);
- void handleUnknown(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete);
- public:
- WemoSwitch();
- WemoSwitch(String alexaInvokeName, unsigned int port, TaskFuncPtr onCallback, TaskFuncPtr offCallback);
- ~WemoSwitch();
- String getAlexaInvokeName();
- void serverLoop();
- void respondToSearch(IPAddress& senderIP, unsigned int senderPort);
- };
- #endif
Und den "richtigen" Code:
C-Quellcode
- #include "WemoSwitch.h"
- #include "Ethernet.h"
- #include "CallbackFunction.h"
- #include "WebServer.h"
- //<<constructor>>
- WemoSwitch::WemoSwitch(){
- //Serial.println("default constructor called");
- }
- //WemoSwitch::WemoSwitch(String alexaInvokeName,unsigned int port){
- WemoSwitch::WemoSwitch(String alexaInvokeName, unsigned int port, TaskFuncPtr oncb, TaskFuncPtr offcb){
- uint32_t uniqueSwitchId = "MSODIEJFIELASD123123" + port;
- char uuid[64];
- sprintf_P(uuid, PSTR("38323636-4558-4dda-9188-cda0e6%02x%02x%02x"),
- (uint16_t) ((uniqueSwitchId >> 16) & 0xff),
- (uint16_t) ((uniqueSwitchId >> 8) & 0xff),
- (uint16_t) uniqueSwitchId & 0xff);
- serial = String(uuid);
- persistent_uuid = "Socket-1_0-" + serial+"-"+ String(port);
- device_name = alexaInvokeName;
- localPort = port;
- onCallback = oncb;
- offCallback = offcb;
- startWebServer();
- }
- //<<destructor>>
- WemoSwitch::~WemoSwitch(){/*nothing to destruct*/}
- void WemoSwitch::serverLoop(){
- int len = 64;
- char buff[len];
- server->processConnection(buff, &len);
- }
- void WemoSwitch::startWebServer(){
- server = new WebServer("", localPort);
- server->setFailureCommand(&handleUnknown);
- server->setDefaultCommand(&handleRoot);
- server->addCommand("setup.xml", &handleSetupXml);
- server->addCommand("upnp/control/basicevent1.xml", &handleUpnpControl);
- server->addCommand("eventservice.xml", &handleEventservice);
- server->begin();
- UDP.begin(localPort);
- /**
- server->on("/", [&]() {
- handleRoot();
- });
- server->on("/setup.xml", [&]() {
- handleSetupXml();
- });
- server->on("/upnp/control/basicevent1", [&]() {
- handleUpnpControl();
- });
- server->on("/eventservice.xml", [&]() {
- handleEventservice();
- });
- //server->onNotFound(handleNotFound);
- server->begin();
- Serial.println("WebServer started on port: ");
- Serial.println(localPort);
- **/
- }
- void WemoSwitch::handleUnknown(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
- {
- server.httpFail();
- }
- void handleEventservice(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete){
- Serial.println(" ########## Responding to eventservice.xml ... ########\n");
- String eventservice_xml = "<scpd xmlns=\"urn:Belkin:service-1-0\">"
- "<actionList>"
- "<action>"
- "<name>SetBinaryState</name>"
- "<argumentList>"
- "<argument>"
- "<retval/>"
- "<name>BinaryState</name>"
- "<relatedStateVariable>BinaryState</relatedStateVariable>"
- "<direction>in</direction>"
- "</argument>"
- "</argumentList>"
- "</action>"
- "</actionList>"
- "<serviceStateTable>"
- "<stateVariable sendEvents=\"yes\">"
- "<name>BinaryState</name>"
- "<dataType>Boolean</dataType>"
- "<defaultValue>0</defaultValue>"
- "</stateVariable>"
- "<stateVariable sendEvents=\"yes\">"
- "<name>level</name>"
- "<dataType>string</dataType>"
- "<defaultValue>0</defaultValue>"
- "</stateVariable>"
- "</serviceStateTable>"
- "</scpd>\r\n"
- "\r\n";
- server.httpSuccess();
- server.print(eventservice_xml.c_str());
- //server->write(eventservice_xml.c_str());
- }
- void WemoSwitch::handleUpnpControl(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete){
- Serial.println("########## Responding to /upnp/control/basicevent1 ... ##########");
- //for (int x=0; x <= HTTP.args(); x++) {
- // Serial.println(HTTP.arg(x));
- //}
- //EthernetClient c = server->available();
- String request = "SAMPLE";
- Serial.print("request:");
- Serial.println(request);
- Serial.println("Responding to Control request");
- String response_xml = "";
- if(request.indexOf("<BinaryState>1</BinaryState>") > 0) {
- Serial.println("Got Turn on request");
- onCallback();
- response_xml = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
- "<s:Body>"
- "<u:SetBinaryStateResponse xmlns:u=\"urn:Belkin:service:basicevent:1\">"
- "<BinaryState>1</BinaryState>"
- "</u:SetBinaryStateResponse>"
- "</s:Body>"
- "</s:Envelope>\r\n"
- "\r\n";
- }
- if(request.indexOf("<BinaryState>0</BinaryState>") > 0) {
- Serial.println("Got Turn off request");
- offCallback();
- response_xml = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
- "<s:Body>"
- "<u:SetBinaryStateResponse xmlns:u=\"urn:Belkin:service:basicevent:1\">"
- "<BinaryState>0</BinaryState>"
- "</u:SetBinaryStateResponse>"
- "</s:Body>"
- "</s:Envelope>\r\n"
- "\r\n";
- }
- //server->write(response_xml.c_str());
- Serial.print("Sending :");
- Serial.println(response_xml);
- }
- void WemoSwitch::handleRoot(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete){
- //server->write("You should tell Alexa to discover devices");
- }
- void WemoSwitch::handleSetupXml(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete){
- Serial.println(" ########## Responding to setup.xml ... ########\n");
- IPAddress localIP = Ethernet.localIP();
- char s[16];
- sprintf(s, "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
- String setup_xml = "<?xml version=\"1.0\"?>"
- "<root xmlns=\"urn:Belkin:device-1-0\">"
- "<specVersion>"
- "<major>1</major>"
- "<minor>0</minor>"
- "</specVersion>"
- "<device>"
- "<deviceType>urn:Belkin:device:controllee:1</deviceType>"
- "<friendlyName>"+ device_name +"</friendlyName>"
- "<manufacturer>Belkin International Inc.</manufacturer>"
- "<modelName>Emulated Socket</modelName>"
- "<modelNumber>3.1415</modelNumber>"
- "<manufacturerURL>http://www.belkin.com</manufacturerURL>"
- "<modelDescription>Belkin Plugin Socket 1.0</modelDescription>"
- "<modelURL>http://www.belkin.com/plugin/</modelURL>"
- "<UDN>uuid:"+ persistent_uuid +"</UDN>"
- "<serialNumber>"+ serial +"</serialNumber>"
- "<binaryState>0</binaryState>"
- "<serviceList>"
- "<service>"
- "<serviceType>urn:Belkin:service:basicevent:1</serviceType>"
- "<serviceId>urn:Belkin:serviceId:basicevent1</serviceId>"
- "<controlURL>/upnp/control/basicevent1</controlURL>"
- "<eventSubURL>/upnp/event/basicevent1</eventSubURL>"
- "<SCPDURL>/eventservice.xml</SCPDURL>"
- "</service>"
- "</serviceList>"
- "</device>"
- "</root>\r\n"
- "\r\n";
- //server->write(setup_xml.c_str());
- Serial.print("Sending :");
- Serial.println(setup_xml);
- }
- String WemoSwitch::getAlexaInvokeName() {
- return device_name;
- }
- void WemoSwitch::respondToSearch(IPAddress& senderIP, unsigned int senderPort) {
- Serial.println("");
- Serial.print("Sending response to ");
- Serial.println(senderIP);
- Serial.print("Port : ");
- Serial.println(senderPort);
- IPAddress localIP = Ethernet.localIP();
- char s[16];
- sprintf(s, "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
- Serial.print("Creating Resonse ...");
- String response =
- "HTTP/1.1 200 OK\r\n"
- "CACHE-CONTROL: max-age=86400\r\n"
- "DATE: Sat, 26 Nov 2016 04:56:29 GMT\r\n"
- "EXT:\r\n"
- "LOCATION: http://" + String(s) + ":" + String(localPort) + "/setup.xml\r\n"
- "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n"
- "01-NLS: b9200ebb-736d-4b93-bf03-835149d13983\r\n"
- "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n"
- "ST: urn:Belkin:device:**\r\n"
- "USN: uuid:" + persistent_uuid + "::urn:Belkin:device:**\r\n"
- "X-User-Agent: redsonic\r\n\r\n";
- Serial.println("Done!");
- Serial.print("Sending Packet...");
- UDP.beginPacket(senderIP, senderPort);
- UDP.write(response.c_str());
- UDP.endPacket();
- Serial.println("Done");
- Serial.println("Response sent !");
- }
Nun gibt der Compiler (einige) Meldungen nach dem Schema:
no known conversion for argument 2 from 'void (WemoSwitch::*)(WebServer&, WebServer::ConnectionType, char*, bool)' to 'void (*)(WebServer&, WebServer::ConnectionType, char*, bool)'
Kurz:
void(WemoSwitch::*) kann nicht in void(*)
umgewandelt werden
Was kann ich nun tun?
Verschoben. ~Thunderbolt
こんにちわ
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
Achte beim stellen von Fragen auf eine genaue Fragestellung, mir passiert das selbst häufig, andere können dir dann nicht so gut helfen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()