SwiftyXBee

⚡️一个用于与 API 模式下的 XBee (ZigBee Series 2) 无线电通信的 Swift 库。

概要

这是一个基于 SwiftyGPIO 的库,用于在 API 模式下与 XBee 无线电通信,支持 Series 2。

这是一个 正在进行中的工作。 我开始为我目前正在进行的项目编写该库,因此,到目前为止,它仅支持 ATCommand、ATCommandResponse、Tx、Rx 和 Transmit Status API 帧。 如果您想为这项崇高的事业做出贡献,请提交 PR,我将非常乐意审查并合并它 😄。

有关 RF 模块的更多信息,您可以查阅其数据表

API 模式

XBee 支持两种操作模式:API 和 AT。 API 模式要求设备通过结构化的接口进行通信(即,数据以帧的形式按定义的顺序进行通信)。 API 指定设备如何使用串行端口数据帧发送和接收命令、命令响应和模块状态消息。 另一方面,在 AT(透明)模式下,XBee 无线电只是将串行数据中继到接收 XBee,如 DH+DL 地址所标识。

根据文档

XBee 固件支持两种 API 操作模式:不带转义字符和带转义字符。 使用 AP 命令来启用任一模式。 要将设备配置为这些模式之一,请设置以下 AP 参数值

⚠️此库设计为仅在 API 模式下工作,它需要AP 模式设置为 2(转义字节),因为此设置提供了最佳的可靠性。

硬件细节

这是将设备手动连接(无 XBee 扩展板)到任何兼容板的引脚分配

XBee 引脚 开发板 UART
VCC = 1 VCC 3.3V
DOUT = 2 RX / 接收
DIN / CONFIG = 3 TX / 发送
GND = 10 GND

在您可以使用 RaspberryPi 上的 UART 引脚(引脚 14 TXD,引脚 15 RXD)之前,需要通过 raspi-config 启用它们(需要重新启动)。 通过启用 UART 引脚,您将失去通过串行端口访问登录 shell 的能力。

支持的开发板

SwiftyGPIO 支持的每个开发板:RaspberryPis、BeagleBones、C.H.I.P. 等...

要使用此库,您需要一个运行 Swift 5.x 🚗 的 Linux ARM 开发板。

下面的示例将使用 Raspberry Pi 3B+ 开发板,但您可以轻松地修改这些示例以使用其他支持的开发板之一。 完整的 RaspberryPi3B+ 工作演示项目可在 Examples 目录下找到。

安装

首先,请确保您的开发板运行的是 Swift 5.x⚠️!

由于 Swift 5.x 支持 Swift Package Manager,您只需将 SwiftXBee 添加为项目 Package.swift 文件中的依赖项即可

let package = Package(
    name: "MyProject",
    dependencies: [
        .package(url: "https://github.com/samco182/SwiftyXBee", from: "1.0.0"),
    ]
    targets: [
        .target(
            name: "MyProject", 
            dependencies: ["SwiftyXBee"]),
    ]
)

然后运行 swift package update 以安装依赖项。

用法

初始化

第一件事是用与您用于在 XCTU 工具上或通过 AT 命令模式设置 XBee 设备的 UART 配置相同的配置来初始化 SwiftyXBee 的实例。 初始化 xbee 对象后,您可以在 XBee 之间发送和接收数据包

import SwiftyXBee

let serial = SerialConnection(speed: .S9600, bitsPerChar: .Eight, stopBits: .One, parity: .None)
let xbee = SwiftyXBee(for: .RaspberryPi3, serialConnection: serial)

您还可以使用以下方法初始化 XBee 对象

import SwiftyXBee

let xbee = SwiftyXBee()

此初始化程序默认选择 .RaspberryPi3 作为选定的开发板,并默认使用 speed: .S9600bitsPerChar: .EightstopBits: .Oneparity: .None) 进行串行连接。

AT 命令数据包

可以通过 API 帧发送 AT 类型命令来配置您的本地无线电。 它们可以查询本地无线电上的设置或设置参数。 这些都是您在透明/命令模式下键入的相同命令。

在此示例中,本地无线电的节点标识符参数已被设置和读取。

设置 AT 命令参数

// The new Node Identifier
let nodeIdentifier = "XBee Test"

xbee.sendATCommand(.addressing(.ni(.write(nodeIdentifier))), frameId: .sendNoACK)

读取 AT 命令参数

xbee.sendATCommand(.addressing(.ni(.read)))

do {
    let atCommandResponse = try xbee.readATCommandResponse()
    print("AT Command Response received: \(atCommandResponse.frameData.commandData) = \(atCommandResponse.frameData.commandData.string)")
} catch let error {
    print("Error receiving packet: \(error)")
}

传输数据包

有几种不同类型的可用传输 (TX) 数据包。 但如上所述,到目前为止,该库仅允许发送 Transmit Request 数据包。 所有 TX 数据包的列表可以在 API 文档中找到。 所有以“Request”结尾的类都是 TX 数据包。

// The destination XBee 64-bit serial number
let deviceAddress = DeviceAddress(address: 0x0013A20012345678)

// The destination XBee 16-bit network address
let networkAddress = NetworkAddress(address: 0xFFFE)

// The actual message to be sent
let message = "This is my message to send!"

xbee.sendTransmitRequest(to: deviceAddress, network: networkAddress, message: message)

当 Transmit Request 完成时,如果在请求的帧 ID 上配置了,接收器设备将从串行接口发送 Transmit Status 数据包。 此消息指示 Transmit Request 是否成功或失败。 如果您想确保您的数据包已正确传送,请调用以下代码

do {
    let transmitStatus = try xbee.readTransmitStatus()
    print("Status received: \(readingPacket.frameData.deliveryStatus)")
} catch let error {
    print("Error: \(error)")
}

接收数据包

与传输 (TX) 数据包一样,也有几种不同类型的可用接收 (RX) 数据包。 但到目前为止,该库仅允许读取 Receive Packet API 帧。

do {
    let readingPacket = try xbee.readRFDataPacket()
    print("Packet received: \(readingPacket.frameData.receivedData)")
} catch let error {
    print("Error: \(error)")
}

注意 🔎

如果您想更好地了解 ZigBee 通信协议的工作原理,或者更全面地了解 XBee 所包含的最常见的 API 帧的详细信息,您可以尝试阅读 这本书