我正在尝试在带有 arduino 库的类中实现 websocket
(https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSocketsClient.h) 在 esp8266s 上。
我没有使用 Arduino IDE,而是使用 Home-assistant 的 ESPHome 集成,这就是代码必须在类中的原因。
为了实现 websocket,我必须将一个函数传递给另一个函数,但显然数据类型不匹配,我不明白如何实现这一点。这是我的代码的缩短版本:
我的代码:
#include "esphome.h"
#include "WebSocketsClient.h"
#include <iostream>
#include <string.h>
class CustomWebsocket : public Component, public Sensor {
public:
WebSocketsClient webSocket;
CustomWebsocket();
void webSocketEventCustom(WStype_t type, uint8_t * payload, size_t length);
void setup() override;
};
void CustomWebsocket::webSocketEventCustom(WStype_t type, uint8_t * payload, size_t length) {
switch(type) {
case WStype_DISCONNECTED:
break;
case WStype_CONNECTED:
break;
case WStype_TEXT:
//do stuff
break;
};
};
void CustomWebsocket::setup(){
webSocket.begin("192.168.178.23", 81, "/");
webSocket.onEvent(this->webSocketEventCustom);
};
最后一行是传递函数的地方。它导致此错误消息:
错误信息:
error: no matching function for call to 'WebSocketsClient::onEvent(<unresolved overloaded function type>)'
webSocket.onEvent(this->webSocketEventCustom);
^
note: candidate is:
In file included from src/CustomWebsocket.h:2:0,
from src/main.cpp:43:
note: void WebSocketsClient::onEvent(WebSocketsClient::WebSocketClientEvent)
void onEvent(WebSocketClientEvent cbEvent);
^
note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'WebSocketsClient::WebSocketClientEvent {aka std::function<void(WStype_t, unsigned char*, unsigned int)>}'
所需的数据类型“WebSocketClientEvent”在库的头文件中指定:
使用过的库:
class WebSocketsClient : protected WebSockets {
public:
typedef std::function<void(WStype_t type, uint8_t * payload, size_t length)> WebSocketClientEvent;
void onEvent(WebSocketClientEvent cbEvent);
所以我的问题是如何以库要求的方式传递函数?
答案 0 :(得分:0)
我找到了解决问题的方法。显然,类的普通函数和成员函数之间存在差异,因此指向每个函数的指针也不同。更详细的解释:https://isocpp.org/wiki/faq/pointers-to-members
我现在已将函数及其内部使用的变量设置为静态,从而解决了问题。