使用Blues无线记事卡发出(无声)警报:防盗警报和资产恢复。项目背景当人们想到资产跟踪器时,通常他们会考虑跟踪应该移动的东西:飞机、火车和汽车。我们不经常考虑的是跟踪固定不易移动的东西:雕像、环境监测设备、淡季存放的房车或船只,以及其他不幸丢失或被盗的贵重物品。最近在工作中,有人分享了一个关于养蜂人使用跟踪设备来保护他们的蜂巢的故事(蜂蜜实际上是液体黄金!)并建议Blues的设备将是一个很好的低成本工具蜂巢跟踪解决方案,这让我脑子里转了转。Blues的使命是让物联网连接变得简单。您的物联网设备是否具有稳定的Wi-Fi连接-或者它位于草地某处的蜂箱中。Blues提供低功耗记事卡,通过预付费蜂窝数据连接到安全云(Notehub),并将设备的数据(JSON格式)泵送到云中以便于访问。最好的部分是,一旦数据在Notehub云中,它可以再次路由到第三方云平台、Web应用程序、低代码仪表板,甚至是像Twilio这样的消息传递平台。使用Twilio,我们可以在应该静止的设备开始移动时发送SMS警报,包括最近已知位置坐标等详细信息。听起来对我来说是一个非常完美的解决方案。今天,我将向您展示如何以低于100美元的价格构建一款防盗设备,该设备将使用蜂窝模块将其位置数据发送到云端,并在检测到运动时触发SMS警报,从而更快地恢复资产。硬件部件Blues无线记事卡(蜂窝)×1Blues无线记事本-A×1Adafruit锂离子聚合物电池-3.7v2500mAh×1USB-A转Micro-USB数据线×1软件应用程序和在线服务BluesWirelessNotehub.ioSMSMessagingAPITwilioSMSMessagingAPIJSONataExerciserWebhook.site组装防盗装置由于我的项目是跟踪不应该移动但仍在移动的对象(如果您愿意,可以进行反向资产跟踪),因此在对象移动时可靠的互联网连接和不移动时的持久电池寿命之类的东西都是重要的考虑因素。幸运的是,BluesWireless拥有解决这两个问题的硬件。BluesWirelessNotecard提供预付费全球蜂窝接入,包括500MB数据和10年服务。我选择的模型适用于LTE-M和NB-IoT协议,并且在空闲时它的功耗极低,仅为约8uA。除了我的Notecard之外,我还使用了BluesWirelessNotecarrierAL,它是Notecard的配套原型板,带有板载蜂窝和GPS天线。我特别选择了NotecarrierAL版本,因为它具有用于LiPo电池的JST连接器,但也有使用AA电池的版本,并且所有Notecarrier板还具有可为设备供电并提供USB的微型USB连接器记事卡的接口。这个难题的最后一块是电源。正如我所提到的,我选择了NotecarrierAL,它具有用于锂聚合物电池的JST连接器,所以我买了一个Adafruit锂离子聚合物电池-3.7v2500mAh来为整个shebang供电。现在把它们放在一起:将Notecard拧入Notecarrier,将板上的蜂窝和GPS天线和连接器连接到Notecard,然后将LiPo电池插入标有“LiPo”的JST连接器端口。随着防盗设备硬件组装完成,是时候设置我们的云和Twilio配置了。注意:如果您想了解有关组装跟踪器的更详细说明,请查看我们的开发者体验网站的入门部分。为跟踪器设置一个Notehub项目以向其报告在使用行军命令设置Notecard本身之前,我们需要在Notehub.io中创建一个新的云项目来将Notecard的数据定向到。由于Notecard是一个设备到云的数据泵,它并不存在于公共互联网上(使其成为一个非常安全的设备),因此需要一个用于同步数据的代理:Notehub。Notehub是一种瘦云服务,它安全地接受来自蜂窝Notecard的数据(通过公共Internet,使用私有VPN隧道),然后立即将数据路由到您选择的云提供商(无论是AWS、Azure、GoogleCloud或任何物联网优化服务,如Ubidots、Datacake、Losant等)。1.如果您还没有,请立即使用Notehub创建一个帐户。每月前5,000个路由事件是免费的(路由事件=从Notehub到您选择的云端点的数据传输)。这应该远远超过此防盗设备所需的(希望如此)。2.注册完成后,点击Notehub界面右上方的“创建项目”按钮,填写项目详情。创建新项目后复制项目UID-我们在配置Notecarrier本身时需要它。创建一个免费的TwilioStarter帐户您需要设置的另一件事是使用Twilio的免费入门帐户,因为它是Twilio的API,我们将利用它来发送SMS警报。当我设置我的测试帐户时,我遵循了BluesTwilio文档,我建议从那里开始。注意:如果您单击文档“先决条件”部分中的Twilio链接,您将通过BluesWireless推荐链接获得一些额外的Twilio入门积分。设置您的帐户后,请确保验证来电显示(可能是您自己的手机号码用于测试目的)并为您的帐户分配一个Twilio电话号码(这是稍后将发送SMS通知的号码)。以下是我如何从仪表板中得知我的帐户有一个与之关联的Twilio电话号码。现在让我们设置我们的记事卡。在Notecard记录运动数据后,我们将重新连接Notehub和Twilio。对资产跟踪记事卡进行编程如果您之前没有配置过记事卡,不用担心,Blues旨在通过简单的JSON命令使这种体验变得简单。虽然您可以将完整的NotecardCLI下载到本地计算机以与Notecard交互,但我倾向于使用我们的开发人员体验站点中内置的基于Web的NotecardCLI。在我看来这更容易。您只需要一根微型USB到USB-A转换器电缆,即可将其插入笔记本电脑并开始与您的记事卡进行交互。连接到记事卡后,向其发出以下命令集。1.恢复出厂设置您的记事卡。从头开始一个新项目总是好的。{"req":"card.restore","delete":true}2.将tracker附加到Notehub项目,设置其模式和同步时间{"req":"hub.set","product":"com.blues.paige:anti_theft_tracker","mode":"periodic","outbound":1440,"inbound":1440}该设置只会每1440分钟(每天一次)periodic将任何未同步的信息发送到Notehub,并且它也将始终每隔1440分钟同步一次,以便处理来自Notehub的任何新笔记和环境变量。outboundinbound由于我们对更改环境变量或常规记事卡活动的方式没有太多期望,因此同步之间的长间隔是可以的。这也将有助于保持电池寿命,因为该跟踪器将经历的最耗电的活动是获取GPS位置并将该数据传输到Notehub。3.设置Notecard的位置检测模式和频率{"req":"card.location.mode","mode":"periodic","seconds":60}在periodic模式下,只有Notecard通过其板载加速度计检测到运动时,Notecard的GPS模块才会激活以获取读数。告诉记事卡每60秒获取一次新的GPS读数比超过5分钟的时间间隔更消耗电池电量,但如果有东西被盗,我更愿意更频繁地提醒它当前的下落。4.开始追踪,每天设置一次签到心跳,新笔记第一时间同步到Notehub{"req":"card.location.track","start":true,"heartbeat":true,"hours":24,"sync":true}card.location.track将在创建后立即发送到Notehub的Notefile中存储位置标记的跟踪数据,例如速度、方位和距离-这就是"sync"true该行末尾的命令所做的。一旦在记事卡上创建了新事件,它就会直接将其发送到Notehub,无需等到下一个定期安排的outbound时间间隔。同样,这更耗电,但对于这种类型的跟踪器,我们希望事件尽可能接近实时,以增加资产恢复的机会。默认文件是_track.qo,但您可以使用该file字段指定您自己的文件名。heartbeat和告诉记事本hours以定义的时间间隔创建一个条目,而不管运动如何。这只是对Notecard仍在工作的直觉检查。注意:如果您想了解有关配置资产跟踪器的更多信息,请在Blues开发者体验网站上查看有关它们的所有信息。在Notehub中生成一些测试跟踪事件现在带着Notecard在散步或开车时查看它生成并发送到Notehub的数据类型。在Notehub项目中,单击“事件”选项卡,然后在输入的过滤器中_track.qo查看您的Notecard应该生成的跟踪事件列表。如您仔细查看图像所见,我的记事本报告了心跳(无运动)数据和运动检测数据的混合。但是,在其中放置一个图钉,我们将找到一种方法来对这些数据进行分类并防止向Twilio发送误报。通过Twilio发送带有位置数据的运动警报行!现在是开始将其中一些_track.qo事件发送到Twilio的时候了。这可能是项目中花费我时间最长的部分,主要是因为我熟悉了JSONata语法——但我已经超越了自己。让我们逐步完成这一部分。注意:如果您想跳过JSONata解释,直接进入步骤2B-这是这个JSONata函数的最终版本。1.在Notehub中新建一条Twilio路由寻找_track.qo文件BluesWireless开发者体验网站上的Twilio入门指南做得非常棒,准确地展示了如何设置从Notehub到Twilio的新路线,请按照它直到第八步,其中选定的笔记文件被定义为被标记twilio.qo-我们不会,相反,我们的项目将寻找_track.qo像我的屏幕截图中的文件。2.将此JSONata代码粘贴到Twilio路由的转换数据部分中如果您阅读了Twilio入门指南的大部分说明,您可能已经了解了通过JSONata转换原始Notecard有效负载的部分,然后再将其发送到Twilio。JSONata,如果你不熟悉它(我以前不熟悉),它是一种用于JSON数据的轻量级查询和转换语言。语法需要一些时间来适应,但一旦它起作用,它就非常酷了。我学到的关于Notehub的另一件事是,任何notefile有效负载都可以通过JSONata转换函数运行,以删除我们不关心的大部分JSON,只将重要的位路由到下一个绑定信息的地方(Twilio,在我们的例子中)。所以这里是JSONata的第1版,要粘贴到Notehub中的转换数据部分:($from:="+190354XXXX";$to:="+1404641XXXX";$body:=function(){($join(["Alert!",sn?sn:device,"isonthemove!","Lastspottedat:",$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&"&";)在这个表达式中,我们定义了三个变量:$from-Twilio电话号码,$to-测试电话号码(可能是您的电话号码),和-一个JSONata函数,用于将字符串连接在一起,让我们知道哪个Notecard正在移动(由Notecard的值定义-它的序列号,如果该值不存在则回退到它的ID)、它最后已知的纬度()和经度()和上次报告的时间()。$bodysndevicewhere_latwhere_lonwhen每个变量或函数用分号与下一个变量或函数分隔,并且要像本例那样将多个变量和函数串在一起,请将它们全部包裹在括号内。除了从原始_track.qoNotefile中提取的基本信息外,我们还使用内置函数(例如$string、$round$fromMillis最后,在where"&Body="定义的最后一行,我们调用新创建的$body()函数来获取我们需要发送给Twilio以获取其消息的字符串,并添加我们也定义的$from和$to变量,以便Twilio知道文本应该来自谁以及应该来自谁收到它。2A。过滤掉心跳事件_track.qo$doNotRoute()这是一个好的开始,但是那些也作为事件进入Notehub的心跳_track.qo事件呢?使用上面的JSONata,这些将每天发送一次到Twilio,并发送一个误报SMS警报,表明Notecard正在移动,而实际上它不是。Enter:一个自定义的BluesJSONata命令,它将有条件地将事件路由到Notehub之外,这正是我们所需要的。$doNotRoute()如果您检查发生运动的事件的纯JSON_track.qo与仅检测心跳的事件的JSON,您会注意到具有运动的事件具有两个心跳不具有的属性:motion和seconds.带有运动数据的记事卡事件_track.qo{//someeventspecificdatauphere"device":"dev:86447XXXXXXXX","sn":"NoteyMcNotecard","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",//abunchofextralocationJSONdatahere}里面body有motion和seconds-这意味着记事本正在运行。没有运动数据的记事卡事件_track.qo{//someeventspecificdatauphere"device":"dev:86447XXXXXXXX","sn":"NoteyMcNotecard","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",//abunchofextralocationJSONdatahere}没有motion和seconds在这个记事卡中body,加上它status是"heartbeat":没有动作。我们可以使用一个(或两个属性)有条件地将值路由到Twilio。游戏规则改变者。用这个新更新的版本2代码替换原来的JSONata:($from:="+190354XXXX";$to:="+1404641XXXX";$body:=function(){($join(["Alert!",sn?sn:device,"isonthemove!","Lastspottedat:",$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=...构造的最后几行中。无论如何都不会发送转换后的Notefile,现在声明了一个名为的新变量并使用JSONata方法,我们检查原始有效负载是否具有值如果它有,则函数运行并将数据发送到Twilio,如果它没有't被调用,并且Note不被发送。$result$existsbody.motion.$body()$doNotRoute()方便起见,添加Google地图链接好的,这应该可以防止误报通过,但是我还想对这条消息进行进一步的改进。我不了解你,但如果我有什么东西被偷了,看到打印出来的GPS坐标在当下并不是特别有用。我希望能够单击SMS中的链接并查看地图上显示的那些坐标。与您的想法相反,目前还没有普遍认可的方式在短信中构建GPS坐标,以便iPhone或Android消息服务能够识别它们是坐标(就像它们对电话号码和地址所做的那样)并自动将它们超链接到在手机上打开地图应用程序。相反,我们必须自己做。所以我的解决方法是在消息的末尾提供一个谷歌地图超链接,用户可以选择点击或不点击(我认为谷歌地图是一个几乎普遍使用的应用程序,无论手机操作系统如何,如果用户不想使用它,他们可以从主消息正文中复制GPS字符串并将其粘贴到他们选择的地图应用程序中)。所以最后一次,用这个版本3代码替换你的JSONata文本:($from:="+190354XXXX";$to:="+1404641XXXX";$body:=function(){($join(["Alert!",sn?sn:device,"isonthemove!","Lastspottedat:",$string($round(where_lat,6)),",",$string($round(where_lon,6)),"around",$fromMillis(when*1000,"[M01]/[D01]/[Y0001][h#1]:[m01][P]","-0500"),"EST.","Googlemapslink:http://maps.google.com/?q=",$string(where_lat),",",$string(where_lon)]))};$result:=($exists(body.motion))?"&Body="&$body()&"&From="&$from&"&To="&$to&"&":$doNotRoute();)这个版本修改了$body函数的结尾,添加了一个额外的行,将纬度和经度坐标输入到谷歌地图URL中,以便可以从SMS中点击它。下面是最终JSONata表达式在TwilioNotehub路由中的样子。现在点击“应用更改”按钮保存路线详细信息。是时候测试这个追踪器了!警报!