如何客製化企業 RAG 知識庫?— 從資料庫到知識整合的實戰技術
|

【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
468 ad

Submit a Comment

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