65.9K
CodeProject 正在变化。 阅读更多。
Home

基于 Wi-Fi 的资产跟踪器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (6投票s)

2016年8月4日

CPOL

3分钟阅读

viewsIcon

21778

downloadIcon

55

使用物联网在 WiFi 覆盖区域内追踪您的资产。

引言

在一个大型仓库中追踪和定位移动资产始终是一个巨大的挑战。想象一个大型仓库,其中有许多移动车辆、机械等。您如何从中央指挥中心定位它们?唯一的解决方案是让资产告知您其位置。在本文中,我们将开发一种基于 WiFi 标签的解决方案,可以将其附加到任何资产。该标签将在特定时间间隔内与您的服务器通信,并告知其位置。

该标签使用 ESP8266-12 (ESP-12) WiFi 芯片开发。

背景

市场上有很多使用 WiFi 标签追踪您资产的解决方案(例如 AirISTA, STANLEY HealthCare 等)。本文将向您解释这项技术背后的原理,并帮助您以经济高效的方式开发自己的解决方案。

对于开发和实施,您将需要以下软件和硬件。

  • Arduino IDE ( 链接)
  • USB 转 TTL 转换器 (链接)
  • ESP8266-12 (链接)。ESP8266 是一款低成本 Wi-Fi 芯片,具有完整的 TCP/IP 协议栈和微控制器功能,由位于上海的中国制造商乐鑫科技生产。
  • 跳线
  • 2 节 AA 电池盒
  • https://thingspeak.com/ 上创建一个帐户,用于公开您的标签将使用的 Web 服务。

使用代码

首先需要做的是设置用于编程 ESP8266 芯片的开发环境。 详细帮助可以在此 链接 中找到。

设置好环境后,我们需要将 ESP 芯片连接到 USB-TTL 连接器。 详细信息可在此 链接 中找到。

掌握 AT 命令的基本知识将帮助您更好地了解芯片 (链接)。

现在,一切都已准备好将您的程序上传到芯片。 在上传之前,我将向您解释此解决方案的工作原理。

如您所知,WiFi 信号是使用接入点 (AP) 生成的,每个 AP 都有一个唯一的 MAC 地址。 安装在 ESP 芯片中的程序将通过 AP 连接到 wifi 并读取连接的 AP 的 MAC 地址并设置到服务器。 假设此芯片连接到 WiFi 覆盖区域中的资产,其中部署了多个 AP。 该芯片将以预定义的时间间隔连接到 wifi 并读取 MAC 地址并发送到您的服务器。 通常,AP 会有一个定义的范围区域,因此您可以根据您获得的最后一个 MAC 地址找到资产的大概位置。

我们需要考虑一些挑战。 在 WiFi 覆盖区域中,大多数位置都将位于多个 AP 的覆盖范围内。 在这里,您需要考虑 WiFi 的另一个参数,称为 RSSI,意思是接收信号强度指示。 RSSI 值将为 -ve 刻度,其中 0 表示最大信号强度。 使用此,您可以找到距离 WiFi 标签最近的 AP,并且有关其他 AP 的信息将帮助您缩小资产的位置范围。 还有一种技术称为 WiFi 三角测量,这意味着如果您可以在任何特定位置找到来自 3 个或更多 AP 的信号,则可以精确定位您的标签。 WiFi 三角测量需要复杂的算法,这超出了本文的范围。

另一个挑战是标签的持续供电。 WiFi 连接会消耗您的电池电量。 使用 2 节 AA 电池,您只能管理 2 或 3 天。 我在此解决方案中包含另一个概念,称为“深度睡眠”,它将使标签在未连接时进入深度睡眠模式,并在特定时间间隔内唤醒并将位置详细信息发送到服务器。 有了这个,我们可以将电池寿命延长到 6 个月!!!。 通过将万用表串联到解决方案中,可以找到确切的功耗。

详细的源代码已附加到本文中。 我将在下面介绍代码中的重要模块。

// This function will help you to get the base station id of the connected AP

String GetBSSIDAddress() {
  String bssidstr =  WiFi.BSSIDstr();
  return bssidstr;
}

 

// scanNetworks function will give the list of APs with the associated wifi.
// Iterating though the list will give you the nearest AP in the given wifi.

byte available_networks = WiFi.scanNetworks();
  int rssi = -200;
  String apMAC = "Couldnot find";
  for (int network = 0; network < available_networks; network++) {

    if (strcmp((WiFi.SSID(network)).c_str(), ssid) == 0)
    {
      if (WiFi.RSSI(network) > rssi)
      {
        rssi = WiFi.RSSI(network);
        apMAC = WiFi.BSSIDstr(network);
      }
    }
  }

// Connect to the wifi using ssid name and password.
WiFi.begin(ssid, password);

 

关注点

这是一个用于 WiFi 跟踪的基本解决方案,您可以对此进行改进,以提高准确性和寿命。

历史

第一个版本。

基于 WiFi 的资产追踪器 - CodeProject - 代码之家
© . All rights reserved.