基于uc/os-II嵌入式实时操作系统的SNMP
2015-05-11谢红刚刘倩丽
谢红刚, 敖 蕾, 李 丽, 刘倩丽
(湖北工业大学电气与电子工程学院, 湖北 武汉 430068)
基于uc/os-II嵌入式实时操作系统的SNMP
谢红刚, 敖 蕾, 李 丽, 刘倩丽
(湖北工业大学电气与电子工程学院, 湖北 武汉 430068)
在嵌入式操作系统上开发高质量的SNMP已经成为网络通信的发展趋势,由于uc/os-II操作系统的简单实用,研究基于uc/os-II嵌入式实时操作系统下SNMP的管理系统,并结合实际设计项目对管理系统的实现原理和实现过程进行了分析。
SNMP; 嵌入式; uc/os-II操作系统
由于Linux操作系统的功能强大,稳定可靠以及有强大的网络功能等特点,深受人们欢迎,基于Linux的嵌入式SNMP的研究也层出不穷[1-3]。由于Linux操作系统代码量多,占用内存空间大的特点,在小型设备上使用不合适,于是针对一些小型设备网络管理,提出了基于uc/os-II嵌入式实时操作系统的SNMP。本文提出的基于uc/os-II嵌入式实时操作系统下的SNMP基于TCP/IP协议工作,而TCP/IP以太网所显示的优势,使其能够满足数据采集和控制对实时性、抗干扰性、可靠性的严格要求。
1 SNMP协议和uc/os-II的简介
简单网络管理协议(SNMP)是由Internet体系结构委员会(IAB)提出来的,以简单、易用获得了很多公司的支持,得到了广泛的应用,而且还应用到了无线网络,成为了事实上的工业标准。
SNMP协议又称之为代理和管理者之间的通信协议,两者之间的共同点是都运行TCP/IP协议。管理者可对管理设备提出效能、配置和状态等信息的询问,透过要求与回复(request/replay)的简单机制来撷取代理者身上的信息,而两者之间的信息主要是通过PDU协议数据单元来传送[4]。
uc/os-II是一种简单的操作系统[5],具有简单易学、注释清晰、范例丰富、可移植性高的特点。它最主要的优点是系统内核实用性强、可靠性高,从最老版本的ucos,以及后来的uc/os,到最新版本的uc/os—II,该实时内核已经经历了近10年的历程。而且其内核是完全免费的,用户不需要支付任何费用,有利于降低系统的开发成本。
uc/os是一个非常小巧的实时操作系统;整个代码分为内核层以及移植层,这样使得它的移植很方便;采用抢占式调度策略,保证任务的实时性;能够管理多达56个任务;提供了邮箱、消息队列、信号量、内存管理、时间管理等系统服务。
2 基于uc/os-II嵌入式实时操作系统的SNMP的实现
2.1 uc/os-II的移植
在嵌入式操作系统上实现SNMP,首先就要进行移植。uc/os-II的主要代码都是由标准的C语言写成的,所以移植方便。本项目是基于IAREWRAM开发环境下的移植,由于uc/os-II是源码公开的操作系统,且其结构化设计便于分离出与处理器相关的部分。uc/os-II在设计时就充分考虑了在不同处理器上的移植问题。uc/os-II是用C语言和汇编语言来编写的,其中大部分代码都是用C语言编写的,只有极少部分与处理器密切相关的代码是用汇编语言编写的,所以对于移植,只需要修改3个文件:OS_CPU.H 、OS__CPU_C.C和OS_CPU_A.ASM[6],就能把它移植到需要的嵌入式处理器上。uc/os-II的体系结构见图1。
图1 uC/OS-II体系结构
2.2 SNMP的实现结构
管理站负责网管命令发出、数据存储及数据分析;代理端实现设备与管理站的SNMP通信。管理站与代理端通过MIB进行接口统一,管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,应答给管理站完成一次管理操作[7]。
SNMP提供管理站和代理端,SNMP的网络管理体系结构见图2。
图2 SNMP网络管理体系结构
2.3 嵌入式SNMP代理的实现
2.3.1 ucos-II TCP/IP协议栈 SOCKET接口函数是TCP/IP的API,SOCKET API函数编写UDP或者TCP通信的任务,SOCKET建立函数、绑定函数,UDP(TCP)包接收函数、发送函数,SOCKET关闭函数。在完成UDP任务时,其中socket()创建套接字,当套接字被创建后,它的端口号和IP地址都是空的,因此应用进程要调用bind()函数将本地IP和端口与套接字相连,recvfrom()函数用于完成数据的接收,sendto()函数用于发送数据,closesocket()函数删除套接字。在完成TCP任务时,服务器在调用bind()函数后,还必须调用accept listen()把套接字设置为被动方式,以便随时接受客户的服务请求[8]。
2.3.2 SNMP代理的工作流程 嵌入式代理为设备与远程网管中心之间提供基于用户数据报协议(User Datagram Protocol,UDP)之上的标准SNMP协议接口,主要任务是完成远端命令和消息接收发送(Get/Set)、协议的解析和封装、MIB库解析映射、板机事件上报等功能。嵌入式代理软件模块包括MIB库、初始化、主协议处理和Trap等三大模块。
图3 软件控制流程图
2.3.3 初始化MIB SNMP中atTable是描述地址转换表的表,下面是MIB-II中atEntry结构的部分定义。
atEntry OBJECT-TYPE
SYNTAX AtEntry
ACCESS not-accessible
STATUS deprecated
DESCRIPTION
“Each entry contains one NetworkAddress to ‘physical′ address equivalence.”
INDEX {atIfIndex,
atNetAddress}
::={atTable 1}
2.3.4 实现代理功能的框架程序
1)首先初始化MIB:init_mib
2)创建SNMP任务:task_snmp,创建任务后需要将任务初始化,初始化程序如下:
OSTaskCreate(Task_SNMP, (void *)0, &GstkSNMP[TASK_SNMP_STK_SIZE-1], TASK_SNMP_PRIO);
SNMP任务函数:task_snmp,程序如下:
void Task_SNMP(void *pdata)
{SOCKETs;
…
s=*socket(0, SOCK_DGRAM, UDP_PROTOCOL);
clientaddr.sin_port=161;
iii=bind( (SOCKET * )&s, (struct sockaddr*)&clientaddr,sizeof(clientaddr));
while (1)
{rec_coute=recvfrom(s,snmp_rec_buffer,1460, 0, (struct sockaddr*)&servaddr, &iii);
if(rec_coute>0){
templenth=snmp_rcve(snmp_rec_buffer,rec_coute);
if(templenth!=0){
sendto(s,snmp_send_buffer,templenth,0,(struct sockaddr*)&servaddr,sizeof(servaddr)); }}}};
建立socket通道,接受通道数据,并对数据进行解析。
SOCKET *socket( uint16 af, uint16 type, uint16 protocol)
{
uint8 i,j,k;
static uint16 port=1025;
…
if(protocol==TCP_PROTOCOL)
{…}
else if(protocol==UDP_PROTOCOL)
{ …}}
建立socket通道以后,响应管理端发起的连接,然后绑定端口,检查IP地址。
通过accept()函数建立连接,连接成功后通过recvfrom()完成数据的接收,接收到的数据通过sendto()完成数据的发送,数据成功发送出去后,closesocket()删除套接字,这样通过socket口的数据接收与发送完成。
3)接收数据报文
uint16 recvfrom( SOCKET s, uint8 *buf, uint16 len, int flags, struct sockaddr *from, uint16 *fromlen ) 用于接收管理站发送过来的报文,通过SOCKET端口接收。
4)分析数据报文
首先是SNMP头分析,如果接收到的数据合格,就进行下一步的分析,其次是版本号的分析;共用体的分析,分析共用体的权限;操作类型的分析(包括种类:get,get_next,set)以及长度和数据段的分析。其流程见图4。
5)处理数据报文
数据的处理过程就是数据封装的过程,即将分析后的数据封装在snmp_send_buffer中,其中数据拷贝并填充发送到数据缓冲的程序如下:
uint8 COPY_SEGMENT(tlvStructType * val,uint8 copydata)
{
uint8 seglen;
…
memcpy(&response.buffer[response.index],&snmprequest.buffer[val->start],seglen );
response.index += seglen;
return seglen;}
其中response.buffer=snmp_send_buffer; snmp_send_buffer为全局变量,将封装好的信息传到udp.c,进行下一步分析。
图4 数据报文分析流程图
6)生成应答报文
SNMP作为UDP的数据部分再经过UDP封装后生成新的应答报文,其程序如下:
uint8 Udp_Process(Rec_Ptr * Udp_Rec)
{
static uint8 UDP_REC_BUFF_NUM=0;
uint8i,j;
memcpy (&(UdpRecBuff[UDP_REC_BUFF_NUM]), (*Udp_Rec).RecDataPtr, (*Udp_Rec).length);…}
7)返回分析结果
将封装好的数据报文经过Socket发送给管理端。
该snmp代理代码加载在基于TI终端上,通过SNMP管理软件实现对该终端的网络信息的管理。使用Wireshark1.10.6网络封包分析软件获取的代理端与管理站之间通信的SNMP数据包如图5所示。
图5 管理站界面图
3 结论
随着网络技术的飞速发展,网络管理工作也变得越来越复杂,简单网络管理协议便应运而生,它简化了复杂的网络管理工作,更方便了对远程设备的控制。嵌入式操作系统也被广泛应用,本文提出基于COS-II操作系统的SNMP,通过IAR Embedded Workbench 开发工具编程、调试,实现了SNMP在COS-II操作系统下的网络管理,适用于一些简单的、小型设备的网络管理。
[1] 徐晶晶.基于嵌入式SNMP网管代理系统的设计与实现[D].武汉:武汉理工大学,2008:34-36.
[2] 刘桂源. 基于ARM的LINUX嵌入式SNMP代理的分析与实现[D].南昌:华东交通大学,2010:21-25.
[3] 高翊宇,马林华,南秦博.基于Linux操作下的TCP/IP网络通信研究与应用[J].现代电子技术,2006,(18):74-75.
[4] 李明江.SNMP简单网络管理协议[M].北京:电子工业出版社,2007:5-10.
[6] 任 哲,樊生文.嵌入式操作系统基础uc/os-II和Linux(第二版)[M].北京:北京航空航天大学出版社,2011:222-224.
[7] 车一龙.基于SNMP的无线网管系统MIB设计与实现[D].西安:西安电子科技大学,2012:9-14.
[8] 龚 康.面向生产设备管理的嵌入式SNMP代理研究与实现[D].重庆:重庆大学,2012:7-10.
[责任编校: 张岩芳]
The SNMP Management System based on the Embedded Real-time Operating System uc/os-II
XIE Honggang, AO Lei, LI Li, LIU Qianli
(SchoolofElectrical&ElectronicEngin.,HubeiUniv.ofTech.,Wuhan430068,China)
With the development of network, it has become a trend of network communication to develop high quality SNMP on embedded operating system. Due to the simplicity and practicability of the operating system uc/os-II, based on the embedded real-time operating system uc/os-II, the SNMP management system were studied in this paper. And the implementation principle and implementation process of management system were also analyzed combined with the actual design project.
SNMP; the embedded; operating system uc/os-II
2014-08-21
湖北省自然科学基金(2014CFB585)
谢红刚(1973-), 男, 湖北鄂州人,工学博士,湖北工业大学教授,研究方向为通讯
1003-4684(2015)01-0025-04
TN915.07
A