1 Star 1 Fork 1

风轻云淡 / esp-iot-solution

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

ESP32 IoT Solution Overview


Solutions


Evaluation Board Series


ESP32 IoT Example List:


Components

Features

DAC Audio - Driver and example of using DAC Audio.
ULP Monitor - Provides some APIs for running simple ulp program in deep sleep.
TouchPad - Driver and example of using different types of touch pad.
Infrared - Driver and framework of using infrared remote control.

Framework

Lowpower_framework - Development framework for lowpower applications.

General fucntions

Button - Driver and example of using buttons and keys.
Debugs - Provides different commands for debugging via UART.
LED - Driver and example of using LED, which provides such APIs as to blink with different frequency.
Light - Driver and example of using PWM to drive a light, which provides such APIs as to control several channels of LED.
OTA - Driver and example of upgrading firmware from the given URL.
Param - Driver and example of saving and loading data via NVS flash.
Power Meter - Driver and example of a single-phase energy meter such as BL0937 or HLW8012.
Relay - Driver and example of a relay with different driving modes.
Weekly timer - Driver and example of a weekly timer to trigger events at some certain moment in each week.

HMI

LittlevGL - Driver of using LittlevGL embedded GUI library.
uGFX - Driver and example of using uGFX embedded GUI library.

I2C Sensors

APDS9960 - Driver and example of reading APDS9960, which is an ambient light photo Sensor.
BH1750 - Driver and example of reading BH1750 light sensor (GY-30 module).
BME280 - Driver and example of reading BME280, which is an pressure and temperature Sensor.
FT5X06 - Driver and example of reading FT5X06, which is a touch Sensor.
HDC2010 - Driver and example of reading HDC2010, which is a low power temperature and humidity sensor.
HTS221 - Driver and example of reading HTS221 temperature and humidity sensor.
LIS2DH12 - Driver and example of reading LIS2DH12, which is a 3-axis accelerometer.
MVH3004D - Driver and example of reading MVH3004D temperature and humidity sensor.
VEML6040 - Driver and example of reading VEML6040, which is a light UV sensor.

I2C Devices

AT24C02 - Driver and example of driving AT24C02, which is an eeprom storage.
CH450 - Driver and example of driving CH450, which is a 7-segment LED driver.
HT16C21 - Driver and example of driving HT16C21, which is a LED driver.
IS31FL3XXX - Driver and example of driving is31fl3xxx series chips, which are light effect LED driver chips.
MCP23017 - Driver and example of using mcp23017, which is a 16-bit I/O expander.
SSD1306 - Driver and example of using ssd1306, which is a 132 x 64 dot matrix OLED/PLED segment driver chip.

I2S Devices

ILI9806 - Driver and example of driving ILI9806 LCD.
NT35510 - Driver and example of driving NT35510 LCD.

Motor

Servo - Driver and example of driving servo motors.
A4988 - Driver and example of driving A4988, which is a stepper motor driver.

Network Abstract

MQTT - Driver and example of using MQTT client, which is a light-weight IoT protocol.
TCP - API and example of using TCP server and client in C++.
UDP - API and example of using UDP in C++.
Alink - API and example of connecting and communicating with Alink cloud service.

SPI Devices

E-ink display - API and example of driving and controlling SPI E-ink screen.
LCD screen - API and example of driving and controlling SPI LCD.
XPT2046 Touch screen - API and example of driving and controlling SPI Touch Screen.

WiFi Abstract

ESP-TOUCH for smart-config - Abstract APIs and example of configuring devices via esp-touch.
Blufi abstract APIs - Abstract APIs and example of configuring devices via blufi.
WiFi connection abstract APIs - Abstract APIs and example of WiFi station connecting to router.


Preparation(Make)

  • To clone this repository by

    git clone --recursive https://github.com/espressif/esp-iot-solution
  • To initialize the submodules

    git submodule update --init --recursive
  • Set IOT_SOLUTION_PATH, for example:

    export IOT_SOLUTION_PATH=~/esp/esp-iot-solution
  • esp-iot-solution project will over write the IDF_PATH to the submodule in makefile by default

  • You can refer to the Makefile in example if you want to build your own application.

  • To run the example project, please refer to:


Preparation(CMake)

  • Add to PATH the path to the tools directory inside the IDF_PATH directory.Add IDF_PATH & idf.py PATH to User Profile(CMake)

  • To clone this repository by

    git clone --recursive https://github.com/espressif/esp-iot-solution
  • To initialize the submodules

    git submodule update --init --recursive
  • Set IOT_SOLUTION_PATH, for example:

    export IOT_SOLUTION_PATH=~/esp/esp-iot-solution
  • esp-iot-solution project will over write the IDF_PATH to the submodule in makefile by default

  • You can refer to the Makefile in example if you want to build your own application.

  • To run the example project, please refer to:


Build system and dependency (Make)

  • We can regard IoT solution project as a platform that contains different device drivers and features

  • Add-on project: If you want to use those drivers and build your project base on the framework, you need to include the IoT components into your project.

    PROJECT_NAME := empty_project
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    IOT_SOLUTION_PATH ?= $(abspath $(shell pwd)/../../)
    include $(IOT_SOLUTION_PATH)/Makefile
    include $(IDF_PATH)/make/project.mk

    As we can see, in the Makefile of your project, you need to include the Makefile under $(IOT_SOLUTION_PATH) directory so that the build system can involve all the components and drivers you need.

    Note: In this way, the build system will replace the IDF_PATH with the directory of idf repository in submodule during the build process.

    If you don't want the replacement to happen(which means to use the ESP_IDF value from your system environment), you can modify as the following Makefile does:

    PROJECT_NAME := empty_project
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    IOT_SOLUTION_PATH ?= $(abspath $(shell pwd)/../../)
    include $(IOT_SOLUTION_PATH)/components/component_conf.mk
    include $(IDF_PATH)/make/project.mk
  • Stand-alone component: if you just want to pick one of the component and put it into your existing project, you just need to copy the single component to your project components directory. But you can also append the component list in your project Makefile like this:

    EXTRA_COMPONENT_DIRS += $(IOT_SOLUTION_PATH)/components/the_one_you_want_to_use
  • Components control: Usually we don't need all the device drivers to be compiled into our project, we can choose the necessary ones in menuconfig:

    make menuconfig --> IoT Solution settings --> IoT Components Management

    Those components that are not enabled, will not be compiled into the project, which alos means, you need to enable the components you would like to use.


Build system and dependency (CMake)

  • We can regard IoT solution project as a platform that contains different device drivers and features

  • Add-on project: If you want to use those drivers and build your project base on the framework, you need to include the IoT components into your project.

    # 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)
    
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    set(IOT_SOLUTION_PATH "$ENV{IOT_SOLUTION_PATH}")
    if(NOT IOT_SOLUTION_PATH)
        # Documentation says you should set IOT_SOLUTION_PATH in your environment, but we
        # can infer it relative to PROJECT_PATH directory if it's not set.
        get_filename_component(IOT_SOLUTION_PATH "${PROJECT_PATH}/../.." ABSOLUTE)
    endif()
    file(TO_CMAKE_PATH "${IOT_SOLUTION_PATH}" IOT_SOLUTION_PATH)
    set(ENV{IOT_SOLUTION_PATH} ${IOT_SOLUTION_PATH})
    
    include($ENV{IOT_SOLUTION_PATH}/CMakeLists.txt)
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    
    project(empty-project)

    As we can see, in the Makefile of your project, you need to include the Makefile under $(IOT_SOLUTION_PATH) directory so that the build system can involve all the components and drivers you need.

    Note: In this way, the build system will replace the IDF_PATH with the directory of idf repository in submodule during the build process.

    If you don't want the replacement to happen(which means to use the ESP_IDF value from your system environment), you can modify as the following Makefile does:

    # 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)
    
    #If IOT_SOLUTION_PATH is not defined, use relative path as default value
    set(IOT_SOLUTION_PATH "$ENV{IOT_SOLUTION_PATH}")
    if(NOT IOT_SOLUTION_PATH)
        # Documentation says you should set IOT_SOLUTION_PATH in your environment, but we
        # can infer it relative to PROJECT_PATH directory if it's not set.
        get_filename_component(IOT_SOLUTION_PATH "${PROJECT_PATH}/../.." ABSOLUTE)
    endif()
    file(TO_CMAKE_PATH "${IOT_SOLUTION_PATH}" IOT_SOLUTION_PATH)
    set(ENV{IOT_SOLUTION_PATH} ${IOT_SOLUTION_PATH})
    
    include($ENV{IOT_SOLUTION_PATH}/CMakeLists.txt)
    include($ENV{IDF_PATH}/tools/cmake/project.cmake)
    
    project(empty-project)
  • Stand-alone component: if you just want to pick one of the component and put it into your existing project, you just need to copy the single component to your project components directory. But you can also append the component list in your project Makefile like this:

    set(EXTRA_COMPONENT_DIRS "${EXTRA_COMPONENT_DIRS} ${IOT_SOLUTION_PATH}/components/the_one_you_want_to_use")
  • Components control: Usually we don't need all the device drivers to be compiled into our project, we can choose the necessary ones in menuconfig:

    idf.py menuconfig --> IoT Solution settings --> IoT Components Management

    Those components that are not enabled, will not be compiled into the project, which alos means, you need to enable the components you would like to use.


Framework

  • components

    • small drivers of different divices like button and LED
    • drivers of sensors
    • drivers of different I2C devices
    • friendly APIs of WiFi and OTA
  • Documents:

    • Documentations of some important features
    • Instruction of some different solutions
  • Examples:

    • Example project using this framework
  • Submodule:

    • esp-idf works as submodule here
  • tools:

    • different tools and scripts
    • unit-test project
    ├── Makefile
    ├── README.md
    ├── components
    ├── documents
    ├── examples
    │   └── aws_iot_demo
    │   └── check_pedestrian_flow
    │   └── empty_project
    │   └── esp32_azure_iot_kit 
    │   └── eth2wifi
    │   └── hmi
    │   └── lowpower_evb
    │   └── oled_screen_module
    │   └── smart_device
    │   └── touch_pad_evb
    │   └── ulp_examples
    ├── submodule
    │   └── esp-idf
    └── tools
        └── unit-test-app

Usage (Make)

  • This code is based on esp-idf project.

  • This repository contains esp-idf code as submodule.

  • To clone this repository by git clone --recurisve https://github.com/espressif/esp-iot-solution.git

  • Change to the directory of examples (such as examples/smart_device) in esp-iot-solution, run make menuconfig to configure the project.

  • Compiling the Project by make all

    ... will compile app, bootloader and generate a partition table based on the config.

  • Flashing the Project

  • Flash the binaries by make flash

    This will flash the entire project (app, bootloader and partition table) to a new chip. The settings for serial port flashing can be configured with make menuconfig.
    You don't need to run make all before running make flash, make flash will automatically rebuild anything which needs it.

  • Viewing Serial Output by make monitor target will use the already-installed miniterm (a part of pyserial) to display serial output from the ESP32 on the terminal console. Exit miniterm by typing Ctrl-].

  • To flash and monitor output in one pass, you can run: make flash monitor

  • You can use unit-test in esp-iot-solution to test all the components.


Usage (CMake)

  • This code is based on esp-idf project.

  • This repository contains esp-idf code as submodule.

  • To clone this repository by git clone --recurisve https://github.com/espressif/esp-iot-solution.git

  • Change to the directory of examples (such as examples/smart_device) in esp-iot-solution, run idf.py menuconfig to configure the project.

  • Compiling the Project by idf.py build

    ... will compile app, bootloader and generate a partition table based on the config.

  • Flashing the Project

  • Flash the binaries by idf.py flash

    This will flash the entire project (app, bootloader and partition table) to a new chip. The settings for serial port flashing can be configured with idf.py menuconfig.
    You don't need to run idf.py all before running idf.py flash, idf.py flash will automatically rebuild anything which needs it.

  • Viewing Serial Output by idf.py monitor target will use the already-installed miniterm (a part of pyserial) to display serial output from the ESP32 on the terminal console. Exit miniterm by typing Ctrl-].

  • To flash and monitor output in one pass, you can run: idf.py flash monitor

  • You can use unit-test in esp-iot-solution to test all the components.


Unit-test (Make)

back to top

To use uint-test, follow these steps:

  • Change to the directory of unit-test-app

    cd YOUR_IOT_SOLUTION_PATH/tools/unit-test-app
  • Use the default sdkconfig and compile unit-test-app by make IOT_TEST_ALL=1 -j8

    make defconfig
    make IOT_TEST_ALL=1
  • Flash the images by make flash

    make IOT_TEST_ALL=1 flash
  • Reset the chip and see the uart log using an uart tool such as minicom

  • All kinds of components will be shown by uart

    Here's the test menu, pick your combo:
    (1)     "Sensor BH1750 test" [bh1750][iot][sensor]
    (2)     "Button test" [button][iot]
    (3)     "Button cpp test" [button_cpp][iot]
    (4)     "Dac audio test" [dac_audio][iot][audio]
    (5)     "Debug cmd test" [debug][iot]
    (6)     "Deep sleep gpio test" [deep_sleep][rtc_gpio][current][iot]
    (7)     "Deep sleep touch test" [deep_sleep][touch][current][iot]
     ......
  • You need to send the index of the unit you want to test by uart. Test code of the unit you select will be run


Unit-test (CMake)

back to top

To use uint-test, follow these steps:

  • Change to the directory of unit-test-app

    cd YOUR_IOT_SOLUTION_PATH/tools/unit-test-app
  • Use the default sdkconfig and compile unit-test-app by make IOT_TEST_ALL=1 -j8

    make defconfig
    make IOT_TEST_ALL=1
  • Flash the images by make flash

    make IOT_TEST_ALL=1 flash
  • Reset the chip and see the uart log using an uart tool such as minicom

  • All kinds of components will be shown by uart

    Here's the test menu, pick your combo:
    (1)     "Sensor BH1750 test" [bh1750][iot][sensor]
    (2)     "Button test" [button][iot]
    (3)     "Button cpp test" [button_cpp][iot]
    (4)     "Dac audio test" [dac_audio][iot][audio]
    (5)     "Debug cmd test" [debug][iot]
    (6)     "Deep sleep gpio test" [deep_sleep][rtc_gpio][current][iot]
    (7)     "Deep sleep touch test" [deep_sleep][touch][current][iot]
     ......
  • You need to send the index of the unit you want to test by uart. Test code of the unit you select will be run


Example (Make)

back to top

To run the Examples projects, follow the steps below:

  • Change the directory to example

  • choose one example project you want to run, we take smart_device here.

  • Change the directory to the example project under example directory, take smart_device example as example here:

    cd YOUR_IOT_SOLUTION_PATH/example/smart_device
  • Run make menuconfig to set the project parameters in

    make menuconfig --> IoT Example - smart_device
  • Run make to compile the project, or make flash to compile and flash the module.


Example (CMake)

back to top

To run the Examples projects, follow the steps below:

  • Change the directory to example

  • choose one example project you want to run, we take smart_device here.

  • Change the directory to the example project under example directory, take smart_device example as example here:

    cd YOUR_IOT_SOLUTION_PATH/example/smart_device/alink_smart_device_demo
  • Run idf.py menuconfig to set the project parameters in

    idf.py menuconfig --> IoT Example - smart_device
  • Run idf.py to compile the project, or idf.py flash to compile and flash the module.


Empty project (Make)

back to top

  • You can start your own appliction code base on the empty_project.

  • By default, you just need to run make under the example/empty_project directory. The makefile will set all the path by default.

  • Meanwhile, you can copy the example project to anywhere you want, in this case, you will have to set the IOT_SOLUTION_PATH so that the build system shall know where to find the code and link the files.

  • Set iot path:(replace 'YOUR_PATH' below), you can also add IOT_SOLUTION_PATH to your environment PATH

        export IOT_SOLUTION_PATH = "YOUR_PATH/esp-iot-solution"

Empty project (CMake)

back to top

  • You can start your own appliction code base on the empty_project.

  • By default, you just need to run idf.py build under the example/empty_project directory. The makefile will set all the path by default.

  • Meanwhile, you can copy the example project to anywhere you want, in this case, you will have to set the IOT_SOLUTION_PATH so that the build system shall know where to find the code and link the files.

  • Set iot path:(replace 'YOUR_PATH' below), you can also add IOT_SOLUTION_PATH to your environment PATH

        export IOT_SOLUTION_PATH = "YOUR_PATH/esp-iot-solution"

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

暂无描述 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/fqyd_cqp/esp-iot-solution.git
git@gitee.com:fqyd_cqp/esp-iot-solution.git
fqyd_cqp
esp-iot-solution
esp-iot-solution
master

搜索帮助

14c37bed 8189591 565d56ea 8189591