#websocket #esp8266
#websocket #esp8266
Вопрос:
Я пытаюсь обслуживать веб-страницу с цветовым кругом. Когда пользователь меняет цвет на колесе, я хочу отправить новое значение rgb в esp, но код в esp никогда не вводится
if(type == WStype_TEXT)
Серверная часть (код esp8266):
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WebSocketsServer.h>
#include "index.h"
const char* WiFissid = "ssid";
const char* WiFiPassword = "password";
const int WebServerPort = port;
const int WebSocketsPort = port;
ESP8266WebServer WebServer(WebServerPort);
WebSocketsServer WebSockets = WebSocketsServer(WebSocketsPort);
const int RedPin = 13;
const int GreenPin = 12;
const int BluePin = 14;
const int Resolution = 256;
int RedValue = 0;
int GreenValue = 0;
int BlueValue = 255;
/* Serve Web Page */
void ServeMainPage()
{
WebServer.send(200, "text/html", MainPage);
}
/* Web Sockets Get Input */
void WebSocketsGetData(uint8_t num, WStype_t type, uint8_t * payload, size_t length)
{
if(type == WStype_CONNECTED)
{
IPAddress ip = WebSockets.remoteIP(num);
Serial.println(String(ip[0]) String(ip[1]) String(ip[2]) String(ip[3]));
String _payload = String((char *) amp;payload[0]);
Serial.println(_payload);
}
else if(type == WStype_TEXT)
{
String _payload = String((char *) amp;payload[0]);
Serial.println(_payload);
}
else if(type == WStype_DISCONNECTED)
{
Serial.println("Client disconnected");
}
}
/* Setup */
void setup()
{
/* Map Pins and Set Default Color */
analogWriteRange(Resolution);
analogWrite(RedPin, RedValue);
analogWrite(GreenPin, GreenValue);
analogWrite(BluePin, BlueValue);
/* Start Serial */
Serial.begin(9600);
/* Connect to WiFi */
WiFi.mode(WIFI_STA);
WiFi.begin(WiFissid, WiFiPassword);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
}
Serial.println(WiFi.localIP());
/* Start and Config Web Server */
WebServer.on("/", ServeMainPage);
WebServer.begin();
/* Start and Config Web Sockets Server */
WebSockets.onEvent(WebSocketsGetData);
WebSockets.begin();
}
void loop()
{
WebServer.handleClient();
WebSockets.loop();
}
index.h:
const char MainPage[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<meta charset="UTF-8">
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jscolor/2.0.4/jscolor.min.js"></script>
<script src = "https://cdn.jsdelivr.net/npm/@jaames/iro"></script>
<title>Leduri Rares</title>
</head>
<body>
<div class = "container-fluid">
<div class = "row">
<div class = "wheel" id = "ColorWheel"></div>
</div>
</div>
</body>
</html>
<style>
body
{
background-color: #000000;
overflow-x: hidden;
}
h1
{
color: white;
}
.container-fluid
{
margin-top: 5%;
}
.row
{
text-align: center;
}
#ColorWheel
{
margin: 0 auto;
}
@media only screen and (max-width: 800px)
{
.container-fluid
{
margin-top: 10%;
}
#ColorWheel
{
margin: 5% auto;
}
}
</style>
<script>
let Socket = new WebSocket("wss://myIP:WSPort");
Socket.onclose = function(event)
{
if (event.wasClean)
{
alert("Connection with the server was closed smoothly");
} else
{
alert("Connection with the server was closed unexpectedly");
}
};
Socket.onerror = function(error)
{
alert("Connection Error: " String(error.message));
};
var colorWheel = new iro.ColorPicker("#ColorWheel",
{
color: "rgb(255, 255, 255)",
borderWidth: 2,
borderColor: '#ffffff',
width: 275,
});
colorWheel.on('color:change', function(color, changes)
{
var Color = colorWheel.color.rgb;
let ColorsJSON = {
Red: Color.r,
Green: Color.g,
Blue: Color.b
};
Socket.send(JSON.stringify(ColorsJSON));
});
</script>
)=====";
Я новичок в программировании, и у меня нет идеи, почему это не работает, любая помощь приветствуется!
Ответ №1:
Ваш ESP8266 skecth в порядке. Только что протестировано с моим собственным клиентом. Дважды проверьте свой index.h или замените его простым для целей тестирования.
Комментарии:
1. Я понял это, я написал wss вместо ws на интерфейсе, чтобы соединение было безопасным, даже если у меня нет сертификата ssl, это небольшая ошибка, но из-за нее все это не сработало, большое спасибо за ваше время