# Link directories To integrate the ZRC SDK, initialize the SDK, connect SDK with Zoom Rooms Client and control Zoom Rooms Client with provided APIs. ## ZRC SDK workflow ![](/img/zrcworkflow.png) ## Requirements - The ZRC SDK must be able to reach Zoom cloud services in order to function. See [Zoom network firewall or proxy server settings](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0060548) for specific requirements. - The ZRC SDK must be able to connect to the Zoom Room over the network in order to function, the same as first-party Zoom Rooms Controller applications (e.g. ZRC for Android). See [Firewall Configuration for Zoom Rooms](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0065712) for specific requirements. - Zoom Rooms version 6.0.0 or higher - The Zoom Rooms must be signed into the Zoom Account for the ZRC SDK to connect. - The ZRC SDK cannot connect to an unactivated Zoom Rooms. - Please call ZRC SDK APIs in your application's main UI thread for thread-safe operation - When using the ZRC SDK for Linux, your application must call `IZRCSDK::HeartBeat()` in the main UI thread to trigger the event loop. The recommended time interval is 150ms. - When using the ZRC SDK for Linux, Glibc version 2.27 or later is required. ## Import the ZRC SDK libraries As mentioned in the ZRC SDK file structure section, the header folder `./include `and the `libZRCSdk.so` library are the files used to build an Application based on the ZRC SDK. Assuming your project has a file structure similar to the example below, link the library SDK and include the library headers in your application code. ```plaintext MyZRCApp ├── include │ └── ServiceComponents └── lib └── libZRCSdk.so ``` ```cmake # Link directories link_directories( ${CMAKE_SOURCE_DIR}/lib ) include_directories( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/ServiceComponents ) ``` ## Initialize the SDK To initialize the SDK, include the header `IZRCSDK.h`, implement `IZRCSDKSink` and call `RegisterSink` to the SDK instance. ```cpp // implement the IZRCSDKSink and register to IZRCSDK IZRCSDKSink *sdkSink = new CZRCSdkSink(); IZRCSDK *sdk = IZRCSDK::GetInstance(); sdk->RegisterSink(sdkSink); // Optional. Currently not supported for Zoom for Government. sdk->InitWebDomain(strWebDomain); ``` ## Setup a Logging Filepath The ZRC SDK log files are configured with `IZRCSDKSink::OnGetAppContentDirPath()`. For example, you can configure as `${HOME}/Library/Logs/ZRCSDK`. Logs will be written to `ZPController_WebService_X.log` files. X is the log file index and the current log file index can be found in `last_log_file_id.txt`. Each log file is limited to a maximum size of 20 MB, and the ZRC SDK will write to a maximum of 10 files before rotating to overwrite the first file. When the ZRC SDK stops and restarts, it will attempt to read the `last_log_file_id.txt` and use the incrementally next log file. The log files are encrypted and are intended for Zoom Support use only. ## Pair to Zoom Rooms with ZRC SDK **REMINDER**: To control a Zoom Rooms using the ZRC SDK, the Zoom Rooms must be signed in first. The ZRC SDK cannot connect to a Zoom Rooms that is not signed in. To connect to a Zoom Rooms and control it using the ZRC SDK, a Zoom Rooms Administrator with appropriate permissions must retrieve an activation code from the Zoom admin portal (or use the Zoom Rooms REST API to retrieve an activation code). Activation codes expire after 10 days, but are only required for your application's initial sign-in using the ZRC SDK. 1. Go to Zoom admin portal - [Room Management](https://zoom.us/location) - Zoom Rooms 2. Find the Zoom Rooms with which you wish to connect and note the Activation Code (if necessary, click Regenerate to regenerate the code, as shown below). ![](/img/zrcroomcode.png) 3. You can configure your application's information in `IZRCSDKSink`. ZRC SDK will report your application information Zoom's backend, where it will appear in the **Zoom Admin Portal - Device Management - Device List** and **Zoom Admin Portal - Room Management - Zoom Rooms** administrative interfaces. ```cpp # implementation example virtual std::string OnGetDeviceManufacturer() { return "My Manufacturer"; } virtual std::string OnGetDeviceModel() { return "My Model"; } virtual std::string OnGetDeviceSerialNumber() { return "My Serial Number"; } virtual std::string OnGetDeviceMacAddress() { return "00:11:22:33:44:55"; } virtual std::string OnGetDeviceIP() { return "192.168.0.100"; } virtual std::string OnGetFirmwareVersion() { return "1.0.0"; } virtual std::string OnGetAppName() { return "My ZRC SDK Application"; } virtual std::string OnGetAppVersion() { return "1.0.1"; } virtual std::string OnGetAppDeveloper() { return "My App Developer"; } virtual std::string OnGetAppContact() { return "my.email@zoom.us"; } ``` 4. Call `IZoomRoomsService::PairRoomWithActivationCode` with your current Activation Code to connect to the target Zoom Rooms. You will receive several `IPreMeetingServiceSink::OnZRConnectionStateChanged` callbacks. When `ConnectionState` becomes `ConnectionStateConnected`, the connection between the ZRC SDK and the Zoom Room has been established and verified. ```cpp // create a ZoomRoomsService to control Zoom Rooms. // implement IZoomRoomsServiceSink and register to IZoomRoomsService IZoomRoomsService* pRoomService = sdk->CreateZoomRoomsService(); IZoomRoomsServiceSink* pRoomSink = new AutoIZoomRoomsServiceSink(); pRoomService->RegisterSink(pRoomSink); pRoomService->PairRoomWithActivationCode(strYourActivationCode); ``` 5. After the ZRC SDK is connected with a Zoom Rooms, your application will be represented as a Zoom Rooms Controller in the Zoom admin portal and your application's details will be shown in Zoom Admin Portal - [Device Management](https://zoom.us/device) - Device List. Select _"Third-party Controller"_ in the _"All Platform OS"_ drop-down to observe all third-party controllers, including your application. ![](/img/zrcadminportal.png) ## Disconnected from Zoom Rooms If you wish to disconnect your application from a Zoom Rooms, use the API `IZoomRoomsService::UnpairRoom` to unpair. ```cpp pRoomService->UnpairRoom(); ```