> For the complete documentation index, see [llms.txt](https://cavedu.gitbook.io/linkit-7697/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cavedu.gitbook.io/linkit-7697/linkit-7697-arduinoide/kai-fa-zhi-nan/shi-yong-mcs-han-shi-ku/mcs-han-shi-ku-api-shi-yong-shou-ce.md).

# MCS 函式庫 API 使用手冊

在 Arduino BSP 中，**MCS** 函式庫提供了下列類別供開發者使用：

* [MCSDevice](/linkit-7697/linkit-7697-development-guide-for-arduino-ide/developer-guide/using-mcs-library/mcs-library-api-reference/mcsdevice.md)
* [MCSLiteDevice](/linkit-7697/linkit-7697-development-guide-for-arduino-ide/developer-guide/using-mcs-library/mcs-library-api-reference/mcslitedevice.md)
* [MCSDataChannel 相關類別](/linkit-7697/linkit-7697-arduinoide/kai-fa-zhi-nan/shi-yong-mcs-han-shi-ku/mcs-han-shi-ku-api-shi-yong-shou-ce/mcsdatachannel-xiang-guan-lei-bie.md)

基本的使用流程為：先透過 device ID 與 device key 建立 **MCSDevice** 或 **MCSLiteDevice** 物件，接著新增所需的 **MCSDataChannel** 資料通道 (如 **MCSControllerOnOff** 或 **MCSDisplayGPS**)，並呼叫 **device.addChannel()** 將資料通道加入至 MCS 裝置。

當以上配置完成後，就可呼叫 **device.connect()** 連接 MCS 伺服器、使用 **device.process()** 函式處理來自 MCS 伺服器的命令，並透過 **channel.set(value)** 與 **channel.value()** 來存取資料通道的數值。

**使用範例**

```
#include <LWiFi.h>
#include <WiFiClient.h>
#include "MCS.h"

// Assign AP ssid / password here
#define _SSID "your_ssid"
#define _KEY  "your_password"

// Assign device id / key of your test device
MCSDevice mcs("your_device_id", "your_device_key");

// Assign channel id 
// The test device should have 2 channel
// the first channel should be "Controller" - "On/Off"
// the secord channel should be "Display" - "On/Off"
MCSControllerOnOff led("your_channel1_id");
MCSDisplayOnOff    remote("your_channel2_id");

#define LED_PIN 7

void setup() {
  // setup Serial output at 9600
  Serial.begin(9600);

  // setup LED/Button pin
  pinMode(LED_PIN, OUTPUT);

  // setup Wifi connection
  while(WL_CONNECTED != WiFi.status())
  {
    Serial.print("WiFi.begin(");
    Serial.print(_SSID);
    Serial.print(",");
    Serial.print(_KEY);
    Serial.println(")...");
    WiFi.begin(_SSID, _KEY);
  }
  Serial.println("WiFi connected !!");

  // setup MCS connection
  mcs.addChannel(led);
  mcs.addChannel(remote);
  while(!mcs.connected())
  {
    Serial.println("MCS.connect()...");
    mcs.connect();
  }
  Serial.println("MCS connected !!");

  // read LED value from MCS server
  while(!led.valid())
  {
    Serial.println("read LED value from MCS...");
    led.value();
  }
  Serial.print("done, LED value = ");
  Serial.println(led.value());
  digitalWrite(LED_PIN, led.value() ? HIGH : LOW);
}

void loop() {
  // call process() to allow background processing, add timeout to avoid high cpu usage
  Serial.print("process(");
  Serial.print(millis());
  Serial.println(")");
  mcs.process(100);
  
  // updated flag will be cleared in process(), user must check it after process() call.
  if(led.updated())
  {
    Serial.print("LED updated, new value = ");
    Serial.println(led.value());
    digitalWrite(LED_PIN, led.value() ? HIGH : LOW);
    if(!remote.set(led.value()))
    {
      Serial.print("Failed to update remote");
      Serial.println(remote.value());
    }
  }
  
  // check if need to re-connect
  while(!mcs.connected())
  {
    Serial.println("re-connect to MCS...");
    mcs.connect();
    if(mcs.connected())
      Serial.println("MCS connected !!");
  }
} 
```
