作者:章國俊
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 < 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 < 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位開發者一同掌握科技創新的技術資訊!