Node.js 无效握手-arduino使用socket.io与nodejs服务器进行握手

Node.js 无效握手-arduino使用socket.io与nodejs服务器进行握手,node.js,websocket,socket.io,arduino,handshake,Node.js,Websocket,Socket.io,Arduino,Handshake,我和我的朋友正在尝试将数据从我们的arduino wifi屏蔽推送到运行socket.io(v1.3.4)框架和express(v4.12.0)框架的nodejs本地服务器 我们尝试了多个库,但现在我们在尝试将http连接升级到websocket连接时出现了“无效握手”错误。知道我们做错了什么吗?尝试连接echo.websocket.org服务确实有效,所以我们假设服务器端缺少一些东西。(使用chrome或其他浏览器时,一切正常) Node.js服务器代码: var express = requ

我和我的朋友正在尝试将数据从我们的arduino wifi屏蔽推送到运行socket.io(v1.3.4)框架和express(v4.12.0)框架的nodejs本地服务器

我们尝试了多个库,但现在我们在尝试将http连接升级到websocket连接时出现了“无效握手”错误。知道我们做错了什么吗?尝试连接echo.websocket.org服务确实有效,所以我们假设服务器端缺少一些东西。(使用chrome或其他浏览器时,一切正常)

Node.js服务器代码:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    seats = [
        {id: 0, status: false},
        {id: 1, status: false},
        {id: 2, status: false},
        {id: 3, status: false},
        {id: 4, status: false},
        {id: 5, status: false},
        {id: 6, status: false},
        {id: 7, status: false},
        {id: 8, status: false},
        {id: 9, status: false},
        {id: 10, status: false},
        {id: 11, status: false},
        {id: 12, status: false},
        {id: 13, status: false},
        {id: 14, status: false},
        {id: 15, status: false}
    ]; //Seats from id 0 --> 15

server.listen(3000);

app.use("/css", express.static(__dirname + '/css'));
app.get('/', function(req, res) {
    res.sendFile(__dirname + '/');
});

// Socket code
io.sockets.on('connection', function (socket) {

    console.log("Somebody connected, push seatlist");
    socket.emit('init-seats', seats);

    // Change status of zetel
    socket.on('zetel-toggle', function (data) {
        console.log("zetel-toggle called");
        seats[data.id].status = data.status;
        io.sockets.emit('change-status', data);
    });

    socket.on('hello', function() {
        console.log("Somebody said hallo");
    });


    socket.on('disconnect', function (data) {
        console.log("Somebody DISconnected");
    });
});

/*io.use(function(socket, next) {
  var handshakeData = socket.request;
    for( variabele in handshakeData) {
        console.log("handshakedata: "+variabele);
    }
  next();
});*/
#include <SPI.h>
#include <WiFi.h>
// Here we define a maximum framelength to 64 bytes. Default is 256.
#define MAX_FRAME_LENGTH 64
// Define how many callback functions you have. Default is 1.
#define CALLBACK_FUNCTIONS 1
#include <WebSocketClient.h>

WiFiClient client;
WebSocketClient webSocketClient;
char ssid[] = "#####"; // Blanked out for stackoverflow
char pass[] = "#####"; // Blanked out for stackoverflow
int status = WL_IDLE_STATUS;
int fsrReading;
int fsrAnalogPin = 1;
int LEDbrightness;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Joining WiFi network..."));
  connectWifi();
  pinMode(13, OUTPUT);

  // Connect to the websocket server
  if (client.connect("192.168.46.238", 3000)) {
  //if (client.connect("echo.websocket.org", 80)) {
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
  }

  // Handshake with the server
  webSocketClient.path = "/";
  webSocketClient.host = "192.168.46.238";

  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed."); 
  }
}

void loop() {
  String data;
  fsrReading = analogRead(fsrAnalogPin);
  Serial.print("Analog reading = ");
  Serial.println(fsrReading);  
  LEDbrightness = map(fsrReading, 0, 1023, 0, 255);
  analogWrite(13, LEDbrightness);

  if (client.connected()) {

    data = webSocketClient.getData();

    if (data.length() > 0) {
      Serial.print("Received data: ");
      Serial.println(data);
    }

    // capture the value of analog 1, send it along
    pinMode(1, INPUT);
    data = String(LEDbrightness);
    if(LEDbrightness > 200) {
      webSocketClient.sendData("hello");
    } else {    
      webSocketClient.sendData("bye");
    }

  } else {

    Serial.println("Client disconnected.");
    while (1) {
      // Hang on disconnect.
    }
  }

  // Wait to fully let the client disconnect
  delay(500);
}

void connectWifi(void) {
  Serial.println("Attempting to connect to Y&RGroup-visitors using WPA2-Personal ...");
  status = WiFi.begin(ssid, pass);
  delay(5000); // give it at least 10 seconds to attempt a connection

  if(status != WL_CONNECTED) {
    Serial.println("Couldn't establish a wireless connection.");
    Serial.println("Network capabilities have been disabled.");
  } else {
    Serial.println("Wireless connection established.");
    printWifiStatus();
  }  
}

void printWifiStatus() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
Arduino代码:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),
    seats = [
        {id: 0, status: false},
        {id: 1, status: false},
        {id: 2, status: false},
        {id: 3, status: false},
        {id: 4, status: false},
        {id: 5, status: false},
        {id: 6, status: false},
        {id: 7, status: false},
        {id: 8, status: false},
        {id: 9, status: false},
        {id: 10, status: false},
        {id: 11, status: false},
        {id: 12, status: false},
        {id: 13, status: false},
        {id: 14, status: false},
        {id: 15, status: false}
    ]; //Seats from id 0 --> 15

server.listen(3000);

app.use("/css", express.static(__dirname + '/css'));
app.get('/', function(req, res) {
    res.sendFile(__dirname + '/');
});

// Socket code
io.sockets.on('connection', function (socket) {

    console.log("Somebody connected, push seatlist");
    socket.emit('init-seats', seats);

    // Change status of zetel
    socket.on('zetel-toggle', function (data) {
        console.log("zetel-toggle called");
        seats[data.id].status = data.status;
        io.sockets.emit('change-status', data);
    });

    socket.on('hello', function() {
        console.log("Somebody said hallo");
    });


    socket.on('disconnect', function (data) {
        console.log("Somebody DISconnected");
    });
});

/*io.use(function(socket, next) {
  var handshakeData = socket.request;
    for( variabele in handshakeData) {
        console.log("handshakedata: "+variabele);
    }
  next();
});*/
#include <SPI.h>
#include <WiFi.h>
// Here we define a maximum framelength to 64 bytes. Default is 256.
#define MAX_FRAME_LENGTH 64
// Define how many callback functions you have. Default is 1.
#define CALLBACK_FUNCTIONS 1
#include <WebSocketClient.h>

WiFiClient client;
WebSocketClient webSocketClient;
char ssid[] = "#####"; // Blanked out for stackoverflow
char pass[] = "#####"; // Blanked out for stackoverflow
int status = WL_IDLE_STATUS;
int fsrReading;
int fsrAnalogPin = 1;
int LEDbrightness;

void setup() {
  Serial.begin(9600);
  Serial.println(F("Joining WiFi network..."));
  connectWifi();
  pinMode(13, OUTPUT);

  // Connect to the websocket server
  if (client.connect("192.168.46.238", 3000)) {
  //if (client.connect("echo.websocket.org", 80)) {
    Serial.println("Connected");
  } else {
    Serial.println("Connection failed.");
  }

  // Handshake with the server
  webSocketClient.path = "/";
  webSocketClient.host = "192.168.46.238";

  if (webSocketClient.handshake(client)) {
    Serial.println("Handshake successful");
  } else {
    Serial.println("Handshake failed."); 
  }
}

void loop() {
  String data;
  fsrReading = analogRead(fsrAnalogPin);
  Serial.print("Analog reading = ");
  Serial.println(fsrReading);  
  LEDbrightness = map(fsrReading, 0, 1023, 0, 255);
  analogWrite(13, LEDbrightness);

  if (client.connected()) {

    data = webSocketClient.getData();

    if (data.length() > 0) {
      Serial.print("Received data: ");
      Serial.println(data);
    }

    // capture the value of analog 1, send it along
    pinMode(1, INPUT);
    data = String(LEDbrightness);
    if(LEDbrightness > 200) {
      webSocketClient.sendData("hello");
    } else {    
      webSocketClient.sendData("bye");
    }

  } else {

    Serial.println("Client disconnected.");
    while (1) {
      // Hang on disconnect.
    }
  }

  // Wait to fully let the client disconnect
  delay(500);
}

void connectWifi(void) {
  Serial.println("Attempting to connect to Y&RGroup-visitors using WPA2-Personal ...");
  status = WiFi.begin(ssid, pass);
  delay(5000); // give it at least 10 seconds to attempt a connection

  if(status != WL_CONNECTED) {
    Serial.println("Couldn't establish a wireless connection.");
    Serial.println("Network capabilities have been disabled.");
  } else {
    Serial.println("Wireless connection established.");
    printWifiStatus();
  }  
}

void printWifiStatus() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
#包括
#包括
//这里我们将最大帧长度定义为64字节。默认值为256。
#定义最大帧长度64
//定义有多少个回调函数。默认值为1。
#定义回调函数1
#包括
无线客户端;
WebSocketClient WebSocketClient;
char ssid[]=“######”;//被封锁以防溢出
字符传递[]=“######”;//被封锁以防溢出
int状态=WL\U空闲\U状态;
国际阅读;
int fsrAnalogPin=1;
亮度;
无效设置(){
Serial.begin(9600);
Serial.println(F(“加入WiFi网络…”);
连接WiFi();
pinMode(13,输出);
//连接到websocket服务器
if(客户端连接(“192.168.46.238”,3000)){
//if(client.connect(“echo.websocket.org”,80)){
Serial.println(“已连接”);
}否则{
Serial.println(“连接失败”);
}
//与服务器握手
webSocketClient.path=“/”;
webSocketClient.host=“192.168.46.238”;
if(webSocketClient.handshake(客户端)){
Serial.println(“握手成功”);
}否则{
Serial.println(“握手失败”);
}
}
void循环(){
字符串数据;
fsrReading=模拟读取(fsrAnalogPin);
串行打印(“模拟读取=”);
Serial.println(fsrreding);
LED亮度=地图(fsr读数,0,1023,0,255);
模拟写入(13,LED亮度);
if(client.connected()){
data=webSocketClient.getData();
if(data.length()>0){
串行打印(“接收数据:”);
Serial.println(数据);
}
//捕获模拟1的值,并将其发送
pinMode(1,输入);
数据=字符串(LED亮度);
如果(LED亮度>200){
sendData(“你好”);
}否则{
webSocketClient.sendData(“再见”);
}
}否则{
Serial.println(“客户端断开连接”);
而(1){
//挂断。
}
}
//等待完全让客户端断开连接
延迟(500);
}
无效连接WiFi(无效){
Serial.println(“尝试使用WPA2 Personal连接到Y&R组访问者…”);
状态=WiFi.begin(ssid,通过);
延迟(5000);//给它至少10秒的时间来尝试连接
如果(状态!=WL\U已连接){
Serial.println(“无法建立无线连接”);
Serial.println(“网络功能已被禁用”);
}否则{
Serial.println(“建立无线连接”);
printWifiStatus();
}  
}
void printWifiStatus(){
序列号。打印(“SSID:”);
Serial.println(WiFi.SSID());
ip地址ip=WiFi.localIP();
串行打印(“IP地址:”);
序列号println(ip);
长rssi=WiFi.rssi();
串行打印(“信号强度(RSSI):”;
串行打印(rssi);
Serial.println(“dBm”);
}
当我们运行arduino代码时,这是我们在序列中得到的:

欢迎任何意见。。。 我们已经为此工作了好几天,但都没有成功。
谢谢

据我所知,服务器侦听端口3000上的连接:

server.listen(3000);
但您的客户端正在尝试连接到端口80:

if (client.connect("192.168.46.238", 80)) {
试试这个:

if (client.connect("192.168.46.238", 3000)) {

抱歉,当我们切换到echo.websocket.org测试时,这是一个复制粘贴错误…当我们尝试连接到本地服务器时,我们使用了端口3000-在OPany更新中更改了该端口?您是否设法使其工作或任何替代方案?socket.io和arduino的websocket客户端的问题是它们不兼容。socket.io是websocket之上的一个协议,所以它不一样。你甚至不能将一个简单的websocket客户端从javascript连接到一个socket.io服务器。