无效握手 - 使用socket.io的arduino到nodejs服务器

时间:2015-03-04 12:42:24

标签: node.js websocket socket.io arduino handshake

我和我的好友正在尝试将带有wifi shield的arduino数据推送到运行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();
});*/

Arduino代码:

#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代码时,这就是我们在序列中得到的: http://i.stack.imgur.com/FkyKk.png

欢迎任何输入...... 我们现在正在努力工作多天而没有成功。 感谢

1 个答案:

答案 0 :(得分:0)

根据我的理解,服务器侦听端口3000上的连接:

server.listen(3000);

但是您的客户端正在尝试连接到端口80:

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

试试这个:

if (client.connect("192.168.46.238", 3000)) {
相关问题