Arduino字符串分配

时间:2015-01-21 00:15:02

标签: c++ arduino

我正在尝试创建一个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。

0 个答案:

没有答案