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