我正在尝试创建一个lib来连接到Socket.io websocket。但是我在连接两个char数组时遇到了很大的问题。
头文件(WebSocket.h)
#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H_
#include <YunClient.h>
#include <Arduino.h>
#include <Console.h>
#define BUFFER_SIZE 25
#define SID_SIZE 21
class WebSocket{
private:
char buffer[BUFFER_SIZE];
char sid[SID_SIZE];
YunClient client;
void sendHandShake(char host[], int port);
void sendCredentials(char host[], char sid[]);
void readResponse();
void readSID();
bool waitResponse();
public:
bool connect(char host[], int port = 3000);
};
#endif
WebSocket.cpp
#include <WebSocket.h>
bool WebSocket::connect(char host[], int port){
if(!client.connect(host, port)){
return false;
}
sendHandShake(host, port);
readResponse();
//Search for HTTP/1.1 200 OK
if(atoi(&buffer[8]) != 200){
Console.println(F("HandShake Error. Should have got 200"));
return false;
}
while(client.available()){
readResponse();
if(buffer[0] == '4'){
readSID();
break;
}
}
Console.println(F("finish reading"));
memset(buffer, 0, BUFFER_SIZE);
sendCredentials(host, sid);
return true;
}
void WebSocket::sendHandShake(char host[], int port){
client.println(F("GET /socket.io/1/ HTTP/1.1"));
client.println(strcat("Host: ", host));
client.println(F("Origin: ArduinoWebSocketClient"));
client.println();
}
void WebSocket::sendCredentials(char host[], char sid[]){
strcat(buffer, "GET /socket.io/1/websocket/");
strcat(buffer, sid);
strcat(buffer, " HTTP 1.1");
Console.println(buffer);
client.println(buffer);
client.println(strcat("Host: ", host));
client.println(F("Origin: ArduinoWebSocketClient"));
client.println(F("Upgrade: WebSocket"));
client.println(F("Connection: Upgrade"));
client.println(F("Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw=="));
client.println(F("Sec-WebSocket-Version: 13"));
client.println(F("Origin: ArduinoSocketIOClient"));
client.println();
}
void WebSocket::readResponse(){
if(!waitResponse())
return;
char character,
*dataPtr = buffer;
while(client.available() > 0 && (character = client.read()) != '\n') {
if (character != '\r' && character != -1) {
*dataPtr++ = character;
}
}
}
void WebSocket::readSID(){
char character,
*dataPtr = sid;
while(client.available() > 0 && (character = client.read()) != '\n') {
if (character == ':')
break;
if (character != '\r' && character != -1)
*dataPtr++ = character;
}
}
bool WebSocket::waitResponse() {
unsigned long now = millis();
while(!client.available() && ((millis() - now) < 30000UL)) {}
return client.available();
}
当我调用方法“sendCredentials()”时,我的缓冲区输出是
92.168.1.112CWeBIaWZqr3qb7-CemMTClient HTTP 1.1
什么时候应该
GET /socket.io/1/websocket/CWeBIaWZqr3qb7-CemMTC HTTP 1.1
我认为这可能是一个内存问题,但我真的找不到解决方案。 我正在使用ArduinoYún。