Discoverable
Discoverable 是一个 Swift 包,它允许 iOS 设备自动发现并连接到网络上的任何兼容设备,无需 IP 地址。
在底层,Discoverable 使用 Foundation 的 Bonjour 框架在网络中查找所广告的服务,并使用网络框架通过使用您自定义的网络协议消息通过 UDP 通信。
连接是一个三阶段的过程
- 使用 Bonjour/Zeroconf,找到网络上广告的服务。
- 一旦发现服务,解析广告机器的 IP 地址并打开 UDP+ 连接。
- 一旦握手完成,连接将保持打开,直到任一方关闭,或者连接强度(见下文)低于 5%。
UDP+
该框架使用 UDP 数据包在双方之间发送消息,但是,DiscoverableProtocol 在此之上建立了一些 TCP 功能
- 要开始连接,需要双方之间的握手,以确保双方都能接收新的连接
- 客户端的所有消息都需要服务器在给定时间内回复确认消息
- 连接强度是一个百分比值,从服务器确认的包数量计算得出。通过获取最近
n
个响应的平均值来获取最新的强度值 - 如果任一方结束连接或关闭连接的原因,它们会发送最后一个临死消息来关闭连接。这意味着不会有任何客户端留下未连接的连接。
DiscoveryProtocol
此Swift协议包含操作网络所需的基本命令
enum DiscoverableProtocol: String {
/// Disconnect & shut down server
case disconnect = "dscv_disconnect"
/// Send greeting to server, with device name appended in the format: ":device_name"
case discover = "dscv_discover"
/// Handshake response received from server
case handshake = "dscv_shake"
/// Acknowledgment message
case acknowledge = "dscv_ack"
}
可以通过扩展DetectableProtocol添加其他消息,或者将任何字符串值传递给send()
。
示例
要运行示例项目,请克隆仓库,然后首先从Example目录执行pod install
。
详细说明请参阅此处
要求
此框架使用Apple的网络框架,该框架在iOS 12+上可用。
安装
Discoverable可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'Discoverable'
API
ConnectionService类可以用两种方式使用
- 单例
shared
实例 - 创建一个新的
ConnectionService
实例
发现
discover(type: String, on: UInt16?)
在给定类型的本地网络上开始查找Bonjour服务。如果没有发现服务,该函数将在5秒后超时。此函数将自动查找服务,解析已发现设备的IP地址,然后使用下面的connect
函数调用,传入发现的IP地址和给定的端口,如果没有提供端口,则使用1024。
连接
connect(to host: String, on port: UInt16)
如果您已经知道要连接的设备的IP地址,可以跳过自动发现,并使用此函数直接连接 - 这是discover
函数在内部使用的相同函数。
在连接开始时,将调用一个函数来在传入连接上打开监听器,并将状态设置为connecting
。该函数将监听来自服务器的握手响应 - 一旦收到响应,则更新连接状态为connected
。
send()
向另一台设备发送一个字符串值,如果已连接。这是计算连接强度的地方 - 对于每个发送的消息,应在2秒内发送确认回复。如果强度低于5%,则认为连接已关闭,并将状态设置为disconected
。
close(_ killServer = true, state = .disconnected)
关闭连接。默认情况下,这将向服务器发送一个断开连接的消息来关闭它。如果需要,还可以设置最终的连接状态,但是很可能不需要更改此设置。
委托
如果您想订阅连接状态和强度的更新,请将ConnectionService的delegate属性设置为一个继承自ConnectionServiceDelegate
的对象。此委托对象必须实现以下函数以接收更新
connectionState(state: ConnectionService.State)
- 连接的当前状态connectionStrength(strength: Float)
- 连接的当前强度,以百分比形式
作者
benmechen, [email protected]
许可协议
Discoverable可在MIT许可协议下使用。有关更多信息,请参阅LICENSE文件。