LWIP-工业以太网交换机 SNMP功能与SStool功能完成笔记

来源:互联网 发布:牙签弩淘宝多少钱 编辑:程序博客网 时间:2024/04/30 02:19

8月份任务安排:
1、熟悉带串口工业以太网交换机lwiP协议栈及SNMP部分源码,为带串口工业以太网交换机增加SNMP功能、SStool搜索设备IP功能及组播侦听协议移植
2、熟悉98dx3135 sdk,熟悉linux开发及网络编程,为28口工业以太网交换机SNMP功能开发及后续协议开发做准备

2015.8.3
lwIP协议栈的学习笔记:
1.1 light weigh IP,其实就是IP协议的简化协议,为了方便在小型嵌入式系统中的运行。往往只需要十几K RAM和40几K的ROM,大大减少了硬件需求。
1.2 提供三种模式:RAW API;lwIP API;BSD API 三种模式下有各自的特点,主要是关于线程和进程的处理。
1.3 移植过程中要注意的一些问题:移植到uc/OS系统中,只有task的概念,没有线程概念,所以要自己分配优先级;需要通过struct sys_timeouts * sys_arch_timeouts (void) 函数来返回正处于运行状态的线程的timeout时间队列指针;消息队列功能需要通过相应的函数来是实现。

2015.8.4
协议代码的详细解读:
2.1 通过一个叫做netif的网络结构体来描述一个硬件网络接口的,LWIP会把所有网卡芯片的结构体链成一个链表进行管理,有一个netif_list的全局变量指向该链表的头部。
2.2 太网网卡所收到的数据包的格式:6字节目的地址,6字节源地址,内容,2字节校验。
2.3 大端模式,某个半字或字数据的高位字节被在内存的低地址端,低位字节排放在内存的高地址端。对于小端模式,则恰好相反。由于我们使用的ARM处理器使用的是小端模式,而接收到的网络字节数据用的是大端模式,所以这里调用函数htons实现大端与小端的转换。
2.4 ARP,全称Address Resolution Protocol,译作地址解析协议,是位于TCP/IP协议栈底层的协议。

2.5 ARP表的查询http://blog.sina.com.cn/s/blog_62a85b950101anvd.html

2015.8.4
对工作任务的理解,给工业以太网交换机增加IP地址统计与查询功能。对目的IP可以实现手动修改,但是目前的难题是不知道TCP协议是如何实现编译与调试的。
关于SNMP协议栈的理解和应用:http://www.360doc.com/content/14/0525/08/13084517_380649582.shtml
3.1 包含的两大部分:OID对象标识符,一个OID对应唯一一个键值对,客户可以通过键值对来查询设别的相关信息。MIB管理信息基础,是将OID翻译成人们可读的一个映射。SNMP被广泛应用在NMS管理系统中。网友的认识:http://www.bbfish.net/sw/sw_8358.html
Snmp的报文格式http://www.bbfish.net/sw/sw_8357.html
3.2 snmp陷阱,查询管理设备信息。Net-snmp提供了所有构建自己网管系统的工具。Net-snmp的安装,安装包位于E:\program\开源源代码\net-snmp-5.7.3
3.3 mib2c的介绍以及使用http://blog.sina.com.cn/s/blog_4f9fc08e01000c90.html

2015.8.5
4.1 关于websever一些工程项目和代码的了解。在E:\veth3000_lwip_test\webserver\webserver_src文件夹下有web-main.c文件,包含了许多网页界面调用的函数。目前要做的具体事务是读懂函数调用机制,熟悉SNMP中相关函数调用的具体功能,并在.c文件中添加函数代码,实现SNMP协议栈的部分功能的应用。
对开发流程的熟悉:

2015.8.6
5.1 成功安装了keil软件和secureCRT软件。keil编译生成了.vImage文件通过网页端升级烧入设备。交换机在跑动起来后会产生一些打印信息,通过secureCRT显示出来。这应该是基本的编译和调试流程。
D:\ProgramFiles\KEIL\ARM\ARMCC\bin\fromelf.exe –bin –output C:\Users\Administrator\Desktop\bin\VETH3000.vImage .\HEX\STM32F429_web.axf
5.2 F:\vorx project\stm32f429_web下有全部的工程文件。找出main中的主要函数进行学习,熟悉程序流程。

2015.8.7
6.1 安装AdventNet.Agent.Toolkit+注册机,然而并没有成功,总是闪退,放弃了!
6.2 学习交换机的基本原理,为熟悉程序代码铺垫。“>http://baike.baidu.com/link?url=5zNqaZlB3TgS8jyx_NS3K3q6sp-0nb0svtUU8dqDa12VqKfmeSb-jDlJjvoBsV6Wgdj85R0cbJwHUj6ANsFk-
第四层交换机是基于传输层数据包的交换过程的,是一类基于TCP/IP协议应用层的用户应用交换需求的新型局域网交换机

6.3 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。
6.4 #if和#endif 的作用:预编译的功能,如果满足if的条件就编译下一句,否者不编译。
6.5 keil中的快捷操作 CTRL+F2 SHIFT+F2。

2015.8.10
7.1 LWIP协议栈程序中关于功能的跳转实现:首先是各个端口以及初始配置的初始化,然后是对端口接收信息的解析IP or ,然后就是各功能调用的函数大部分位于veth开头的.c文件中,web服务器的session功能的实现位于session.c中(session主要包括两部分内容:key和value),SerialUtility.c 提供了操作串口服务器相关的对外接口函数,lwip.c中的msg_out.c包含了送出去的snmp消息。
7.2 老五讲的LWIP:http://wenku.baidu.com/link?url=khJA7ckOgUouRUMik3Hlgvqi2tQcgFI3mFG-mAgtV5jzbP6D84Rmj2cVKh-jYF_Kt2KHxa9Lh6NTDf2z_xw9C3SBGEFjHHBs9pWdaOJCFYW
什么函数能够返回当前进程个超时事件链表的首地址?
7.2.1 LWIP中常用到的内存分配策略有两种,一种是内存堆分配,一种是内存池分配。
7.2.2LWIP的数据包缓冲的实现。数据包的管理机制 pbuf;
7.2.3网络接口结构。netif的网络结构体来描述硬件网络接口。 low_level_init 函数就是与我们使用的硬件密切相关的函数;
7.2.4以太网数据的收发。 netif->flags |= NETIF_FLAG_UP 至此能接受以太网数据;
(典型的LWIP应用系统包括这样的三个进程:首先是上层应用程序进程,然后是LWIP协议栈进程,最后是底层硬件数据包接收进程)
7.2.5网口接收数据的传递。LWIP使用了一个eth_hdr的数据结构来描述以太网数据包包头的14个字节(目标MAC地址 源MAC地址 类型)
在计算机体系结构和计算机通信领域中,对于半字、字等的存储机制有可能不同。
7.2.6调用tcpip_input函数往上层递交数据包。
7.2.7当上层有数据包要发送时,直接调用netif->linkoutput发送数据包就可以了。netif->linkoutput在结构enc28j60初始化时已经被设置为指 向low_level_output函数,该函数和底层硬件驱动密切相关,用于实现发送一个数据包的功能。
7.2.8 APR表 (地址解析协议)LWIP内核通过数组的方式来创建ARP缓存表,如下,static struct etharp_entry arp_table[ARP_TABLE_SIZE];
7.2.9 IP层主要讨论信息包的接收、分片数据包重装、信息包的发送和转发三个内容。ip_input函数通过数据包的3位标志和13位片偏移字段判断发给自己的该IP包是不是分片包,根据IP数据包头内部的协议字段判断该数据包应该被递交给哪个上层协议。

2015.8.11
8.1 项目程序中snmp一些具体功能的实现。
Internet 组管理协议称为IGMP协议
socket API
8.2 抓包经验:以太网帧头:目的mac+源mac+报文类型。对应ip包而言,报文类型是0800,所以0800是以太网帧头的结尾部分IP报文头:大部分都是以4500开头的,4表示ipv4版本,5表示IP头长度是5个LW(20bytes),00是用来表示报文优先级的。可以通过找4500来确定ip头的起始位置http协议报文的每一行要以回车和换行结束,回车和换行缓存ASCII码就是0d0a,所以可以通过0d0a来判断这是一行http内容的结尾。
8.3 snmp的工作流程

2015.8.12
9.1 安装的snmp服务测试软件 snmputilg 以及 sugermnstool ,通过测试软件以及打印信息能发现在客户端已经收到了snmp的要求以及做出了相应的反应,但是在服务器端没有得到相应的数据,有问题。解决方法:1.首先找到发出的信息中是否包含了设备基础消息的源码,snmp的消息流。2.请教组长后找到了新的检测方式,发现能够收到对应的消息,但是为什么不能在端口界面显示还没有明白,大概是应为调用信息不完整引起的。
9.2 通过sugerMNStool的MIB browser的调试,发现在终端能够获取交换机的一些基础信息如名称、mac地址、IP号、端口状态等等信息。下一步工作是通过打印信息的调试找到这些信息的调用位置以及调用方法为网页功能的增加做准备。
9.3 抓包的过程中 通过设置 ip.addr == 192.168.1.30 来设置特定的检测地址。

2015.8.13
10.1 void (*get_value_pc)(u8_t rid, struct obj_def *od);这种是什么函数定义?
10.2 extern const struct mib_array_node internet; extern的用法?extern声明可在多个文件中用(包括.h) ,告诉比编译器这个函数已经在别处有过声明。
10.3 const mib_scalar_node udp_scalar定义用法? 对结构体的初始化
10.4 修改了mib.c文件中775行 产品名称设置为VETH3000 Ethernet switch
寻找设备名称传到服务器的函数路径:1 mib2.c第775行,默认定义 2.同文件第651行,通过mib_scalar_node结构体对sys_tem_scalar初始化(mib_scalar_node结构体的定义在snmp_structs.h的第124行) 3.设备信息保存在mib2.c第660行 sys_tem_nodes[]数组中 4.mib2.c第667行sys_tem
5.697行 mib2_nodes[MIB2_GROUPS] 6. 710行mib2中 7.724行mgmt 8.754行internet 9.msg_in.c中71行snmp_init()调用了77行udp_rec调用了686行snmp_rec调用了snmp_msg_event(),调用了类型判断msg_input_list如若是snmp_msg_get_event,得到需要的硬件网络等信息值返回。
外部数据的传递过程(到snmp_init和得到value值后):snmp_init在一系列的init函数中,最开始包含在main.c中在到web_main.c再到lwip_init等等。
得到value之后的过程,打包到udp协议中进行发送。
10.5 关于服务器命令的发送和最后收到回传消息的过程。

2015.8.14
11.1 安装了网管软件,能够识别出部分交换机的统计信息,现在要做的工作找到:端口名称、接收码率、发送码率、平均输入速率、平均输出速率、输入错误百分比、输出错误百分比、输入丢弃百分比、输出丢弃百分比、输入吞吐量、输出吞吐量
11.2 如何通过snmp协议发送和接收端口码率port_speed的信息。port.c第173行
11.3 printf用法 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法

2015.8.17
12.1 关于数据结构类型的使用,基本的结构类型包括数值类型和字符类型,数值类有整型short int long 浮点型float double ;字符类有char
构造类有数组 结构体 共同体 和枚举类;另外还有指针类型与空类型。
int 咔出来的内存大小是4 个byte;long 咔出来的内存大小是4 个byte;float 咔出来的内存大小是4 个byte;double 咔出来的内存大小是8 个byte;
char 咔出来的内存大小是1 个byte
12.2 关于本程序中传递端口号错误的发现与解决:首先用GET端口号,发现返回的是一串16进制数组0x50:6f:72:74:20:31:00:00:06:00:00:00:01:00:00:00 对应的ASC表为:port 1,另外发现对板子进行初始化后第一步操作能得到ifdescr正确的返回值port 1 。
首先还是要调整好心态,要知道面对的是毫无情感与变数的代码,现在遇到的问题一定有解决的办法,请一定要静下心来理清头绪。
ifentry_get_value()—>struct mib_list_rootnode iflist_root
只在初始化的时候调用了snmp_inc_iflist(),然后对ifdescr的调用是从哪儿来的?
在网上找到了mib2.c的开源代码,然后从2300行左右一直往后改的结果:
12.2.2 改变case7,8和case10,11等的结果:case8 变了,以前的值是2现在的值为1
到目前为止,发现需要修改的函数以及参数等,并修改了原函数的部分代码!最后需要解决的问题是:具体调用函数的匹配,以及现在的板子只显示一个端口数据的问题。

2015.8.18
13.1 通过昨天的努力,今天的任务就比较明确了,主要是解决多个端口的问题。关于端口码率等问题是别人的工作,如果我能提前解决端口问题,或许可以独立完成别人要完成的那部分程序。
13.2 上午是看见了一个朋友圈动态,然后瞬间心情出现了起伏。希望自己不要想得太多,多读书多做事。
13.3 对snmp协议栈中OID建立的更加深入的理解,各个端口对应的信息在mib_structs中是如何建立起来的?以及meg_in.c对应的参数传递信息

13.4 define的多行定义,在换行的结尾处添加 \ 号。
13.5 netif结构体的定义在netif.h第136行,在netif.c第206行有个snmp_inc_iflist()初始化值

2015.8.19
14.1 早上组长主动与我交流,更加清楚了调试方法。其实还是对协议栈流程的不熟悉。
14.2 如何在程序中打印一串ID号:%s
14.3 重点研究snmp_msg_get_event();由while开始循环,mib_node—–>obj_def()

2015.8.20
15.1 是不是没有把端口的个数信息传给某个变量导致的/百度了关于mib以及oid的构建
15.2 system组存放的是设备的基本信息、snmp存放的是应用层数据之外,其他组都是网络层和数据链路层信息分组。通过对这些组的实现,可以对设备的网络层、数据链路层及设备基本信息实施监视和管理。
15.3 支持SNMP的网络设备需要实现自己能实现的管理对象。比如,路由器使用EGP协议,则必须实现egp组,且需要实现system、at、ip、icmp等组。不能实现的就不实现。比如,路由器不必实现tcp组。如果设备能实现一个组的语义,则需要实现该组中所有的对象。这是估算中强制要求的。
SNMP或其他方式访问MIB时,访问的是对象的具体实例,而不是OID所描述的管理对象。

15.4 mib2.c的第1081行 void snmp_dec_iflist(void)是解决多端口问题,关键找到将端口数信息传给iflist_root.count的地方
iflist.count 改成10后,打印出来端口数是11,port显示出现问题,oid最后结尾都是.11

2015.8.21
16.1 snmp_varbind_root invb 的count值的有关说明,从输入变量绑定的列表
16.2 一些单个对象作为表中的列,所有的列组成表中的一行(Entry),若干航就组成了一个表(Table)。表中的对象成为”列对象”。列对象的取值按索引标识实例。索引可以为数值型,字符型,IP型。索引可以是单个索引也可以是复合索引。Interface表中的列树是有ifNumber标识,值是系统中的接口数量,也就是表中实例数。【ifIndex从1取到ifNumber】。
ifTable
1.3.6.1.2.1.2.2.1(x)
x.i.ifIndex
x=行标识符,i=列标识符;例如port1 为 1.3.6.1.2.1.2.2.1.2.1
16.3 #define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ 是什么意思?
16.4 void关键字的用途:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果。(void) x {}
16.5 修改了web_main .c中addNetifList()从231到234的,减去了注释 原因:因为有10个端口所以每个端口在初始化的时候必须给他一个netif。 经过调试发现能显示多端口的信息 至此问题似乎解决!出现了一直自动升级的问题,跟程序中某处错误有关,导致开门狗时间无法清零。解决办法:给其中9个端口在if循环中初始化,另外一个在if外初始化。
16.6 如何把SET_INFO.The_type的值赋给value?

2015.8.24
17.1 修改snmp中关于设备信息的一些细节问题,然后学习sstool的协议栈,让该工具能够获连接到本设备。
串口服务器通信协议设计(修改后)doc位于文件夹F:\SSTool
17.2 如果我是组长,我会花比较大的时间告诉组员他的任务是什么,最后实现什么效果,然后让他自己摸索一段时间。大概以星期为周期,最后得到成果后他的工作需要予以肯定。
17.3 hwaddr[] 的最后一位地址加1的问题 netif->hwaddr[5] = board.sets_info.The_MAC[5] + netif->num + 1;
17.4 看了第一遍 完全不明白那个文档说的是啥。
首先是对UDP socket的理解:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
17.5 udp协议的套接字编程的步骤:
服务器端:
1、服务器端通过socket系统调用建立一个应用程序与udp协议间的通信线路;
2、使用bind系统调用指定端口号
至此服务器已经打开,可以使用recvfrom来从客户端接收请求,并且服务器通过recvfrom调用获得客户端的ip与端口号。
客户端:
1、客户端通过socket系统调用建立一个应用程序与udp协议之间的通信线路;
2、通过bind系统调用指定使用的端口号
3、客户端通过sendto调用向服务器发送请求,服务器的地址与端口号作为sendto发送的参数
ASC码表:

2015.8.25
18.1 今天上午明白了sstool完成的大概流程,类似于NTP的请求服务,首先是在web_main.c 的main函数中构建初始化,然后在udp.c文件中构建具体的函数体。包括接收和发送具体的协议帧。
18.2 在SVN中上传了之前完成的SNMP功能的源代码,上传日期为2015.8.25。关于如何具体的写备注信息没有找到具体的方法。
18.3 关键函数 udp_recv netif->linkoutput
18.4 重学LWIP:LWIP使用了一个eth_hdr的数据结构来描述以太网数据包包头的14个字节。

0 0
原创粉丝点击