使用Blues無(wú)線記事卡發(fā)出(無(wú)聲)警報(bào):防盜警報(bào)和資產(chǎn)恢復(fù)。
項(xiàng)目背景
當(dāng)人們想到資產(chǎn)跟蹤器時(shí),通常他們會(huì)考慮跟蹤應(yīng)該移動(dòng)的東西:飛機(jī)、火車(chē)和汽車(chē)。我們不經(jīng)常考慮的是跟蹤固定不易移動(dòng)的東西:雕像、環(huán)境監(jiān)測(cè)設(shè)備、淡季存放的房車(chē)或船只,以及其他不幸丟失或被盜的貴重物品。
最近在工作中,有人分享了一個(gè)關(guān)于養(yǎng)蜂人使用跟蹤設(shè)備來(lái)保護(hù)他們的蜂巢的故事(蜂蜜實(shí)際上是液體黃金?。┎⒔ㄗhBlues的設(shè)備將是一個(gè)很好的低成本工具蜂巢跟蹤解決方案,這讓我腦子里轉(zhuǎn)了轉(zhuǎn)。
Blues的使命是讓物聯(lián)網(wǎng)連接變得簡(jiǎn)單。您的物聯(lián)網(wǎng)設(shè)備是否具有穩(wěn)定的Wi-Fi連接-或者它位于草地某處的蜂箱中。Blues提供低功耗記事卡,通過(guò)預(yù)付費(fèi)蜂窩數(shù)據(jù)連接到安全云(Notehub),并將設(shè)備的數(shù)據(jù)(JSON格式)泵送到云中以便于訪問(wèn)。
最好的部分是,一旦數(shù)據(jù)在Notehub云中,它可以再次路由到第三方云平臺(tái)、Web應(yīng)用程序、低代碼儀表板,甚至是像Twilio這樣的消息傳遞平臺(tái)。
使用Twilio,我們可以在應(yīng)該靜止的設(shè)備開(kāi)始移動(dòng)時(shí)發(fā)送SMS警報(bào),包括最近已知位置坐標(biāo)等詳細(xì)信息。聽(tīng)起來(lái)對(duì)我來(lái)說(shuō)是一個(gè)非常完美的解決方案。
今天,我將向您展示如何以低于100美元的價(jià)格構(gòu)建一款防盜設(shè)備,該設(shè)備將使用蜂窩模塊將其位置數(shù)據(jù)發(fā)送到云端,并在檢測(cè)到運(yùn)動(dòng)時(shí)觸發(fā)SMS警報(bào),從而更快地恢復(fù)資產(chǎn)。
硬件部件
Blues無(wú)線記事卡(蜂窩)×1
Blues無(wú)線記事本-A×1
Adafruit鋰離子聚合物電池-3.7v2500mAh×1
USB-A轉(zhuǎn)Micro-USB數(shù)據(jù)線×1
軟件應(yīng)用程序和在線服務(wù)
BluesWirelessNotehub.io
SMSMessagingAPI
TwilioSMSMessagingAPI
JSONataExerciser
Webhook.site
組裝防盜裝置
由于我的項(xiàng)目是跟蹤不應(yīng)該移動(dòng)但仍在移動(dòng)的對(duì)象(如果您愿意,可以進(jìn)行反向資產(chǎn)跟蹤),因此在對(duì)象移動(dòng)時(shí)可靠的互聯(lián)網(wǎng)連接和不移動(dòng)時(shí)的持久電池壽命之類(lèi)的東西都是重要的考慮因素。
幸運(yùn)的是,BluesWireless擁有解決這兩個(gè)問(wèn)題的硬件。BluesWirelessNotecard提供預(yù)付費(fèi)全球蜂窩接入,包括500MB數(shù)據(jù)和10年服務(wù)。我選擇的模型適用于LTE-M和NB-IoT協(xié)議,并且在空閑時(shí)它的功耗極低,僅為約8uA。
除了我的Notecard之外,我還使用了BluesWirelessNotecarrierAL,它是Notecard的配套原型板,帶有板載蜂窩和GPS天線。
我特別選擇了NotecarrierAL版本,因?yàn)樗哂杏糜贚iPo電池的JST連接器,但也有使用AA電池的版本,并且所有Notecarrier板還具有可為設(shè)備供電并提供USB的微型USB連接器記事卡的接口。
這個(gè)難題的最后一塊是電源。正如我所提到的,我選擇了NotecarrierAL,它具有用于鋰聚合物電池的JST連接器,所以我買(mǎi)了一個(gè)Adafruit鋰離子聚合物電池-3.7v2500mAh來(lái)為整個(gè)shebang供電。
現(xiàn)在把它們放在一起:將Notecard擰入Notecarrier,將板上的蜂窩和GPS天線和連接器連接到Notecard,然后將LiPo電池插入標(biāo)有“LiPo”的JST連接器端口。
隨著防盜設(shè)備硬件組裝完成,是時(shí)候設(shè)置我們的云和Twilio配置了。
注意:如果您想了解有關(guān)組裝跟蹤器的更詳細(xì)說(shuō)明,請(qǐng)查看我們的開(kāi)發(fā)者體驗(yàn)網(wǎng)站的入門(mén)部分。
為跟蹤器設(shè)置一個(gè)Notehub項(xiàng)目以向其報(bào)告
在使用行軍命令設(shè)置Notecard本身之前,我們需要在Notehub.io中創(chuàng)建一個(gè)新的云項(xiàng)目來(lái)將Notecard的數(shù)據(jù)定向到。
由于Notecard是一個(gè)設(shè)備到云的數(shù)據(jù)泵,它并不存在于公共互聯(lián)網(wǎng)上(使其成為一個(gè)非常安全的設(shè)備),因此需要一個(gè)用于同步數(shù)據(jù)的代理:Notehub。
Notehub是一種瘦云服務(wù),它安全地接受來(lái)自蜂窩Notecard的數(shù)據(jù)(通過(guò)公共Internet,使用私有VPN隧道),然后立即將數(shù)據(jù)路由到您選擇的云提供商(無(wú)論是AWS、Azure、GoogleCloud或任何物聯(lián)網(wǎng)優(yōu)化服務(wù),如Ubidots、Datacake、Losant等)。
1.如果您還沒(méi)有,請(qǐng)立即使用Notehub創(chuàng)建一個(gè)帳戶。每月前5,000個(gè)路由事件是免費(fèi)的(路由事件=從Notehub到您選擇的云端點(diǎn)的數(shù)據(jù)傳輸)。這應(yīng)該遠(yuǎn)遠(yuǎn)超過(guò)此防盜設(shè)備所需的(希望如此)。
2.注冊(cè)完成后,點(diǎn)擊Notehub界面右上方的“創(chuàng)建項(xiàng)目”按鈕,填寫(xiě)項(xiàng)目詳情。
創(chuàng)建新項(xiàng)目后復(fù)制項(xiàng)目UID-我們?cè)谂渲肗otecarrier本身時(shí)需要它。
創(chuàng)建一個(gè)免費(fèi)的TwilioStarter帳戶
您需要設(shè)置的另一件事是使用Twilio的免費(fèi)入門(mén)帳戶,因?yàn)樗荰wilio的API,我們將利用它來(lái)發(fā)送SMS警報(bào)。
當(dāng)我設(shè)置我的測(cè)試帳戶時(shí),我遵循了BluesTwilio文檔,我建議從那里開(kāi)始。
注意:如果您單擊文檔“先決條件”部分中的Twilio鏈接,您將通過(guò)BluesWireless推薦鏈接獲得一些額外的Twilio入門(mén)積分。
設(shè)置您的帳戶后,請(qǐng)確保驗(yàn)證來(lái)電顯示(可能是您自己的手機(jī)號(hào)碼用于測(cè)試目的)并為您的帳戶分配一個(gè)Twilio電話號(hào)碼(這是稍后將發(fā)送SMS通知的號(hào)碼)。
以下是我如何從儀表板中得知我的帳戶有一個(gè)與之關(guān)聯(lián)的Twilio電話號(hào)碼。
現(xiàn)在讓我們?cè)O(shè)置我們的記事卡。在Notecard記錄運(yùn)動(dòng)數(shù)據(jù)后,我們將重新連接Notehub和Twilio。
對(duì)資產(chǎn)跟蹤記事卡進(jìn)行編程
如果您之前沒(méi)有配置過(guò)記事卡,不用擔(dān)心,Blues旨在通過(guò)簡(jiǎn)單的JSON命令使這種體驗(yàn)變得簡(jiǎn)單。
雖然您可以將完整的NotecardCLI下載到本地計(jì)算機(jī)以與Notecard交互,但我傾向于使用我們的開(kāi)發(fā)人員體驗(yàn)站點(diǎn)中內(nèi)置的基于Web的NotecardCLI。在我看來(lái)這更容易。
您只需要一根微型USB到USB-A轉(zhuǎn)換器電纜,即可將其插入筆記本電腦并開(kāi)始與您的記事卡進(jìn)行交互。
連接到記事卡后,向其發(fā)出以下命令集。
1. 恢復(fù)出廠設(shè)置您的記事卡。
從頭開(kāi)始一個(gè)新項(xiàng)目總是好的。
{"req":"card.restore","delete":true} |
2. 將tracker附加到Notehub項(xiàng)目,設(shè)置其模式和同步時(shí)間
{ "req":"hub.set", "product":"com.blues.paige:anti_theft_tracker", "mode":"periodic", "outbound":1440, "inbound":1440 } |
該設(shè)置只會(huì)每?? 1440 分鐘(每天一次)periodic將任何未同步的信息發(fā)送到 Notehub,并且它也將始終每隔 1440 分鐘同步一次,以便處理來(lái)自 Notehub 的任何新筆記和環(huán)境變量。outboundinbound
由于我們對(duì)更改環(huán)境變量或常規(guī)記事卡活動(dòng)的方式?jīng)]有太多期望,因此同步之間的長(zhǎng)間隔是可以的。這也將有助于保持電池壽命,因?yàn)樵摳櫰鲗⒔?jīng)歷的最耗電的活動(dòng)是獲取 GPS 位置并將該數(shù)據(jù)傳輸?shù)?Notehub。
3.設(shè)置Notecard的位置檢測(cè)模式和頻率
{"req":"card.location.mode","mode":"periodic","seconds":60} |
在periodic模式下,只有 Notecard 通過(guò)其板載加速度計(jì)檢測(cè)到運(yùn)動(dòng)時(shí),Notecard 的 GPS 模塊才會(huì)激活以獲取讀數(shù)。告訴記事卡每 60 秒獲取一次新的 GPS 讀數(shù)比超過(guò) 5 分鐘的時(shí)間間隔更消耗電池電量,但如果有東西被盜,我更愿意更頻繁地提醒它當(dāng)前的下落。
4.開(kāi)始追蹤,每天設(shè)置一次簽到心跳,新筆記第一時(shí)間同步到Notehub
{ "req":"card.location.track", "start":true, "heartbeat":true, "hours":24, "sync": true } |
card.location.track將在創(chuàng)建后立即發(fā)送到 Notehub 的 Notefile 中存儲(chǔ)位置標(biāo)記的跟蹤數(shù)據(jù),例如速度、方位和距離 - 這就是"sync" true該行末尾的命令所做的。一旦在記事卡上創(chuàng)建了新事件,它就會(huì)直接將其發(fā)送到 Notehub,無(wú)需等到下一個(gè)定期安排的outbound時(shí)間間隔。
同樣,這更耗電,但對(duì)于這種類(lèi)型的跟蹤器,我們希望事件盡可能接近實(shí)時(shí),以增加資產(chǎn)恢復(fù)的機(jī)會(huì)。
默認(rèn)文件是_track.qo,但您可以使用該file字段指定您自己的文件名。
heartbeat和告訴記事本hours以定義的時(shí)間間隔創(chuàng)建一個(gè)條目,而不管運(yùn)動(dòng)如何。這只是對(duì) Notecard 仍在工作的直覺(jué)檢查。
注意:如果您想了解有關(guān)配置資產(chǎn)跟蹤器的更多信息,請(qǐng)?jiān)贐lues 開(kāi)發(fā)者體驗(yàn)網(wǎng)站上查看有關(guān)它們的所有信息。
在 Notehub 中生成一些測(cè)試跟蹤事件
現(xiàn)在帶著 Notecard 在散步或開(kāi)車(chē)時(shí)查看它生成并發(fā)送到 Notehub 的數(shù)據(jù)類(lèi)型。
在 Notehub 項(xiàng)目中,單擊“事件”選項(xiàng)卡,然后在輸入的過(guò)濾器中_track.qo查看您的 Notecard 應(yīng)該生成的跟蹤事件列表。
如您仔細(xì)查看圖像所見(jiàn),我的記事本報(bào)告了心跳(無(wú)運(yùn)動(dòng))數(shù)據(jù)和運(yùn)動(dòng)檢測(cè)數(shù)據(jù)的混合。
但是,在其中放置一個(gè)圖釘,我們將找到一種方法來(lái)對(duì)這些數(shù)據(jù)進(jìn)行分類(lèi)并防止向Twilio發(fā)送誤報(bào)。
通過(guò)Twilio發(fā)送帶有位置數(shù)據(jù)的運(yùn)動(dòng)警報(bào)
行!現(xiàn)在是開(kāi)始將其中一些_track.qo事件發(fā)送到Twilio的時(shí)候了。
這可能是項(xiàng)目中花費(fèi)我時(shí)間最長(zhǎng)的部分,主要是因?yàn)槲沂煜ち薐SONata語(yǔ)法——但我已經(jīng)超越了自己。
讓我們逐步完成這一部分。
注意:如果您想跳過(guò)JSONata解釋?zhuān)苯舆M(jìn)入步驟2B-這是這個(gè)JSONata函數(shù)的最終版本。
1.在Notehub中新建一條Twilio路由尋找_track.qo文件
BluesWireless開(kāi)發(fā)者體驗(yàn)網(wǎng)站上的Twilio入門(mén)指南做得非常棒,準(zhǔn)確地展示了如何設(shè)置從Notehub到Twilio的新路線,請(qǐng)按照它直到第八步,其中選定的筆記文件被定義為被標(biāo)記twilio.qo-我們不會(huì),相反,我們的項(xiàng)目將尋找_track.qo像我的屏幕截圖中的文件。
2. 將此 JSONata 代碼粘貼到Twilio 路由的轉(zhuǎn)換數(shù)據(jù)部分中
如果您閱讀了 Twilio 入門(mén)指南的大部分說(shuō)明,您可能已經(jīng)了解了通過(guò) JSONata 轉(zhuǎn)換原始 Notecard 有效負(fù)載的部分,然后再將其發(fā)送到 Twilio。
JSONata ,如果你不熟悉它(我以前不熟悉),它是一種用于 JSON 數(shù)據(jù)的輕量級(jí)查詢和轉(zhuǎn)換語(yǔ)言。語(yǔ)法需要一些時(shí)間來(lái)適應(yīng),但一旦它起作用,它就非??崃?。
我學(xué)到的關(guān)于 Notehub 的另一件事是,任何 notefile 有效負(fù)載都可以通過(guò) JSONata 轉(zhuǎn)換函數(shù)運(yùn)行,以刪除我們不關(guān)心的大部分 JSON,只將重要的位路由到下一個(gè)綁定信息的地方( Twilio,在我們的例子中)。
所以這里是 JSONata 的第 1 版,要粘貼到 Notehub 中的轉(zhuǎn)換數(shù)據(jù)部分:
( $from := "+190354XXXX"; $to := "+1404641XXXX"; $body := function(){ ( $join([ "Alert! ", sn ? sn : device, " is on the move!", " Last spotted at: ", $string($round(where_lat, 6)), ",", $string($round(where_lon, 6)), " around ", $fromMillis(when * 1000, "[M01]/[D01]/[Y0001] [h#1]:[m01][P]", "-0500"), " EST." ]) ) }; "&Body=" & $body() & "&From=" & $from & "&To=" & $to & "&"; ) |
在這個(gè)表達(dá)式中,我們定義了三個(gè)變量:
$from - Twilio 電話號(hào)碼,
$to- 測(cè)試電話號(hào)碼(可能是您的電話號(hào)碼),
和- 一個(gè) JSONata 函數(shù),用于將字符串連接在一起,讓我們知道哪個(gè) Notecard 正在移動(dòng)(由 Notecard 的值定義 - 它的序列號(hào),如果該值不存在則回退到它的ID)、它最后已知的緯度 ( ) 和經(jīng)度( ) 和上次報(bào)告的時(shí)間 ( )。$bodysndevicewhere_latwhere_lonwhen
每個(gè)變量或函數(shù)用分號(hào)與下一個(gè)變量或函數(shù)分隔,并且要像本例那樣將多個(gè)變量和函數(shù)串在一起,請(qǐng)將它們?nèi)堪诶ㄌ?hào)內(nèi)。
除了從原始_track.qoNotefile 中提取的基本信息外,我們還使用內(nèi)置函數(shù)(例如$string、$round$fromMillis
最后,在 where"&Body="定義的最后一行,我們調(diào)用新創(chuàng)建的$body()函數(shù)來(lái)獲取我們需要發(fā)送給 Twilio 以獲取其消息的字符串,并添加我們也定義的$from和$to變量,以便 Twilio 知道文本應(yīng)該來(lái)自誰(shuí)以及應(yīng)該來(lái)自誰(shuí)收到它。
2A。過(guò)濾掉心跳事件_track.qo$doNotRoute()
這是一個(gè)好的開(kāi)始,但是那些也作為事件進(jìn)入 Notehub 的心跳_track.qo 事件呢?使用上面的 JSONata,這些將每天發(fā)送一次到 Twilio,并發(fā)送一個(gè)誤報(bào) SMS 警報(bào),表明 Notecard 正在移動(dòng),而實(shí)際上它不是。
Enter :一個(gè)自定義的 Blues JSONata 命令,它將有條件地將事件路由到 Notehub 之外,這正是我們所需要的。$doNotRoute()
如果您檢查發(fā)生運(yùn)動(dòng)的事件的純 JSON_track.qo與僅檢測(cè)心跳的事件的 JSON,您會(huì)注意到具有運(yùn)動(dòng)的事件具有兩個(gè)心跳不具有的屬性:motion和seconds.
帶有運(yùn)動(dòng)數(shù)據(jù)的記事卡事件_track.qo
{ // some event specific data up here "device": "dev:86447XXXXXXXX", "sn": "Notey McNotecard", "product": "product:com.blues.paige:anti_theft_tracker", "routed": 1646683287, "req": "note.add", "when": 1646683261, "file": "_track.qo", "body": { "hdop": 1, "motion": 4, "seconds": 74, "temperature": 29.125, "time": 1646683260, "voltage": 4.21875 }, "best_location_type": "gps", // a bunch of extra location JSON data here } |
里面body有motion和seconds- 這意味著記事本正在運(yùn)行。
沒(méi)有運(yùn)動(dòng)數(shù)據(jù)的記事卡事件_track.qo
{ // some event specific data up here "device": "dev:86447XXXXXXXX", "sn": "Notey McNotecard", "product": "product:com.blues.paige:anti_theft_tracker", "routed": 1646600372, "req": "note.add", "when": 1646600347, "file": "_track.qo", "updates": 1, "body": { "hdop": 1, "status": "heartbeat", "temperature": 25.5, "time": 1646341009, "voltage": 4.2734375 }, "best_location_type": "gps", // a bunch of extra location JSON data here } |
沒(méi)有motion和seconds在這個(gè)記事卡中body,加上它status是"heartbeat":沒(méi)有動(dòng)作。
我們可以使用一個(gè)(或兩個(gè)屬性)有條件地將值路由到 Twilio。游戲規(guī)則改變者。
用這個(gè)新更新的版本 2代碼替換原來(lái)的 JSONata :
( $from := "+190354XXXX"; $to := "+1404641XXXX"; $body := function(){ ( $join([ "Alert! ", sn ? sn : device, " is on the move!", " Last spotted at: ", $string($round(where_lat, 6)), ",", $string($round(where_lon, 6)), " around ", $fromMillis(when * 1000, "[M01]/[D01]/[Y0001] [h#1]:[m01][P]", "-0500"), " EST." ]) ) }; $result := ($exists(body.motion)) ? "&Body=" & $body() & "&From=" & $from & "&To=" & $to & "&" : $doNotRoute(); ) |
更改在"&Body=...構(gòu)造的最后幾行中。
無(wú)論如何都不會(huì)發(fā)送轉(zhuǎn)換后的 Notefile,現(xiàn)在聲明了一個(gè)名為的新變量并使用 JSONata方法,我們檢查原始有效負(fù)載是否具有值如果它有,則函數(shù)運(yùn)行并將數(shù)據(jù)發(fā)送到 Twilio,如果它沒(méi)有't被調(diào)用,并且 Note 不被發(fā)送。$result$existsbody.motion.$body()$doNotRoute()
方便起見(jiàn),添加 Google 地圖鏈接
好的,這應(yīng)該可以防止誤報(bào)通過(guò),但是我還想對(duì)這條消息進(jìn)行進(jìn)一步的改進(jìn)。我不了解你,但如果我有什么東西被偷了,看到打印出來(lái)的 GPS 坐標(biāo)在當(dāng)下并不是特別有用。
我希望能夠單擊 SMS 中的鏈接并查看地圖上顯示的那些坐標(biāo)。
與您的想法相反,目前還沒(méi)有普遍認(rèn)可的方式在短信中構(gòu)建 GPS 坐標(biāo),以便 iPhone 或 Android 消息服務(wù)能夠識(shí)別它們是坐標(biāo)(就像它們對(duì)電話號(hào)碼和地址所做的那樣)并自動(dòng)將它們超鏈接到在手機(jī)上打開(kāi)地圖應(yīng)用程序。
相反,我們必須自己做。所以我的解決方法是在消息的末尾提供一個(gè)谷歌地圖超鏈接,用戶可以選擇點(diǎn)擊或不點(diǎn)擊(我認(rèn)為谷歌地圖是一個(gè)幾乎普遍使用的應(yīng)用程序,無(wú)論手機(jī)操作系統(tǒng)如何,如果用戶不想使用它,他們可以從主消息正文中復(fù)制 GPS 字符串并將其粘貼到他們選擇的地圖應(yīng)用程序中)。
所以最后一次,用這個(gè)版本 3代碼替換你的 JSONata 文本:
( $from := "+190354XXXX"; $to := "+1404641XXXX"; $body := function(){ ( $join([ "Alert! ", sn ? sn : device, " is on the move!", " Last spotted at: ", $string($round(where_lat, 6)), ",", $string($round(where_lon, 6)), " around ", $fromMillis(when * 1000, "[M01]/[D01]/[Y0001] [h#1]:[m01][P]", "-0500"), " EST.", " Google maps link: http://maps.google.com/?q=", $string(where_lat), ",", $string(where_lon) ]) ) }; $result := ($exists(body.motion)) ? "&Body=" & $body() & "&From=" & $from & "&To=" & $to & "&" : $doNotRoute(); ) |
這個(gè)版本修改了$body函數(shù)的結(jié)尾,添加了一個(gè)額外的行,將緯度和經(jīng)度坐標(biāo)輸入到谷歌地圖 URL 中,以便可以從 SMS 中點(diǎn)擊它。
下面是最終 JSONata 表達(dá)式在 Twilio Notehub 路由中的樣子。
現(xiàn)在點(diǎn)擊“應(yīng)用更改”按鈕保存路線詳細(xì)信息。
是時(shí)候測(cè)試這個(gè)追蹤器了!
警報(bào)!
-
防盜系統(tǒng)
+關(guān)注
關(guān)注
0文章
74瀏覽量
20245 -
SMS
+關(guān)注
關(guān)注
0文章
78瀏覽量
28590
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論