HelloXV1.77网络功能简介
HelloXV1.77的网络功能做了较大程度的加强,移植了业界广泛使用的lwIP协议栈,并做了很多优化工作,修正了其中的一些bug。同时,实现了一个network字符界面应用程序,可以对网络功能进行调试。同时实现了一个抽象的以太网管理框架(Ethernet Framework),实现了一套标准的网络驱动程序接口,屏蔽了不同网络驱动程序之间的差异。这样,不同的硬件,其驱动代码是不同的,但是只要遵循这一套标准的接口规范,就可以无缝挂接到HelloX内核中。
下面简要介绍V1.77版的网络调试程序network,在此基础上,简要介绍一下HelloX的网络驱动程序编写方法。
Network程序
在字符shell模式下,输入network并回车,即可进入network应用程序。该程序提供了如下一些网络相关命令:
scan命令
该命令用于扫描所有可用的WiFi热点,前提是需要有WLAN硬件支持。该命令会列出所有扫描到的AP热点,如下:
[network-view]scan
Available WiFi list:
-----------------------------
00:BSSID = 20004E9C, RSSI = 76, SSID = 'HelloX_HGW_AP', channel = 1
01:BSSID = 2000508C, RSSI = 15, SSID = 'Celleden_Map1600', channel = 6
如果发现想要连接的热点不在上述列表中,可多执行几次scan命令,很多情况下,一次scan是无法扫描到所有热点的。
assoc命令
assoc用于跟某个指定的WiFi热点相关联。Scan只是扫描出一些可用的热点,但是如果需要跟某个热点进行连接,则必须使用assoc命令。如下:
[network-view]assoc HelloX_HGW_AP
上述命令用于连接到名字为“HelloX_HGW_AP”的WiFi热点。注意,该WiFi热点必须是开放的不加密热点,因为上述命令没有指定连接密码。
如果是要连接一个加密的WiFi热点,则可以用/k参数指定连接的密码:
[network-view]assoc HelloX_HGW_AP /k0123456789012
后面是密码。当前只支持WEP加密,因此密码必须是13个字节。
再次说明一下,当前值支持开放不加密的WiFi热点,以及基于WEP加密的WiFi热点,尚不支持WPA加密热点,因此要希望连接成功,必须修改WiFi热点的配置,修改为开放不加密,或者使用WEP加密(密码要设置为13位数字)。
showint命令
该命令用于显示出系统中所有网络接口的统计信息,比如接收报文个数,发送报文个数等。下列是一个简单的输出例子:
[network_view]showint
Statistics information for interface 'Marvel_WLAN_Int':
Send frame # : 17
Success send # : 17
Send bytes size : 2946
Receive frame # : 14
Success recv # : 14
Receive bytes size : 1778
各输出字段的含义是自解释的。
iflist命令
能够则列举出系统中所有的网络接口,与其对应的IP地址等信息。与showint不同的是,iflist显示的是网络接口的静态信息(IP地址/掩码/缺省网关等),而showint显示的则是网络接口的动态信息。
下面是iflist的一个输出例子:
[network_view]iflist
--------------------------------------
Inetface name : Ma
IPv4 address : 192.168.43.173
IPv4 mask : 255.255.255.0
IPv4 gateway : 192.168.43.1
Interface MTU : 1500
--------------------------------------
Inetface name : lo
IPv4 address : 127.0.0.1
IPv4 mask : 255.0.0.0
IPv4 gateway : 127.0.0.1
Interface MTU : 0
上面显示了两个网络接口,第一个是WLAN接口,名字只包含了起始的2个字节。
setif命令
setif命令则用于修改接口的静态配置参数。比如,可以通过下列方式,为一个网络接口设置静态的IP地址:
setif Marvel_WLAN_Int /a 192.168.0.100 /m 255.255.255.0 /g 192.168.0.1
其中Marvel_WLAN_Int是接口的名字(showint命令可以显示),后面分别是该接口的IP地址/子网掩码/缺省网关。需要注意的是,缺省情况下,接口上是启动DHCP功能的,试图自动获取IP地址。一旦通过上述命令设置静态IP地址,则会同时把该接口上的DHCP功能关闭。
如果要重新打开DHCP功能,则使用如下命令:
setif Marvel_WLAN_Int /d enable
而下列命令,则用于重新启动接口上的DHCP功能:
setif Marvel_WLAN_Int /d enable
重启DHCP功能的目的,是为了立即在接口上发出DHCP请求。缺省情况下,DHCP功能是以指数退避方式来发送DHCP请求报文的,即当接口刚刚使能的时候,会发送DHCP请求,如果没有收到响应,则会在2秒后再发一次,然后是4秒,然后是8秒…以此类推。如果想立即在接口上重新发出DHCP请求,则使用上述命令restart一下即可。
Ping命令
这是最常用的诊断命令,后面直接跟IP地址即可。下面是一个简单的输出例子:
[network_view]ping 192.168.43.1
Ping 192.168.43.1 with 64 bytes packet:
[0]Reply from 192.168.43.1,size = 64,time = 40(ms)
[1]Reply from 192.168.43.1,size = 64,time = 180(ms)
[2]Reply from 192.168.43.1,size = 64,time = 180(ms)
ping statistics: total send = 3,received = 3,0 loss.
如果希望改变缺省的ping报文长度,则可以增加一个参数:
ping 192.168.43.1 /l 1024
上述命令以1024字节为ping报文长度。缺省情况下,会连续ping三个报文,然后结束。如果希望ping更多的报文,则使用下列命令:
ping 192.168.43.1 /c 1000
上述命令可以ping1000个报文。当然,l参数和c参数可以一起使用。
HelloX网络驱动程序编写方法
HelloX实现了一个基于线程轮询机制的以太网驱动程序框架,系统中有一个叫做eth_thread的线程,定时(每隔100ms)轮询网卡驱动程序,试图接收数据帧。如果有合适的数据帧到达,则eth_thread会把这个数据帧递交到IP层处理。
因此,要实现一个以太网驱动程序,需要遵循HelloX的以太网驱动框架,具体来说,就是要实现下列函数:
初始化函数
原型如下,这个函数在以太网驱动程序被加载的时候,会被HelloX调用,用于完成硬件的初始化功能。当然,如果不需要初始化,完全可以写成下列形式:
static BOOL Int_Init(__ETHERNET_INTERFACE*pInt)
{
returnTRUE;
}
硬件的初始化,还可以放在驱动程序的入口函数中,下面会提及。
报文发送函数
原型如下:
static BOOL SendFrame(__ETHERNET_INTERFACE*pInt);
在IP层试图发送报文的时候,以太网驱动框架会调用这个函数。所发送的数据帧已经在IP层面准备好(包括源MAC地址/目的MAC地址等),存放在pInt对象的一个缓冲区中(如下代码),驱动程序只需要发送即可。
typedef struct tag__ETHERNET_INTERFACE{
char ethName[MAX_ETH_NAME_LEN +1];
char ethMac[ETH_MAC_LEN];
char SendBuff[ETH_DEFAULT_MTU];//Sending buffer.
int buffSize;
__ETH_INTERFACE_STATE ifState;
LPVOID pL3Interface;
LPVOID pIntExtension; //Privateinformation.
……
}__ETHERNET_INTERFACE;
其中SendBuff是存放待发送数据帧的缓冲区,buffSize是数据帧的长度,必须小于ETH_DEFAULT_MTU(1500)。
在SendFrame函数中,只需要操作硬件,把SendBuff中的内容送到物理网络上,然后返回即可。
数据帧接收函数
该函数原型如下,会被HelloX的以太网管理框架周期性的调用,以判断是否有数据帧到达:
static struct pbuf*RecvFrame(__ETHERNET_INTERFACE* pInt);
在这个函数中,硬件判断有数据帧到达,则需要创建一个pbuf,把数据帧从硬件缓冲区中拷贝到pbuf里面,然后返回这个pbuf。比如下面的实例代码:
static struct pbuf*Marvel_RecvFrame(__ETHERNET_INTERFACE* pInt)
{
struct eth_packet *rx_pkt =&pgmarvel_priv->rx_pkt;
struct pbuf *p, *q;
u16 len =0;
int l = 0;
char *buffer = NULL;
p= NULL;
/*Obtain the size of the packet and put it into the "len" variable. */
len= lbs_rev_pkt();
if(len > 0){
buffer= rx_pkt->data;
/*We allocate a pbuf chain of pbufs from the pool. */
p= pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
if(p != NULL){
for(q = p; q != NULL; q = q->next){
memcpy((u8_t*)q->payload,(u8_t*)&buffer[l], q->len);
l= l + q->len;
}
}
else
{
}
}
return p;
}
如果硬件判断没有数据帧到达,则只需要返回NULL即可。
特定功能的控制函数
原型如下:
static BOOL Eth_Ctrl(__ETHERNET_INTERFACE*pInt,DWORD dwOperation,LPVOID pData);
对于一些以太网的特定控制功能,比如设置MTU大小,修改速率,WiFi的扫描AP/附着AP等,通过这个函数实现。dwOperation指明了需要的操作。
如果没有特殊需要,也可以不需要实现该函数。建议的实现方式是,实现一个只返回TRUE的空函数,比如:
static BOOLMarvel_Ctrl(__ETHERNET_INTERFACE* pInt,DWORD dwOperation,LPVOID pData)
{
returnTRUE;
}
实现驱动程序入口函数
实现完成上述函数之后,还需要实现一个以太网驱动程序的入口函数,这个入口函数会被HelloX的以太网管理框架调用,用于加载以太网驱动程序。在入口函数中,需要做系列工作:
1. 初始化硬件;
2. 调用AddEthernetInterface,向系统中注册以太网接口。
下面是一个实现实例:
BOOL Marvel_Initialize(LPVOID pData)
{
__ETHERNET_INTERFACE*pMarvelInt = NULL;
char mac[ETH_MAC_LEN];
//初始化硬件,获得硬件的MAC地址,存放在mac数组中。
//调用AddEthernetInterface,注册接口。
pMarvelInt= EthernetManager.AddEthernetInterface(
MARVEL_ETH_NAME, //以太网的名字,任意字符串,不能包含空格。
&mac[0], //MAC地址。
NULL, //初始化函数的参数。
Int_Init, //接口初始化函数,对应上述Int_Init函数
SendFrame, //数据帧发送函数
RecvFrame, //数据帧接收函数
Eth_Ctrl); //控制函数。
if(NULL== pMarvelInt)
{
returnFALSE;
}
returnTRUE;
}
调用AddEthernetInterface的时候,需要使用上面实现的四个操作函数作为参数。调用成功后,会返回一个以太网对象指针,可以保存起来,供后期卸载以太网接口的时候用。
在以太网驱动入口数组中增加一项
最后一步,就是在以太网驱动程序入口函数数组中增加一项,告诉操作系统以太网驱动程序的存在。这样操作系统在初始化的时候,就会调用驱动程序入口函数,加载驱动程序。入口函数数组位于network/ethernet/ethentry.c文件中,下面是一个示例:
__ETHERNET_DRIVER_ENTRYEthernetDriverEntry[] =
{
#ifdef __CFG_NET_MARVELLAN
{Marvel_Initialize,NULL},
#endif
//Please add your ethernet driver's entry here.
{NULL,NULL}
};
其中Marvel_Initialize是驱动程序入口函数,NULL是入口函数的参数,可以是任意指针。注意,该数组中的第一个网络接口,会被系统自动设置为缺省网络接口,即缺省网关所在的接口,或者HelloX默认路由所在的接口。
这样以太网驱动程序就编写完成了。建议把以太网驱动程序的代码,存放在driver/STM32目录下。重新编译HelloX,即可实现以太网驱动程序的加载。
以太网驱动程序加载成功后,即可食用network程序,进行诊断和调试。如果命令级别的诊断无法发现问题,则可以启用代码级的调试。具体来说,在ethif.h文件中,打开以太网调试开关(__ETH_DEBUG),重新编译并加载运行,即可输出网络运行过程中的更加详细的信息。
HelloX V1.77的代码,可以从github上下载:
github.com/hellox-project/hellox_stm32
有任何问题,欢迎加入QQ群讨论:38467832
HelloXV1.77网络功能简介的更多相关文章
- HelloX操作系统网络功能简介及使用和开发指南
HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...
- UNIX网络编程---简介
UNIX网络编程---简介 一. 概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...
- 【RL-TCPnet网络教程】第4章 RL-TCPnet网络协议栈简介
第4章 RL-TCPnet网络协议栈简介 本章节介绍RL-TCPnet网络协议栈,让大家对 RL-TCPnet有一个整体的了解,RL-TCPnet是一款小型网络协议栈,适用于 ARM 内 ...
- 计算机网络通信TCP/IP协议浅析 网络发展简介(二)
本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket 分层的 ...
- Web技术的发展 网络发展简介(三)
在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...
- Redis安装和主要功能简介
Redis安装和主要功能简介 Redis(https://redis.io/), 是一个内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 安装Redis 我很少在开发机中直接装各种数 ...
- docker——libnetwork插件网络功能
从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...
- 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议
软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...
- DYN-B201 Dynamics CRM 云生产力解决方案与功能简介
DYN-B201 Dynamics CRM 云生产力解决方案与功能简介 讲师:王健.林松涛Dynamics CRM 云产品正式落地中国,CRM 与 Azure.O365 深度整合无缝集成,带来无与伦比 ...
随机推荐
- mysql学习笔记5
phpmyadmin中向数据表中插入新数据 INSERT INTO tb_admin(`table_id`, `table_name`, `table_des`, `table_time`) VAL ...
- InstallShield Custom Dialog
InstallShield 2008 Screen Layout is designed as below. Use toolbox to edit screen layout. 1> Set ...
- Webstorm 配置与使用 Less
* 安装完NodeJs * 将npm文件夹保存在C:\Users\Administrator\AppData\Roaming\下 * 在webStrom中,setting -> Tools -& ...
- centos 关闭触摸板,触摸板点击
yum install xorg-x11-apps xinput –list 由图可以看出俺的本本触摸板ID为14,于是可以通过以下命令开启与关闭它: 禁止touchpad:xinput set-in ...
- Siverlight网页应用程序中WCF通信注意事项
最近刚刚接触WCF通信,功能就是客户端点击按钮后,服务器端返回一个随机数字.在VS2010中调试的时候,通信都正常,但发布到IIS7中就没反应了,经过几天的摸索,发现WCF的配置要注意以下两点: 1. ...
- Chart Style
How to add label to column chart http://blogs.msdn.com/b/delay/archive/2009/07/27/simple-column-labe ...
- chrome常用插件
1. ModHeader 功能:修改请求头部信息 安装地址:https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnf ...
- SQL导入
然后将新窗口中所有内容放到你需要复制的那个数据库中->新建查询->修改第一行 USE[新数据库名]-> 运行这段代码->刷新数据库 基本就是选择源数据库和目标数据库,特别注意的 ...
- 模拟DLL加载
#include <stdio.h> #include <malloc.h> #include <sys/stat.h> typedef int (*PFUNC)( ...
- android下拉选择框spinner
spinner是什么东西呢?有点像下拉菜单,其实是一个弹出窗口,但是是可以进行进一步操作的弹出窗口.你点击那个三角形的符号,弹出一个窗口,通常是列表,然后进行操作. 它在xml文件中的定义和其它控件没 ...