Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino WiFi101库-将WiFi和WiFiClient传递给子类_C++_C_Pointers_Arduino - Fatal编程技术网

C++ Arduino WiFi101库-将WiFi和WiFiClient传递给子类

C++ Arduino WiFi101库-将WiFi和WiFiClient传递给子类,c++,c,pointers,arduino,C++,C,Pointers,Arduino,我正在慢慢地着手一个物联网项目,涉及一个使用Adafruit ItsyBitsy M4、ATWINC1500和WiFi101库的WiFi客户端。在一个草图中,所有这些都非常有效,但很快就会变得难以管理。我已经切换到PlatformIO环境,正在使用CPP重写 我希望能够根据其目的将代码模块化为类,这些类在很大程度上是成功的。然后,我可以将连接硬件的指针(*)传递给类“set”方法(即,对于串行端口,NeoPixel和Uart)。但是,我无法使用WiFiClass和WiFiClient类实现这一点

我正在慢慢地着手一个物联网项目,涉及一个使用Adafruit ItsyBitsy M4、ATWINC1500和WiFi101库的WiFi客户端。在一个草图中,所有这些都非常有效,但很快就会变得难以管理。我已经切换到PlatformIO环境,正在使用CPP重写

我希望能够根据其目的将代码模块化为类,这些类在很大程度上是成功的。然后,我可以将连接硬件的指针(
*
)传递给类“set”方法(即,对于串行端口,NeoPixel和Uart)。但是,我无法使用
WiFiClass
WiFiClient
类实现这一点

我尝试过将
WiFi
WiFiClient
作为指针传递给我的类(请参见下面的代码),同样,我成功地将Uart Classe用于串行端口(尽管我必须使用
->
而不是
用于方法)。问题是,虽然我能够确定(我认为是什么)当前客户端状态,但在我的循环()中从未返回任何数据。我有getter和setter方法来获取/设置
WiFiClient
指针,但使用它们时没有数据

当草图开始时,
WiFiClass
WiFi
对象)似乎也在自动创建,这让我感到不舒服,因为我没有在任何地方声明它

我的问题是:
  • 与使用库提供的默认
    WiFi
    类相比,是否有任何方法可以显式声明
    WiFiClass
    并初始化自定义WiFi101连接?为了清楚起见,我喜欢看到事情的初始状态,而不仅仅是接受它们已经存在的事实
  • 我是否真的可以将
    WiFiClient
    类传递给我自己的类,并让所有类通过指针在
    main.cpp
    中使用同一个实例 以下是我迄今为止所做的尝试:

    网络接口类 (最初设计用于保存整个实例化的WiFi类,但目前仅使用WiFiClient):

    //network-interface.cpp:
    WiFiClient NetworkInterface::getNetworkClient(){
    返回*\u网络客户端;
    }
    字节网络接口::setNetworkInterface(WiFiClient*newNetworkInterface,interfacetype\u t模式){
    
    如果(mode>=0&&mode
    WiFi
    是在WiFi101.h中声明并在WiFi.cpp中定义的全局对象(在两个文件的末尾)。要使用它,请包括WiFi101.h或传递对
    WiFiClass&
    类型的参数或字段的引用(参考WiFiClass)

    从您的代码中,不清楚要对客户端对象执行什么操作。您的客户端对象是全局的,我看不到它连接到服务器的位置。您将全局对象的指针设置为networkInterface对象,存储指针,但getter函数的返回类型不是指针,局部变量myClient也不是指针

    如果要使用指针,请更改getter函数以返回指针。但是,原始对象必须存在于某个位置(现在是全局对象)

    但是WiFiClient类只是一个包装器,并将
    =
    操作符重载为copy。如果复制,它仍然引用相同的底层TCP套接字。因此,您可以不使用指针或引用来分配它

    WiFiClient _networkClient;
    byte setNetworkInterface(WiFiClient &client) {
      _networkClient = client; // copy data about TCP socket
    }
    

    你好,Juraj,谢谢你花时间解释。我提供的代码不清楚,而且我在尝试不同的东西时引入了错误。我应该先正确检查一下。我目前正在编写一个客户端库来“对话”使用最终将使用客户端的推送通道。我只是想先尝试将其传递给某种类。将在今天晚些时候实现您的建议
    // main.cpp:
    
    #include <SPI.h>
    #include <WiFi101.h>
    #include "arduino_secrets.h"
    #include "network-interface.h"
    
    char ssid[] = SECRET_SSID;        // your network SSID (name)
    char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
    int keyIndex = 0;            // your network key Index number (needed only for WEP)
    int status = WL_IDLE_STATUS;
    char server[] = "www.google.com";    // name address for Google (using DNS)
    WiFiClient client;
    
    NetworkInterface networkInterface;
    
    
    void setup() {
        //Initialize serial and wait for port to open:
        Serial.begin(9600);
        while (!Serial);
    
        Serial.println("= = = Simple Client-Server Test = = = ");
    
        WiFi.setPins(A5, A4, A3, A2);
        if (WiFi.status() == WL_NO_SHIELD) {
            Serial.println("WiFi shield not present");
            while (true);
        }
    
        // attempt to connect to WiFi network:
        while (status != WL_CONNECTED) {
            Serial.print("Attempting to connect to SSID: ");
            Serial.println(ssid);
            // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
            status = WiFi.begin(ssid, pass);
    
            // wait for connection 
            delay(2000);
        }
        Serial.println("Connected to wifi");
        printWiFiStatus();
    
        Serial.println("\nStarting connection to server...");
    
        /*
          Pass the network client (and hopefully soon WiFi class with hardware connection data) to NetworkInterface class
    
          TODO: IMPLEMENT ENUM FOR INTERFACE TYPES
        */
        networkInterface.setNetworkInterface(&client, 0); 
        ...
    }
    
    void loop() {
        // if there are incoming bytes available
        // from the server, read them and print them:
        WiFiClient myClient = networkInterface.getNetworkClient();
    
        if (myClient.available()) {
            Serial.print("\n==================================\n");
            Serial.print("| REMOTE :: Server Has Responded: |");
            Serial.print("\n----------------------------------\n");
            while (myClient.available()) {
                char c = myClient.read();
                Serial.write(c);
            }
            Serial.print("\n==================================\n");
        }
    
        // if the server's disconnected, stop the myClient:
        if (!myClient.connected()) {
            Serial.println();
            Serial.println("CLIENT :: Disconnecting");
            myClient.stop();
    
            // do nothing forevermore:
            while (true);
        }
    }
    
    
    void makeTestCallToPusher() {
          char serverURLTest[] = "192.168.2.4";
    
          WiFiClient myClient = networkInterface.getNetworkClient();
    
        if (myClient.connect(serverURLTest, 80)) {
            Serial.print("CLIENT :: Connected - ");Serial.print(serverURLTest);Serial.print("\n");
            myClient.println("GET /test HTTP/1.1");
            myClient.println("Upgrade: WebSocket");
            myClient.println("Connection: Upgrade");
            myClient.println("Origin: ARDUINO_TEST");
            myClient.println("Host: eu");
            myClient.println("Connection: close");
            myClient.println();
        }
    }
    
    
    void printWiFiStatus() {
        // print the SSID of the network you're attached to:
        Serial.print("SSID: ");
        Serial.println(WiFi.SSID());
    
        // print your WiFi shield's IP address:
        IPAddress ip = WiFi.localIP();
        Serial.print("IP Address: ");
        Serial.println(ip);
    
        // print the received signal strength:
        long rssi = WiFi.RSSI();
        Serial.print("signal strength (RSSI):");
        Serial.print(rssi);
        Serial.println(" dBm");
    }
    
    WiFiClient* myClient = networkInterface.getNetworkClient();
    if (myClient->available()) {
    
    WiFiClient _networkClient;
    byte setNetworkInterface(WiFiClient &client) {
      _networkClient = client; // copy data about TCP socket
    }