From 060a829091e8801ef63d80658b75ddc69f91eed6 Mon Sep 17 00:00:00 2001 From: yuanjm Date: Thu, 18 Feb 2021 18:45:21 +0800 Subject: [PATCH] examples: Add QR code support for provisioning examples --- .../legacy/ble_prov/CMakeLists.txt | 2 +- .../provisioning/legacy/ble_prov/Makefile | 2 +- .../provisioning/legacy/ble_prov/README.md | 35 ++++++++++++++++ .../legacy/ble_prov/main/Kconfig.projbuild | 5 +++ .../legacy/ble_prov/main/app_main.c | 40 +++++++++++++++++++ .../legacy/softap_prov/CMakeLists.txt | 2 +- .../provisioning/legacy/softap_prov/Makefile | 2 +- .../provisioning/legacy/softap_prov/README.md | 35 ++++++++++++++++ .../legacy/softap_prov/main/Kconfig.projbuild | 5 +++ .../legacy/softap_prov/main/app_main.c | 40 +++++++++++++++++++ .../provisioning/wifi_prov_mgr/CMakeLists.txt | 2 +- examples/provisioning/wifi_prov_mgr/Makefile | 2 +- examples/provisioning/wifi_prov_mgr/README.md | 36 +++++++++++++++++ .../wifi_prov_mgr/main/Kconfig.projbuild | 5 +++ .../wifi_prov_mgr/main/app_main.c | 36 +++++++++++++++++ 15 files changed, 243 insertions(+), 6 deletions(-) diff --git a/examples/provisioning/legacy/ble_prov/CMakeLists.txt b/examples/provisioning/legacy/ble_prov/CMakeLists.txt index 30012d3e4d..d4924bb7c7 100644 --- a/examples/provisioning/legacy/ble_prov/CMakeLists.txt +++ b/examples/provisioning/legacy/ble_prov/CMakeLists.txt @@ -1,6 +1,6 @@ # 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 $ENV{IDF_PATH}/examples/common_components/qrcode) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(ble_prov) diff --git a/examples/provisioning/legacy/ble_prov/Makefile b/examples/provisioning/legacy/ble_prov/Makefile index 47547d7e2f..2cfa6583d6 100644 --- a/examples/provisioning/legacy/ble_prov/Makefile +++ b/examples/provisioning/legacy/ble_prov/Makefile @@ -4,5 +4,5 @@ # PROJECT_NAME := ble_prov - +EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/qrcode include $(IDF_PATH)/make/project.mk diff --git a/examples/provisioning/legacy/ble_prov/README.md b/examples/provisioning/legacy/ble_prov/README.md index d0639441fb..3e6afa8879 100644 --- a/examples/provisioning/legacy/ble_prov/README.md +++ b/examples/provisioning/legacy/ble_prov/README.md @@ -116,6 +116,41 @@ I (718390) app_prov: Stopping provisioning I (718670) app_prov: Provisioning stopped ``` +## QR Code Scanning + +Enabling `CONFIG_EXAMPLE_PROV_SHOW_QR` will display a QR code on the serial terminal, which can be scanned from the ESP Provisioning phone apps to start the Wi-Fi provisioning process. + +The monitor log should display something like this : + +``` +I (1640) app_prov: SoftAP Provisioning started with SSID 'PROV_EA69FC', Password 'PROV_PASS' +I (1640) app: Scan this QR code from the provisioning application for Provisioning. +I (1650) QRCODE: Encoding below text with ECC LVL 0 & QR Code Version 10 +I (1660) QRCODE: {"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"ble"} + + █▀▀▀▀▀█ ▄▀ ▄█ ▄█▄▄█▀▄ ██ █▀▀▀▀▀█ + █ ███ █ ▀███▀ ██▀▀█ ▀█▀ █ ███ █ + █ ▀▀▀ █ █▄ ▄ ▀███ ▄▄█▀ ▄ █ ▀▀▀ █ + ▀▀▀▀▀▀▀ █▄▀ █ ▀ ▀▄█▄▀▄▀▄█ ▀▀▀▀▀▀▀ + ▀▀▄▀▄▄▀█ █▄ ▀▄▀█▄█ ▄▄ ██▄█▀▀▄▀▀▄ + ███ █▀▀ ▄▀▀ ▄█▄ ▀▀█▄█▀▄▄ ▄█ █ + ▄▀▀ ▀▀▀█▀▄▄▄█▀▀ ██▄█▄▄█▄▀█ ▄▄ ▀█ + ▄█▄█ ▀▀▄█ ██ ▄█ ██▀█▀ ▄█ █▄ + ▄█▀█▀ █▄▀▀▄ █▀█▀██ ▄█▀ ▀▀▄ ▀ + █▄▄█▄▀█▄▄▀▄▄▀█ ▀▄ ▄▀██ ▄ █▄▄▄ ▀█ + ▀▄▀▄▀▀▀█ ▄ ▄▀▀▀█▄▀▀▀▀▀▄█ ▄▄ █ ▄▄ + ▀█▄▀██▀▄▄ ▄▄▀▄ ▄▀▀▀▀█▄▀▄▀█ ▄▄ ▀▀ + ▀ ▀ ▀ ▀▀█▄▀ ▀▀ ▀▀▀▄▀██ █▀▀▀█▀ ▄▄ + █▀▀▀▀▀█ ▀▀██▀█▀ ▀█ ▄ █▀▀█ ▀ ██ ▀▄ + █ ███ █ ▄█▀▄▄▄ █▀▀▀ ██ ▀████▀ ▄█ + █ ▀▀▀ █ ▄▀▄▄ ▄▀█▀▄▄▄█ ▀ ▄▀█▀▀▀ + ▀▀▀▀▀▀▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ + + +I (1870) app: If QR code is not visible, copy paste the below URL in a browser. +https://espressif.github.io/esp-jumpstart/qrcode.html?data={"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"ble"} +``` + ## Troubleshooting ### Provisioning failed diff --git a/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild b/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild index b1578f84b3..fd4143da62 100644 --- a/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild +++ b/examples/provisioning/legacy/ble_prov/main/Kconfig.projbuild @@ -37,4 +37,9 @@ menu "Example Configuration" help Set the maximum connection attempts to perform when connecting to a Wi-Fi AP. + config EXAMPLE_PROV_SHOW_QR + bool "Show provisioning QR code" + default y + help + Show the QR code for provisioning. endmenu diff --git a/examples/provisioning/legacy/ble_prov/main/app_main.c b/examples/provisioning/legacy/ble_prov/main/app_main.c index d9543a6f4b..efa5f72679 100644 --- a/examples/provisioning/legacy/ble_prov/main/app_main.c +++ b/examples/provisioning/legacy/ble_prov/main/app_main.c @@ -20,8 +20,12 @@ #include #include "app_prov.h" +#include "qrcode.h" #define EXAMPLE_AP_RECONN_ATTEMPTS CONFIG_EXAMPLE_AP_RECONN_ATTEMPTS +#define PROV_QR_VERSION "v1" +#define PROV_TRANSPORT_BLE "ble" +#define QRCODE_BASE_URL "https://espressif.github.io/esp-jumpstart/qrcode.html" static const char *TAG = "app"; @@ -109,6 +113,41 @@ static void start_ble_provisioning(void) ESP_ERROR_CHECK(app_prov_start_ble_provisioning(security, pop)); } +static void get_device_service_name(char *service_name, size_t max) +{ + uint8_t eth_mac[6]; + const char *ssid_prefix = "PROV_"; + esp_wifi_get_mac(WIFI_IF_STA, eth_mac); + snprintf(service_name, max, "%s%02X%02X%02X", + ssid_prefix, eth_mac[3], eth_mac[4], eth_mac[5]); +} + +static void ble_prov_print_qr(void) +{ + char payload[150] = {0}; + char name[12] = {0}; + char *pop = NULL; +#ifdef CONFIG_EXAMPLE_USE_POP + pop = CONFIG_EXAMPLE_POP; +#endif + get_device_service_name(name, sizeof(name)); + if (pop) { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"pop\":\"%s\",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, pop, PROV_TRANSPORT_BLE); + } else { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, PROV_TRANSPORT_BLE); + } +#ifdef CONFIG_EXAMPLE_PROV_SHOW_QR + ESP_LOGI(TAG, "Scan this QR code from the provisioning application for Provisioning."); + esp_qrcode_config_t cfg = ESP_QRCODE_CONFIG_DEFAULT(); + esp_qrcode_generate(&cfg, payload); +#endif /* CONFIG_APP_WIFI_PROV_SHOW_QR */ + ESP_LOGI(TAG, "If QR code is not visible, copy paste the below URL in a browser.\n%s?data=%s", QRCODE_BASE_URL, payload); +} + void app_main(void) { /* Initialize networking stack */ @@ -137,6 +176,7 @@ void app_main(void) /* If not provisioned, start provisioning via BLE */ ESP_LOGI(TAG, "Starting BLE provisioning"); start_ble_provisioning(); + ble_prov_print_qr(); } else { /* Else start as station with credentials set during provisioning */ ESP_LOGI(TAG, "Starting WiFi station"); diff --git a/examples/provisioning/legacy/softap_prov/CMakeLists.txt b/examples/provisioning/legacy/softap_prov/CMakeLists.txt index fa6ac14339..ac08cea681 100644 --- a/examples/provisioning/legacy/softap_prov/CMakeLists.txt +++ b/examples/provisioning/legacy/softap_prov/CMakeLists.txt @@ -1,6 +1,6 @@ # 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 $ENV{IDF_PATH}/examples/common_components/qrcode) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(softap_prov) diff --git a/examples/provisioning/legacy/softap_prov/Makefile b/examples/provisioning/legacy/softap_prov/Makefile index 98085767f5..371d2373fb 100644 --- a/examples/provisioning/legacy/softap_prov/Makefile +++ b/examples/provisioning/legacy/softap_prov/Makefile @@ -4,5 +4,5 @@ # PROJECT_NAME := softap_prov - +EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/qrcode include $(IDF_PATH)/make/project.mk diff --git a/examples/provisioning/legacy/softap_prov/README.md b/examples/provisioning/legacy/softap_prov/README.md index c59bc0bd5f..d2b1b7e9a8 100644 --- a/examples/provisioning/legacy/softap_prov/README.md +++ b/examples/provisioning/legacy/softap_prov/README.md @@ -118,6 +118,41 @@ I (668732) app_prov: Provisioning stopped I (668742) app: SoftAP stopped ``` +## QR Code Scanning + +Enabling `CONFIG_EXAMPLE_PROV_SHOW_QR` will display a QR code on the serial terminal, which can be scanned from the ESP Provisioning phone apps to start the Wi-Fi provisioning process. + +The monitor log should display something like this : + +``` +I (1640) app_prov: SoftAP Provisioning started with SSID 'PROV_EA69FC', Password 'PROV_PASS' +I (1640) app: Scan this QR code from the provisioning application for Provisioning. +I (1650) QRCODE: Encoding below text with ECC LVL 0 & QR Code Version 10 +I (1660) QRCODE: {"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"softap"} + + █▀▀▀▀▀█ ▄▀ ▄█ ▄█▄▄█▀▄ ██ █▀▀▀▀▀█ + █ ███ █ ▀███▀ ██▀▀█ ▀█▀ █ ███ █ + █ ▀▀▀ █ █▄ ▄ ▀███ ▄▄█▀ ▄ █ ▀▀▀ █ + ▀▀▀▀▀▀▀ █▄▀ █ ▀ ▀▄█▄▀▄▀▄█ ▀▀▀▀▀▀▀ + ▀▀▄▀▄▄▀█ █▄ ▀▄▀█▄█ ▄▄ ██▄█▀▀▄▀▀▄ + ███ █▀▀ ▄▀▀ ▄█▄ ▀▀█▄█▀▄▄ ▄█ █ + ▄▀▀ ▀▀▀█▀▄▄▄█▀▀ ██▄█▄▄█▄▀█ ▄▄ ▀█ + ▄█▄█ ▀▀▄█ ██ ▄█ ██▀█▀ ▄█ █▄ + ▄█▀█▀ █▄▀▀▄ █▀█▀██ ▄█▀ ▀▀▄ ▀ + █▄▄█▄▀█▄▄▀▄▄▀█ ▀▄ ▄▀██ ▄ █▄▄▄ ▀█ + ▀▄▀▄▀▀▀█ ▄ ▄▀▀▀█▄▀▀▀▀▀▄█ ▄▄ █ ▄▄ + ▀█▄▀██▀▄▄ ▄▄▀▄ ▄▀▀▀▀█▄▀▄▀█ ▄▄ ▀▀ + ▀ ▀ ▀ ▀▀█▄▀ ▀▀ ▀▀▀▄▀██ █▀▀▀█▀ ▄▄ + █▀▀▀▀▀█ ▀▀██▀█▀ ▀█ ▄ █▀▀█ ▀ ██ ▀▄ + █ ███ █ ▄█▀▄▄▄ █▀▀▀ ██ ▀████▀ ▄█ + █ ▀▀▀ █ ▄▀▄▄ ▄▀█▀▄▄▄█ ▀ ▄▀█▀▀▀ + ▀▀▀▀▀▀▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ + + +I (1870) app: If QR code is not visible, copy paste the below URL in a browser. +https://espressif.github.io/esp-jumpstart/qrcode.html?data={"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"softap"} +``` + ## Troubleshooting ### Provisioning failed diff --git a/examples/provisioning/legacy/softap_prov/main/Kconfig.projbuild b/examples/provisioning/legacy/softap_prov/main/Kconfig.projbuild index d0fa309666..97fee32dc4 100644 --- a/examples/provisioning/legacy/softap_prov/main/Kconfig.projbuild +++ b/examples/provisioning/legacy/softap_prov/main/Kconfig.projbuild @@ -56,4 +56,9 @@ menu "Example Configuration" help Set the maximum connection attempts to perform when connecting to a Wi-Fi AP. + config EXAMPLE_PROV_SHOW_QR + bool "Show provisioning QR code" + default y + help + Show the QR code for provisioning. endmenu diff --git a/examples/provisioning/legacy/softap_prov/main/app_main.c b/examples/provisioning/legacy/softap_prov/main/app_main.c index 21aea40020..97b30da024 100644 --- a/examples/provisioning/legacy/softap_prov/main/app_main.c +++ b/examples/provisioning/legacy/softap_prov/main/app_main.c @@ -20,8 +20,12 @@ #include #include "app_prov.h" +#include "qrcode.h" #define EXAMPLE_AP_RECONN_ATTEMPTS CONFIG_EXAMPLE_AP_RECONN_ATTEMPTS +#define PROV_QR_VERSION "v1" +#define PROV_TRANSPORT_SOFTAP "softap" +#define QRCODE_BASE_URL "https://espressif.github.io/esp-jumpstart/qrcode.html" static const char *TAG = "app"; @@ -96,6 +100,41 @@ static void start_softap_provisioning(void) ssid, CONFIG_EXAMPLE_PASS, security, pop)); } +static void get_device_service_name(char *service_name, size_t max) +{ + uint8_t eth_mac[6]; + const char *ssid_prefix = "PROV_"; + esp_wifi_get_mac(WIFI_IF_STA, eth_mac); + snprintf(service_name, max, "%s%02X%02X%02X", + ssid_prefix, eth_mac[3], eth_mac[4], eth_mac[5]); +} + +static void softap_prov_print_qr(void) +{ + char payload[150] = {0}; + char name[12] = {0}; + char *pop = NULL; +#ifdef CONFIG_EXAMPLE_USE_POP + pop = CONFIG_EXAMPLE_POP; +#endif + get_device_service_name(name, sizeof(name)); + if (pop) { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"pop\":\"%s\",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, pop, PROV_TRANSPORT_SOFTAP); + } else { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, PROV_TRANSPORT_SOFTAP); + } +#ifdef CONFIG_EXAMPLE_PROV_SHOW_QR + ESP_LOGI(TAG, "Scan this QR code from the provisioning application for Provisioning."); + esp_qrcode_config_t cfg = ESP_QRCODE_CONFIG_DEFAULT(); + esp_qrcode_generate(&cfg, payload); +#endif /* CONFIG_APP_WIFI_PROV_SHOW_QR */ + ESP_LOGI(TAG, "If QR code is not visible, copy paste the below URL in a browser.\n%s?data=%s", QRCODE_BASE_URL, payload); +} + void app_main(void) { /* Initialize networking stack */ @@ -125,6 +164,7 @@ void app_main(void) /* If not provisioned, start provisioning via soft AP */ ESP_LOGI(TAG, "Starting WiFi SoftAP provisioning"); start_softap_provisioning(); + softap_prov_print_qr(); } else { /* Start WiFi station with credentials set during provisioning */ ESP_LOGI(TAG, "Starting WiFi station"); diff --git a/examples/provisioning/wifi_prov_mgr/CMakeLists.txt b/examples/provisioning/wifi_prov_mgr/CMakeLists.txt index b036d9ce60..3bd8174c6c 100644 --- a/examples/provisioning/wifi_prov_mgr/CMakeLists.txt +++ b/examples/provisioning/wifi_prov_mgr/CMakeLists.txt @@ -1,6 +1,6 @@ # 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 $ENV{IDF_PATH}/examples/common_components/qrcode) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(wifi_prov_mgr) diff --git a/examples/provisioning/wifi_prov_mgr/Makefile b/examples/provisioning/wifi_prov_mgr/Makefile index cbd420b741..daf801980d 100644 --- a/examples/provisioning/wifi_prov_mgr/Makefile +++ b/examples/provisioning/wifi_prov_mgr/Makefile @@ -4,5 +4,5 @@ # PROJECT_NAME := wifi_prov_mgr - +EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/qrcode include $(IDF_PATH)/make/project.mk diff --git a/examples/provisioning/wifi_prov_mgr/README.md b/examples/provisioning/wifi_prov_mgr/README.md index cf67e01714..f7fee43b53 100644 --- a/examples/provisioning/wifi_prov_mgr/README.md +++ b/examples/provisioning/wifi_prov_mgr/README.md @@ -112,6 +112,42 @@ I (54355) app: Hello World! I (55355) app: Hello World! ``` +### QR Code Scanning + +Enabling `CONFIG_EXAMPLE_PROV_SHOW_QR` will display a QR code on the serial terminal, which can be scanned from the ESP Provisioning phone apps to start the Wi-Fi provisioning process. + +The monitor log should display something like this : + +``` +I (1462) app: Provisioning started +I (1472) app: Scan this QR code from the provisioning application for Provisioning. +I (1472) QRCODE: Encoding below text with ECC LVL 0 & QR Code Version 10 +I (1482) QRCODE: {"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"ble"} +GAP procedure initiated: advertise; disc_mode=2 adv_channel_map=0 own_addr_type=0 adv_filter_policy=0 adv_itvl_min=256 adv_itvl_max=256 + + █▀▀▀▀▀█ ▀▀▀█▄█ ▀▀▄ █▄ ▀ █▀▀▀▀▀█ + █ ███ █ ▀▄█ █▄ ▀▄█ ▄██ █ █ ███ █ + █ ▀▀▀ █ ▄▀█▀▄▀ ▀█▄▀ ██ █ ▀▀▀ █ + ▀▀▀▀▀▀▀ █▄▀ █▄█▄█ ▀ █ █ ▀ ▀▀▀▀▀▀▀ + ▀▀ ▀▀ ▀ ▀▄ ▀▄ ▄▀▀▀█ ▀▄ ▀ ▀▄▄ ▄▄▀ + ███▄█▄▀ █▀ ▀▀▀▀▄▄█ █▀ █ ▄█▄█▀ + ▀███▀ ▀▄▄██ ▄▄██▄ ▀▀▀▀ ▄▀█ ▀▄▄▀ + ▄███ ▀██▀▀ ▄ ▄█▄▀▀█▄ ▀▄▀▄▄█ ▄ + ▀█▀ █▄▀▀ ▀▀█▀▀ █▀▄▀▄▀ ▄█ ███▄ ██ + ██▀█ ▀▄█ █▄▀▄███▀▄▀█ ▀█ █▀▀ ▀▄▄▀ + █▄▀▄█▀▀ ▀▄ ▀▄▄█▄▀▀█▄█▄█▀▀█ ▀▄ ▄▀ + █ ▄█▄ ▀ ▄▀ █▄ ▀█▄█▄▀▀█▀█ ▄█ ▀▄▄█ + ▀▀▀▀ ▀ █▀█▀▀▄▄██▄█▀█ ▀██▀▀▀█▄▄▀ + █▀▀▀▀▀█ ▄█▀▀▀██ ▄▀▄ █▄█ ▀ █ ▄ ▄ + █ ███ █ █ ▀▄█▀▀█▀▄█▄▄ ▀██▀▀▀▀▄▄▀▀ + █ ▀▀▀ █ ▄█ ▀ ▄█▀█ █▀ ▀▀███▄▀█ █▄█ + ▀▀▀▀▀▀▀ ▀ ▀ ▀▀ ▀ ▀▀▀▀▀▀ + + +I (1702) app: If QR code is not visible, copy paste the below URL in a browser. +https://espressif.github.io/esp-jumpstart/qrcode.html?data={"ver":"v1","name":"PROV_EA69FC","pop":"abcd1234","transport":"ble"} +``` + ### Wi-Fi Scanning Provisioning manager also supports providing real-time Wi-Fi scan results (performed on the device) during provisioning. This allows the client side applications to choose the AP for which the device Wi-Fi station is to be configured. Various information about the visible APs is available, like signal strength (RSSI) and security type, etc. Also, the manager now provides capabilities information which can be used by client applications to determine the security type and availability of specific features (like `wifi_scan`). diff --git a/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild b/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild index 3c27774a93..00cbab17f7 100644 --- a/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild +++ b/examples/provisioning/wifi_prov_mgr/main/Kconfig.projbuild @@ -20,4 +20,9 @@ menu "Example Configuration" default 1 if EXAMPLE_PROV_TRANSPORT_BLE default 2 if EXAMPLE_PROV_TRANSPORT_SOFTAP + config EXAMPLE_PROV_SHOW_QR + bool "Show provisioning QR code" + default y + help + Show the QR code for provisioning. endmenu diff --git a/examples/provisioning/wifi_prov_mgr/main/app_main.c b/examples/provisioning/wifi_prov_mgr/main/app_main.c index 4180731b39..794638a871 100644 --- a/examples/provisioning/wifi_prov_mgr/main/app_main.c +++ b/examples/provisioning/wifi_prov_mgr/main/app_main.c @@ -28,6 +28,7 @@ #ifdef CONFIG_EXAMPLE_PROV_TRANSPORT_SOFTAP #include #endif /* CONFIG_EXAMPLE_PROV_TRANSPORT_SOFTAP */ +#include "qrcode.h" static const char *TAG = "app"; @@ -35,6 +36,11 @@ static const char *TAG = "app"; const int WIFI_CONNECTED_EVENT = BIT0; static EventGroupHandle_t wifi_event_group; +#define PROV_QR_VERSION "v1" +#define PROV_TRANSPORT_SOFTAP "softap" +#define PROV_TRANSPORT_BLE "ble" +#define QRCODE_BASE_URL "https://espressif.github.io/esp-jumpstart/qrcode.html" + /* Event handler for catching system events */ static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) @@ -120,6 +126,30 @@ esp_err_t custom_prov_data_handler(uint32_t session_id, const uint8_t *inbuf, ss return ESP_OK; } +static void wifi_prov_print_qr(const char *name, const char *pop, const char *transport) +{ + if (!name || !transport) { + ESP_LOGW(TAG, "Cannot generate QR code payload. Data missing."); + return; + } + char payload[150] = {0}; + if (pop) { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"pop\":\"%s\",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, pop, transport); + } else { + snprintf(payload, sizeof(payload), "{\"ver\":\"%s\",\"name\":\"%s\"" \ + ",\"transport\":\"%s\"}", + PROV_QR_VERSION, name, transport); + } +#ifdef CONFIG_EXAMPLE_PROV_SHOW_QR + ESP_LOGI(TAG, "Scan this QR code from the provisioning application for Provisioning."); + esp_qrcode_config_t cfg = ESP_QRCODE_CONFIG_DEFAULT(); + esp_qrcode_generate(&cfg, payload); +#endif /* CONFIG_APP_WIFI_PROV_SHOW_QR */ + ESP_LOGI(TAG, "If QR code is not visible, copy paste the below URL in a browser.\n%s?data=%s", QRCODE_BASE_URL, payload); +} + void app_main(void) { /* Initialize NVS partition */ @@ -260,6 +290,12 @@ void app_main(void) * by the default event loop handler, we don't need to call the following */ // wifi_prov_mgr_wait(); // wifi_prov_mgr_deinit(); + /* Print QR code for provisioning */ +#ifdef CONFIG_EXAMPLE_PROV_TRANSPORT_BLE + wifi_prov_print_qr(service_name, pop, PROV_TRANSPORT_BLE); +#else /* CONFIG_EXAMPLE_PROV_TRANSPORT_SOFTAP */ + wifi_prov_print_qr(service_name, pop, PROV_TRANSPORT_SOFTAP); +#endif /* CONFIG_EXAMPLE_PROV_TRANSPORT_BLE */ } else { ESP_LOGI(TAG, "Already provisioned, starting Wi-Fi STA");