Skip to content

Commit

Permalink
Add support PPP network in ESP32 Core v3.x.x
Browse files Browse the repository at this point in the history
  • Loading branch information
mobizt committed Dec 21, 2024
1 parent 6c735b9 commit 628efed
Show file tree
Hide file tree
Showing 17 changed files with 925 additions and 14 deletions.
36 changes: 30 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/mobizt/FirebaseClient/.github%2Fworkflows%2Fcompile_library.yml?logo=github&label=compile) [![Github Stars](https://img.shields.io/github/stars/mobizt/FirebaseClient?logo=github)](https://github.com/mobizt/FirebaseClient/stargazers) ![Github Issues](https://img.shields.io/github/issues/mobizt/FirebaseClient?logo=github)

![GitHub Release](https://img.shields.io/github/v/release/mobizt/FirebaseClient) ![Arduino](https://img.shields.io/badge/Arduino-v1.4.10-57C207?logo=arduino) ![PlatformIO](https://badges.registry.platformio.org/packages/mobizt/library/FirebaseClient.svg) ![GitHub Release Date](https://img.shields.io/github/release-date/mobizt/FirebaseClient)
![GitHub Release](https://img.shields.io/github/v/release/mobizt/FirebaseClient) ![Arduino](https://img.shields.io/badge/Arduino-v1.4.11-57C207?logo=arduino) ![PlatformIO](https://badges.registry.platformio.org/packages/mobizt/library/FirebaseClient.svg) ![GitHub Release Date](https://img.shields.io/github/release-date/mobizt/FirebaseClient)

[![GitHub Sponsors](https://img.shields.io/github/sponsors/mobizt?logo=github)](https://github.com/sponsors/mobizt)

Revision `2024-12-11T12:02:01Z`
Revision `2024-12-21T04:55:10Z`

## Table of Contents

Expand Down Expand Up @@ -133,6 +133,7 @@ For the FAQ (Frequently Asked Questions), please visit [here](/FAQ.md).
* Arduino® GIGA R1 WiFi
* Arduino® OPTA
* Raspberry Pi Pico (RP2040)
* Raspberry Pi Pico 2 (RP2350)
* STM32 MCU based boards (minimum 256k Flash memory)
* Teensy 3.1, 3.2, 3.5, 3.6, 4.0 and 4.1
* LAN8720 Ethernet PHY
Expand All @@ -142,7 +143,7 @@ For the FAQ (Frequently Asked Questions), please visit [here](/FAQ.md).
* W5100 SPI Ethernet module
* W5500 SPI Ethernet module
* SIMCom Modules with [TinyGSM](https://github.com/vshymanskyy/TinyGSM)

* PPP Modules with ESP32 Core v3.x.x

# Unsuppored Devices

Expand Down Expand Up @@ -327,7 +328,7 @@ Rename folder from **FirebaseClient-main** to **FirebaseClient**.
Go to menu **Files** -> **Examples** -> **FirebaseClient** and choose one from examples.


- ### RP2040 Arduino SDK installation
- ### RP2040/RP2350 Arduino SDK installation

For Arduino IDE, the Arduino-Pico SDK can be installed from Boards Manager by searching pico and choose Raspberry Pi Pico/RP2040 to install.

Expand Down Expand Up @@ -508,7 +509,7 @@ The async task handler will kepp the async tasks running as long as it places in
#### Running Many Tasks Concurrency Using Different Async Clients (In Different SSL Clients)

In Raspberry Pi Pico W, its `WiFiClientSecure` memory used for the transmit and receive buffers are adjustable (512 to 16384) and you have enough memory to run many tasks concurrency using different async clients.
In Raspberry Pi Pico W/2W, its `WiFiClientSecure` memory used for the transmit and receive buffers are adjustable (512 to 16384) and you have enough memory to run many tasks concurrency using different async clients.

In ESP32 device, its `WiFiClientSecure` memory usage cannot be adjusted, it requires at least 50 k per connection (37 k used for `mbedTLS` memory allocation) and only three `WiFiClientSecure`(s) can be defined.

Expand Down Expand Up @@ -1377,6 +1378,8 @@ The `AsyncClientClass` object requires the network config data (`network_config_
- [DefaultNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultNetwork/) is used with the core WiFi enabled networking.
- [DefaultPPPNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultPPPNetwork/) is used with the ESP32 core v3.x.x with PPP networking supports.
- [DefaultWiFiNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultWiFiNetwork/) is used with the core WiFi Multi enabled networking or non-core WiFi networking.
- [DefaultEthernetNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultEthernetNetwork/) is used with the core Ethernet enabled networking.
Expand All @@ -1397,7 +1400,7 @@ To set or change the network for the `AsyncClientClass`, please see [Change Netw
>
> In ESP8266/ESP32, you can't use WiFi while using ESP-Now.
The default network class can be used with WiFi capable MCUs e.g. ESP8266, ESP32 and Raspberry Pi Pico W.
The default network class can be used with WiFi capable MCUs e.g. ESP8266, ESP32 and Raspberry Pi Pico W/2W.
The boolean parameter passed to the default network class constructor is the option for how the network (WiFi) reconnection can be done automatically or manually.
Expand Down Expand Up @@ -1435,6 +1438,19 @@ When you define `DefaultNetwork` with no parameter, the WiFi reconnection will b
> If you are using ESP32 device, and `<reconnect_option>` was enabled. The bugs in the outdated ESP32 Core WiFi will cause unknown network connection issue when library is trying to reconnect your WiFi using `WiFi.reconnect()`.
> You have to update the ESP32 Arduino Core SDK to the latest version or at least v2.x.x.
- `DefaultPPPNetwork`
The `DefaultPPPNetwork` class constructor.
```cpp
DefaultPPPNetwork::DefaultPPNetwork()
```

This DefaultPPPNetwork class is for ESP32 v3.x.x with PPP network supports.

See [ESP32 DefaultPPPNetwork example](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultPPPNetwork/ESP32/) for using ESP32 with its PPP library.


- `DefaultWiFiNetwork`

This `DefaultWiFiNetwork` class required some parameter for reconnection using WiFi credentials.
Expand Down Expand Up @@ -1468,6 +1484,7 @@ void setup()
}
```


- `DefaultEthernetNetwork`

The DefaultEthernetNetwork class parameters are included the following.
Expand Down Expand Up @@ -1693,6 +1710,8 @@ The following section will provide the basic (bare minimum) code example and the
* [ESP32](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultEthernetNetwork/ESP32/)
* [ESP8266](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultEthernetNetwork/ESP8266/)
* [DefaultNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultNetwork/)
* [DefaultPPPNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultPPPNetwork/)
* [ESP32](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultPPPNetwork/ESP32/)
* [DefaultWiFiNetwork](/examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultWiFiNetwork/)
* [EthernetNetwork](/examples/App/NetworkInterfaces/Async/Callback/EthernetNetwork/)
* [GenericNetwork](/examples/App/NetworkInterfaces/Async/Callback/GenericNetwork/)
Expand All @@ -1704,6 +1723,8 @@ The following section will provide the basic (bare minimum) code example and the
* [ESP32](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultEthernetNetwork/ESP32/)
* [ESP8266](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultEthernetNetwork/ESP8266/)
* [DefaultNetwork](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultNetwork/)
* [DefaultPPPNetwork](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultPPPNetwork/)
* [ESP32](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultPPPNetwork/ESP32/)
* [DefaultWiFiNetwork](/examples/App/NetworkInterfaces/Async/NoCallback/DefaultNetworks/DefaultWiFiNetwork/)
* [EthernetNetwork](/examples/App/NetworkInterfaces/Async/NoCallback/EthernetNetwork/)
* [GenericNetwork](/examples/App/NetworkInterfaces/Async/NoCallback/GenericNetwork/)
Expand All @@ -1715,6 +1736,8 @@ The following section will provide the basic (bare minimum) code example and the
* [ESP32](/examples/App/NetworkInterfaces/Sync/DefaultNetworks/DefaultEthernetNetwork/ESP32/)
* [ESP8266](/examples/App/NetworkInterfaces/Sync/DefaultNetworks/DefaultEthernetNetwork/ESP8266/)
* [DefaultNetwork](/examples/App/NetworkInterfaces/Sync/DefaultNetworks/DefaultNetwork/)
* [DefaultPPPNetwork](/examples/App/NetworkInterfaces/Sync/DefaultNetworks/DefaultPPPNetwork/)
* [ESP32](/examples/App/NetworkInterfaces/Sync/DefaultNetworks/DefaultPPPNetwork/ESP32/)
* [DefaultWiFiNetwork](/examples/App/NetworkInterfaces/Sync//DefaultNetworks/DefaultWiFiNetwork/)
* [EthernetNetwork](/examples/App/NetworkInterfaces/Sync/EthernetNetwork/)
* [GenericNetwork](/examples/App/NetworkInterfaces/Sync/GenericNetwork/)
Expand Down Expand Up @@ -3093,6 +3116,7 @@ ENABLE_ESP8266_W5500_ETH // For native core library W5500 Ethernet module suppor
ENABLE_ESP8266_W5100_ETH // For native core library W5100 Ethernet module support in ESP8266.
FIREBASE_DISABLE_ONBOARD_WIFI // For disabling on-board WiFI functionality in case external Client usage.
FIREBASE_DISABLE_NATIVE_ETHERNET // For disabling native (sdk) Ethernet functionality in case external Client usage.
FIREBASE_DISABLE_NATIVE_PPP // For disabling native ESP32 (sdk) PPP functionality.
ENABLE_ASYNC_TCP_CLIENT // For Async TCP Client usage.
FIREBASE_ASYNC_QUEUE_LIMIT // For maximum async queue limit setting for an async client.
FIREBASE_PRINTF_PORT // For Firebase.printf debug port.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@


/**
* This example is for ESP32 Core v3.x.x and the SIM modules.
*
* WaveShare SIM7600 with hardware Flow Control
*
* ESP32 WaveShare SIM7600
*
* GPIO25 RST
* GPIO21 TX
* GPIO22 RX
* GPIO26 RTS
* GPIO27 CTS
* GND GND
*
* SIM800 basic module with just TX,RX and RST
*
* GPIO0 RST
* GPIO2 TX
* GPIO19 RX
* GND GND
*
* The PPP ESP32 example was taken from
* https://github.com/espressif/arduino-esp32/blob/master/libraries/PPP/examples/PPP_Basic/PPP_Basic.ino
*
* The complete usage guidelines, please visit https://github.com/mobizt/FirebaseClient
*
*/

#include <Arduino.h>

#include <FirebaseClient.h>

#include <NetworkClientSecure.h>

// The API key can be obtained from Firebase console > Project Overview > Project settings.
#define API_KEY "Web_API_KEY"

// User Email and password that already registerd or added in your project.
#define USER_EMAIL "USER_EMAIL"
#define USER_PASSWORD "USER_PASSWORD"

void asyncCB(AsyncResult &aResult);

void printResult(AsyncResult &aResult);

DefaultPPPNetwork default_network;

UserAuth user_auth(API_KEY, USER_EMAIL, USER_PASSWORD, 3000 /* expire period in seconds (<= 3600) */);

FirebaseApp app;

NetworkClientSecure ssl_client;

using AsyncClient = AsyncClientClass;

AsyncClient aClient(ssl_client, getNetwork(default_network));

#define PPP_MODEM_APN "YourAPN"
#define PPP_MODEM_PIN "0000" // or NULL

// WaveShare SIM7600 HW Flow Control
#define PPP_MODEM_RST 25
#define PPP_MODEM_RST_LOW false // active HIGH
#define PPP_MODEM_RST_DELAY 200
#define PPP_MODEM_TX 21
#define PPP_MODEM_RX 22
#define PPP_MODEM_RTS 26
#define PPP_MODEM_CTS 27
#define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_HW
#define PPP_MODEM_MODEL PPP_MODEM_SIM7600

// SIM800 basic module with just TX,RX and RST
// #define PPP_MODEM_RST 0
// #define PPP_MODEM_RST_LOW true //active LOW
// #define PPP_MODEM_TX 2
// #define PPP_MODEM_RX 19
// #define PPP_MODEM_RTS -1
// #define PPP_MODEM_CTS -1
// #define PPP_MODEM_FC ESP_MODEM_FLOW_CONTROL_NONE
// #define PPP_MODEM_MODEL PPP_MODEM_SIM800

bool firebaseConfigReady = false;

void onEvent(arduino_event_id_t event, arduino_event_info_t info)
{
switch (event)
{
case ARDUINO_EVENT_PPP_START:
Serial.println("PPP Started");
break;
case ARDUINO_EVENT_PPP_CONNECTED:
Serial.println("PPP Connected");
break;
case ARDUINO_EVENT_PPP_GOT_IP:
Serial.println("PPP Got IP");
break;
case ARDUINO_EVENT_PPP_LOST_IP:
Serial.println("PPP Lost IP");
break;
case ARDUINO_EVENT_PPP_DISCONNECTED:
Serial.println("PPP Disconnected");
break;
case ARDUINO_EVENT_PPP_STOP:
Serial.println("PPP Stopped");
break;
default:
break;
}
}

void setup()
{
Serial.begin(115200);

// This delay is needed in case ETH_CLK_MODE was set to ETH_CLOCK_GPIO0_IN,
// to allow the external clock source to be ready before initialize the Ethernet.
delay(500);

Serial.printf("Firebase Client v%s\n", FIREBASE_CLIENT_VERSION);

// Listen for modem events
Network.onEvent(onEvent);

// Configure the modem
PPP.setApn(PPP_MODEM_APN);
PPP.setPin(PPP_MODEM_PIN);
PPP.setResetPin(PPP_MODEM_RST, PPP_MODEM_RST_LOW, PPP_MODEM_RST_DELAY);
PPP.setPins(PPP_MODEM_TX, PPP_MODEM_RX, PPP_MODEM_RTS, PPP_MODEM_CTS, PPP_MODEM_FC);

Serial.println("Starting the modem. It might take a while!");
PPP.begin(PPP_MODEM_MODEL);

Serial.print("Manufacturer: ");
Serial.println(PPP.cmd("AT+CGMI", 10000));
Serial.print("Model: ");
Serial.println(PPP.moduleName());
Serial.print("IMEI: ");
Serial.println(PPP.IMEI());

bool attached = PPP.attached();
if (!attached)
{
int i = 0;
unsigned int s = millis();
Serial.print("Waiting to connect to network");
while (!attached && ((++i) < 600))
{
Serial.print(".");
delay(100);
attached = PPP.attached();
}
Serial.print((millis() - s) / 1000.0, 1);
Serial.println("s");
attached = PPP.attached();
}

Serial.print("Attached: ");
Serial.println(attached);
Serial.print("State: ");
Serial.println(PPP.radioState());
if (attached)
{
Serial.print("Operator: ");
Serial.println(PPP.operatorName());
Serial.print("IMSI: ");
Serial.println(PPP.IMSI());
Serial.print("RSSI: ");
Serial.println(PPP.RSSI());
int ber = PPP.BER();
if (ber > 0)
{
Serial.print("BER: ");
Serial.println(ber);
Serial.print("NetMode: ");
Serial.println(PPP.networkMode());
}

Serial.println("Switching to data mode...");
PPP.mode(ESP_MODEM_MODE_CMUX); // Data and Command mixed mode
if (!PPP.waitStatusBits(ESP_NETIF_CONNECTED_BIT, 1000))
{
Serial.println("Failed to connect to internet!");
}
else
{
Serial.println("Connected to internet!");
}
}
else
{
Serial.println("Failed to connect to network!");
}
}

void setConfig()
{
if (firebaseConfigReady)
return;

firebaseConfigReady = true;

Serial.println("Initializing app...");

ssl_client.setInsecure();

initializeApp(aClient, app, getAuth(user_auth), asyncCB, "authTask");
}

void loop()
{
if (PPP.connected())
{
setConfig();
}

// The async task handler should run inside the main loop
// without blocking delay or bypassing with millis code blocks.

app.loop();

// To get the authentication time to live in seconds before expired.
// app.ttl();
}

void asyncCB(AsyncResult &aResult)
{
// WARNING!
// Do not put your codes inside the callback and printResult.

printResult(aResult);
}

void printResult(AsyncResult &aResult)
{
if (aResult.isEvent())
{
Firebase.printf("Event task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.appEvent().message().c_str(), aResult.appEvent().code());
}

if (aResult.isDebug())
{
Firebase.printf("Debug task: %s, msg: %s\n", aResult.uid().c_str(), aResult.debug().c_str());
}

if (aResult.isError())
{
Firebase.printf("Error task: %s, msg: %s, code: %d\n", aResult.uid().c_str(), aResult.error().message().c_str(), aResult.error().code());
}

if (aResult.available())
{
Firebase.printf("task: %s, payload: %s\n", aResult.uid().c_str(), aResult.c_str());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
* <apn> - The GPRS APN (Access Point Name).
* <user> - The GPRS user.
* <password> - The GPRS password.
*
* In ESP32 Core v3.x.x, PPP devices are natively supported.
* See examples/App/NetworkInterfaces/Async/Callback/DefaultNetworks/DefaultPPPNetwork/ESP32
*
* The complete usage guidelines, please visit https://github.com/mobizt/FirebaseClient
*
Expand Down
Loading

0 comments on commit 628efed

Please sign in to comment.