了解IoT解决方案的蓝牙互联网网关

由马丁·伍利

865

基于Bluetooth SIG在将蓝牙设备与互联网和物联网架构集成方面所做的一些工作,这里有一些有趣的结果。

根据研究机构ABI的数据,蓝牙技术在所有物联网设备中占38%,而Wi-Fi和蜂窝技术分别占32%和19%。由于它们有不同的优点和缺点,这些技术不一定是相互排斥的,通常在物联网解决方案中一起使用。

但是有一个问题!蓝牙和TCP/IP不兼容。(物联网意味着使用TCP/IP等协议。)

可以看出,TCP/IP仅跨越蓝牙栈的两层。在TCP/IP和Friends协议栈中也使用其他协议(图1)。然而,蓝牙LE不能直接与TCP/IP通信,反之亦然。

蓝牙LE与TCP/IP
图1:蓝牙LE与TCP/IP

广泛的标准范围

尽管一些与物联网和蓝牙相关的标准已经由蓝牙SIG和其他标准定义,但单独使用它们不太可能涵盖物联网的所有方面。目前,定义了以下标准:

RFC7668

一种用于通信的Internet工程任务组(IETF)标准,它定义了如何调整IPv6 6LoWPAN包以便通过蓝牙LE堆栈的较低层次发送。不是TCP/IP的所有方面都被支持,但是蓝牙LE设备使用它可以有IP地址,并且可以使用6LoWPAN IPv6数据包相互通信。

Internet协议支持配置文件(IPSP)

这是一个低功耗蓝牙(Bluetooth Low Energy, LE)配置文件,允许发现支持IP over Bluetooth的设备。它在RFC7668中定义了如何使用蓝牙LE堆栈发送和接收IPv6报文。

HTTP代理服务(HPS)

这对传感器之类的设备很有用,并允许蓝牙传感器或类似的设备与网关设备一起工作,网关设备支持蓝牙LE和TCP/IP,可以作为HTTP客户端。因此,当蓝牙设备发出请求时,网关代表蓝牙设备向远程web服务器发送HTTP请求。从web应用服务器接收到的任何数据都会被发送回
蓝牙设备。

存在一些有用的标准

但是,如果您想在一般物联网使用情况下从互联网上驱动与蓝牙设备的交互,那么您需要一个网关,它具有某种自适应方案(API)因此,请求可以使用基于TCP/IP的协议表示,然后由网关转换为相应的蓝牙请求并发送到连接的蓝牙设备。

要在物联网环境中使用蓝牙,通常需要一些能够在TCP/IP上运行的应用程序协议和蓝牙协议之间进行转换的工具。这通常被称为蓝牙互联网网关(图2)(BIG),它被归类为中间件。

蓝牙和物联网解决方案架构
图2:蓝牙和物联网解决方案架构

Internet网关要求

现在,我们可以选择较旧的蓝牙BR/EDR和较新的蓝牙LE(图3)。蓝牙LE可用于各种方式,包括面向连接的通信和无连接,也可用于创建蓝牙设备的大型网状网络。因此,我们必须首先考虑需要支持什么类型的蓝牙技术。

Internet网关要求
图3:蓝牙互联网网关要求

对于该项目,使用蓝牙LE,因为对蓝牙mesh的支持不是优先事项,而且也无意支持较旧的蓝牙BR/EDR。
蓝牙LE设备可以以多种方式工作。无连接通信涉及一个称为广告的过程,在这个过程中,小数据包的数据被广播,并由一个设备在范围内(扫描)接收。该机制用于方便设备发现。

通常,像智能手机这样的扫描设备会在用户的帮助下找到并选择一个设备,然后建立连接。在此之后,通过连接进行通信。这需要网关代表某种TCP/IP客户机来完成。

发布广告的可连接设备称为外围设备。扫描和请求连接的设备称为中央设备。

因此,决定支持作为外围设备的可连接LE设备,并使用蓝牙互联网网关作为进行扫描和连接的中心设备。

Internet网关要求
图4:蓝牙互联网网关要求

蓝牙互联网网关架构

适配器组件处理以TCP/IP协议编码的请求。Bluetooth LE API有助于驱动Bluetooth堆栈实现的请求的Bluetooth过程。

他们决定在树莓派上使用Linux作为网关所需要的同时支持TCP/IP和蓝牙的平台。它还决定在TCP/IP协议中使用HTTP和WebSockets, HTTP请求和响应用于所有操作,除了传递蓝牙特征通知流(通过WebSocket传递)。

网关逻辑架构
图5:网关逻辑架构

对于HTTP支持,选择了Apache Web服务器,因为它有广泛的模块集合,开源websocketd用于Web套接字支持。网关上还插了一个网络摄像头来观察远程操作。

适配器代码是用Python. 为了将Python脚本与HTTP中的web服务器集成,使用了公共网关接口(CGI)。

BlueZ是您将在Linux上找到的蓝牙堆栈的名称。它提供了一个与语言无关的API,它使用允许进程间通信的LinuxD-bus服务。

网关物理架构
图6:网关物理架构

蓝牙互联网网关实现

HTTP GET

不使用用于传递相关参数的HTTP查询字符串更改远程对象状态的请求。

HTTP PUT

使用用于编码和传输相关参数的HTTP请求体中的JSON对象更改远程对象状态的请求。

回答

HTTP状态和JSON对象。

以下是一个关于设备发现的例子(图7):

上面显示了一个名为do_discover_devices.py的适配器脚本生成的响应。使用HTTP GET调用它,并将扫描时间参数传递到查询字符串中。这表明网关应该花费多长时间执行蓝牙扫描,以毫秒为单位。响应是一个对象数组,以JSON格式表示发现的设备。

设备发现
图7:设备发现

在本例中,使用HTTP PUT(图8)写入蓝牙特性。在这里,蓝牙设备地址被分配为第一个参数,并标识要与之交互的设备。

handle参数是属于特定蓝牙服务的蓝牙特性的特定实例的唯一标识符。

写入到蓝牙特性
图8:写入蓝牙特性
适配器代码
图9:适配器代码
API的代码
图10:API代码

蓝牙互联网网关安全

任何允许通过互联网访问你的设备的东西都需要安全。回顾了最初网关设计和实现的安全性(图11),发现了许多安全性问题。

安全性分析
图11:安全性分析

例如,没有身份验证机制,因此无法控制谁可以或不可以访问网关。

此阶段的网关使用了三个不同的TCP/IP端口:用于HTTP的端口80、用于网络摄像头流媒体服务的端口8081和用于websocketd的端口8082。直接接触互联网的端口越多,安全风险就越大。

TCP/IP上的数据在此阶段也不加密,蓝牙上的数据也不一定加密。

确保入口安全的步骤
图12:用于固定网关的步骤

它也被认为是可取的,有一些方法授予访问特定的蓝牙设备,而不是在网关范围内的所有设备。此外,能够授权访问特定的设备功能,而不是通过蓝牙设备可以做的所有事情,这将是非常有利的。

反向代理

网关上运行着三个服务,每个服务监听一个不同的端口。但是安装的IP防火墙被配置为只允许443端口访问。Apache web服务器被设置为充当一个反向代理,并将端口443包转发到URL模式
所指向的另一个端口。13)。这限制了向Internet公开的端口数量。

反向代理
图13:反向代理

此外,该项目还提出了蓝牙防火墙的概念。这允许控制哪些蓝牙设备可以通过网关进行交互,哪些服务、特征和描述符可以访问。蓝牙防火墙的配置文件如图14所示。

蓝牙防火墙配置
图14:蓝牙防火墙配置

蓝牙互联网网关可扩展性

虽然蓝牙规范没有规定中央设备与外围设备可以建立的并发连接的数量限制,但在实践中总是存在限制,而且可能非常低。

因此,如果您想支持大量同时连接到蓝牙互联网网关并由其控制的设备,这里有一些选项。

  1. 添加多个适配器。您可以添加多个蓝牙适配器(图16)到您的网关。有些适配器以USB适配器的形式出现,因此在物理上很容易实现;对代码进行一些调整是必要的,但这并不难。
  2. 水平扩展。这就是本项目采用的方法。网关服务的多个实例(图17)在多个Raspberry Pi设备上运行,请求通过软件负载均衡器分布在这些设备上。所有客户端请求都转到运行负载均衡器的节点。
可伸缩性
图15:可伸缩性
利用适配器进行能力建设
图16:使用适配器的能力建设
通过添加网关节点进行能力建设
图17:增加网关节点的能力建设

理论上,使用水平扩展,可以将大量的Raspberry Pi节点添加到网关集群中,并实现很高的蓝牙设备并发支持。

这里需要注意的唯一问题是,有一个称为粘性的负载平衡器概念。一旦从某个网关节点到某个特定的蓝牙设备建立了蓝牙连接,所有来自与该蓝牙设备相关的客户端的后续请求都必须由同一个网关节点处理,因为该网关节点拥有该蓝牙连接。

作者提出的机架式树莓Pi Zero W多节点解决方案
图18:作者制作的机架式Raspberry Pi Zero W多节点解决方案

这个HAProxy负载平衡器对粘性有极好的支持,允许用户配置行为。


这篇文章是基于Martin Woolley, EMEA高级开发关系经理,在2月份的世界技术大会和2021年印度电子周Bluetooth SIG上的演讲理解蓝牙技术的可靠性。

分享你的想法和评论

请输入您的评论!
请在这里输入你的名字