gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:35 27 4
gpt4 key购买 nike

我正在慢慢开始从事涉及使用 Adafruit ItsyBitsy M4、ATWINC1500 和 WiFi101 库的 WiFi 客户端的物联网项目。在单个草图中,一切都很好,但这很快就会变得难以控制。我已经切换到 PlatformIO 环境并正在使用 CPP 重写。

我希望能够根据其目的将我的代码模块化为大部分已经成功的类。然后我可以将连接的硬件(即串行端口的 NeoPixel 和 Uart)的指针 (*) 传递给类“set”方法。但是,我一直无法使用 WiFiClassWiFiClient 类执行此操作。

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

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

我的问题:

  1. 有什么方法可以显式声明 WiFiClass 并初始化自定义 WiFi101 连接,而不是使用库提供的默认 WiFi 类?为清楚起见,我喜欢查看事物的初始化位置,而不仅仅是接受它们已经存在。
  2. 我真的可以将 WiFiClient 类传递给我自己的类,并让所有类通过指针在 main.cpp 中使用同一个实例吗?

以下是我到目前为止所尝试的:

网络接口(interface)类

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

// network-interface.cpp:

WiFiClient NetworkInterface::getNetworkClient() {
return *_networkClient;
}

byte NetworkInterface::setNetworkInterface(WiFiClient *newNetworkInterface, interfacetype_t mode) {
if (mode >= 0 && mode <= 3) {
networkMode = mode;
} else {
networkMode = -1; // TODO: Use enum
return -1;
}
_networkClient = newNetworkInterface;
return mode;
}


// .header file:

#ifndef NETWORKINTERFACE_H
#define NETWORKINTERFACE_H_

#include "Arduino.h"

typedef enum {
INTERFACETYPE_WIFI = 0,
INTERFACETYPE_ETH = 1,
INTERFACETYPE_BT = 2,
INTERFACETYPE_UNSUPPORTED = -1
} interfacetype_t;

class NetworkInterface {

public:
bool connectToSSID(byte ssid[], byte password[]);
bool getConnectionStatus();
bool disconnectFromNetwork();
interfacetype_t getNetworkMode();
WiFiClient getNetworkClient();
byte setNetworkInterface(WiFiClient *newNetworkInterface, interfacetype_t mode); // 26.01.2019 - LIMITED TO WiFICLIENT, UNSURE ABOUT WiFiClass

private:
interfacetype_t networkMode;
WiFiClient *_networkClient;
};

#endif

主类:

// 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");
}

最佳答案

WiFi 是在 WiFi101.h 中声明并在 WiFi.cpp 中定义的全局对象(在两个文件的末尾)。要使用它,请包含 WiFi101.h 或传递对 WiFiClass& 类型的参数或字段的引用(对 WiFiClass 的引用)。

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

如果您想使用指针,请将 getter 函数更改为返回一个指针。但是原始对象必须存在于某个地方(现在它是全局的)。

WiFiClient* myClient = networkInterface.getNetworkClient();
if (myClient->available()) {

但 WiFiClient 类只是一个包装器,并且有 = 运算符重载为拷贝。如果复制它仍然引用相同的底层 TCP 套接字。所以你可以在没有指针或引用的情况下分配它。

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

关于c++ - Arduino WiFi101 库 - 将 WiFi 和 WiFiClient 传递给子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com