謝紅剛, 敖 蕾, 李 麗, 劉倩麗
(湖北工業大學電氣與電子工程學院, 湖北 武漢 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以太網所顯示的優勢,使其能夠滿足數據采集和控制對實時性、抗干擾性、可靠性的嚴格要求。
簡單網絡管理協議(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.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 管理站界面圖
隨著網絡技術的飛速發展,網絡管理工作也變得越來越復雜,簡單網絡管理協議便應運而生,它簡化了復雜的網絡管理工作,更方便了對遠程設備的控制。嵌入式操作系統也被廣泛應用,本文提出基于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