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