资料介绍
描述
uSNMP(“micro-SNMP”)是用于开发 SNMPv1 代理和管理器的小型便携式“C”库。Arduino IDE、Windows 和 *nix 的端口包含在源代码中,并已在 Arduino 兼容 (AVR ATmega328p) 和 Arduino Mega 与 Ethernet Shield、NodeMCU v0.9 (Expressif ESP8266)、Windows(使用 Embarcadero BCC32C C++ 编译)上进行了测试编译器)和 Cygwin(使用 gcc)。
uSNMP 有多小?
在带有 Ethernet Shield 的 Arduino ATmega328p 上,一个实现mib-2::system
表格的 uSNMP 代理,三个极简表格,包括 2 个数字输入(状态切换时发送陷阱)、2 个数字输出和 1 个模拟输入,大约 20kB,包括 SPI ,以太网,UDP,DNS例程。它支持Get、GetNext、Set操作,并在数字输入切换时发送Trap 。2kB SRAM 限制了 MIB 条目的数量和网络数据包的大小(从而限制了请求和响应的长度)。通过放弃该mib-2::system
表,可以将更多的数字和模拟 I/O 引脚添加到相应的表中。在 Arduino Mega 或 ESP8266 上,可以支持更大的缓冲区和更多的 I/O 引脚,因为 SRAM 更大。
uSNMP 能做什么?
该库包括按字典顺序存储和遍历 MIB 树的函数;支持回调函数获取和设置 MIB 叶节点的值,发出 SNMPv1 Get、GetNext、Set请求;构建和处理响应;创建和解析一个 varbind 列表,发送一个Trap并处理 Endianness。
为什么使用 SNMP?
SNMP(简单网络管理协议)是 IT 设备中的事实标准,并在工业和建筑环境领域得到很好的支持:网络设备、服务器和存储、UPS、整流器、远程保护或保护信号设备、RTU、远程 I/ O 等等。它的管理信息库 (MIB) 概念,在 ASN.1 符号的文本文件中定义,是它的超能力。MIB 文件的工作方式类似于数据字典或设备描述语言。它们可以轻松地将新设备载入基于 SNMP 的管理软件,其中有许多包括开源软件,具有地理和拓扑地图覆盖、仪表板、图表、事件日志、事件操作过滤器、故障单等功能。
此设置非常适合物联网应用程序或资产管理,其中有许多相同的站点和设备,但点数很少。相比之下,SCADA/HMI 软件适用于具有多点的单站点,例如过程工厂或建筑物,并具有高度可视化的特征,例如 3D 和动画。
那么,为什么是 SNMPv1,而不是 SNMPv2 或 v3?
SNMP 协议,尽管它的名字,实际上并不容易实现,也不适合小型处理器,即使对于 SNMPv1 也是如此。SNMPv1 与 v2/v3 相比,您失去了什么?主要针对批量数据查询和安全特性的操作。但是考虑一下:设备的 MIB 仍然可以通过 SNMPv1 操作完全遍历。大多数(如果不是全部)工业协议,包括 Modbus、BACnet 和 Profinet 等占主导地位的协议,都没有内置或安全功能较弱。这不是轻视安全,而是在情况允许的情况下提倡务实。
uSNMP 如何工作?
uSNMP 库扩展了 M. Tim Jones (Charles River Media, 2002. ISBN 1-58450-247-9) 所著的“嵌入式系统的 TCP/IP 应用层协议”一书的第 8 章中介绍的嵌入式 SNMP 服务器,他非常雄辩地写了
“...... SNMP 消息生成的问题是......转发(未知)TLV 长度......为这个问题选择的解决方案是使用预测解析器解析 SNMP 请求并构建响应......我们通过 SNMP PDU 进行预测性解析,当我们到达最终 TLV 时,我们通过函数调用链返回并根据需要更新 TLV 的长度值。”
如何使用 uSNMP?
代理和命令行实用程序的代码示例可用作开发 SNMPv1 代理、发出 SNMPv1 请求和处理响应以及发送陷阱的模板。用于 Windows 和 *nix的示例 uSNMP 代理程序 usnmpd.c从文件中读取 OID 和值对,并且可以用作 SNMPv1 网关,方法是让轮询程序格式化并将其接收到的数据写入此文件。另一个代理示例usnmpd.ino将 Arduino 板转换为具有数字和模拟 I/O 的支持 SNMP 的控制器。MIB 文件位于mibs目录中。ARDUINO.MIB文件用于Arduino 软件 (IDE) 管理板,私有企业编号 (PEN) 是Armadino 的 38644。
usnmpd.ino - Arduino 的 SNMP 代理
让我们更深入地研究一下usnmpd.ino 。对于 NodeMCU 等第 3 方硬件包,首先需要在 Arduino IDE 中添加其 Boards Manager JSON 文件的 URL。URL 指向 Arduino IDE 用来构建可用已安装板的列表的 JSON 索引文件。这可以通过File...Preferences和 NodeMCU 等 ESP8266 板完成:
usnmpd.ino的前几行设置了网络连接(以太网或 WiFi)、IP 地址和代理配置。
// Agent's IP configuration. Retain these global variable names.
IPAddress hostIpAddr( 192, 168, 1, 177 ),
dnsServer( 192, 168, 1, 1 ),
hostGateway( 192, 168, 1, 1 ),
hostNetmask( 255, 255, 255, 0 );
#ifdef ARDUINO_ETHERNET
unsigned char hostMacAddr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
#else // assume ARDUINO_WIFI
char staSSID[] = "Wifi_SSID";
char staPSK[] = "Wifi_Password";
#endif
// SNMP agent configuration.
#define ENTERPRISE_OID "P.38644.30" // used as sysObjectID and in trap
#define RO_COMMUNITY "public"
#define RW_COMMUNITY "private"
#define TRAP_DST_ADDR "192.168.1.170"
uSNMP 为对象 ID 定义了三个前缀,每个有效的 OID 都需要以这些前缀开头:
B denotes Mgmt-Mib2 - 1.3.6.1.2.1
E denotes Experimental - 1.3.6.1.3
P denotes Private-Enterprises - 1.3.6.1.4.1
因此,sysDescr.0 (1.3.6.1.2.1.1.1.0) 将被编码为“B.1.1.0”,“1.3.6.1.4.1.38644.30”的企业 OID 将被编码为“P.38644.30”
setup() 初始化板和代理“引擎”,包括构建 MIB 树和发送冷启动陷阱。引脚 D2 到 D5 设计为数字输入,D6 到 D8 是数字输出,A0 和 A1 是模拟输入,具体取决于目标微控制器上可用的 SRAM 数量。包含 mib-2::system 表后,带有 ATmega328p 的 Arduino UNO 可以具有 D2、D3、D6、D7 和 A0,而 Arduino Mega 可能会超出 D5、D8 和 A1(如果愿意的话)。否则,省略系统表将释放 UNO 上的空间以容纳更多引脚。
initSnmpAgent(SNMP_PORT, ENTERPRISE_OID, RO_COMMUNITY, RW_COMMUNITY);
initMibTree();
trapBuild(&request, enterpriseOID, hostIpAddr, COLD_START, 0, NULL); // cold start trap
trapSend(&request, trapDstAddr, TRAP_DST_PORT, roCommunity);
MIB 树是用函数构建的miblistadd()
,即按照字典顺序将 MIB 离开节点嫁接到它上面。如果需要,随后设置节点的值,并附加回调函数以响应 SNMP Get 和 Set 操作。在下面的摘录中,sysDescr
分配了一个已经包含系统描述的字符串。在用 BER(基本编码规则)编码后用sysObjectID
初始化。设置了回调以在请求获取操作时填写系统正常运行时间。EnterpriseOID
sysUpTime
get_uptime()
/* System MIB */
// sysDescr Entry
thismib = miblistadd(mibTree, "B.1.1.0", OCTET_STRING, RD_ONLY,
sysDescr, strlen(sysDescr));
// sysObjectID Entry
thismib = miblistadd(mibTree, "B.1.2.0", OBJECT_IDENTIFIER, RD_ONLY,
entOIDBer, 0); // set length to 0 first
i = str2ber(enterpriseOID, entOIDBer);
mibsetvalue(thismib, (void *) entOIDBer, (int) i); // proper length set
// sysUptime Entry
thismib = miblistadd(mibTree, "B.1.3.0", TIMETICKS, RD_ONLY, NULL, 0);
i = 0; mibsetvalue(thismib, &i, 0);
mibsetcallback(thismib, get_uptime, NULL);
数字和模拟 I/O 引脚显示在 SNMP 表中。为了节省内存,这些表是极简的,仅包含索引和引脚值。需要回调函数,以便在响应 Get 或 Set 请求时及时检索值。因此,例如,对于数字输出 D6,
// Digital output #6 index
thismib = miblistadd(mibTree, "P.38644.30.2.1.1.6", INTEGER, RD_ONLY, NULL, 0);
i = 6; mibsetvalue(thismib, &i, 0);
// The value of Digital #6
thismib = miblistadd(mibTree, "P.38644.30.2.1.2.6", INTEGER, RD_WR, NULL, 0);
i = 0; mibsetvalue(thismib, &i, 0);
mibsetcallback(thismib, get_dio, set_dio);
代理被设计为在检测到数字输入中的状态变化时发送陷阱。由于 uSNMP 代理不可重入,因此只能在主循环中构建和发送陷阱。
if ( x & 0x01 ) {
vblistReset(&response); dInIndex[17]='0'+y; // use response buffer to build trap
if ( lastDIN & 0x01 ) { // input pin y was 1
i = 0; // it is thus 0 now
vblistAdd(&response, dInIndex, INTEGER, &i, 0);
trapBuild(&request, enterpriseOID, hostIpAddr, ENTERPRISE_SPECIFIC, 1, &response);
}
else {
i = 1;
vblistAdd(&response, dInIndex, INTEGER, &i, 0);
trapBuild(&request, enterpriseOID, hostIpAddr, ENTERPRISE_SPECIFIC, 2, &response);
}
trapSend(&request, trapDstAddr, TRAP_DST_PORT, rwCommunity);
}
同样,如果代理在处理 SNMP 请求时遇到不匹配的社区字符串,它会发送一个身份验证失败陷阱。
if ( processSNMP() == COMM_STR_MISMATCH ) {
trapBuild(&request, enterpriseOID, hostIpAddr, AUTHENTICATE_FAIL, 0, NULL);
trapSend(&request, trapDstAddr, TRAP_DST_PORT, rwCommunity);
}
试验结果
仅此而已。uSNMP 库具有发出 SNMP 请求和处理响应的功能;并包括用于测试 usnmpd.imo 代理的命令行示例,例如 usnmpget 和 usnmpset。另一种方法是使用 Net-SNMP 二进制文件。两组测试如下所示:
- HPDL1414微型时钟开源分享
- 微型格斗板开源硬件
- 基于FreeRTOS+LwIP的SNMP实现方案V0
- TCD1304微型PCB开源设计
- 微型焊台开源项目
- 微型电流表开源项目
- SNMP常用的一些OID详细例表说明
- net-snmp 技术用资料 7次下载
- PDH网管盘 SNMP控件接口函数 0次下载
- SNMP协议的一些基本知识 0次下载
- SNMP协议详解
- 基于Web 的SNMP 网络管理
- 基于SNMP的网络监控系统
- VxWorks与SNMP代理的开发
- 基于ARM的嵌入式系统及SNMP的设计与实现
- 如何设置Windows的SNMP服务 931次阅读
- 在服务器BMC Web门户无法查看加密的SNMP共同体 722次阅读
- 前沿开源技术领域的开源大数据一一解读 1006次阅读
- 如何使用Python通过SNMP监控网络设备? 1148次阅读
- 影响微型减速电机运转的因素 805次阅读
- 处理微型电机受潮的方法 1279次阅读
- 影响微型电机运行效率的因素 1265次阅读
- 简单网络管理协议(SNMP)的研究与应用 3159次阅读
- nixie微型无人机的功能介绍_nixie微型无人机多少钱 1.3w次阅读
- snmp协议详解 6672次阅读
- snmp及编程实现 8525次阅读
- snmp从入门到开发详解 2.2w次阅读
- snmp使用哪几种操作_snmp怎么使用_snmp的使用教程 1.9w次阅读
- snmp原理与实战详解 1w次阅读
- 基于SNMP的网络监控系统开发平台与架构的设计与实现 6419次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多