24小(xiǎo)时联系電(diàn)话:18217114652、13661815404
中文(wén)
- 您当前的位置:
- 首页>
- 電(diàn)子资讯>
- 技术专题>
- 了解物(wù)联网解决方案的...
技术专题
了解物(wù)联网解决方案的蓝牙互联网网关
了解物(wù)联网解决方案的蓝牙互联网网关
根据研究机构 ABI 的数据,蓝牙技术在所有(yǒu)物(wù)联网设备中的占比為(wèi) 38%,而 Wi-Fi 和蜂窝分(fēn)别為(wèi) 32% 和 19%。由于它们具有(yǒu)不同的优势和劣势,因此它们不一定是相互排斥的技术,并且通常在物(wù)联网解决方案中一起使用(yòng)。
但有(yǒu)个问题!蓝牙和 TCP/IP 不兼容。(物(wù)联网意味着使用(yòng) TCP/IP 等协议。)
可(kě)以看出,TCP/IP 仅跨越蓝牙堆栈的两层。其他(tā)协议也用(yòng)于堆栈 TCP/IP 和 Friends(图 1)。但是,蓝牙 LE 不能(néng)直接与 TCP/IP 通信,反之亦然。
图 1:蓝牙 LE 与 TCP/IP
广泛的标准范围
尽管蓝牙 SIG 和其他(tā)组织已经定义了一些与 IoT 和蓝牙相关的标准,但单独使用(yòng)它们不太可(kě)能(néng)涵盖 IoT 的所有(yǒu)方面。目前,定义了以下标准:
RFC7668
用(yòng)于通信的互联网工程任務(wù)组 (IETF) 标准,它定义了如何调整 IPv6 6LoWPAN 数据包以通过蓝牙 LE 堆栈的较低层发送。并非 TCP/IP 的所有(yǒu)方面都受支持,但使用(yòng)它的蓝牙 LE 设备可(kě)以拥有(yǒu) IP 地址,并且可(kě)以使用(yòng) 6LoWPAN IPv6 数据包相互通信。
Internet 协议支持配置文(wén)件 (IPSP)
这是一个低功耗蓝牙 (LE) 配置文(wén)件,允许发现支持 IP over Bluetooth 的设备。它在 RFC7668 中定义了蓝牙 LE 堆栈如何用(yòng)于发送和接收 IPv6 数据包。
HTTP 代理(lǐ)服務(wù) (HPS)
这对于传感器等设备很(hěn)有(yǒu)用(yòng),并允许蓝牙传感器或类似设备与支持蓝牙 LE 和 TCP/IP 并可(kě)以充当 HTTP 客户端的网关设备一起使用(yòng)。因此,网关代表蓝牙设备并在其请求时向遠(yuǎn)程 Web 服務(wù)器发送 HTTP 请求。从 Web 应用(yòng)程序服務(wù)器接收到的任何数据都会被发送回蓝牙设备。
存在一些有(yǒu)用(yòng)的标准
但是,如果您想在一般 IoT 用(yòng)例中驱动与 Internet 上的蓝牙设备的交互,那么您需要一个网关,该网关具有(yǒu)某种适配方案(API),以便可(kě)以使用(yòng)基于 TCP/IP 的协议和然后由网关转换為(wèi)适当的蓝牙请求并发送到连接的蓝牙设备。
要在 IoT 环境中使用(yòng)蓝牙,您通常需要可(kě)以在某些通过 TCP/IP 运行的应用(yòng)程序协议和蓝牙协议之间进行转换的东西。这通常称為(wèi)蓝牙互联网网关(图 2)(BIG),属于中间件。
图 2:蓝牙和物(wù)联网解决方案架构
蓝牙互联网网关要求
现在,我们有(yǒu)旧的蓝牙 BR/EDR 和新(xīn)的蓝牙 LE 可(kě)供选择(图 3)。蓝牙 LE 可(kě)以以多(duō)种方式使用(yòng),包括面向连接的通信和无连接,还可(kě)以用(yòng)于创建蓝牙设备的大型网状网络。因此,首先要考虑需要支持什么类型的蓝牙技术。
图 3:蓝牙互联网网关要求
对于这个项目,使用(yòng)了蓝牙 LE,因為(wèi)对蓝牙网状网络的支持不是优先事项,也无意支持旧的蓝牙 BR/EDR。
蓝牙 LE 设备可(kě)以以多(duō)种方式工作。无连接通信涉及称為(wèi)广告的过程,其中小(xiǎo)数据包被范围内的设备广播和接收(扫描)。该机制用(yòng)于促进设备发现。
通常,智能(néng)手机等扫描设备会在用(yòng)户的帮助下找到并选择设备,然后建立连接。此后,通过连接进行通信。这需要网关代表某种 TCP/IP 客户端来完成。
做广告的可(kě)连接设备称為(wèi)外围设备。而那些扫描和请求连接的设备称為(wèi)中央设备。
因此,决定支持可(kě)连接的 LE 设备作為(wèi)外围设备,蓝牙互联网网关作為(wèi)中央设备进行扫描和连接。
图 4:蓝牙互联网网关要求
蓝牙互联网网关架构
适配器组件处理(lǐ)以 TCP/IP 协议编码的请求。蓝牙 LE API 有(yǒu)助于驱动蓝牙堆栈实现的请求蓝牙程序。
决定在 Raspberry Pi 上使用(yòng) Linux 作為(wèi)具有(yǒu)网关所需的 TCP/IP 和蓝牙支持的平台。还决定将 HTTP 和 WebSockets 用(yòng)于 TCP/IP 协议,HTTP 请求和响应用(yòng)于所有(yǒu)操作,但蓝牙特征通知流的传递(通过 WebSocket 传递)除外。
图 5:网关逻辑架构
对于 HTTP 支持,选择了 Apache Web 服務(wù)器,因為(wèi)它具有(yǒu)广泛的模块集合,并且开源 websocketd 用(yòng)于 Web 套接字支持。一个网络摄像头也被插入网关以观察遠(yuǎn)程操作。
适配器代码是用(yòng) Python 编写的。為(wèi)了将 Python 脚本与 HTTP 中的 Web 服務(wù)器集成,使用(yòng)了通用(yòng)网关接口 (CGI)。
BlueZ 是您将在 Linux 上找到的蓝牙堆栈的名称。它提供了一个与语言无关的 API,它使用(yòng) Linux d-bus 服務(wù),允许进行进程间通信。
图 6:网关物(wù)理(lǐ)架构
蓝牙互联网网关实现
获取
不使用(yòng)用(yòng)于传递关联参数的 HTTP 查询字符串更改遠(yuǎn)程对象状态的请求。
HTTP PUT
使用(yòng) HTTP 请求正文(wén)中的 JSON 对象更改遠(yuǎn)程对象状态的请求,用(yòng)于编码和传输相关参数。
回应。HTTP 状态和 JSON 对象。
这是一个涉及设备发现的示例(图 7):
上面显示了由名為(wèi) do_discover_devices.py 的适配器脚本生成的响应。它是使用(yòng) HTTP GET 调用(yòng)的,并且将扫描时间参数传递到查询字符串中。这表示网关应该花(huā)费多(duō)長(cháng)时间执行蓝牙扫描(以毫秒(miǎo)為(wèi)单位)。响应是一个对象数组,表示以 JSON 格式发现的设备。
图 7:设备发现
在此示例中,使用(yòng) HTTP PUT(图 8)写入蓝牙特性。在这里,蓝牙设备地址被分(fēn)配為(wèi)第一个参数,用(yòng)于标识要与之交互的设备。
handle 参数是蓝牙特性的特定实例的唯一标识符,属于特定的蓝牙服務(wù)。
图 8:写入蓝牙特性
图 9:适配器代码
图 10:API 代码
蓝牙互联网网关安全
允许通过 Internet 访问您的设备的任何内容都必须是安全的。对初始网关设计和实施的安全性(图 11)的审查发现了许多(duō)安全问题。
图 11:安全分(fēn)析
例如,没有(yǒu)身份验证机制,因此无法控制谁可(kě)以或不可(kě)以访问网关。
此阶段的网关使用(yòng)了三个不同的 TCP/IP 端口:用(yòng)于 HTTP 的端口 80、用(yòng)于网络摄像头流服務(wù)的端口 8081 和用(yòng)于 websocketd 的 8082。直接暴露在 Internet 上的端口越多(duō),安全风险就越大。
TCP/IP 上的数据在此阶段也未加密,蓝牙上的数据也不一定加密。
图 12:保护网关的步骤
人们还认為(wèi)有(yǒu)一些方法可(kě)以仅授予对特定蓝牙设备的访问权限,而不是授予对碰巧在网关范围内的所有(yǒu)设备的访问权限。此外,能(néng)够仅授予对特定设备功能(néng)的访问权限,而不是设备可(kě)以通过蓝牙执行的所有(yǒu)操作,这将是有(yǒu)利的。
反向代理(lǐ)
网关上运行着三个服務(wù),每个服務(wù)侦听不同的端口。但是安装的 IP 防火墙被配置為(wèi)只允许端口 443 访问。Apache Web 服務(wù)器被设置為(wèi)充当反向代理(lǐ),并将端口 443 数据包转发到由 URL 模式定向的另一个端口(图 13)。这限制了暴露给 Internet 的端口数量。
图 13:反向代理(lǐ)
此外,為(wèi)该项目发明了蓝牙防火墙的概念。这允许控制可(kě)以通过网关与哪些蓝牙设备交互以及可(kě)以访问哪些服務(wù)、特性和描述符。蓝牙防火墙的配置文(wén)件如图 14 所示。
图 14:蓝牙防火墙配置
蓝牙互联网网关可(kě)扩展性
虽然蓝牙规范没有(yǒu)规定中央设备可(kě)以与外围设备建立的并发连接数量的限制,但在实践中总是有(yǒu)一个限制,而且可(kě)能(néng)很(hěn)低。
因此,如果您想支持同时连接到蓝牙互联网网关并受其控制的大量设备,这里有(yǒu)一些选项。
添加多(duō)个适配器。您可(kě)以向网关添加多(duō)个蓝牙适配器(图 16)。一些适配器以 USB 加密狗的形式出现,因此在物(wù)理(lǐ)上很(hěn)容易实现;需要对您的代码进行一些调整,但这并不难。
水平缩放。这是本项目中采用(yòng)的方法。网关服務(wù)的多(duō)个实例(图 17)在多(duō)个 Raspberry Pi 设备上运行,请求由软件负载平衡器分(fēn)布在它们之间。所有(yǒu)客户端请求都发送到运行负载均衡器的节点。
图 15:可(kě)扩展性
图 16:使用(yòng)适配器进行能(néng)力建设
图 17:通过添加网关节点进行能(néng)力建设
使用(yòng)水平扩展,理(lǐ)论上可(kě)以将大量 Raspberry Pi 节点添加到网关集群中,并实现非常高并发的蓝牙设备支持。
这里唯一需要注意的问题是有(yǒu)一个负载平衡器概念,称為(wèi)粘性。一旦建立了从网关节点之一到特定蓝牙设备的蓝牙连接,来自与该蓝牙设备相关的客户端的所有(yǒu)后续请求都必须由同一网关节点处理(lǐ),因為(wèi)它持有(yǒu)蓝牙连接。
图 18:作者制作的机架式树莓派零瓦多(duō)节点解决方案
HAProxy 负载均衡器对粘性有(yǒu)很(hěn)好的支持,允许用(yòng)户配置行為(wèi)。