⚡️一个用于与 API 模式下的 XBee (ZigBee Series 2) 无线电通信的 Swift 库。
这是一个基于 SwiftyGPIO 的库,用于在 API 模式下与 XBee 无线电通信,仅支持 Series 2。
这是一个 正在进行中的工作。 我开始为我目前正在进行的项目编写该库,因此,到目前为止,它仅支持 ATCommand、ATCommandResponse、Tx、Rx 和 Transmit Status API 帧。 如果您想为这项崇高的事业做出贡献,请提交 PR,我将非常乐意审查并合并它 😄。
有关 RF 模块的更多信息,您可以查阅其数据表。
XBee 支持两种操作模式:API 和 AT。 API 模式要求设备通过结构化的接口进行通信(即,数据以帧的形式按定义的顺序进行通信)。 API 指定设备如何使用串行端口数据帧发送和接收命令、命令响应和模块状态消息。 另一方面,在 AT(透明)模式下,XBee 无线电只是将串行数据中继到接收 XBee,如 DH+DL 地址所标识。
根据文档
XBee 固件支持两种 API 操作模式:不带转义字符和带转义字符。 使用 AP 命令来启用任一模式。 要将设备配置为这些模式之一,请设置以下 AP 参数值
- AP = 1:API 操作。
- AP = 2:API 操作(带转义字符 - 仅适用于 UART)。
这是将设备手动连接(无 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: .S9600
、bitsPerChar: .Eight
、stopBits: .One
和 parity: .None)
进行串行连接。
可以通过 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 帧的详细信息,您可以尝试阅读 这本书。