2015-09-15 60 views
0

我正在使用一個MQTT連接的庫,我想創建一個函數來創建對象,而不是在預處理器中進行設置。原因是因爲我需要在程序開始運行後獲取它連接的服務器。在一個函數中創建一個新對象 - C++

這裏是我的mqttConnection功能:

void mqttConnection(bool checkConnection) { 

if (!checkConnection) { 
    strcpy(mqttServer, mqttUrl); 

    PubSubClient client(mqttServer, 1883, callback, wifiClient); // why would it care if this was here? 
} 

// Connecting to MQTT broker, loop until connected 
while (!client.connected()){ 
    if(!client.connect("device-name")) { 
     Serial.println("MQTT Broker Connection Failed. Trying Again..."); 
    } 
    else { 
     Serial.println("MQTT Broker Connection Success!"); 
     if(client.subscribe(mqttTopic)) { 
      Serial.println("Subscription Successful! Woot!"); 
     } 
    } 
} 

} 

這裏是類:

#ifndef PubSubClient_h 
#define PubSubClient_h 

#include <Arduino.h> 
#include "Client.h" 

// MQTT_MAX_PACKET_SIZE : Maximum packet size 
#define MQTT_MAX_PACKET_SIZE 128 

// MQTT_KEEPALIVE : keepAlive interval in Seconds 
#define MQTT_KEEPALIVE 15 

#define MQTTPROTOCOLVERSION 3 
#define MQTTCONNECT  1 << 4 // Client request to connect to Server 
#define MQTTCONNACK  2 << 4 // Connect Acknowledgment 
#define MQTTPUBLISH  3 << 4 // Publish message 
#define MQTTPUBACK  4 << 4 // Publish Acknowledgment 
#define MQTTPUBREC  5 << 4 // Publish Received (assured delivery part 1) 
#define MQTTPUBREL  6 << 4 // Publish Release (assured delivery part 2) 
#define MQTTPUBCOMP  7 << 4 // Publish Complete (assured delivery part 3) 
#define MQTTSUBSCRIBE 8 << 4 // Client Subscribe request 
#define MQTTSUBACK  9 << 4 // Subscribe Acknowledgment 
#define MQTTUNSUBSCRIBE 10 << 4 // Client Unsubscribe request 
#define MQTTUNSUBACK 11 << 4 // Unsubscribe Acknowledgment 
#define MQTTPINGREQ  12 << 4 // PING Request 
#define MQTTPINGRESP 13 << 4 // PING Response 
#define MQTTDISCONNECT 14 << 4 // Client is Disconnecting 
#define MQTTReserved 15 << 4 // Reserved 

#define MQTTQOS0  (0 << 1) 
#define MQTTQOS1  (1 << 1) 
#define MQTTQOS2  (2 << 1) 

class PubSubClient { 
private: 
    Client* _client; 
    uint8_t buffer[MQTT_MAX_PACKET_SIZE]; 
    uint16_t nextMsgId; 
    unsigned long lastOutActivity; 
    unsigned long lastInActivity; 
    bool pingOutstanding; 
    void (*callback)(char*,uint8_t*,unsigned int); 
    uint16_t readPacket(); 
    uint8_t readByte(); 
    boolean write(uint8_t header, uint8_t* buf, uint16_t length); 
    uint16_t writeString(char* string, uint8_t* buf, uint16_t pos); 
    uint8_t *ip; 
    char* domain; 
    uint16_t port; 
public: 
    PubSubClient(Client& client); 
    PubSubClient(uint8_t *, uint16_t, void(*)(char*,uint8_t*,unsigned int),Client& client); 
    PubSubClient(char*, uint16_t, void(*)(char*,uint8_t*,unsigned int),Client& client); 
    boolean connect(char *); 
    boolean connect(char *, char *, char *); 
    boolean connect(char *, char *, uint8_t, uint8_t, char *); 
    boolean connect(char *, char *, char *, char *, uint8_t, uint8_t, char*); 
    void disconnect(); 
    boolean publish(char *, char *); 
    boolean publish(char *, uint8_t *, unsigned int); 
    boolean publish(char *, uint8_t *, unsigned int, boolean); 
    boolean publish_P(char *, uint8_t *, unsigned int, boolean); 
    boolean subscribe(char *); 
    boolean loop(); 
    boolean connected(); 
}; 


#endif 

我得到的錯誤是,

'client' was not declared in this scope 

爲什麼它很重要,它是在功能?

回答

3
PubSubClient client(mqttServer, 1883, callback, wifiClient); 

在if語句範圍內。由於C++中的作用域規則,變量只能在if語句的大括號之前被訪問。

您可以更改

if (!checkConnection) { 
    strcpy(mqttServer, mqttUrl); 

    PubSubClient client(mqttServer, 1883, callback, wifiClient); // why would it care if this was here? 
} 

if (!checkConnection) { 
    strcpy(mqttServer, mqttUrl); 
} 
PubSubClient client(mqttServer, 1883, callback, wifiClient); 
2

client範圍僅限於if聲明。您需要將其聲明範圍之外,這樣的:

PubSubClient client(/*Some default arguments*/); 

if (!checkConnection) { 
    client = client(mqttServer, 1883, callback, wifiClient); 
} 

while (!client.connected()) { 
/*...*/ 
} 
3

除了回答關於client範圍,如果你使用最新版本的PubSubClient庫,現在有用於設置功能客戶端對象創建之後的服務器詳細信息:

PubSubClient client(wifiClient); 

// some time later 
client.setServer(mqttServer,1883); 

這使得在運行時更改服務器詳細信息變得更容易。

完整的API文檔在這裏:http://pubsubclient.knolleary.net/

+0

感謝這個,它會解決我的client.loop()問題。並感謝偉大的圖書館! – Craigfoo

0

我可以MQTT服務器連接,並且還我可以從客戶端訂閱。可是如何才能讓訂閱從客戶

它顯示的數據1

str=client.subscribe(testq); 
    if(str>0) 
    { 

     Serial.println(str); 
} 

這意味着訂閱全成

但如何打印認購數據

請幫助我

相關問題