可发现 0.1.2

Discoverable 0.1.2

Ben Mechen 维护。



  • benmechen

Discoverable

Version License Platform

Discoverable 是一个 Swift 包,它允许 iOS 设备自动发现并连接到网络上的任何兼容设备,无需 IP 地址

在底层,Discoverable 使用 Foundation 的 Bonjour 框架在网络中查找所广告的服务,并使用网络框架通过使用您自定义的网络协议消息通过 UDP 通信。

连接是一个三阶段的过程

  1. 使用 Bonjour/Zeroconf,找到网络上广告的服务。
  2. 一旦发现服务,解析广告机器的 IP 地址并打开 UDP+ 连接。
  3. 一旦握手完成,连接将保持打开,直到任一方关闭,或者连接强度(见下文)低于 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文件。