Page 1 of 1

Provisioning Manager WiFi not working

Posted: Tue Mar 31, 2020 10:49 pm
by Stomper

I tried the provisioning manager example code from the examples.

I changed the sample to use wifi provisioning

Code: Select all

void app_main()
    /* Initialize NVS partition */
    esp_err_t ret = nvs_flash_init();
        /* NVS partition was truncated
         * and needs to be erased */

        /* Retry nvs_flash_init */

    /* Initialize TCP/IP */

    /* Initialize the event loop */
    wifi_event_group = xEventGroupCreate();

    /* Initialize mDNS */
	esp_err_t err = mdns_init();
	if (err)
		printf("MDNS Init failed: %d\n", err);

	//set hostname
	//set default instance

    /* Register our event handler for Wi-Fi, IP and Provisioning related events */
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_PROV_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));

    /* Initialize Wi-Fi */
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();

    /* Configuration for the provisioning manager */
    wifi_prov_mgr_config_t config = {
        /* What is the Provisioning Scheme that we want ?
         * wifi_prov_scheme_softap or wifi_prov_scheme_ble */
        .scheme = wifi_prov_scheme_softap,

        /* Any default scheme specific event handler that you would
         * like to choose. Since our example application requires
         * neither BT nor BLE, we can choose to release the associated
         * memory once provisioning is complete, or not needed
         * (in case when device is already provisioned). Choosing
         * appropriate scheme specific event handler allows the manager
         * to take care of this automatically. This can be set to
         * WIFI_PROV_EVENT_HANDLER_NONE when using wifi_prov_scheme_softap*/
        .scheme_event_handler = WIFI_PROV_EVENT_HANDLER_NONE

    /* Initialize provisioning manager with the
     * configuration parameters set above */

    bool provisioned = false;
    /* Let's find out if the device is provisioned */

    /* If device is not yet provisioned start provisioning service */
    if (!provisioned) {
        ESP_LOGI(TAG, "Starting provisioning");

        /* What is the Device Service Name that we want
         * This translates to :
         *     - Wi-Fi SSID when scheme is wifi_prov_scheme_softap
         *     - device name when scheme is wifi_prov_scheme_ble
        char service_name[12];
        get_device_service_name(service_name, sizeof(service_name));

        /* What is the security level that we want (0 or 1):
         *      - WIFI_PROV_SECURITY_0 is simply plain text communication.
         *      - WIFI_PROV_SECURITY_1 is secure communication which consists of secure handshake
         *          using X25519 key exchange and proof of possession (pop) and AES-CTR
         *          for encryption/decryption of messages.
        wifi_prov_security_t security = WIFI_PROV_SECURITY_0;

        /* Do we want a proof-of-possession (ignored if Security 0 is selected):
         *      - this should be a string with length > 0
         *      - NULL if not used
        const char *pop = "abcd1234";

        /* What is the service key (could be NULL)
         * This translates to :
         *     - Wi-Fi password when scheme is wifi_prov_scheme_softap
         *     - simply ignored when scheme is wifi_prov_scheme_ble
        const char *service_key = NULL;

        /* This step is only useful when scheme is wifi_prov_scheme_ble. This will
         * set a custom 128 bit UUID which will be included in the BLE advertisement
         * and will correspond to the primary GATT service that provides provisioning
         * endpoints as GATT characteristics. Each GATT characteristic will be
         * formed using the primary service UUID as base, with different auto assigned
         * 12th and 13th bytes (assume counting starts from 0th byte). The client side
         * applications must identify the endpoints by reading the User Characteristic
         * Description descriptor (0x2901) for each characteristic, which contains the
         * endpoint name of the characteristic */
        uint8_t custom_service_uuid[] = {
            /* LSB <---------------------------------------
             * ---------------------------------------> MSB */
            0x21, 0x43, 0x65, 0x87, 0x09, 0xba, 0xdc, 0xfe,
            0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12

        /* Start provisioning service */
        ESP_ERROR_CHECK(wifi_prov_mgr_start_provisioning(security, pop, service_name, service_key));

        /* Uncomment the following to wait for the provisioning to finish and then release
         * the resources of the manager. Since in this case de-initialization is triggered
         * by the default event loop handler, we don't need to call the following */
        // wifi_prov_mgr_wait();
        // wifi_prov_mgr_deinit();
    } else {
        ESP_LOGI(TAG, "Already provisioned, starting Wi-Fi STA");

        /* We don't need the manager as device is already provisioned,
         * so let's release it's resources */

        /* Start Wi-Fi station */

    /* Wait for Wi-Fi connection */
    xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_EVENT, false, true, portMAX_DELAY);

    /* Start main application now */
    while (1) {
        ESP_LOGI(TAG, "Hello World!");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
After that I created an html page to post on the URI "http://foobarfoo/proto-ver".

Code: Select all

<html lang="en">

<title>Prov Test</title>

<form action="http://foobarfoo/proto-ver" method="post">

  <input type="submit" value="Submit">

And I expected to get a string back. But all I get is ERR_EMPTY_RESPONSE in my browser and the debug console of the esp32 says:

Code: Select all

I (730) app: Starting provisioning
I (820) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0
I (820) wifi: mode : sta (a4:cf:12:1e:44:14)
I (830) wifi: mode : sta (a4:cf:12:1e:44:14) + softAP (a4:cf:12:1e:44:15)
I (830) wifi: Total power save buffer number: 16
I (830) wifi: Init max length of beacon: 752/752
I (840) wifi: Init max length of beacon: 752/752
I (840) wifi: Total power save buffer number: 16
I (860) wifi_prov_mgr: Provisioning started with service name : PROV_1E4414 
I (860) app: Provisioning started
I (11850) wifi: new:<1,1>, old:<1,0>, ap:<1,1>, sta:<0,0>, prof:1
I (11850) wifi: station: 40:a3:cc:a0:c3:0a join, AID=1, bgn, 40U
I (12040) tcpip_adapter: softAP assign IP to station,IP is:
E (22400) protocomm_httpd: Content length not found
W (22400) httpd_uri: httpd_uri: uri handler execution failed
What am I doing wrong?
Where can I find an api reference how to use the provisioning manager?

Best regards

Re: Provisioning Manager WiFi not working

Posted: Mon Apr 06, 2020 10:52 am
by ESP_Piyush
Hello, there is a specific format in which you need to post data on the provisioning handlers. We use protobuf for data serialisation. Please check here: ... oning.html.

Sample implementations of the client can be found in our iOS app ( and Android app ( ... ng-android). A python based implementation is available in esp-idf ( ... s/esp_prov)

Re: Provisioning Manager WiFi not working

Posted: Tue Apr 14, 2020 6:57 pm
by Stomper
Ah... ok got it. :mrgreen:

Thanks for your answer!