基于Blues无线记事卡实现超低成本防盗系统的制作

描述

  使用Blues无线记事卡发出(无声)警报:防盗警报和资产恢复。

  项目背景

  当人们想到资产跟踪器时,通常他们会考虑跟踪应该移动的东西:飞机、火车和汽车。我们不经常考虑的是跟踪固定不易移动的东西:雕像、环境监测设备、淡季存放的房车或船只,以及其他不幸丢失或被盗的贵重物品。

  最近在工作中,有人分享了一个关于养蜂人使用跟踪设备来保护他们的蜂巢的故事(蜂蜜实际上是液体黄金!)并建议Blues的设备将是一个很好的低成本工具蜂巢跟踪解决方案,这让我脑子里转了转。

  Blues的使命是让物联网连接变得简单。您的物联网设备是否具有稳定的Wi-Fi连接-或者它位于草地某处的蜂箱中。Blues提供低功耗记事卡,通过预付费蜂窝数据连接到安全云(Notehub),并将设备的数据(JSON格式)泵送到云中以便于访问。

  最好的部分是,一旦数据在Notehub云中,它可以再次路由到第三方云平台、Web应用程序、低代码仪表板,甚至是像Twilio这样的消息传递平台。

  使用Twilio,我们可以在应该静止的设备开始移动时发送SMS警报,包括最近已知位置坐标等详细信息。听起来对我来说是一个非常完美的解决方案。

  今天,我将向您展示如何以低于100美元的价格构建一款防盗设备,该设备将使用蜂窝模块将其位置数据发送到云端,并在检测到运动时触发SMS警报,从而更快地恢复资产。

SMS

  硬件部件

  Blues无线记事卡(蜂窝)×1

  Blues无线记事本-A×1

  Adafruit锂离子聚合物电池-3.7v2500mAh×1

  USB-A转Micro-USB数据线×1

  软件应用程序和在线服务

  BluesWirelessNotehub.io

  SMSMessagingAPI

  TwilioSMSMessagingAPI

  JSONataExerciser

  Webhook.site

  组装防盗装置

  由于我的项目是跟踪不应该移动但仍在移动的对象(如果您愿意,可以进行反向资产跟踪),因此在对象移动时可靠的互联网连接和不移动时的持久电池寿命之类的东西都是重要的考虑因素。

  幸运的是,BluesWireless拥有解决这两个问题的硬件。BluesWirelessNotecard提供预付费全球蜂窝接入,包括500MB数据和10年服务。我选择的模型适用于LTE-M和NB-IoT协议,并且在空闲时它的功耗极低,仅为约8uA。

SMS

  除了我的Notecard之外,我还使用了BluesWirelessNotecarrierAL,它是Notecard的配套原型板,带有板载蜂窝和GPS天线。

  我特别选择了NotecarrierAL版本,因为它具有用于LiPo电池的JST连接器,但也有使用AA电池的版本,并且所有Notecarrier板还具有可为设备供电并提供USB的微型USB连接器记事卡的接口。

SMS

  这个难题的最后一块是电源。正如我所提到的,我选择了NotecarrierAL,它具有用于锂聚合物电池的JST连接器,所以我买了一个Adafruit锂离子聚合物电池-3.7v2500mAh来为整个shebang供电。

  现在把它们放在一起:将Notecard拧入Notecarrier,将板上的蜂窝和GPS天线和连接器连接到Notecard,然后将LiPo电池插入标有“LiPo”的JST连接器端口。

SMS

  随着防盗设备硬件组装完成,是时候设置我们的云和Twilio配置了。

  注意:如果您想了解有关组装跟踪器的更详细说明,请查看我们的开发者体验网站的入门部分。

  为跟踪器设置一个Notehub项目以向其报告

  在使用行军命令设置Notecard本身之前,我们需要在Notehub.io中创建一个新的云项目来将Notecard的数据定向到。

  由于Notecard是一个设备到云的数据泵,它并不存在于公共互联网上(使其成为一个非常安全的设备),因此需要一个用于同步数据的代理:Notehub。

SMS

  Notehub是一种瘦云服务,它安全地接受来自蜂窝Notecard的数据(通过公共Internet,使用私有VPN隧道),然后立即将数据路由到您选择的云提供商(无论是AWS、Azure、GoogleCloud或任何物联网优化服务,如Ubidots、Datacake、Losant等)。

  1.如果您还没有,请立即使用Notehub创建一个帐户。每月前5,000个路由事件是免费的(路由事件=从Notehub到您选择的云端点的数据传输)。这应该远远超过此防盗设备所需的(希望如此)。

  2.注册完成后,点击Notehub界面右上方的“创建项目”按钮,填写项目详情。

SMS

  创建新项目后复制项目UID-我们在配置Notecarrier本身时需要它。

  创建一个免费的TwilioStarter帐户

  您需要设置的另一件事是使用Twilio的免费入门帐户,因为它是Twilio的API,我们将利用它来发送SMS警报。

  当我设置我的测试帐户时,我遵循了BluesTwilio文档,我建议从那里开始。

  注意:如果您单击文档“先决条件”部分中的Twilio链接,您将通过BluesWireless推荐链接获得一些额外的Twilio入门积分。

  设置您的帐户后,请确保验证来电显示(可能是您自己的手机号码用于测试目的)并为您的帐户分配一个Twilio电话号码(这是稍后将发送SMS通知的号码)。

  以下是我如何从仪表板中得知我的帐户有一个与之关联的Twilio电话号码。

SMS

  现在让我们设置我们的记事卡。在Notecard记录运动数据后,我们将重新连接Notehub和Twilio。

  对资产跟踪记事卡进行编程

  如果您之前没有配置过记事卡,不用担心,Blues旨在通过简单的JSON命令使这种体验变得简单。

  虽然您可以将完整的NotecardCLI下载到本地计算机以与Notecard交互,但我倾向于使用我们的开发人员体验站点中内置的基于Web的NotecardCLI。在我看来这更容易。

  您只需要一根微型USB到USB-A转换器电缆,即可将其插入笔记本电脑并开始与您的记事卡进行交互。

SMS

  连接到记事卡后,向其发出以下命令集。

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 应该生成的跟踪事件列表。

SMS

  如您仔细查看图像所见,我的记事本报告了心跳(无运动)数据和运动检测数据的混合。

  但是,在其中放置一个图钉,我们将找到一种方法来对这些数据进行分类并防止向Twilio发送误报。

  通过Twilio发送带有位置数据的运动警报

  行!现在是开始将其中一些_track.qo事件发送到Twilio的时候了。

  这可能是项目中花费我时间最长的部分,主要是因为我熟悉了JSONata语法——但我已经超越了自己。

  让我们逐步完成这一部分。

  注意:如果您想跳过JSONata解释,直接进入步骤2B-这是这个JSONata函数的最终版本。

  1.在Notehub中新建一条Twilio路由寻找_track.qo文件

  BluesWireless开发者体验网站上的Twilio入门指南做得非常棒,准确地展示了如何设置从Notehub到Twilio的新路线,请按照它直到第八步,其中选定的笔记文件被定义为被标记twilio.qo-我们不会,相反,我们的项目将寻找_track.qo像我的屏幕截图中的文件。

SMS

  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,
      " 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 & "&";
)

在这个表达式中,我们定义了三个变量:

$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 :一个自定义的 Blues JSONata 命令,它将有条件地将事件路由到 Notehub 之外,这正是我们所需要的。$doNotRoute()

如果您检查发生运动的事件的纯 JSON_track.qo与仅检测心跳的事件的 JSON,您会注意到具有运动的事件具有两个心跳不具有的属性:motion和seconds.

带有运动数据的记事卡事件_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- 这意味着记事本正在运行。

没有运动数据的记事卡事件_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
}

没有motion和seconds在这个记事卡中body,加上它status是"heartbeat":没有动作。

我们可以使用一个(或两个属性)有条件地将值路由到 Twilio。游戏规则改变者。

用这个新更新的版本 2代码替换原来的 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=...构造的最后几行中。

无论如何都不会发送转换后的 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,
      " 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();
)

这个版本修改了$body函数的结尾,添加了一个额外的行,将纬度和经度坐标输入到谷歌地图 URL 中,以便可以从 SMS 中点击它。

下面是最终 JSONata 表达式在 Twilio Notehub 路由中的样子。

SMS

  现在点击“应用更改”按钮保存路线详细信息。

  是时候测试这个追踪器了!

  警报!

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分