中国xx学院
2015届毕业生实习总结报告
学生姓名:______________________ 专业年级:______________________ 实习单位:______________________ 实习时间:______________________ 辅导员老师:____________________
年 月 日
毕业实习报告格式
1、封面:写明专业、班级、姓名、辅导员老师、实习报告题目、实习单位、实习时间、地点等。
2、摘要:作为实习报告部分的第一页,为摘要,字数一般为150字,是实习报告的中心思想。
3、正文(要求字数不低于3000字):是实习报告的核心。写作内容可根据实习内容和性质而不同
(1)实习目的或研究目的
(介绍实习目的和意义、实习单位的发展情况及实习要求等)
(2)实习内容
(3)实习结果
(4)实习总结或体会 (是对实习的体会和最终的、总体的结论,不是正文中各段小结的简单重复。)
实习报告要求
1、 封面——指定的样稿
2、 用A4纸输出, 左右页边距:2厘米,上下页边距:2厘米
正文:宋体,小四,行间距1.5倍
正文标题:黑体小二号段后:1行
第二篇:生产实习报告封面及内容模板
电子科技大学
通信与信息工程学院
生产实习
学号: 2010013050034
姓名: 代玥玥
指导教师: 许都
电子科技大学通信与信息工程学院
生产实习考核表
一、实习目的和任务
学习网络理论,了解无线网络拓扑,探讨分布与集中式管理对无线网络的优化,以及用户与无线网络管理之间的交互。设计使用web实现用户与无线网络管理之间的交互,设计用户界面,方便直观的反应交互内容。
二、实习内容和要求
实验要求:
1.了解luci用户界面的设计
2.学习lua脚本语言,html语言以及数据库相关信息
3.使用lua,html,sql设计用户界面,实现用户与无线网络之间的交互
实验内容:
一、luci用户界面
luci作为web服务器,实现客户端web页面配置功能。对于request处理方式,采用的是cgi,而所用的cgi程序就是luci,工作框架如下图所示:
Client端和serv端采用cgi方式交互,uhttpd服务器的cgi方式中,fork出一个子进程,子进程利用execl替换为luci进程空间,并通过setenv环境变量的方式,传递一些固定格式的数据(如PATH_INFO)给luci。另外一些非固定格式的数据(post-data)则由父进程通过一个w_pipe写给luci的stdin,而luci的返回数据则写在stdout上,由父进程通过一个r_pipe读取。
luci程序流程
luci作为web服务器的cgi程序,是通过execl函数替换到进程空间的,并且详细说明了它与其它进程的交互方法。
它首先执行的是running()函数,其中create出另一个执行体httpdispatch,每次httpdispatch执行yield返回一些数据时,running()函数就读取这些数据,做相应处理,然后再次执行resume(httpdispath),……如此直到httpdispatch执行完毕。
首先说明一下代码组成,在luci文件系统中,lua语言的代码不要编译,类似一种脚本语言被执行,还有一些uhttpd服务器的主目录,它们是:
/www/index.html
/cgi-bin/luci
/luci-static/xxx/xx.css、js、gif
/usr/lib/lua/nixio.so、uci.so
/luci/http.lua、dispatcher.lua、core…
/controller/xxx.lua
/model/xxx.lua
/view/xxx.lua
节点树node-tree
在controller目录下,每个.lua文件中,都有一个index()函数,其中主要调用entry()函数,形如entry(path,target,title,order),path形如{admin,network,wireless},entry()函数根据这些创建一个node,并把它放在全局node-tree的相应位置,后面的参数都是该node的属性,还可以有其他的参数。其中最重要的就是target。
Createtree()函数就是要找到controller目录下所有的.lua文件,并找到其中的index()函数执行,从而生成一个node-tree。这样做的io操作太多,为了效率,第一次执行后,把生成的node-tree放在/tmp/treecache文件中,以后只要没有更新(一般情况下,服务器里的.lua文件是不会变的),直接读该文件即可。生成的node-tree如下:
这里要注意的是,每次dispatch()会根据path_info逐层索引,且每一层都把找到的节点信息放在一个变量track中,这样做使得上层node的信息会影响下层node,而下层node的信息又会覆盖上层node。比如{/admin/system},最后的auto=false,target=aa,而由于admin有sysauth值,它会遗传给它的子节点,也即所有admin下的节点都需要认证。
target简介
对每个节点,最重要的属性当然是target,这也是dispatch()流程最后要执行的方法。target主要有:alise、firstchild、call、cbi、form、template。这几个总体上可以分成两类,前两种主要用于链接其它node,后一个则是主要的操作、以及页面生成。下面分别描述。
链接方法:在介绍初始登录流程时,已经讲到了这种方法。比如初始登录时,url中的path_info仅为'/',这应该会索引到rootnode节点。而该节点本身是没有内容显示的,所以它用alias('admin')方法,自动链接到admin节点。再比如,admin节点本身也没有内容显示,它用firstchild()方法,自动链接到它的第一个子节点/admin/status。
操作方法:这种方法一般用于一个路径的叶节点leaf,它们会去执行相应的操作,如修改interface参数等,并且动态生成页面html文件,传递给client。这里实际上是利用了所谓的MVC架构,这在后面再描述,这里主要描述luci怎么把生成的html发送给client端。
Call、cbi、form、template这几种方法,执行的原理各不相同,但最终都会生成完整的http-response报文(包括html文件),并调用luci.template.render(),luci.http.redirect()等函数,它们会调用几个特殊的函数,把报文内容返回给luci.running()流程。
如上图所示,再联系luci.running()流程,就很容易看出,生成的完整的http-response报文会通过io.write()写在stdout上,而uhttpd架构已决定了,这些数据将传递给父进程,并通过tcp连接返回给client端。
sysauth用户认证
2.1节已描述了,由于节点是由上而下逐层索引的,所以只要一个节点有sysauth值,那么它所有的子节点都需要认证。不难想象,/admin节点有sysauth值,它以下的所有子节点都是需要认证才能查看、操作的;/mini节点没有sysauth值,那么它以下的所有子节点都不需要认证。
luci中关于登陆密码,用到的几个函数为:
可以看出它的密码是用的linux的密码,而openwrt的精简内核没有实现多用户机制,只有一个root用户,且开机时自动以root用户登录。要实现多用户,必须在web层面上,实现另外一套(user、passwd)系统。
另外,认证后,serv端会发给client一个session值,且它要一直以cookie的形式存在于request报文中,供serv端来识别用户。这是web服务器的一般做法,这里就不多讲了。
MVC界面生成
这其实是luci的精华所在,第二节开始介绍/usr/lib/lua/luci/下有三个目录model、view、controller,它们对应M、V、C。第2.2节介绍了生成的界面怎么传递给client,下面简单介绍生成界面的方法。
Call()方法会调用controller里的函数,主要通过openwrt系统的uci、network、inconfig等工具对系统进行设置,如果需要还会生成新界面。动态生成界面的方法有两种,一是通过cbi()/form()方法,它们利用model中定义的模板map,生成html文件;另一种是通过template()方法,利用view中定义的htm(一种类似html的文件),直接生成界面。
二、用户配置界面
目次布局
模块进口文件status.lua在目次lua\luci\controller\admin下。
function index()
entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true
entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
end
在index()函数中,应用entry函数来完成每个模块函数的注册,官方申明文档如下:
entry(path, target, title=nil, order=nil)
path is a table that describes the position in the dispatching tree: For example a path of {"foo", "bar", "baz"} would your node in foo.bar.baz.
target describes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page
title defines the title that will be visible to the user in the menu (optional)
order is a number with which nodes on the same level will be sorted in the menu (optional)
此中target首要分为三类:call,template和cbi。
call用来调用函数。
即语句entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2)
Firewall模块调用了action_iptables函数:
function action_iptables()
if luci.http.formvalue("zero") then
……
end
end
template用来调用已有的htm模版,模版目次在lua\luci\view目次下。
即语句entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
调用了lua\luci\view\admin_status\index.htm文件来显示。
cbi语句应用cbi模块,这是应用很是频繁也很是便利的模块,在cbi模块中定义各类控件,Luci体系会主动履行大项目组处理惩罚工作。其链接目次在lua\luci\model\cbi下。
显然语句entry({"admin", "status", "processes"}, cbi("admin_status/processes"), _("Processes"), 6)
调用lua\luci\model\cbi\admin_status\processes.lua来实现模块。
cbi模块包含的一系列lua文件构成界面元素的组合,所有cbi模块中的控件都须要写在luci.cbi.Map中。
在cbi.lua文件中封装了所有的控件元素,例如复选框,下拉列表等。
button = s:option(Button, "_button", "Button")
button.inputtitle = translate("exec")
button.inputstyle = "apply"
function button.write(self, section, value)
AbstractValue.write(self, section, value)
local listvalue = luci.fs.readfile("/etc/saveValue")
os.execute("touch /etc/testfile%s" %{listvalue})
self.inputtitle = translate("haha")
end
按钮的响应过程为:从saveValue文件中获取内容,然后以获取到的字符串定名创建新文件。
代码如下:
Model:
module("luci.controller.admin.ap",package.seeall)
function index()
entry({"admin","AP"},alias("admin","AP","AP"),_("AP"),10).index=true
entry({"admin", "AP", "AP"}, cbi("admin_ap/basic_settings"), _("Basic settings"), 1)
entry({"admin", "AP", "overview"}, template("admin_ap/index"), _("AP1"), 20)
entry({"admin", "AP", "packages"}, call("action_packages"), _("Software"), 30)
entry({"admin", "AP", "overview2"}, template("admin_ap/index2"), _("AP2"), 40)
end
CBI模块:
require "luci.fs"
local uci = require "luci.model.uci".cursor()
local sys = require "luci.sys"
local wa = require "luci.tools.webadmin"
local fs = require "nixio.fs"
m = Map("basic_settings", "Basic settings")
s = m:section(TypedSection, "basic_settings", "Basic settings")
s.anonymous = true
s.addremove = false
s:tab("basic_settings", "Basic settings")
s:tab("security", "Security mode")
s:tab( "mac", "MAC filtering configuration")
s:tab("advance", "Advance settings")
button = s:taboption("basic_settings",Button, "_button", "Button")
button.inputtitle = translate("exec")
button.inputstyle = "apply"
function button.write(self, section, value)
AbstractValue.write(self, section, value)
os.execute("touch /home/dyy/abc")
end
图一 AP基本配置
图二 AP加密设置
图三 AP的MAC设置
图四 AP高级设置
配置文件:
config 'basic_settings'
option 'interface' 'wlan x'
option 'ssid' 'dewgh6r'
option 'hw_mode' '2'
option 'channel' '0'
option 'auth_algs' '0'
option 'select' '0'
option 'bridge' 'br0'
option 'change' '0'
option 'change1' '0'
......
三、实习的心得与体会
经过一个半月的生产实习,我感觉收获颇多,这次实习是我真正意义上接触通信开端也是一次很好的历练。在这一个半月的时间里,我学习了lua语言,制作了用户界面,这让我很有成就感。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩。