
# 应用侧C++ SDK使用指南
物联网平台提供C++语言的应用侧SDK供开发者使用。本文介绍应用侧 C++SDK的安装和配置，以及使用C++ SDK调用[应用侧API](https://support.huaweicloud.com/api-iothub/iot_06_v5_0001.html)的示例。
#### 在Linux系统上安装SDK
1. 获取依赖包。 
   1. 所需的这些第三方软件包在大部分系统的包管理工具中都有提供，例如基于Debian/Ubuntu的系统。
      ```
      sudo apt-get install libcurl4-openssl-dev libboost-all-dev libssl-dev libcpprest-dev
      ```
      
   
   2. spdlog需要从源码进行安装。
      ```
      git clone https://github.com/gabime/spdlog.git 
      cd spdlog 
      mkdir build 
      cd build 
      cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..  // 用以生成动态库 make sudo make install
      ```
      
   
   
   
   
2. 编译安装。 
   ```
   git clone https://github.com/huaweicloud/huaweicloud-sdk-cpp-v3.git 
   cd huaweicloud-sdk-cpp-v3 
   mkdir build 
   cd build 
   cmake .. make 
   sudo make install
   ```
   完成上述操作后，C++ SDK安装目录为" /usr/local"。
   
   
#### 在Windows系统上安装SDK
1. 安装vcpkg并使用vcpkg安装所需软件包。 
   ```
   vcpkg install curl cpprestsdk boost openssl spdlog
   ```
   
   
2. 使用CLion进行编译。 
   1. 使用CLion打开huaweicloud-sdk-cpp-v3目录。
   
   2. 选择"File \> Settings"。
   
   3. 选择"Build \> Execution \> Deployment \> CMake"。
   
   4. 在CMake options中加入以下配置。
      ```
      -DCMAKE_TOOLCHAIN_FILE={your vcpkg install dir}/scripts/buildsystems/vcpkg.cmake
      ```
      
   
   5. 右键CMakeLists.txt选择"Load CMake Project"。
   
   6. 配置clion的编译工具链为MSVC: 在[2.c]的CMake配置页面选择Toolchain为Visual Studio，不能选择mingw等其他编译器(windows平台下依赖msvc编译器， 选择mingw等其他编译器编译会报错)。另外，用户还可以选择编译出来的二进制文件是Debug模式还是Release模式, 选择Build Type进行下拉选择即可。
   
   7. 配置目标文件的架构和平台: windows平台支持编译不同CPU架构（x64, x86)的sdk链接库文件，用户可以根据实际需要进行配置，单击"Build \> Execution, Deployment \> Toolchains"，在Architecture选项可以下拉选择支持的CPU架构。
   
   8. 选择"Build"开始编译，编译结果会在clion控制台进行打印。
   
   
   
   
3. 安装 C++ SDK。编译完成后选择"Build \> Install"，完成后，C++ SDK安装目录为"C:\\Program File (x86)\\huaweicloud-sdk-cpp-v3"。
 
#### 代码示例
以调用[查询设备列表](https://support.huaweicloud.com/api-iothub/iot_06_v5_0048.html)接口为例，以下代码示例向您展示使用C++ SDK的主要步骤：
1. 创建认证。
2. 创建IoTDAClient实例并初始化。
3. 实例化请求对象。
4. 调用查询设备列表接口。 
   ```
   #include <cstdio>
   #include <iostream>
   #include <huaweicloud/core/exception/Exceptions.h>
   #include <huaweicloud/core/Client.h>
   #include <huaweicloud/iotda/v5/IoTDAClient.h>
   using namespace HuaweiCloud::Sdk;
   using namespace HuaweiCloud::Sdk::Core;
   using namespace HuaweiCloud::Sdk::Core::Utils;
   using namespace HuaweiCloud::Sdk::Core::Exception;
   using namespace HuaweiCloud::Sdk::Iotda::V5;
   using namespace HuaweiCloud::Sdk::Iotda::V5::Model;
   using namespace std;
   int main(void)
   {
       // region_id：如果是上海一，请填写"cn-east-3"；如果是北京四，请填写"cn-north-4";如果是华南广州，请填写"cn-south-1"
       std::string regionId = "<YOUR REGION ID>";
       std::string projectId = "<YOUR PROJECTID>";
       // ENDPOINT：请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的https接入地址。
       std::string endpoint = "<YOUR ENDPOINT>";
       std::string ak;
       std::string sk;
   #if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER)
       ak = getenv("HUAWEICLOUD_SDK_AK");
       sk = getenv("HUAWEICLOUD_SDK_SK");
   #elif defined(linux) || defined(__linux) || defined(__linux__)
       char* envVar;
       #define INIT_ENV_VAR(ID, NAME)               \
       do {                                     \
           if (envVar = secure_getenv) { \
               ID = std::string(envVar);        \
           }                                    \
       } while (0)
       INIT_ENV_VAR(ak, HUAWEICLOUD_SDK_AK);
       INIT_ENV_VAR(sk, HUAWEICLOUD_SDK_SK);
       #undef INIT_ENV_VAR
   #endif
       auto basicCredentials = std::make_unique<BasicCredentials>();
       // 标准版企业版请使用衍生算法，基础版删除该代码
       basicCredentials->setDerivedPredicate(Constants::DEFAULT_DERIVED_PREDICATE);
       basicCredentials->withAk(ak)
               .withSk(sk)
               .withProjectId(projectId);
       auto client = HuaweiCloud::Sdk::Iotda::V5::IoTDAClient::newBuilder()
               .withCredentials(std::unique_ptr<Credentials>(basicCredentials.release()))
               .withRegion(Region(regionId, endpoint))
               .build();
       // Initialize request parameters
       HuaweiCloud::Sdk::Iotda::V5::Model::ListDevicesRequest request = HuaweiCloud::Sdk::Iotda::V5::Model::ListDevicesRequest();
       try {
           std::string stringValue;
           std::cout << "************ListDevice***********" << std::endl;
           // 调用查询设备列表接口
           std::shared_ptr<HuaweiCloud::Sdk::Iotda::V5::Model::ListDevicesResponse> listRes =
                   client->listDevices(request);
           std::cout << listRes->getHttpBody() << std::endl;
       } catch (HostUnreachableException& e) { // handle exception
           std::cout << e.what() << std::endl;
       } catch (SslHandShakeException& e) {
           std::cout << e.what() << std::endl;
       } catch (RetryOutageException& e) {
           std::cout << e.what() << std::endl;
       } catch (CallTimeoutException& e) {
           std::cout << e.what() << std::endl;
       } catch (ServiceResponseException& e) {
           std::cout << "StatusCode: " << e.getStatusCode() << std::endl;
           std::cout << "ErrorCode: " << e.getErrorCode() << std::endl;
           std::cout << "ErrorMsg: " << e.getErrorMsg() << std::endl;
           std::cout << "RequestId: " << e.getRequestId() << std::endl;
       }
       return 0;
   }
   ```
   
   
5. 如果您是在Linux系统中运行该代码，请复制上述文件到iotda_test.cpp。然后执行如下命令： 
   ```
   $ g++ -o iotda_test iotda_test.cpp --std=c++14 -liotda_v5 -lcore -lcrypto -lboost_system -lcpprest
   $ ./iotda_test 
   # 下方会显示实际运行结果$
   ```
   如果您是在Windows系统下使用cmake来管理工程，则需要在CMakeLists.txt 中引入sdk core包和服务包的相关依赖。可以参考下面的CMakeLists.txt 文件:
   ```
   cmake_minimum_required(VERSION 3.16) 
   project(demo) 
   find_package(CURL REQUIRED) 
   set(CMAKE_CXX_STANDARD 14) 
    
   set(LINK_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/bin;") 
   set(BIN_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/lib;") 
   set(SERVICE_DIR "C:/Program Files (x86)/huaweicloud_cpp_sdk_v3/include;") 
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBOOST_UUID_FORCE_AUTO_LINK")  
   link_directories(${BIN_DIR}) 
   include_directories(${SERVICE_DIR}) 
   add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>") 
   add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
     
   add_executable(demo main.cpp) 
   target_link_libraries(demo PUBLIC core iotda_v5)
   ```
   
   
 
#### 更多
项目源码及更多详细的使用指导请参考[华为云开发者 C++ 软件开发工具包（C++ SDK）](https://github.com/huaweicloud/huaweicloud-sdk-cpp-v3/blob/master/README_CN.md)。
推荐您使用API在线调试工具[API Explorer](https://console.huaweicloud.com/apiexplorer/#/apidoc/IoTDA) ，API Explorer 支持快速调试和检索，调试API的同时，可以根据您的参数实时生成各种开发语言的SDK示例代码，方便您直接根据示例代码使用SDK。
