SwiftSnmpKit

一个 Swift 包,用于向网络设备发出 SNMP(简单网络管理协议)请求。

特性

SwiftSnmpKit 支持以下 SNMP 版本

  1. SNMPv2c(基于 community 的认证)
  2. SNMPv3 无认证无隐私
  3. SNMPv3 认证无隐私
  4. SNMPv3 认证和隐私

仅支持通过 UDP 端口 161 发送 SNMP 查询。不支持通过 UDP 端口 162 发送 SNMP traps 或 informs。不支持 TCP 传输。

支持以下 SNMP 查询类型

  1. SNMP Get
  2. SNMP GetNext

支持以下 SNMP 回复类型

  1. SNMP Response
  2. SNMP Report

SnmpSender 单例将报告 SNMP EngineIDs、Engine Boots 和 Engine Times,并用于未来的查询。

概述

  1. 使用 Swift Package Manager 导入 SwiftSnmpKit
  2. 在你的 "Link Binary with Libraries" 中包含 SwiftSnmpKit
  3. 在你的源文件顶部添加 import SwiftSnmpKit
  4. 使用 guard let snmpSender = SnmpSender.shared else... 初始化 SnmpSender 单例
  5. 在 async 函数中,使用 await snmpSender.send() 发送并等待 SNMP 请求
  6. 切换结果以获取 SNMP 变量绑定(成功)或错误(失败)。

Swift Package Manager

你可以使用 Swift Package Manager 并在 Package.swift 中指定依赖项,通过添加以下内容

.package(url: "https://github.com/darrellroot/SwiftSnmpKit.git", .upToNextMajor(from: "0.1.6"))

初始化 SNMP Sender 单例

guard let snmpSender = SnmpSender.shared else {
    fatalError("Snmp Sender not inialized")
}

发送 SNMP 请求并等待回复(SNMPv2c 示例)

let result = await snmpSender.send(host: agent,
    command: .getRequest, community: community,
    oid: "1.3.6.1.2.1.1.1.0")

发送 SNMP 请求并等待回复(SNMPv3 示例)

let getNextResult = await snmpSender.send(host: agent,
    userName: "ciscoprivuser", pduType: .getNextRequest,
    oid: "1.3.6.1.2", authenticationType: .sha1,
    authPassword: "authpassword",
    privPassword: "privpassword")

authPassword 和 privPassword 参数是可选的。

SNMPv2c 请求只会尝试一次。如果发生数据包丢失,你的代码需要重新传输。

SNMPv3 请求最多会尝试三次。 这允许 SNMP 报告填充 EngineID、EngineBoots 和 EngineTime 字段。

切换结果

switch getNextResult {
case .failure(let error):
    consecutiveNextFailures += 1
    print("SNMP Error: \(error.localizedDescription)")
case .success(let variableBinding):
    print(variableBinding)
    if variableBinding.value == AsnValue.endOfMibView {
        done = true
    }
    if variableBinding.value == AsnValue.noSuchObject {
        consecutiveNextFailures += 1
    } else {
        consecutiveNextFailures = 0
    }
    nextOid = variableBinding.oid
}

示例项目

包含命令行 SNMP 工具的示例项目位于 https://github.com/darrellroot/SwiftSnmpTools