Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(esp_modem): Add mqtt example in AT-only mode
Similar to pppos-client, but without PPP mode. This uses standard mqtt client and a loopback service that forwards the TCP traffic from localhost to the modem and vice-versa. (next step is to create a dedicated tcp-transport layer for modem)
- Loading branch information
1 parent
a9b5e66
commit a299192
Showing
17 changed files
with
1,066 additions
and
33 deletions.
There are no files selected for viewing
10 changes: 10 additions & 0 deletions
10
components/esp_modem/examples/modem_tcp_client/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# The following lines of boilerplate have to be in your project's CMakeLists | ||
# in this exact order for cmake to work correctly | ||
cmake_minimum_required(VERSION 3.5) | ||
|
||
set(EXTRA_COMPONENT_DIRS "../..") | ||
|
||
include($ENV{IDF_PATH}/tools/cmake/project.cmake) | ||
project(modem_tcp_client) | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
# Modem TCP client | ||
|
||
(See the README.md file in the upper level 'examples' directory for more information about examples.) | ||
|
||
## Overview | ||
This example demonstrates how to act as a MQTT client using modem's TCP commands (provided, the device supports "socket" related commands) | ||
|
||
### Supported IDF versions | ||
|
||
This example is only supported from `v4.1`, as this is the default dependency of `esp-modem` component. |
5 changes: 5 additions & 0 deletions
5
components/esp_modem/examples/modem_tcp_client/main/CMakeLists.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
idf_component_register(SRCS "modem_client.cpp" | ||
"sock_dce.cpp" | ||
"sock_commands.cpp" | ||
INCLUDE_DIRS ".") | ||
target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") |
148 changes: 148 additions & 0 deletions
148
components/esp_modem/examples/modem_tcp_client/main/Kconfig.projbuild
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
menu "Example Configuration" | ||
|
||
choice EXAMPLE_MODEM_DEVICE | ||
prompt "Choose supported modem device (DCE)" | ||
default EXAMPLE_MODEM_DEVICE_BG96 | ||
help | ||
Select modem device connected to the ESP DTE. | ||
config EXAMPLE_MODEM_DEVICE_SIM800 | ||
bool "SIM800" | ||
help | ||
SIMCom SIM800L is a GSM/GPRS module. | ||
It supports Quad-band 850/900/1800/1900MHz. | ||
config EXAMPLE_MODEM_DEVICE_BG96 | ||
bool "BG96" | ||
help | ||
Quectel BG96 is a series of LTE Cat M1/Cat NB1/EGPRS module. | ||
config EXAMPLE_MODEM_DEVICE_SIM7600 | ||
bool "SIM7600" | ||
help | ||
SIM7600 is Multi-Band LTE-TDD/LTE-FDD/HSPA+ and GSM/GPRS/EDGE module | ||
endchoice | ||
|
||
config EXAMPLE_MODEM_APN | ||
string "Set MODEM APN" | ||
default "internet" | ||
help | ||
Set APN (Access Point Name), a logical name to choose data network | ||
|
||
config EXAMPLE_MODEM_PPP_AUTH_USERNAME | ||
string "Set username for authentication" | ||
default "espressif" | ||
depends on !EXAMPLE_MODEM_PPP_AUTH_NONE | ||
help | ||
Set username for PPP Authentication. | ||
|
||
config EXAMPLE_MODEM_PPP_AUTH_PASSWORD | ||
string "Set password for authentication" | ||
default "esp32" | ||
depends on !EXAMPLE_MODEM_PPP_AUTH_NONE | ||
help | ||
Set password for PPP Authentication. | ||
|
||
config EXAMPLE_MODEM_PPP_AUTH_NONE | ||
bool "Skip PPP authentication" | ||
default n | ||
help | ||
Set to true for the PPP client to skip authentication | ||
|
||
config EXAMPLE_SEND_MSG | ||
bool "Short message (SMS)" | ||
default n | ||
help | ||
Select this, the modem will send a short message before power off. | ||
|
||
if EXAMPLE_SEND_MSG | ||
config EXAMPLE_SEND_MSG_PEER_PHONE_NUMBER | ||
string "Peer Phone Number (with area code)" | ||
default "+8610086" | ||
help | ||
Enter the peer phone number that you want to send message to. | ||
endif | ||
|
||
config EXAMPLE_NEED_SIM_PIN | ||
bool "SIM PIN needed" | ||
default n | ||
help | ||
Enable to set SIM PIN before starting the example | ||
|
||
config EXAMPLE_SIM_PIN | ||
string "Set SIM PIN" | ||
default "1234" | ||
depends on EXAMPLE_NEED_SIM_PIN | ||
help | ||
Pin to unlock the SIM | ||
|
||
menu "UART Configuration" | ||
config EXAMPLE_MODEM_UART_TX_PIN | ||
int "TXD Pin Number" | ||
default 25 | ||
range 0 31 | ||
help | ||
Pin number of UART TX. | ||
|
||
config EXAMPLE_MODEM_UART_RX_PIN | ||
int "RXD Pin Number" | ||
default 26 | ||
range 0 31 | ||
help | ||
Pin number of UART RX. | ||
|
||
config EXAMPLE_MODEM_UART_RTS_PIN | ||
int "RTS Pin Number" | ||
default 27 | ||
range 0 31 | ||
help | ||
Pin number of UART RTS. | ||
|
||
config EXAMPLE_MODEM_UART_CTS_PIN | ||
int "CTS Pin Number" | ||
default 23 | ||
range 0 31 | ||
help | ||
Pin number of UART CTS. | ||
|
||
config EXAMPLE_MODEM_UART_EVENT_TASK_STACK_SIZE | ||
int "UART Event Task Stack Size" | ||
range 2000 6000 | ||
default 2048 | ||
help | ||
Stack size of UART event task. | ||
|
||
config EXAMPLE_MODEM_UART_EVENT_TASK_PRIORITY | ||
int "UART Event Task Priority" | ||
range 3 22 | ||
default 5 | ||
help | ||
Priority of UART event task. | ||
|
||
config EXAMPLE_MODEM_UART_EVENT_QUEUE_SIZE | ||
int "UART Event Queue Size" | ||
range 10 40 | ||
default 30 | ||
help | ||
Length of UART event queue. | ||
|
||
config EXAMPLE_MODEM_UART_PATTERN_QUEUE_SIZE | ||
int "UART Pattern Queue Size" | ||
range 10 40 | ||
default 20 | ||
help | ||
Length of UART pattern queue. | ||
|
||
config EXAMPLE_MODEM_UART_TX_BUFFER_SIZE | ||
int "UART TX Buffer Size" | ||
range 256 2048 | ||
default 512 | ||
help | ||
Buffer size of UART TX buffer. | ||
|
||
config EXAMPLE_MODEM_UART_RX_BUFFER_SIZE | ||
int "UART RX Buffer Size" | ||
range 256 2048 | ||
default 1024 | ||
help | ||
Buffer size of UART RX buffer. | ||
endmenu | ||
|
||
endmenu |
137 changes: 137 additions & 0 deletions
137
components/esp_modem/examples/modem_tcp_client/main/modem_client.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
/* PPPoS Client Example | ||
This example code is in the Public Domain (or CC0 licensed, at your option.) | ||
Unless required by applicable law or agreed to in writing, this | ||
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR | ||
CONDITIONS OF ANY KIND, either express or implied. | ||
*/ | ||
#include <string> | ||
#include "freertos/FreeRTOS.h" | ||
#include "freertos/event_groups.h" | ||
#include "esp_netif.h" | ||
#include "esp_netif_ppp.h" | ||
#include "mqtt_client.h" | ||
#include "esp_modem_config.h" | ||
#include "cxx_include/esp_modem_api.hpp" | ||
#include "sock_dce.hpp" | ||
#include "esp_log.h" | ||
|
||
#define BROKER_URL "mqtt://mqtt.eclipseprojects.io" | ||
|
||
static const char *TAG = "modem_client"; | ||
static EventGroupHandle_t event_group = NULL; | ||
static const int CONNECT_BIT = BIT0; | ||
static const int GOT_DATA_BIT = BIT2; | ||
|
||
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) | ||
{ | ||
ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id); | ||
esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data; | ||
esp_mqtt_client_handle_t client = event->client; | ||
int msg_id; | ||
switch ((esp_mqtt_event_id_t)event_id) { | ||
case MQTT_EVENT_CONNECTED: | ||
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); | ||
msg_id = esp_mqtt_client_subscribe(client, "/topic/esp-pppos", 0); | ||
ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); | ||
break; | ||
case MQTT_EVENT_DISCONNECTED: | ||
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); | ||
break; | ||
case MQTT_EVENT_SUBSCRIBED: | ||
ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); | ||
msg_id = esp_mqtt_client_publish(client, "/topic/esp-pppos", "esp32-pppos", 0, 0, 0); | ||
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); | ||
break; | ||
case MQTT_EVENT_UNSUBSCRIBED: | ||
ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); | ||
break; | ||
case MQTT_EVENT_PUBLISHED: | ||
ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); | ||
break; | ||
case MQTT_EVENT_DATA: | ||
ESP_LOGI(TAG, "MQTT_EVENT_DATA"); | ||
printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); | ||
printf("DATA=%.*s\r\n", event->data_len, event->data); | ||
xEventGroupSetBits(event_group, GOT_DATA_BIT); | ||
break; | ||
case MQTT_EVENT_ERROR: | ||
ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); | ||
break; | ||
default: | ||
ESP_LOGI(TAG, "MQTT other event id: %d", event->event_id); | ||
break; | ||
} | ||
} | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
extern "C" void app_main(void) | ||
{ | ||
|
||
/* Init and register system/core components */ | ||
ESP_ERROR_CHECK(esp_netif_init()); | ||
ESP_ERROR_CHECK(esp_event_loop_create_default()); | ||
|
||
event_group = xEventGroupCreate(); | ||
|
||
/* Configure and create the UART DTE */ | ||
esp_modem_dte_config_t dte_config = ESP_MODEM_DTE_DEFAULT_CONFIG(); | ||
/* setup UART specific configuration based on kconfig options */ | ||
dte_config.uart_config.tx_io_num = CONFIG_EXAMPLE_MODEM_UART_TX_PIN; | ||
dte_config.uart_config.rx_io_num = CONFIG_EXAMPLE_MODEM_UART_RX_PIN; | ||
dte_config.uart_config.rts_io_num = CONFIG_EXAMPLE_MODEM_UART_RTS_PIN; | ||
dte_config.uart_config.cts_io_num = CONFIG_EXAMPLE_MODEM_UART_CTS_PIN; | ||
dte_config.uart_config.rx_buffer_size = CONFIG_EXAMPLE_MODEM_UART_RX_BUFFER_SIZE; | ||
dte_config.uart_config.tx_buffer_size = CONFIG_EXAMPLE_MODEM_UART_TX_BUFFER_SIZE; | ||
dte_config.uart_config.event_queue_size = CONFIG_EXAMPLE_MODEM_UART_EVENT_QUEUE_SIZE; | ||
dte_config.task_stack_size = CONFIG_EXAMPLE_MODEM_UART_EVENT_TASK_STACK_SIZE*2; | ||
dte_config.task_priority = CONFIG_EXAMPLE_MODEM_UART_EVENT_TASK_PRIORITY; | ||
dte_config.dte_buffer_size = CONFIG_EXAMPLE_MODEM_UART_RX_BUFFER_SIZE / 2; | ||
|
||
auto dte = esp_modem::create_uart_dte(&dte_config); | ||
assert(dte); | ||
|
||
/* Configure the DCE */ | ||
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(CONFIG_EXAMPLE_MODEM_APN); | ||
|
||
/* create the DCE and initialize network manually (using AT commands) */ | ||
auto dce = sock_dce::create(&dce_config, std::move(dte)); | ||
if (!dce->init_network()) { | ||
ESP_LOGE(TAG, "Failed to setup network"); | ||
return; | ||
} | ||
|
||
dce->init(1883); | ||
esp_mqtt_client_config_t mqtt_config = {}; | ||
mqtt_config.broker.address.uri = "mqtt://127.0.0.1"; | ||
mqtt_config.session.message_retransmit_timeout = 10000; | ||
esp_mqtt_client_handle_t mqtt_client = esp_mqtt_client_init(&mqtt_config); | ||
esp_mqtt_client_register_event(mqtt_client, static_cast<esp_mqtt_event_id_t>(ESP_EVENT_ANY_ID), mqtt_event_handler, NULL); | ||
esp_mqtt_client_start(mqtt_client); | ||
if (!dce->start("test.mosquitto.org", 1883)) { | ||
ESP_LOGE(TAG, "Failed to start DCE"); | ||
return; | ||
} | ||
while (1) { | ||
while (dce->perform()) { | ||
ESP_LOGD(TAG, "...performing"); | ||
} | ||
ESP_LOGE(TAG, "Loop exit.. retrying"); | ||
// handle disconnections errors | ||
if (!dce->init_network()) { | ||
ESP_LOGE(TAG, "Failed to reinit network"); | ||
return; | ||
} | ||
if (!dce->start("test.mosquitto.org", 1883)) { | ||
ESP_LOGI(TAG, "Network reinitialized, retrying"); | ||
} | ||
} | ||
|
||
} |
Oops, something went wrong.