From 2d199dc521ec75b4ac996049e2b1acda6685bfaf Mon Sep 17 00:00:00 2001 From: Anurag Kar Date: Sun, 23 Sep 2018 20:14:46 +0530 Subject: [PATCH] Docs : Added Provisioning and Protocomm related docs Co-Authored-By: Amey Inamdar Co-Authored-By: Anurag Kar --- docs/Doxyfile | 13 ++ docs/_static/unified_provisioning.png | Bin 0 -> 22567 bytes docs/_static/unified_provisioning.xml | 1 + docs/conf_common.py | 3 + docs/en/api-reference/index.rst | 1 + docs/en/api-reference/provisioning/index.rst | 11 ++ .../api-reference/provisioning/protocomm.rst | 169 ++++++++++++++++++ .../provisioning/provisioning.rst | 154 ++++++++++++++++ .../provisioning/wifi_provisioning.rst | 60 +++++++ .../api-reference/provisioning/index.rst | 1 + .../api-reference/provisioning/protocomm.rst | 1 + .../provisioning/provisioning.rst | 1 + .../provisioning/wifi_provisioning.rst | 1 + 13 files changed, 416 insertions(+) create mode 100644 docs/_static/unified_provisioning.png create mode 100644 docs/_static/unified_provisioning.xml create mode 100644 docs/en/api-reference/provisioning/index.rst create mode 100644 docs/en/api-reference/provisioning/protocomm.rst create mode 100644 docs/en/api-reference/provisioning/provisioning.rst create mode 100644 docs/en/api-reference/provisioning/wifi_provisioning.rst create mode 100644 docs/zh_CN/api-reference/provisioning/index.rst create mode 100644 docs/zh_CN/api-reference/provisioning/protocomm.rst create mode 100644 docs/zh_CN/api-reference/provisioning/provisioning.rst create mode 100644 docs/zh_CN/api-reference/provisioning/wifi_provisioning.rst diff --git a/docs/Doxyfile b/docs/Doxyfile index fd241f0191..4765c675c8 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -99,6 +99,19 @@ INPUT = \ ../../components/esp_http_client/include/esp_http_client.h \ ../../components/http_server/include/http_server.h \ ## + ## Provisioning - API Reference + ## + ## Protocol Communication + ../../components/protocomm/include/common/protocomm.h \ + ../../components/protocomm/include/security/protocomm_security.h \ + ../../components/protocomm/include/security/protocomm_security0.h \ + ../../components/protocomm/include/security/protocomm_security1.h \ + ../../components/protocomm/include/transports/protocomm_ble.h \ + ../../components/protocomm/include/transports/protocomm_console.h \ + ../../components/protocomm/include/transports/protocomm_httpd.h \ + ## WiFi Provisioning + ../../components/wifi_provisioning/include/wifi_provisioning/wifi_config.h \ + ## ## Storage - API Reference ## ## SPI Flash and Partition APIs diff --git a/docs/_static/unified_provisioning.png b/docs/_static/unified_provisioning.png new file mode 100644 index 0000000000000000000000000000000000000000..247ce0c1f39213f5ad91ea9fc42e8185c3c5fe12 GIT binary patch literal 22567 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 z

X{Gd^YQ9Wzfh9Ni%Sc{EKdh7 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 literal 0 HcmV?d00001 diff --git a/docs/_static/unified_provisioning.xml b/docs/_static/unified_provisioning.xml new file mode 100644 index 0000000000..d15e9ef505 --- /dev/null +++ b/docs/_static/unified_provisioning.xml @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/conf_common.py b/docs/conf_common.py index 8c4612560b..0eafe710db 100644 --- a/docs/conf_common.py +++ b/docs/conf_common.py @@ -132,6 +132,9 @@ nwdiag_fontpath = '../_static/DejaVuSans.ttf' rackdiag_fontpath = '../_static/DejaVuSans.ttf' packetdiag_fontpath = '../_static/DejaVuSans.ttf' +# Enabling this fixes cropping of blockdiag edge labels +seqdiag_antialias = True + # Breathe extension variables # Doxygen regenerates files in 'xml/' directory every time, diff --git a/docs/en/api-reference/index.rst b/docs/en/api-reference/index.rst index e35c4cc39c..0de5c5ae66 100644 --- a/docs/en/api-reference/index.rst +++ b/docs/en/api-reference/index.rst @@ -11,6 +11,7 @@ API Reference Ethernet Peripherals Protocols + Provisioning Storage System Configuration Options diff --git a/docs/en/api-reference/provisioning/index.rst b/docs/en/api-reference/provisioning/index.rst new file mode 100644 index 0000000000..cb064e30bf --- /dev/null +++ b/docs/en/api-reference/provisioning/index.rst @@ -0,0 +1,11 @@ +Provisioning API +**************** + +.. toctree:: + :maxdepth: 1 + + Unified Provisioning + Protocol Communication + Wi-Fi Provisioning + +Example code for this API section is provided in :example:`provisioning` directory of ESP-IDF examples. diff --git a/docs/en/api-reference/provisioning/protocomm.rst b/docs/en/api-reference/provisioning/protocomm.rst new file mode 100644 index 0000000000..8dc72c50a3 --- /dev/null +++ b/docs/en/api-reference/provisioning/protocomm.rst @@ -0,0 +1,169 @@ +Protocol Communication +====================== + +Overview +-------- +Protocol Communication (protocomm) component manages secure sessions and provides framework for multiple transports. The application can also use protocomm layer directly to have application specific extensions for the provisioning (or non-provisioning) use cases. + +Following features are available for provisioning : + * Communication security at application level - + * protocomm_security0 (no security) + * protocomm_security1 (curve25519 key exchange + AES-CTR encryption) + * Proof-of-possession (support with protocomm_security1 only) + +Protocomm internally uses protobuf (protocol buffers) for secure session establishment. Though users can implement their own security (even without using protobuf). One can even use protocomm without any security layer. + +Protocomm provides framework for various transports - WiFi (SoftAP+HTTPD), BLE, console - in which case the handler invocation is automatically taken care of on the device side (see Transport Examples below for code snippets). + +Note that the client still needs to establish session (only for protocomm_security1) by performing the two way handshake. See :doc:`provisioning` for more details about the secure handshake logic. + +Transport Example (SoftAP + HTTP) with Security 1 +------------------------------------------------- +For complete example see :example:`provisioning/softap_prov` + + .. highlight:: c + + :: + + /* Endpoint handler to be registered with protocomm. + * This simply echoes back the received data. */ + esp_err_t echo_req_handler (uint32_t session_id, + const uint8_t *inbuf, ssize_t inlen, + uint8_t **outbuf, ssize_t *outlen, + void *priv_data) + { + /* Session ID may be used for persistence */ + printf("Session ID : %d", session_id); + + /* Echo back the received data */ + *outlen = inlen; /* Output data length updated */ + *outbuf = malloc(inlen); /* This will be deallocated outside */ + memcpy(*outbuf, inbuf, inlen); + + /* Private data that was passed at the time of endpoint creation */ + uint32_t *priv = (uint32_t *) priv_data; + if (priv) { + printf("Private data : %d", *priv); + } + + return ESP_OK; + } + + /* Example function for launching a protocomm instance over HTTP */ + protocomm_t *start_pc(const char *pop_string) + { + protocomm_t *pc = protocomm_new(); + + /* Config for protocomm_httpd_start() */ + protocomm_httpd_config_t pc_config = PROTOCOMM_HTTPD_DEFAULT_CONFIG(); + + /* Start protocomm server on top of HTTP */ + protocomm_httpd_start(pc, &pc_config); + + /* Create Proof of Possession object from pop_string. It must be valid + * throughout the scope of protocomm endpoint. This need not be static, + * ie. could be dynamically allocated and freed at the time of endpoint + * removal */ + const static protocomm_security_pop_t pop_obj = { + .data = (const uint8_t *) strdup(pop_string), + .len = strlen(pop_string) + }; + + /* Set security for communication at application level. Just like for + * request handlers, setting security creates an endpoint and registers + * the handler provided by protocomm_security1. One can similarly use + * protocomm_security0. Only one type of security can be set for a + * protocomm instance at a time. */ + protocomm_set_security(pc, "security_endpoint", &protocomm_security1, &pop_obj); + + /* Private data passed to the endpoint must be valid throughout the scope + * of protocomm endpoint. This need not be static, ie. could be dynamically + * allocated and freed at the time of endpoint removal */ + static uint32_t priv_data = 1234; + + /* Add a new endpoint for the protocomm instance, identified by a unique name + * and register a handler function along with private data to be passed at the + * time of handler execution. Multiple endpoints can be added as long as they + * are identified by unique names */ + protocomm_add_endpoint(pc, "echo_req_endpoint", + echo_req_handler, (void *) &priv_data); + return pc; + } + + /* Example function for stopping a protocomm instance */ + void stop_pc(protocomm_t *pc) + { + /* Remove endpoint identified by it's unique name */ + protocomm_remove_endpoint(pc, "echo_req_endpoint"); + + /* Remove security endpoint identified by it's name */ + protocomm_unset_security(pc, "security_endpoint"); + + /* Stop HTTP server */ + protocomm_httpd_stop(pc); + + /* Delete (deallocate) the protocomm instance */ + protocomm_delete(pc); + } + +Transport Example (BLE) with Security 0 +--------------------------------------- +For complete example see :example:`provisioning/ble_prov` + + .. highlight:: c + + :: + + /* Example function for launching a secure protocomm instance over BLE */ + protocomm_t *start_pc() + { + protocomm_t *pc = protocomm_new(); + + /* Endpoint UUIDs */ + protocomm_ble_name_uuid_t nu_lookup_table[] = { + {"security_endpoint", 0xFF51}, + {"echo_req_endpoint", 0xFF52} + }; + + /* Config for protocomm_ble_start() */ + protocomm_ble_config_t config = { + .service_uuid = { + /* LSB <--------------------------------------- + * ---------------------------------------> MSB */ + 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, + }, + .nu_lookup_count = sizeof(nu_lookup_table)/sizeof(nu_lookup_table[0]), + .nu_lookup = nu_lookup_table + }; + + /* Start protocomm layer on top of BLE */ + protocomm_ble_start(pc, &config); + + /* For protocomm_security0, Proof of Possession is not used, and can be kept NULL */ + protocomm_set_security(pc, "security_endpoint", &protocomm_security0, NULL); + protocomm_add_endpoint(pc, "echo_req_endpoint", echo_req_handler, NULL); + return pc; + } + + /* Example function for stopping a protocomm instance */ + void stop_pc(protocomm_t *pc) + { + protocomm_remove_endpoint(pc, "echo_req_endpoint"); + protocomm_unset_security(pc, "security_endpoint"); + + /* Stop BLE protocomm service */ + protocomm_ble_stop(pc); + + protocomm_delete(pc); + } + +API Reference +------------- + +.. include:: /_build/inc/protocomm.inc +.. include:: /_build/inc/protocomm_security.inc +.. include:: /_build/inc/protocomm_security0.inc +.. include:: /_build/inc/protocomm_security1.inc +.. include:: /_build/inc/protocomm_httpd.inc +.. include:: /_build/inc/protocomm_ble.inc diff --git a/docs/en/api-reference/provisioning/provisioning.rst b/docs/en/api-reference/provisioning/provisioning.rst new file mode 100644 index 0000000000..7990e31ae6 --- /dev/null +++ b/docs/en/api-reference/provisioning/provisioning.rst @@ -0,0 +1,154 @@ +Unified Provisioning +^^^^^^^^^^^^^^^^^^^^ + +Overview +>>>>>>>> +Unified provisioning support in the ESP-IDF provides an extensible mechanism to the developers to configure the device with the Wi-Fi credentials and/or other custom configuration using various transports and different security schemes. Depending on the use-case it provides a complete and ready solution for Wi-Fi network provisioning along with example iOS and Android applications. Or developers can extend the device-side and phone-app side implementations to accommodate their requirements for sending additional configuration data. Following are the important features of this implementation. + +1. *Extensible Protocol:* The protocol is completely flexible and it offers the ability for the developers to send custom configuration in the provisioning process. The data representation too is left to the application to decide. +2. *Transport Flexibility:* The protocol can work on Wi-Fi (SoftAP + HTTP server) or on BLE as a transport protocol. The framework provides an ability to add support for any other transport easily as long as command-response behaviour can be supported on the transport. +3. *Security Scheme Flexibility:* It's understood that each use-case may require different security scheme to secure the data that is exchanged in the provisioning process. Some applications may work with SoftAP that's WPA2 protected or BLE with "just-works" security. Or the applications may consider the transport to be insecure and may want application level security. The unified provisioning framework allows application to choose the security as deemed suitable. +4. *Compact Data Representation:* The protocol uses `Google Protobufs `_ as a data representation for session setup and Wi-Fi provisioning. They provide a compact data representation and ability to parse the data in multiple programming languages in native format. Please note that this data representation is not forced on application specific data and the developers may choose the representation of their choice. + +Typical Provisioning Process +>>>>>>>>>>>>>>>>>>>>>>>>>>>> +.. seqdiag:: + :caption: Typical Provisioning Process + :align: center + + seqdiag typical-prov-process { + activation = none; + node_width = 80; + node_height = 60; + edge_length = 360; + span_height = 5; + default_shape = roundedbox; + default_fontsize = 12; + + CLIENT [label = "Client"]; + DEVICE [label = "Device"]; + + === 1. Transport specific discovery and connection === + DEVICE -> CLIENT [label="Some form of beaconing"]; + CLIENT -> DEVICE [label="Client connects"]; + === 2. Session Establishment ==== + CLIENT -> DEVICE [label="Get Version Request"]; + DEVICE -> CLIENT [label="Get Version Response"]; + CLIENT -> DEVICE [label="Session Setup Request"]; + DEVICE -> CLIENT [label="Session Setup Response"]; + CLIENT --> DEVICE; + ... One or multiple steps as per protocol ... + DEVICE --> CLIENT + === 3. Configuration === + CLIENT --> DEVICE [label="App specific Set Config (optional)"]; + DEVICE --> CLIENT [label="Set Config Response (optional)"]; + CLIENT -> DEVICE [label="Wi-Fi SetConfig(SSID, Passphrase...)"]; + DEVICE -> CLIENT [label="Wi-Fi SetConfig response"]; + CLIENT -> DEVICE [label="Wi-Fi ApplyConfig cmd"]; + DEVICE -> CLIENT [label="Wi-Fi ApplyConfig resp"]; + CLIENT -> DEVICE [label="Wi-Fi GetStatus cmd (repeated)"]; + DEVICE -> CLIENT [label="Wi-Fi GetStatus resp (repeated)"]; + === 4. Close connection === + DEVICE -> CLIENT [label="Close Connection"]; + } + +Deciding on Transport +>>>>>>>>>>>>>>>>>>>>> +Unified provisioning subsystem supports Wi-Fi (SoftAP+HTTP server) and BLE (GATT based) transport schemes. Following points need to be considered while selecting the best possible transport for provisioning. + +1. BLE based transport has an advantage that in the provisioning process, the BLE communication channel stays intact between the device and the client. That provides reliable provisioning feedback. +2. BLE based provisioning implementation makes the user-experience better from the phone apps as on Android and iOS both, the phone app can discover and connect to the device without requiring user to go out of the phone app +3. BLE transport however consumes ~110KB memory at runtime. If the product does not use the BLE or BT functionality after provisioning is done, almost all the memory can be reclaimed back and can be added into the heap. +4. SoftAP based transport is highly interoperable; however as the same radio is shared between SoftAP and Station interface, the transport is not reliable in the phase when the Wi-Fi connection to external AP is attempted. Also, the client may roam back to different network when the SoftAP changes the channel at the time of Station connection. +5. SoftAP transport does not require much additional memory for the Wi-Fi use-cases +6. SoftAP based provisioning requires the phone app user to go to "System Settings" to connect to Wi-Fi network hosted by the device in case of iOS. The discovery (scanning) as well as connection API is not available for the iOS applications. + +Deciding on Security +>>>>>>>>>>>>>>>>>>>> +Depending on the transport and other constraints the security scheme needs to be selected by the application developers. Following considerations need to be given from the provisioning security perspective: +1. The configuration data sent from the client to the device and the response has to be secured. +2. The client should authenticate the device it is connected to. +3. The device manufacturer may choose proof-of-possession - a unique per device secret to be entered on the provisioning client as a security measure to make sure that the user can provisions the device in the possession. + +There are two levels of security schemes. The developer may select one or combination depending on requirements. + +1. *Transport Security:* SoftAP provisioning may choose WPA2 protected security with unique per-device passphrase. Per-device unique passphrase can also act as a proof-of-possession. For BLE, "just-works" security can be used as a transport level security after understanding the level of security it provides. +2. *Application Security:* The unified provisioning subsystem provides application level security (*security1*) that provides data protection and authentication (through proof-of-possession) if the application does not use the transport level security or if the transport level security is not sufficient for the use-case. + +Device Discovery +>>>>>>>>>>>>>>>> +The advertisement and device discovery is left to the application and depending on the protocol chosen, the phone apps and device firmware application can choose appropriate method to advertise and discovery. + +For the SoftAP+HTTP transport, typically the SSID (network name) of the AP hosted by the device can be used for discovery. + +For the BLE transport device name or primary service included in the advertisement or combination of both can be used for discovery. + +Architecture +>>>>>>>>>>>> +The below diagram shows architecture of unified provisioning. + +.. figure:: ../../../_static/unified_provisioning.png + :align: center + :alt: Unified Provisioning Architecture + + Unified Provisioning Architecture + +It relies on the base layer called :doc:`protocomm` (Protocol Communication) which provides a framework for security schemes and transport mechanisms. Wi-Fi Provisioning layer uses Protocomm to provide simple callbacks to the application for setting the configuration and getting the Wi-Fi status. The application has control over implementation of these callbacks. In addition application can directly use protocomm to register custom handlers. + +Application creates a protocomm instance which is mapped to a specific transport and specific security scheme. Each transport in the protocomm has a concept of an "end-point" which corresponds to logical channel for communication for specific type of information. For example security handshake happens on a different endpoint than the Wi-Fi configuration endpoint. Each end-point is identified using a string and depending on the transport internal representation of the end-point changes. In case of SoftAP+HTTP transport the end-point corresponds to URI whereas in case of BLE the end-point corresponds to GATT characteristic with specific UUID. Developers can create custom end-points and implement handler for the data that is received or sent over the same end-point. + +Security Schemes +>>>>>>>>>>>>>>>> +At present unified provisioning supports two security schemes: +1. Security0 - No security (No encryption) +2. Security1 - Curve25519 based key exchange, shared key derivation and AES256-CTR mode encryption of the data. It supports two modes : + + a. Authorized - Proof of Possession (PoP) string used to authorize session and derive shared key + b. No Auth (Null PoP) - Shared key derived through key exchange only + +Security1 scheme details are shown in the below sequence diagram + +.. seqdiag:: + :caption: Security1 + :align: center + + seqdiag security1 { + activation = none; + node_width = 80; + node_height = 60; + edge_length = 480; + span_height = 5; + default_shape = roundedbox; + default_fontsize = 12; + + CLIENT [label = "Client"]; + DEVICE [label = "Device"]; + + === Security 1 === + CLIENT -> CLIENT [label = "Generate\nKey Pair", rightnote = "{cli_privkey, cli_pubkey} = curve25519_keygen()"]; + CLIENT -> DEVICE [label = "SessionCmd0(cli_pubkey)"]; + DEVICE -> DEVICE [label = "Generate\nKey Pair", leftnote = "{dev_privkey, dev_pubkey} = curve25519_keygen()"]; + DEVICE -> DEVICE [label = "Initialization\nVector", leftnote = "dev_rand = gen_16byte_random()"]; + DEVICE -> DEVICE [label = "Shared Key", leftnote = "shared_key(No PoP) = curve25519(dev_privkey, cli_pubkey) \nshared_key(with PoP) = curve25519(dev_privkey, cli_pubkey) ^ SHA256(pop)"]; + DEVICE -> CLIENT [label = "SessionResp0(dev_pubkey, dev_rand)"]; + CLIENT -> CLIENT [label = "Shared Key", rightnote = "shared_key(No PoP) = curve25519(cli_privkey, dev_pubkey)\nshared_key(with PoP) = curve25519(cli_privkey, dev_pubkey) ^ SHA256(pop)"]; + CLIENT -> CLIENT [label = "Verification\nToken", rightnote = "cli_verify = aes_ctr_enc(key=shared_key, data=dev_pubkey, nonce=dev_rand)"]; + CLIENT -> DEVICE [label = "SessionCmd1(cli_verify)"]; + DEVICE -> DEVICE [label = "Verify Client", leftnote = "check (dev_pubkey == aes_ctr_dec(cli_verify...)"]; + DEVICE -> DEVICE [label = "Verification\nToken", leftnote = "dev_verify = aes_ctr_enc(key=shared_key, data=cli_pubkey, nonce=(prev-context))"]; + DEVICE -> CLIENT [label = "SessionResp1(dev_verify)"]; + CLIENT -> CLIENT [label = "Verify Device", rightnote = "check (cli_pubkey == aes_ctr_dec(dev_verify...)"]; + } + +Sample Code +>>>>>>>>>>> +Please refer to :doc:`protocomm` and :doc:`wifi_provisioning` for API guides and code snippets on example usage. + +Various use case implementations can be found as examples under :example:`provisioning`. + +Provisioning Tools +>>>>>>>>>>>>>>>>>> + +A python based provisioning tool is provided under `$IDF_PATH/tools/esp_prov`, intended for use along with the examples under :example:`provisioning`. + +For android, a provisioning tool along with source code is available on Github as `esp-idf-provisioning-android `_ diff --git a/docs/en/api-reference/provisioning/wifi_provisioning.rst b/docs/en/api-reference/provisioning/wifi_provisioning.rst new file mode 100644 index 0000000000..a822bf62ff --- /dev/null +++ b/docs/en/api-reference/provisioning/wifi_provisioning.rst @@ -0,0 +1,60 @@ +Wi-Fi Provisioning +================== + +Overview +-------- + +This component provides protocomm endpoint handler - `wifi_prov_config_data_handler` - and related protobuf framework which can be used for Wi-Fi configuration in the context of device provisioning, though it may be used in non-provisioning cases as well. The configuration consists of three commands : + * `get_status` - For querying the Wi-Fi connection status + * `set_config` - For setting the Wi-Fi connection credentials + * `apply_config` - For applying the credentials saved during `set_config` and (re)start the Wi-Fi station + +The way this is supposed to work is that the desired Wi-Fi configuration for the ESP32, which is to run as a station and thus connect to an AP with certain credentials, is to be sent during `set_config`. Then `apply_config` is supposed to start (or restart) the Wi-Fi in station mode with the previously set AP credentials. Afterwords, `get_config` command is used to probe the device continuously for Wi-Fi connection status, to ensure that the connection was indeed successful. If the connection failed, then appropriate status code along with disconnection reason, is to be conveyed through `get_config`. + +Application Example +------------------- + + .. highlight:: c + + :: + + esp_err_t get_status_handler(wifi_prov_config_get_data_t *resp_data) + { + /* Fill the wifi_prov_config_get_data_t structure + * with Wi-Fi station connection status information. */ + + return ESP_OK; + } + + esp_err_t set_config_handler(const wifi_prov_config_set_data_t *req_data) + { + /* Copy contents of req_data->ssid and req_data->password + * which are Wi-Fi AP credentials to which the device will connect */ + + return ESP_OK; + } + + esp_err_t apply_config_handler(void) + { + /* Apply the Wi-Fi STA credentials saved during set_config */ + + return ESP_OK; + } + + /* Structure with various config command handlers to be passed + * as private data during endpoint registration with protocomm */ + wifi_prov_config_handlers_t wifi_prov_handlers = { + .get_status_handler = get_status_handler, + .set_config_handler = set_config_handler, + .apply_config_handler = apply_config_handler, + }; + + /* Set the endpoint handler */ + protocomm_add_endpoint(pc, "wifi_config_endpoint", + wifi_prov_config_data_handler, + (void *) &wifi_prov_handlers); + +API Reference +------------- + +.. include:: /_build/inc/wifi_config.inc diff --git a/docs/zh_CN/api-reference/provisioning/index.rst b/docs/zh_CN/api-reference/provisioning/index.rst new file mode 100644 index 0000000000..d7931ed5c3 --- /dev/null +++ b/docs/zh_CN/api-reference/provisioning/index.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/provisioning/index.rst diff --git a/docs/zh_CN/api-reference/provisioning/protocomm.rst b/docs/zh_CN/api-reference/provisioning/protocomm.rst new file mode 100644 index 0000000000..c50654e0d1 --- /dev/null +++ b/docs/zh_CN/api-reference/provisioning/protocomm.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/provisioning/protocomm.rst diff --git a/docs/zh_CN/api-reference/provisioning/provisioning.rst b/docs/zh_CN/api-reference/provisioning/provisioning.rst new file mode 100644 index 0000000000..375f2ac82d --- /dev/null +++ b/docs/zh_CN/api-reference/provisioning/provisioning.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/provisioning/provisioning.rst diff --git a/docs/zh_CN/api-reference/provisioning/wifi_provisioning.rst b/docs/zh_CN/api-reference/provisioning/wifi_provisioning.rst new file mode 100644 index 0000000000..2a73a26111 --- /dev/null +++ b/docs/zh_CN/api-reference/provisioning/wifi_provisioning.rst @@ -0,0 +1 @@ +.. include:: ../../../en/api-reference/provisioning/wifi_provisioning.rst