|

【Tutorial】快速開發LinkIt 7697的BLE功能

   

作者:章國俊

LinkIt 7697 是以 MediaTek MT7697 SOC 為基礎的開發板,不但支援 Wi-Fi 與 BLE 連線功能,還提供了 Arduino 的開發環境支援以及週邊的函式庫,大幅簡化了開發工作!(原始碼請見 Arduino Add-On for LinkIt SDK v4)。
本文將示範如何運用 Arduino IDE,來開發 Linkit 7697 BLE 的各項相關功能。

準備工作

LinkIt 7697開發板

當拿到開發板時,開發環境準備工作請參考這篇:【Tutorial】LinkIt 7697三種開發環境,輕鬆上手。

運行範例

Linkit 的 Arduino 函式庫為我們的開發簡化了不少工作,我們將透過範例了解如何運用這些功能。在 Arduino IDE 上安裝了 LinkIt 7697 的開發板管理擴充之後就可以經由 Arduino IDE 選單→ File→ Examples→ LBLE 取得這些範例。以下會擷取範例中重點的部份,並在後面附上完成程式碼的連結。接下來就來看看,使用一個 LinkIt 7697 與一支手機能做些什麼樣的開發吧!

iBeacon (Apple)

iBeacon 是由 Apple 提出的一種協議。由 iBeacon 相容的硬體設備進行廣播,使附近的手機或平板電腦之類的移動裝置得以接收,並做出相應的反應,通常用於資訊的推播或是室內定位。

執行這個範例可以讓 LinkIt 7697 成為一個 iBeacon advertiser:


<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> </span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> </span>

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{
  Serial.begin(<span class="hljs-number">9600</span>);
  LBLE.begin();
  <span class="hljs-keyword">while</span> (!LBLE.ready()) {
    delay(<span class="hljs-number">100</span>);
  }
  Serial.println(<span class="hljs-string">"BLE ready"</span>);

  <span class="hljs-function">LBLEAdvertisementData beaconData
  LBLEUuid <span class="hljs-title">uuid</span><span class="hljs-params">(<span class="hljs-string">"E2C56DB5-DFFB-48D2-B060-D0F5A71096E0"</span>)</span></span>;
  beaconData.configAsIBeacon(uuid, <span class="hljs-number">01</span>, <span class="hljs-number">02</span>, -<span class="hljs-number">40</span>);
  LBLEPeripheral.advertise(beaconData);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">loop</span><span class="hljs-params">()</span> </span>{
  delay(<span class="hljs-number">3000</span>);
}

完整原始碼
執行之後可以用手機 APP搜尋(這裡用的是: iBeacon & Eddystone Scanner):


連上了!在上圖可以看到信號的強度,並且推算出手機與beacon大致的距離。

Eddystone (Google)

Eddystone 是 Google 在2015年時,所提出的一種 BLE profile,可以用在許多 beacon 的應用之中。執行這個範例可以讓 LinkIt 7697 成為一個 Eddystone URL advertiser(程式與前面的 iBeacon 非常類似):


  ...
  LBLEAdvertisementData beaconData;
  beaconData.configAsEddystoneURL(EDDY_HTTPS, <span class="hljs-string">"makerpro.cc"</span>, EDDY_URL_NONE);

  LBLEPeripheral.advertiseAsBeacon(beaconData);
  ...

完整原始碼
執行之後可以用手機 APP 搜尋:


這次可以看到 beacon data 是帶有有 URL 的。距離又更精準一點!

BLE Peripheral

在 BLE 的架構中分為兩個部份:Peripheral 與 Central。
Periphal 會廣播,方便 Central 可以找到它,在 Peripheral 與 Central 連上之後,Central 可以提取 Periphal 的資料,或是控制它。這個範例讓 LinkIt 7697 成為一個 BLE Periphral,在此我們用手機當作 Central,來控制開發板上的 LED 明滅。(以下省略部份程式,並做一點小修改,以便在手機上控制)


<span class="hljs-function">LBLEService <span class="hljs-title">ledService</span><span class="hljs-params">(<span class="hljs-string">"19B10010-E8F2-537E-4F6C-D104768A1214"</span>)</span></span>;
<span class="hljs-function">LBLECharacteristicInt <span class="hljs-title">switchCharacteristic</span><span class="hljs-params">(<span class="hljs-string">"19B10011-E8F2-537E-4F6C-D104768A1214"</span>, LBLE_READ | LBLE_WRITE)</span></span>;

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{

  ...

  LBLEAdvertisementData advertisement;
  advertisement.configAsConnectableDevice(<span class="hljs-string">"BLE LED"</span>);
  ledService.addAttribute(switchCharacteristic);

  LBLEPeripheral.setName(<span class="hljs-string">"BLE LED"</span>);
  LBLEPeripheral.addService(ledService);
  LBLEPeripheral.begin();
  LBLEPeripheral.advertise(advertisement);
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">loop</span><span class="hljs-params">()</span> </span>{
  delay(<span class="hljs-number">100</span>);
  <span class="hljs-keyword">if</span> (switchCharacteristic.isWritten()) {
    <span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> value = switchCharacteristic.getValue();
    <span class="hljs-keyword">switch</span> (value) {
      <span class="hljs-keyword">case</span> <span class="hljs-number">0x31</span>:
        digitalWrite(LED_BUILTIN, HIGH);
        <span class="hljs-keyword">break</span>;
      <span class="hljs-keyword">case</span> <span class="hljs-number">0x30</span>:
        digitalWrite(LED_BUILTIN, LOW);
        <span class="hljs-keyword">break</span>;
      <span class="hljs-keyword">default</span>:
        ...
    }
  }
}

完整原始碼
執行之後可以用手機 APP 搜尋(這裡用的APP是 BLE Scanner)、連線,然後控制 LED 的明滅。

透過手機點亮LED turn on:

透過手機點亮LED,可以看見開發板上紅色LED燈亮起來。

透過手機關閉LED turn off:

透過手機關閉LED,可以看見開發板上紅色LED燈熄滅。

Scan Peripherals

BLE Central 可以作為一群 peripherals 的管理中心,它可以先掃描附近的 peripherals。在這裡,我們首先使用一個手機 APP 來模擬 BLE Periphral(這裏用的是 BLE Peripheral Simulator),這是一個傳輸體溫的裝置:


然後執行範例開始掃描:


<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> </span>
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> </span>
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">setup</span><span class="hljs-params">()</span> </span>{
  ...
  LBLE.begin();
  <span class="hljs-keyword">while</span> (!LBLE.ready()) {
    delay(<span class="hljs-number">10</span>);
  }
  LBLECentral.scan();
  ...
  <span class="hljs-comment">// list advertisements found.</span>
  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; LBLECentral.getPeripheralCount(); ++i) {
    printDeviceInfo(i);
  }
  LBLECentral.stopScan();
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">loop</span><span class="hljs-params">()</span> </span>{
  <span class="hljs-comment">// do nothing</span>
}

<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">printDeviceInfo</span><span class="hljs-params">(<span class="hljs-keyword">int</span> i)</span> </span>{
  ...
  <span class="hljs-keyword">const</span> String name = LBLECentral.getName(i);
  ...
  <span class="hljs-keyword">const</span> String manu = LBLECentral.getManufacturer(i);
  ...
}

完整原始碼


找到我們用手機模擬的裝置了!

Connect to peripheral

接續前一個範例,在掃描之後,可以對已找到的裝置連線。接著執行這個範例:


LBLEClient client;
...
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">loop</span><span class="hljs-params">()</span> </span>{
  ...
  client.connect(serverAddress);
  ...
  <span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> serviceCount = client.getServiceCount();
    Serial.println(<span class="hljs-string">"available services = "</span>);
    <span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i &lt; serviceCount; ++i)
    {
      Serial.print(<span class="hljs-string">"\t - "</span>);
      <span class="hljs-keyword">const</span> String serviceName = client.getServiceName(i);
      <span class="hljs-keyword">if</span>(serviceName.length())
      {
        Serial.print(<span class="hljs-string">"["</span>);
        Serial.print(serviceName);
        Serial.print(<span class="hljs-string">"] "</span>);
      }
      Serial.println(client.getServiceUuid(i));

    }
    ...
}

完整原始碼


連上periphral!得到periphral的相關資訊,可以進一步執行其他工作。

結語

從以上的範例中,我們可以把 LinkIt7697 當作:

  • iBeacon 或是 Eddystone
  • BLE peripheral
  • BLE central

透過 LinkIt7697 的 Arduino library 進行開發,真的變得簡單許多!你還想透過不同的組合做些什麼有趣或實用的功能呢?快來一起動手做、動手玩,向 PRO Maker 之路前進吧!

(責任編輯:林佳盈)

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author:

Share This Post On

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *