通過使用結合全雙工實時通信的Bluetooth Smart
由XSockets.NET的創始人兼首席執行官(CEO)Uffe Bjorklund?所創。自2009年以來他一直致力于圍繞實時通信的開發工作。
來自德州儀器(TI)的SimpleLink?多標準CC2650無線MCU是一種令人驚奇的硬件,該硬件作為中央單元的外設,可通過藍牙低能耗設備進行通信。基于CC2650的SimpleLink SensorTag擁有很多服務,能在全球任何地方訪問套件,真的很棒。
任務
在本文中,我們將看看如何能擴展與CC2650無線MCU的通信(通過在藍牙低能耗中央設備后面添加全雙工通信層),以便我們能在全球任何地方對CC2650進行讀取和寫入操作。因為這可能讓人感覺有點兒抽象,所以提供了下圖,或許有助于讓我們將要做的事情形象化。
有許多連接到外圍Bluetooth Smart設備的方法,但在本文中,我們將用Raspberry Pi 2作為藍牙低能耗(BLE)中央設備。
該圖表明:CC2650無線MCU通過藍牙低能耗設備與RaspberryPi進行通信。接著該Pi與XSockets(在這個實例中用的是NodeJS)建立TCP/IP連接,以便能采用全雙工模式發送/接收數據。然后XSockets將能從任何TCP/IP連接處發送/接收數據,這樣我們就可以在任何地方對CC2650進行讀取和寫入操作了。在上圖中,客戶端的幾個代表是經過挑選的,但實際上客戶端可以是具有TCP/IP的任何東西。
在物聯網(IoT)世界中,實時通信幾乎是必不可少的。最流行的IoT協議采用全雙工通信,而且有很好的理由。IoT通常涉及以高頻率發送數據或在有事發生時接收數據。借助請求響應驅動架構解決這一問題往往并非良策。而采用半雙工技術,您要冒這樣的風險:得到的解決方案很不正式卻開銷巨大;收到的信息是在不需要時發來的。
為實時通信建立Raspberry Pi
由于我們用來與Raspberry Pi的SensorTag進行通信的庫是基于NodeJS的,因此我們也將使用NodeJS進行實時通信。
安裝NodeJS
在Raspberry Pi上安裝NodeJS非常容易。
sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb
然后,您可通過運行(這可能會輸出v0.12.0或更高版本)來驗證該版本
節點v
解決方案
本文的任務是展示如何在全球任何地方采用全雙工模式對CC2650進行讀取/寫入操作。為了能做到這一點,我們需要三種部件。
- Raspberry Pi上的傳感器客戶端,該器件可與藍牙低能耗設備進行通信,并且還能以全雙工方式連接到我們的實時服務器。
- 實時服務器,該器件能向監控傳感器的客戶端發送信息,還能在監控客戶端想要將數據寫入到傳感器時向傳感器客戶端發送信息。
- 監控客戶端(可以是多種類型的),該器件可顯示傳感器數據,并通過實時服務器向傳感器客戶端發送指令。
這三個實施方案將在下面提及。
傳感器客戶端
Raspberry Pi上的傳感器客戶端(NodeJS)很容易建立。
設置
創建一個名為CC2650的文件夾并導航到它。
安裝SensorTag庫
npm install sensortag
安裝xsockets.net庫
npm install xsockets.net
代碼
用于客戶端的完整代碼(?70行)可在github庫中找到,但重要的部分在這里介紹。只需將app.js文件放在您安裝上述程序包的文件夾中即可。
連接到服務器,注意此處的IP和端口只用于開發。當部署到Azure時,該IP和端口將被替換為公共端點。
//連接到XSockets
var conn = new xsockets.TcpClient('192.168.1.3', 4502, ['sensor']);
//獲取傳感器控制器
//該控制器用來接收數據和發送數據
var sensorcontroller = conn.controller('sensor');
當sensortag上的溫度變化時
tagInstance.on('irTemperatureChange', function (ot, at) {
//call server method 'irTempChange' and pass new value
sensorcontroller.send('irtempchange', { obj: ot, amb: at });
});
當監控客戶端啟用紅外溫度服務時
sensorcontroller.on('enableirtemp', self.enableIrTemperature);
當世界某個地方的監控客戶端禁用紅外溫度服務時
sensorcontroller.on('disableirtemp', self.disableIrTemperature);
實時服務器
由于XSockets.NET是有形態的,因此您可連接任何東西,它允許您跨協議等進行對話。建立服務器端通信將非常輕松。
傳感器控制器
這是傳感器客戶端將向其發送數據的控制器。這個概念簡單卻有效。當傳感器客戶端向該傳感器控制器發送信息時,該信息被發送到具有監視器控制器實例的所有客戶端。這樣,所有正負責監控的客戶端均會獲得有關通知。
- 可連接/斷開的傳感器
- 可讓紅外溫度服務啟用/禁用的傳感器
- 改變了傳感器上的溫度。
監視器控制器
監視器控制器比傳感器控制器更簡單。這只有三種方法。
- 第一種方法,能獲得關于所有在線(OnOpened)傳感器的信息。
- 第二種方法,用于在傳感器上禁用紅外溫度服務的通知。
- 第三種方法,用于在傳感器上啟用紅外溫度服務。
通過輸入我們從傳感器客戶端那里知道的連接ID,服務器可把正確的傳感器作為目標來禁用/啟用。
監控客戶端
由于您可將任何東西連接到實時服務器(XSockets),因此您幾乎可從任何東西所在的方位控制該傳感器。但您的想象力會設定限制!在這個范例中,筆者將只用一個基本網頁和JavaScript來從該傳感器讀/寫數據。
代碼
用于客戶端的完整代碼可在github庫中找到,但重要的部分在這里介紹。
連接到服務器,注意此處的IP和端口只用于開發。
//連接到XSockets
var conn = new XSockets.WebSocket('ws://192.168.1.3:4502', ['monitor']);
//獲取傳感器控制器
//該控制器用來接收數據和發送數據
var monitor = conn.controller('monitor');
當服務器發送有關溫度變化的通知時
monitor.on('irTempChange', function(d) {
console.log('irtempchange', d);
vm.update(d);
});
當從該網頁啟用紅外溫度服務時
monitor.invoke('enableIrTemp', vm.id());
當從該網頁禁用紅外溫度服務時
monitor.invoke('disableIrTemp', vm.id());
當世界某個地方的監控客戶端禁用紅外溫度服務時
monitor.on('irTempDisabled', function(id) {
vm.disable( id);
});
當世界某個地方的監控客戶端啟用紅外溫度服務時
monitor.on('irTempEnabled', function(id) {
vm.enable(id);
});
啟動和運行
下面有一張圖,展示的結果來自筆者的開發機器。我們看到,傳感器標簽通過BLE設備連接到使用NodeJS與XSockets進行通信的Raspberry Pi。然后XSockets可向所有客戶端(在這個實例中僅僅是一個網頁)發送數據。此外,我們還可直接從該網頁(或任何其它客戶端)啟用/禁用傳感器服務。
總結
打造該解決方案時,最大的挑戰(對筆者來說)是在Raspberry Pi上設置BLE,但其原因可能是筆者在Linux和BLE方面技能有限。借助Raspberry Pi 2進行工作真是棒極了,德州儀器(TI)的SensorTag非常穩定且易于使用。此外,筆者還想給Azure一些贊譽,因為在Azure上部署 XSockets 簡直不費吹灰之力。
接下來做什么?
就服務而言,本文僅談論了來自CC2650的紅外溫度服務。接下來我們將繼續完善該解決方案,并添加對更多服務的支持以及對多種SensorTag的支持,這樣世界各地的人們就能注冊自己的標簽以便在Azure上展示。
GitHub庫
?完整的解決方案可在GitHub獲得
資源?
- 除Noble以外的sensortag庫:https://github.com/sandeepmistry/node-sensortag
- Noble:https://github.com/sandeepmistry/noble
- Raspberry PI資源:http://www.raspberrypi.org/downloads/
- Raspberry PI — 新手設置:http://www.raspberrypi.org/help/noobs-setup/
- 面向XSockets.NET的nodejs客戶端:https://github.com/XSockets/XSockets.Clients/tree/master/src/XSockets.Clients/XSockets4NodeJS
- 藍牙開發者門戶網站(Bluetooth Developer Portal)所載關于通用屬性配置文件(GATT)的信息:https://developer.bluetooth.org/TechnologyOverview/Pages/GATT.aspx
- 適用于Visual Studio的NodeJS工具:https://nodejstools.codeplex.com/
- 德州儀器(TI)CC2650:www.ti.com/sensortag
- Michael Saunby:http://mike.saunby.net/2013/04/raspberry-pi-and-ti-cc2541-sensortag.html
如欲閱讀全文,敬請在此處訪問XSocket博客。
評論
查看更多