2021-02-26 18:32:15 +01:00
|
|
|
/* 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.h>
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
|
#include "freertos/event_groups.h"
|
|
|
|
#include "esp_netif.h"
|
|
|
|
#include "esp_netif_ppp.h"
|
|
|
|
#include "mqtt_client.h"
|
|
|
|
#include "esp_log.h"
|
|
|
|
#include "cxx_include/esp_modem_dte.hpp"
|
2021-03-08 15:10:15 +01:00
|
|
|
#include "esp_modem_config.h"
|
2021-03-03 20:35:08 +01:00
|
|
|
#include "cxx_include/esp_modem_api.hpp"
|
2021-03-08 15:10:15 +01:00
|
|
|
#include <iostream>
|
2021-02-26 18:32:15 +01:00
|
|
|
|
2021-03-03 20:35:08 +01:00
|
|
|
#define BROKER_URL "mqtt://mqtt.eclipseprojects.io"
|
2021-02-26 18:32:15 +01:00
|
|
|
|
|
|
|
static const char *TAG = "pppos_example";
|
|
|
|
static EventGroupHandle_t event_group = NULL;
|
|
|
|
static const int CONNECT_BIT = BIT0;
|
|
|
|
static const int STOP_BIT = BIT1;
|
|
|
|
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_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data;
|
|
|
|
esp_mqtt_client_handle_t client = event->client;
|
|
|
|
int msg_id;
|
|
|
|
switch (event->event_id) {
|
|
|
|
case MQTT_EVENT_CONNECTED:
|
2021-03-03 20:35:08 +01:00
|
|
|
ESP_LOGE(TAG, "MQTT_EVENT_CONNECTED");
|
|
|
|
xEventGroupSetBits(event_group, GOT_DATA_BIT);
|
|
|
|
//
|
|
|
|
// msg_id = esp_mqtt_client_subscribe(client, "/topic/esp-pppos", 0);
|
|
|
|
// ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
|
2021-02-26 18:32:15 +01:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void on_ppp_changed(void *arg, esp_event_base_t event_base,
|
|
|
|
int32_t event_id, void *event_data)
|
|
|
|
{
|
|
|
|
ESP_LOGI(TAG, "PPP state changed event %d", event_id);
|
|
|
|
if (event_id == NETIF_PPP_ERRORUSER) {
|
|
|
|
/* User interrupted event from esp-netif */
|
|
|
|
esp_netif_t *netif = (esp_netif_t *)event_data;
|
|
|
|
ESP_LOGI(TAG, "User interrupted event from netif:%p", netif);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void on_ip_event(void *arg, esp_event_base_t event_base,
|
|
|
|
int32_t event_id, void *event_data)
|
|
|
|
{
|
|
|
|
ESP_LOGD(TAG, "IP event! %d", event_id);
|
|
|
|
if (event_id == IP_EVENT_PPP_GOT_IP) {
|
|
|
|
esp_netif_dns_info_t dns_info;
|
|
|
|
|
|
|
|
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
|
|
|
|
esp_netif_t *netif = event->esp_netif;
|
|
|
|
|
|
|
|
ESP_LOGI(TAG, "Modem Connect to PPP Server");
|
|
|
|
ESP_LOGI(TAG, "~~~~~~~~~~~~~~");
|
|
|
|
ESP_LOGI(TAG, "IP : " IPSTR, IP2STR(&event->ip_info.ip));
|
|
|
|
ESP_LOGI(TAG, "Netmask : " IPSTR, IP2STR(&event->ip_info.netmask));
|
|
|
|
ESP_LOGI(TAG, "Gateway : " IPSTR, IP2STR(&event->ip_info.gw));
|
|
|
|
esp_netif_get_dns_info(netif, ESP_NETIF_DNS_MAIN, &dns_info);
|
|
|
|
ESP_LOGI(TAG, "Name Server1: " IPSTR, IP2STR(&dns_info.ip.u_addr.ip4));
|
|
|
|
esp_netif_get_dns_info(netif, ESP_NETIF_DNS_BACKUP, &dns_info);
|
|
|
|
ESP_LOGI(TAG, "Name Server2: " IPSTR, IP2STR(&dns_info.ip.u_addr.ip4));
|
|
|
|
ESP_LOGI(TAG, "~~~~~~~~~~~~~~");
|
|
|
|
xEventGroupSetBits(event_group, CONNECT_BIT);
|
|
|
|
|
|
|
|
ESP_LOGI(TAG, "GOT ip event!!!");
|
|
|
|
} else if (event_id == IP_EVENT_PPP_LOST_IP) {
|
|
|
|
ESP_LOGI(TAG, "Modem Disconnect from PPP Server");
|
|
|
|
} else if (event_id == IP_EVENT_GOT_IP6) {
|
|
|
|
ESP_LOGI(TAG, "GOT IPv6 event!");
|
|
|
|
|
|
|
|
ip_event_got_ip6_t *event = (ip_event_got_ip6_t *)event_data;
|
|
|
|
ESP_LOGI(TAG, "Got IPv6 address " IPV6STR, IPV62STR(event->ip6_info.ip));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void modem_test_app(esp_modem_dte_config_t *dte_config, esp_modem_dce_config_t *dce_config, esp_netif_config_t *ppp_config);
|
|
|
|
|
|
|
|
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());
|
|
|
|
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, ESP_EVENT_ANY_ID, &on_ip_event, NULL));
|
|
|
|
ESP_ERROR_CHECK(esp_event_handler_register(NETIF_PPP_STATUS, ESP_EVENT_ANY_ID, &on_ppp_changed, NULL));
|
|
|
|
|
|
|
|
event_group = xEventGroupCreate();
|
|
|
|
|
|
|
|
/* Configure the DTE */
|
|
|
|
esp_modem_dte_config_t dte_config = ESP_MODEM_DTE_DEFAULT_CONFIG();
|
|
|
|
|
|
|
|
/* Configure the DCE */
|
|
|
|
esp_modem_dce_config_t dce_config = ESP_MODEM_DCE_DEFAULT_CONFIG(CONFIG_EXAMPLE_MODEM_PPP_APN);
|
|
|
|
|
|
|
|
/* Configure the PPP netif */
|
|
|
|
esp_netif_config_t netif_ppp_config = ESP_NETIF_DEFAULT_PPP();
|
|
|
|
|
|
|
|
uint8_t data[32] = {};
|
|
|
|
int actual_len = 0;
|
2021-03-08 15:10:15 +01:00
|
|
|
auto uart_dte = create_uart_dte(&dte_config);
|
2021-03-07 19:43:45 +01:00
|
|
|
uart_dte->set_mode(modem_mode::UNDEF);
|
2021-03-03 20:35:08 +01:00
|
|
|
uart_dte->command("+++", [&](uint8_t *data, size_t len) {
|
2021-02-26 18:32:15 +01:00
|
|
|
std::string response((char*)data, len);
|
|
|
|
ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
std::cout << response << std::endl;
|
2021-03-03 20:35:08 +01:00
|
|
|
return command_result::OK;
|
2021-03-04 20:19:18 +01:00
|
|
|
}, 500);
|
2021-02-26 18:32:15 +01:00
|
|
|
|
2021-03-03 20:35:08 +01:00
|
|
|
// uart_dte->command("AT+CPIN?\r", [&](uint8_t *data, size_t len) {
|
2021-02-26 20:23:29 +01:00
|
|
|
// std::string response((char*)data, len);
|
|
|
|
// ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
// std::cout << response << std::endl;
|
2021-03-03 20:35:08 +01:00
|
|
|
// return command_result::OK;
|
2021-02-26 20:23:29 +01:00
|
|
|
// }, 1000);
|
2021-03-04 20:19:18 +01:00
|
|
|
//
|
2021-03-03 20:35:08 +01:00
|
|
|
// uart_dte->command("AT+CPIN=1234\r", [&](uint8_t *data, size_t len) {
|
|
|
|
// std::string response((char*)data, len);
|
|
|
|
// ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
// std::cout << response << std::endl;
|
|
|
|
// return command_result::OK;
|
|
|
|
// }, 1000);
|
|
|
|
//
|
2021-02-27 09:32:14 +01:00
|
|
|
// return;
|
2021-03-08 15:10:15 +01:00
|
|
|
esp_netif_t *esp_netif = esp_netif_new(&netif_ppp_config);
|
2021-02-26 20:23:29 +01:00
|
|
|
assert(esp_netif);
|
|
|
|
|
2021-03-03 20:35:08 +01:00
|
|
|
std::string apn = "internet";
|
2021-03-07 19:43:45 +01:00
|
|
|
// auto device = create_generic_module(uart_dte, apn);
|
|
|
|
auto device = create_SIM7600_module(uart_dte, apn);
|
|
|
|
// bool pin_ok = true;
|
|
|
|
// if (device->read_pin(pin_ok) == command_result::OK && !pin_ok) {
|
|
|
|
// throw_if_false(device->set_pin("1234") == command_result::OK, "Cannot set PIN!");
|
|
|
|
// }
|
2021-03-04 20:19:18 +01:00
|
|
|
|
|
|
|
//
|
2021-03-07 19:43:45 +01:00
|
|
|
std::string number;
|
2021-03-04 20:19:18 +01:00
|
|
|
// std::cout << "----" << std::endl;
|
|
|
|
// device->get_imsi(number);
|
|
|
|
// std::cout << "----" << std::endl;
|
|
|
|
// std::cout << "|" << number << "|" << std::endl;
|
|
|
|
// ESP_LOG_BUFFER_HEXDUMP("TEST", number.c_str(), number.length(), ESP_LOG_INFO);
|
|
|
|
// std::cout << "----" << std::endl;
|
|
|
|
// device->get_imei(number);
|
|
|
|
// std::cout << "|" << number << "|" << std::endl;
|
|
|
|
// device->get_module_name(number);
|
|
|
|
// std::cout << "|" << number << "|" << std::endl;
|
|
|
|
// std::cout << "----" << std::endl;
|
2021-03-07 19:43:45 +01:00
|
|
|
// auto my_dce = create_generic_module_dce(uart_dte, device, esp_netif);
|
|
|
|
auto my_dce = create_SIM7600_dce_from_module(uart_dte, device, esp_netif);
|
|
|
|
my_dce->get_module_name(number);
|
|
|
|
std::cout << "|" << number << "|" << std::endl;
|
|
|
|
bool pin_ok = true;
|
|
|
|
if (my_dce->read_pin(pin_ok) == command_result::OK && !pin_ok) {
|
|
|
|
throw_if_false(my_dce->set_pin("1234") == command_result::OK, "Cannot set PIN!");
|
|
|
|
}
|
2021-02-26 20:23:29 +01:00
|
|
|
|
2021-03-04 20:19:18 +01:00
|
|
|
// return;
|
2021-03-06 16:56:50 +01:00
|
|
|
// my_dce->set_cmux();
|
2021-03-04 20:19:18 +01:00
|
|
|
// my_dce->set_cmux();
|
|
|
|
|
2021-03-06 16:56:50 +01:00
|
|
|
// while (1) {
|
|
|
|
// vTaskDelay(pdMS_TO_TICKS(1000));
|
|
|
|
// uart_dte->write((uint8_t*)"AT+CPIN?\r", 9);
|
|
|
|
//
|
|
|
|
// }
|
2021-03-04 20:19:18 +01:00
|
|
|
// uart_dte->send_cmux_command(2, "AT+CPIN?");
|
2021-03-06 16:56:50 +01:00
|
|
|
// return;
|
2021-03-04 20:19:18 +01:00
|
|
|
|
2021-03-07 19:43:45 +01:00
|
|
|
my_dce->get_module_name(number);
|
|
|
|
my_dce->set_data_mode();
|
|
|
|
|
2021-02-27 09:32:14 +01:00
|
|
|
my_dce->command("AT+CPIN?\r", [&](uint8_t *data, size_t len) {
|
2021-02-26 20:23:29 +01:00
|
|
|
std::string response((char*)data, len);
|
|
|
|
ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
std::cout << response << std::endl;
|
2021-03-03 20:35:08 +01:00
|
|
|
return command_result::OK;
|
2021-02-27 09:32:14 +01:00
|
|
|
}, 1000);
|
|
|
|
|
2021-03-04 20:19:18 +01:00
|
|
|
while (1) {
|
|
|
|
|
2021-03-08 15:10:15 +01:00
|
|
|
my_dce->set_data();
|
|
|
|
/* Config MQTT */
|
|
|
|
xEventGroupWaitBits(event_group, CONNECT_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
|
|
|
|
esp_mqtt_client_config_t mqtt_config = { };
|
|
|
|
mqtt_config.uri = BROKER_URL;
|
|
|
|
esp_mqtt_client_handle_t mqtt_client = esp_mqtt_client_init(&mqtt_config);
|
|
|
|
esp_mqtt_client_register_event(mqtt_client, MQTT_EVENT_ANY, mqtt_event_handler, NULL);
|
|
|
|
esp_mqtt_client_start(mqtt_client);
|
|
|
|
xEventGroupWaitBits(event_group, GOT_DATA_BIT, pdTRUE, pdTRUE, portMAX_DELAY);
|
|
|
|
esp_mqtt_client_destroy(mqtt_client);
|
2021-03-03 20:35:08 +01:00
|
|
|
|
|
|
|
// vTaskDelay(pdMS_TO_TICKS(20000));
|
2021-03-08 15:10:15 +01:00
|
|
|
my_dce->exit_data();
|
|
|
|
uart_dte->command("AT+CPIN?\r", [&](uint8_t *data, size_t len) {
|
|
|
|
std::string response((char*)data, len);
|
2021-03-04 20:19:18 +01:00
|
|
|
// ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
2021-03-08 15:10:15 +01:00
|
|
|
std::cout << response << std::endl;
|
|
|
|
return command_result::OK;
|
|
|
|
}, 1000);
|
2021-03-04 20:19:18 +01:00
|
|
|
}
|
2021-03-03 20:35:08 +01:00
|
|
|
|
2021-02-27 09:32:14 +01:00
|
|
|
// ddd->send_command("AT+COPS=?\r", [&](uint8_t *data, size_t len) {
|
|
|
|
// std::string response((char*)data, len);
|
|
|
|
// ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
// std::cout << response << std::endl;
|
|
|
|
// return true;
|
|
|
|
// }, 60000);
|
2021-02-26 20:23:29 +01:00
|
|
|
|
2021-02-26 18:32:15 +01:00
|
|
|
// auto uart = create_uart_terminal(dte_config);
|
|
|
|
// uart->set_data_cb([&](size_t len){
|
|
|
|
// actual_len = uart->read(data, 32);
|
|
|
|
// ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
// });
|
|
|
|
// uart->write((uint8_t*)"AT\r",3);
|
|
|
|
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
|
|
|
// int len = uart->read(data, 32);
|
|
|
|
// ESP_LOGI(TAG, "len=%d data %s", len, (char*)data);
|
|
|
|
// vTaskDelay(pdMS_TO_TICKS(1000));
|
|
|
|
// len = uart->read(data, 32);
|
|
|
|
ESP_LOGI(TAG, "len=%d data %s", actual_len, (char*)data);
|
2021-03-03 20:35:08 +01:00
|
|
|
|
|
|
|
uart_dte->command("AT+CPIN?\r", [&](uint8_t *data, size_t len) {
|
|
|
|
std::string response((char*)data, len);
|
|
|
|
ESP_LOGI("in the lambda", "len=%d data %s", len, (char*)data);
|
|
|
|
std::cout << response << std::endl;
|
|
|
|
return command_result::OK;
|
|
|
|
}, 1000);
|
2021-03-08 15:10:15 +01:00
|
|
|
}
|
2021-02-26 18:32:15 +01:00
|
|
|
|
|
|
|
|