物联网智能家居控制系统.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流物联网智能家居控制系统.精品文档.四川信息职业技术学院2014年四川省高职院校物联网大赛设计设计题目:智能家居控制系统 姓 名:段绍华 刘富精 徐建 李俊男 指导教师:黄超 2014 年 12 月 05 日目录目录0摘要1第1章 方案设计21.1 项目背景21.2建设目标21.3需求分析21.3.1功能需求分析21.3.2对技术架构的要求分析31.4总体设计31.4.1总体设计目标31.4.2系统整体流程设计31.5系统详细流程3第2章 硬件电路设计42.1内容及其原理42.2红外收发模块42.3无线收发模块52.4电源模块112.4.1 LM7805基本介绍112.4.2 LM1117基本介绍132.5 单片机的选择142.6硬件的主要两大模块162.6.1 串口无线主机收发模块162.6.2 红外终端收发模块17第3章 软件部分设计183.1 手机终端控制界面183.2 电脑服务器控制界面193.3 TCP协议的运用20附录一23服务器部分程序代码23客户端部分程序代码24附录二2751单片机控制空调部分程序代码27智能家居控制系统市场前景36总结37摘要本设计主要是一个基于物联网控制的智能家居控制系统,主要是通过手机无线传输数据给电脑服务器,服务器在以串口的方式发送给串口无线主机,串口无线主机在通过nRF905无线模块把数据发送给红外收发器终端,最后红外终端在通过红外发送器把信号发送给智能家居。从而得到了对智能家居的控制。本系统主要分为四大模块:手机终端模块、电脑服务器模块、串口无线收发器模块、红外收发器模块。关键词:智能家居;无线组网;nRF905;第1章 方案设计1.1 项目背景智能家居是在互联网的影响之下物联化体现。智能家居通过物联网技术将家中的各种设备连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境,提供全方位的信息交互功能。智能家居又称住宅智能化,是智能建筑的重要组成部分。它随着科技的高速发展和人们生活要求的不断提高而应运而生,成为21世纪的热点技术。智能家居可以定义为一个过程或者一个系统,该过程(系统)利用先进的计算机技术、网络通信技术、综合布线技术构建与家居生活有关的各种子系统。并将其结合在一起。通过统筹管理,将智能家居的被动静止结构转变为具有智慧的新动态,为住户生活提供全方位的信息交换功能。帮助家庭和外部使用者与家庭环境之间保持信息交流畅通,优化人们的生活方式。1.2 建设目标 随着科技的不断发展,现在人类也进入了物联网时代,随着物联网时代的到来,使人类的生活水平也大大的提高了,现在人们不仅仅是想着吃好和穿好,而是向往一种智能化的生活方式,智能化能极大的提高人类的生活效率、能极大的提高工作效率以及经济等各方面。本设计主要是基于物联网的一个智能家居控制系统,这给人们的生活带来了极大的便利。1.3 需求分析1.3.1功能需求分析随着整个社会的发展步伐,人们的生活在快节奏的基础上越来越丰富和多元化,对于家居装修,也提出了越来越多的需求。如今,时尚、个性、环保、舒适等等,这些词语已频频出现在住房装修装饰现场。本次设计主要是做一个关于智能家居的控制系统,能实现基本的对空调、投影仪、窗帘等等的控制。 1.3.2 对技术架构的要求分析 对于这次设计,主要有四个模块,第一手机发送模块,第二电脑主机模块,第三红外接收模块,第四红外发送模块。1.4总体的设计1.4.1 总体设计目标 要达到能够远距离的远范围的进行控制,要达到控制的灵敏度高、实用价值高、操作简单化、体积要小等标准。1.4.2 系统整体流程设计 首先第一步进行硬件电路的设计,这里主要包括电路的设计和PCB制版。 第二就是程序代码的编写,以及工艺的制作。 第三就是板子的组装与调试。1.5 系统详细流程主要分为四大模块系统功能框图,如图1-1所示。电脑服务端接收图1-1 系统整体框图第2章 硬件电路设计2.1.内容及其原理这主要是一个智能家居控制系统,可以通过手机或者电脑就可以对智能家居进行控制,实用性非常的方便。原理主要利用单片机进行控制,首先我们这个智能家居主要分为四大模块,有手机终端模块、电脑服务器主机模块、串口无线收发器模块、红外收发器模块。它主要通过上位机编程,最后通过手机发射数据给主机服务器,在由主机以串口的方式发给串口无线主机,在由串口无线主机通过以nRF905无线模块的方式把数据发送给红外收发器,最后红外收发器把接收到的数据以红外波的方式发给家居,从而实现了对智能家居的控制。2.2.红外发送模块 红外线发光二极管由红外辐射效率高的材料(常用砷化镓GaAs)制成PN结,外加正向偏压向PN结注入电流激发红外光。光谱功率分布为中心波长830950nm,半峰带宽约40nm左右。其最大的优点是可以完全无红暴,(采用940950nm波长红外管)或仅有微弱红暴(红暴为有可见红光)而延长使用寿命。光是一种电磁波,它的波长区间从几个纳米(1nm=10-9m)到1毫米(mm)左右。人眼可见的只是其中一部分,我们称其为可见光,可见光的波长范围为380nm780nm,可见光波长由长到短分为红、橙、黄、绿、青、兰、紫光,波长比紫光短的称为紫外光,波长比红光长的称为红外光。这里主要通过接收服务器主机发出的信号,使之在P1.0和P1.2两引脚上产生一个38KHz的红外波,主要起调制作用。如图2-1所示,电路中调节RP1就能改变红外的发射与接收距离。图2-1 红外发送电路图2.3 无线模块 主要用的是nRF905无线模块,它具有体积小,性能好等优点。如图2-2所示。 图2-2 nRF905实物图 1.模块介绍 NRF905无线模块特点: (1) 433Mhz 开放ISM 频段免许可证使用。 (2) 最高工作速率50kbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合。 (3) 125 频道,满足多点通信和跳频通信需要。 (4) 内置硬件CRC 检错和点对多点通信地址控制。 (5) 低功耗1.9 - 3.6V 工作,待机模式下状态仅为2.5uA 。 (6) 收发模式切换时间< 650us 。 (7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示,可直接接各种单片机使用,软件编程非常方便。 (8) TX Mode: 在+10dBm情况下,电流为30mA; RX Mode: 12.2mA 。 (9) 标准DIP间距接口,便于嵌入式应用。2.接口电路管脚说明 管脚 名称 管脚功能 说明 1 VCC 电源 电源+3.33.6V DC 2 TX_EN 数字输入 TX_EN=1 TX模式TX_EN=0 RX模式 3 TRX_CE 数字输入 使能芯片发射或接收 4 PWR_UP 数字输入 芯片上电 5 uCLK 时钟输出 本模块该脚废弃不用,向后兼容 6 CD 数字输出 载波检测 7 AM 数字输出 地址匹配 8 DR 数字输出 接收或发射数据完成 9 MISO SPI 接口SPI输出 10 MOSI SPI 接口SPI输入 11 SCK SPI 时钟SPI时钟 12 CSN SPI 使能SPI使能 13 GND 地 接地 14 GND 地 接地说明:(1) VCC脚接电压范围为3.3V3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。(2) 除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。(3) 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机SPI模块介入,只需添加代码模拟SPI时序即可。(4) 13脚、14脚为接地脚需要和母板的逻辑地连接起来。(5) 排针间距为100mil,标准DIP插针。(6) 与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。 (7) 其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和RF905模块的IO口线连接。3.模块引脚和电气参数说明RF905模块使用Nordic公司的nRF905芯片开发而成。RF905 单片无线收发器工作在433/868/915MHZ 的ISM 频段由一个完全集成的频率调制器一个带解调器的接收器一个功率放大器一个晶体震荡器和一个调节器组成ShockBurst工作模式的特点是自动产生前导码和CRC 可以很容易通过SPI 接口进行编程配置电流消耗低在发射功率为10dBm 时发射电流为30mA 接收电流为12.5mA. 进入POWERDOWN 模式可以很容易实现节电。4.工作模式 nRF905采用Nordic公司的VLSI ShockBurst技术。ShockBurst技术使nRF905能够提供高速的数据传输,而不需要昂贵的高速MCU来进行数据处理/时钟覆盖通过将与RF协议有关的高速信号处理放到芯片内,nRF905提供给应用的微控制器个SPI接口,速率由微控制器自己设定的接口速度决定。nRF905通过ShockBurst作模式在RF以最大速率进行连接时降低数字应用部分的速度来降低在应用中的平均电流消耗。在ShockBurst RX模式中,地址匹配AM和数据准备就绪DR信号通知MCU一个有效的地址和数据包已经各自接收完成。在ShockBurst TX模式中,nRF905自动产生前导码和CRC校验码,数据准备就绪DR信号通知MCU数据传输已经完成总之,这意味着降低MCU的存储器需求也就是说降低MCU成本,又同时缩短软件开发时间。(1).典型ShockBurstTX模式: .当应用MCU有遥控数据节点时,接收节点地址TX-address和有效数据TX-payload通过SPI接口传送给nRF905应用协议或MCU设置接口速度; .MCU设置TRX_CE、TX_EN为高来激活nRF905ShockBurst传输; .nRF905ShockBurstt:无线系统自动上电数据包完成(加前导码和CRC校验码)数据包发送(100kbps,GFSK,曼切斯特编码) l.如果AUTO_RETRAN被设置为高nRF905将连续地发送数据包直到TRX_CE被设置为低; .当TRX_CE被设置为低时,nRF905结束数据传输并自动进入standby模式。(2).典型ShockBurst RX模式 .通过设置TRX_CE高,TX_EN低来选择ShockBurst模式; .650us以后,nRF905监测空中的信息; .当nRF905发现和接收频率相同的载波时,载波检测CD被置高; .当nRF905接收到有效的地址时,地址匹配AM被置高; .当nRF905接收到有效的数据包(CRC校验正确)时,nRF905去掉前导码地址和CRC位,数据准备就绪(DR)被置高; .MCU设置TRX_CE低,进入standby模式低电流模式; .MCU可以以合适的速率通过SPI接口读出有效数据; .当所有的有效数据被读出后,nRF905将AM和DR置低; .nRF905将准备进入ShockBurst RX、ShockBurst TX或Powerdown模式。(3).掉电模式在掉电模式中,nRF905被禁止,电流消耗最小,典型值低于2.5uA。当进入这种模式时,nRF905是不活动的状态。这时候平均电流消耗最小,电池使用寿命最长。在掉电模式中,配置字的内容保持不变。(4).STANDBY模式Standby模式在保持电流消耗最小的同时保证最短ShockBurstRXShockBurstTX的启动时间。当进入这种模式时,一部分晶体振荡器是活动的。电流消耗取决于晶体振荡器频率,如:当频率为4MHZ时,IDD=12uA;当频率为20MHZ 时,IDD=46uA。如果uPCLK(Pin3)被使能,电流消耗将增加。并且取决于负载电容和频率。在此模式中,配置字的内容保持不变。5.器件配置 nRF905的所有配置都通过SPI接口进行。SPI接口由5个寄存器组成,一条SPI指令用来决定进行什么操作。SPI接口只有在掉电模式和Standby模式是激活的。(1).状态寄存器(Status-Register) 寄存器包含数据就绪DR和地址匹配AM状态。(2).RF配置寄存器(RF-Configuration Register)寄存器包含收发器的频率、输出功率等配置信息。(3).发送地址(TX-Address)寄存器包含目标器件地址,字节长度由配置寄存器设置。(4).发送有效数据(TX-Payload) 寄存器包含发送的有效ShockBurst数据包数据,字节长度由配置寄存器设置。(5).接收有效数据(RX-Payload)寄存器包含接收到的有效ShockBurst数据包数据,字节长度由配置寄存器设置。在寄存器中的有效数据由数据准备就绪DR指示。6.接口(1).模式控制接口: 该接口由PWR 、TRX_CE、TX_EN组成控制由nRF905组成的高频头的四种工作模式:掉电和SPI 编程模式;待机和SPI编程模式;发射模式;接收模式。 (2).SPI接口: SPI 接口由 CSN、SCK、MOSI以及MISO组成。在配置模式下单片机通过SPI接口配置高频头的工作参数;在发射/接收模式下单片机SPI接口发送和接收数据。 (3).状态输出接口: 提供载波检测输出CD,地址匹配输出AM,数据就绪输出DR。外围的RF信息。 3.1.晶体规格为了实现晶体振荡器低功耗和快速启动时间的解决方案,推荐使用低值晶体负载电容。指定CL=12pF是可以接受的。但是,也可能增大到16pF。指定一个晶体并行相等电容,Co=1.5pF也是很好的,但这样一来会增加晶体自身成本。典型的设定晶体电容Co=1.5pF,指定Co_max=7.0pF。3.2.外部参考时钟一个外部参考时钟如MCU时钟,可以用来代替晶体震荡器。这个时钟信号应该直接连接到XC1引脚,XC2引脚为高阻态。当使用外部时钟代替晶体时钟工作时,始终必须工作在Standby模式以降低电流消耗。如果器件被设成Standby模式而没有使用外部时钟或晶体时钟,则电流消耗最大可达1mA。3.3.微处理器输出时钟在默认情况下,微处理器提供输出时钟。在Standby模式下提供输出时钟将增加电流消耗。在Standby模式电流消耗取决于频率和外部晶体负载、输出时钟的频率和提供输出时钟的电容负载。3.4.天线输出ANT1和ANT2输出脚给天线提供稳定的RF输出。这两个脚必须有接到VDD_PA的直流通路,通过RF扼流圈,或者通过天线双极的中心点。在ANT1和ANT2之间的负载阻抗应该在200-700范围内,通过简单的匹配网络或RF变压器(不平衡变压器)可以获得较低的阻抗(例如50)。 在本次设计中,电路如图2-3所示,无线模块。图2-3 nRF905无线模块电路图2.4. 电源模块 任何一个电子产品都离不开电源电路,离开了电源,就将不能工作,这里主要是给单片机供电和给nRF905供电。单片机主要采用5V电源供电,而nRF905则只需要3.3V的电压就能工作,所以在本次设计中主要采用LM7805和LM1117两块芯片来分别产生5V电压和3.3V电压。2.4.1 .LM7805的基本介绍LM7805是常用的三端稳压器,一般使用的是TO-220封装,能提供DC 5V的输出电压,应用范围广,内含过流和过载保护电路。带散热片时能持续提供1A的电流,如果使用外围器件,它还能提供不通的电压和电流。1.下面是LM7805的基本参数,如图3-1所示。图3-1 LM7805参数图2.LM7805引脚图(管脚图),如图3-2所示。图3-2 LM7805封装图7805是常用的三端稳压器件,顾名思义05就是输出电压为5v,还可以微调,7805输出波纹很小。2.4.2.LM1117的基本介绍 LM1117提供电流限制和热保护。电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在±1%以内。LM1117系列具有LLP、TO-263、SOT-223、TO-220和TO-252 D-PAK封装。输出端需要一个至少10uF的钽电容来改善瞬态响应和稳定性。 LM1117是一款正电压输出的低压降三端线性稳压电路,在1A输出电流下的压降为1.2V。分为两个版本,固定电压输出版本和可调电压输出版本。固定输出电压1.5V、1.8V、2.5V、3.3V、5.0V和可调版本的电压精度为1;固定电压为1.2V的产品输出电压精度为2。内部集成过热保护和限流电路,适用于各类电子产品。 LM1117提供电流限制和热保护,以确保芯片和功率稳定性系统。而在芯片上保证输出电压精度在±2。同时也提供了固定电压输出版本和可调电压输出版本,可调版本能输出从1.25V-13.8V。 1. 提供1.8V、2.5V、2.85V、3.3V、5V和可调电压的型号。 2. 节省空间的SOT-223和LLP封装。3.电流限制和热保护功能输出电流可达800mA。4.线性调整率:0.2% (Max)。 5.负载调整率:0.4% (Max)。 6.温度范围LM1117:0125 LM1117I:-40125 应用2.85V模块用于SCSI-2有源终端开关DC/DC转换器的主调压器高效线性调整器电池充电器电池供电装置。 在本次设计中,为了节省空间,我都采用贴片元件,根据以上的信息参数,所设计的电路如图3-4所示。图中D1主要起保护作用,为了防止电源电压接反而造成烧坏元器件。图3-4 电源模块电路图2.5 单片机的选择STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。 1. 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051. 2. 工作电压:5.5V3.3V(5V单片机)/3.8V2.0V(3V 单片机) 3.工作频率范围:040MHz,相当于普通8051 的080MHz,实际工作 频率可达48MHz 4. 用户应用程序空间为8K字节 5. 片上集成512 字节RAM 6. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片8. 具有EEPROM 功能 9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2 10.外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可由外部中断低电平触发中断方式唤醒下面是单片机的实物图,如图4-1所示。图4-1 单片机实物图STC89C52具体介绍如下:主电源引脚(2根) VCC(Pin40):电源输入,接5V电源 GND(Pin20):接地线外接晶振引脚(2根) XTAL1(Pin19):片内振荡电路的输入端 XTAL2(Pin20):片内振荡电路的输出端控制引脚(4根) RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。 ALE/PROG(Pin30):地址锁存允许信号 PSEN(Pin29):外部存储器读选通信号 EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读 指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根) STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。 PO口(Pin39Pin32):8位双向I/O口线,名称为P0.0P0.7 。 P1口(Pin1Pin8):8位准双向I/O口线,名称为P1.0P1.7 。 P2口(Pin21Pin28):8位准双向I/O口线,名称为P2.0P2.7 。 P3口(Pin10Pin17):8位准双向I/O口线,名称为P3.0P3.7 。2.6.硬件的主要两大模块2.6.1.串口无线收发模块 服务器主机部分,主要是接收来自手机上的数据传到电脑服务器上,通过 串口接收手机发出的数据在通过nRF905发送给红外收发器。图3-5 无线收发器主机原理图 下面是我们的PCB板图,无线收发器主机图与红外收发器终端电路的PCB板子图几乎一样,所以在这里我们就只接了一个如图3-6所示。图3-6 无线收发器主机PCB图2.6.2 红外终端收发模块 客服端部分,主要是通过nRF905接收来自主机的不同数据,在通过红外发射出去,可以控制空调、投影仪、电视机等。电路如图3-5所示。图3-5 红外收发终端电路图第3章 软件部分设计 软件是系统的控制灵魂,灵活性很强,可以根据系统的要求和功能而变化,在硬件结构一定的情况下,智能性都是由软件实现。在本系统中,软件结构采用模块化设计,各功能程序分别编写和调试,各模块调试成功后,再将所在模块连接起来,构成系统的软件,这样的设计有利于程序代码的优化,而且便于编程、调试、维护及协作。本家居控制系统的系统软件部分主要包括以下几个部分:(1)主机部分相关软件设计;(2)分机部分相关软件设计;(3)无线通讯的软件设计;3.1 手机终端控制界面通过C#编写上位机来控制串口无线整机,下面如图3-1所示,是一个最初的手机登陆界面。图3-2是一个方式选择模式,通过在手机上选择不同的方式,就可以对不同的家居进行控制。 图3-1 图3-2下面两幅图图3-3是空调的那个窗口控制界面,图3-4是投影仪的那个控制界面,通过前面方式的选择不同分别对空调、和投影仪进行控制。它主要是把数据通过无线的方式传给电脑主机,主机在进行判断是否符合条件,符合则执行当前操作。 图3-3 图3-43.2 电脑服务器控制界面 主要是把手机传过来的数据通过串口用nRF905无线模块传出去,如图3-5所示,是空调的主界面,图3-6是投影仪的主界面。通过发送不同的数据,传输给串口无线整机时,主机在进行判断是不是符合K开头,J结尾。若符合,则继续执行判断模式的选择。 图3-5 空调主界面图 图3-6 投影仪的主界面3.3 TCP协议的运用 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,由IETF的RFC 793说明(specified)。TCP在IP报文的协议号是6。 1网络协议编辑功能当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠1 ,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;同时可以使用md5认证对数据进行加密。在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法)。该算法主要包括三个主要部分:1)加性增、乘性减;2)慢启动;3)对超时事件做出反应。连接建立TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答TCP的三次握手SYN+ACK1 ,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP三次握手的过程如下:如图3-8所示图3-8 TCP协议连接结构图客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。 连接终止建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如图3-9所示。图3-9 TCP协议连接终止结构图 TCP连接的终止(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。(4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。附录一服务端部分程序代码:static void Main(string args) int port = 2000; string host = "127.0.0.1" /创建终结点(EndPoint) IPAddress ip = IPAddress.Parse(host);/把ip地址字符串转换为IPAddress类型的实例 IPEndPoint ipe = new IPEndPoint(ip, port);/用指定的端口和ip初始化IPEndPoint类的新实例 /创建socket并开始监听 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字 s.Bind(ipe);/绑定EndPoint对像(2000端口和ip地址) s.Listen(0);/开始监听 Console.WriteLine("等待客户端连接"); /接受到client连接,为此连接建立新的socket,并接受信息 Socket temp = s.Accept();/为新建连接创建新的socket Console.WriteLine("建立连接"); string recvStr = "" byte recvBytes = new byte1024; int bytes; bytes = temp.Receive(recvBytes, recvBytes.Length, 0);/从客户端接受信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); /给client端返回信息 Console.WriteLine("server get message:0", recvStr);/把客户端传来的信息显示出来 string sendStr = Console .ReadLine (); byte bs = Encoding.ASCII.GetBytes(sendStr); temp.Send(bs, bs.Length, 0);/返回信息给客户端 temp.Close(); s.Close();客服端程序部分代码:static void Main(string args) string sendStr; try int port = 2000; string host = Console .ReadLine (); /创建终结点EndPoint IPAddress ip = IPAddress.Parse(host); /IPAddress ipp = new IPAddress("127.0.0.1"); IPEndPoint ipe = new IPEndPoint(ip, port);/把ip和端口 转化为IPEndpoint实例 /创建socket并连接到服务器 Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建Socket Console.WriteLine("Conneting"); c.Connect(ipe);/连接到服务器 /向服务器发送信息 sendStr =Console .ReadLine (); byte bs = Encoding.ASCII.GetBytes(sendStr);/把字符串编码为字节 Console.WriteLine("Send Message"); c.Send(bs, bs.Length, 0);/发送信息 /接受从服务器返回的信息 string recvStr = "" byte recvBytes = new byte1024; int bytes; bytes = c.Receive(recvBytes, recvBytes.Length, 0);/从服务器端接受返回信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); Console.WriteLine("client get m