西南科技大学专业方向设计报告课程名称:通信工程专业方向设计设计名称:基于WinSocket的图像传输技术姓名:梁显龙学号: 20105517班级:通信1002指导教师:路锦正起止日期: 2013.12.1—2013.12.30 西南科技大学信息工程学院制方向设计任务书学生班级:通信1002 学生姓名:梁显龙学号:20105517 设计名称:基于WinSocket的图像传输技术起止日期:2013.12.1—2013.12.30 指导教师:路锦正方向设计学生日志课程设计评语表基于WinSocket的图像传输技术一、摘要信息技术高速发展的今天,图片信息在人们的生活中发挥着越来越重要的作用。
网络信息可以通过Socket套接字[参考《windows网络编程》]进行可靠传输,因此掌握好基于TCP 的Socket网络通信技术尤为重要。
本设计意在设计出一套能够通过51单片机控制摄像头VC0706拍照,并由GSM移动通信模块通过Socket发送拍照所得图片的数据信息到上位机功能软件,最终实现图片显示的系统。
通过本设计可以使我们更加清楚地了解基于Socket传输数据信息的流程,深刻理解Socket可靠传输书数据的原因。
同时可以让我们了解图片数据结构及合成方法,全面提升我们的综合能力。
二、设计目的和意义图片信息在我们生活中发挥着越来越重要的作用。
上网浏览新闻时,我们首先关注的便是图片新闻。
因为图片新闻相比文字新闻更为直观,我们只需要看一眼便可大概知晓它所代表的新闻事件。
只有激起了读者的兴趣,读者才可能继续进行深入了解。
因此一个新闻事件配上一张合适的图片显得尤为重要。
近几年网购已成为许多年轻人购物的主要方式,当我们进行货物挑选时,只能根据卖家提供的图片进行选择。
当然,图片信息还充斥在我们网络生活的方方面面,很多情况下都需要进行可靠传输。
就目前的传输方式来看,利用WinSocket[参考《C#程序设计[M]》]进行传输,可靠性最高,可以无失真查传输图片,能有效满足人们对图片信息的需求。
综上所述,基于WinSocket的图像传输技术显得尤为重要。
通过本次设计可以使我们掌握图片的基本机构,了解WinSocket数据传输的过程,创建C/S[参考《C#实用教程[M]》]模式的Socket通信架构,全面提升自身综合素质。
三、设计原理3.1、图像数据格式图像格式种类繁多,常用的主要有.jpg、.bmp、.gif等。
其中又以.jpg较为常用,因此本设计仅对该格式进行深入学习。
将图像转换成字节数组,以十六进制进行显示。
可以发现每张图片均以FFD8开头,以FFD9结束,中间不再出现FFD8和FFD9。
因此我们可以得到图像数据的基本结构为FFD8******FFD9,其中**为以十六进制表示的0~255十进制数。
3.2、套接字工作原理利用Socket进行网络通信时,需要分别建立服务器端和客户端。
服务器端建立Socket的监听套接字后,等待客户端的连接,连接成功后便可进行正常的通信。
值得一说的是它们之间的三次握手和套接字特有的帧结构可以保证数据的准确传输。
服务器端:(1) 打开一通信通道并告知本地主机。
(2) 等待客户请求。
(3) 接收到服务请求,处理该请求并发送应答信号。
(4) 返回第二步,等待另一客户请求。
(5) 关闭服务器。
客户端:(1) 打开一通信通道,连接到服务器。
(2) 向服务器发送服务请求报文,等待并接收应答。
(3) 有新的请求时,重复第二步。
(4)请求结束后关闭通信通道并终止。
3.3、套接字工作时序图面向连接套接字的系统调用时序图:图1 套接字工作时序图3.4、GSM连接Socket服务GSM移动通信模块支持GPRS功能,因此我们可以利用它来传递数据信息。
由于GSM移动数据模块高度集成化,只需通过串口发送简单的指令便可完成GPRS数据通信。
值得注意的是,利用GPRS进行通信时,内核代码也是按照套接字通信标准同服务器进行数据交换。
通信流程:(1) GSM网络环境测试。
(2) GSM服务商查询。
(3)使用Ip地址连接方式。
(4)提供IP地址及端口号,连接服务器。
(5)接收、发送数据。
3.5、PC端Socket接收图片设计在PC端,我们需要制作一个Windows Form应用软件。
该应用软件需要建立一个服务端侦听套接字,用来接收来自客户端的信息,这里主要用来接收来自GSM传回的图片信息。
该软件同时需要完成图片的合成及显示。
任何一款应用软件,都需要一个简洁、漂亮、适用的外观。
在本次设计中应力争做到这三点,并保证程序的最高质量。
3.6、VC0706摄像头拍照流程图VC0706为串行摄像头,可在传输速度要求不高的场合使用。
拍摄相片时也较为简单,只需要通过串口发送一系列指令便可实现轻松拍照。
拍照流程:(1)上电(2)延时2.5秒(3)设置拍照图片大小指令(可选,如更改,需要复位一下才会生效)(4)复位指令(可选,如没有执行第3步,则该步不需要)(5)设置拍照图片压缩率指令(可选)(6)发送清空图片缓存指令(7)发送拍照指令(8)发送读取所拍图片长度指令(9)根据第8步所获得的图片长度,发送读取图片数据指令(10)如再次拍照,则返回第6步,先清空缓存,然后开始下一张图片拍照四、详细设计步骤4.1、获取图片数据单片机STC12C5A60S2为51系列单片机的升级版,其功能大大增强。
本次设计中需要用到两个串口,该单片机可以满足该要求。
图片数据的采集正是通过该单片机向摄像头VC0706发送拍照指令,取得图片数据。
拍照流程在3.6中已经详细给出,程序流程也正是按照其流程进行。
下面仅给出部分程序。
程序:Timer0Init(); //定时器初始化Uart2Init(0,1,247); //COM2 波特率设置为38400bpsCAMInit(); //摄像头初始化(详见CAMInit()函数)TakePhoto(); //拍照(详见 TakePhoto()函数)while(1){if(ONOFF==0){TakePhoto(); //拍照}}/*摄像头初始化函数*/void CAMInit(){Uart2SendHexs(camsize,9); //CAM长、宽度设置delayms(50);Uart2SendHexs(camrest,4); //如果有CAM长、宽度设置,那么需要复位delayms(2000);Uart2SendHexs(camyasuo,9); //CAM压缩率设置delayms(50);}/*拍照函数*/void TakePhoto(){Uart2SendHexs(camclear,5); //CAM清图片缓存delayms(50);Uart2SendHexs(camtake,5); //照相命令delayms(50);Uart2SendHexs(camlenth,25); //读取图片长度(二进制)delayms(800);Uart2SendHexs(camread,36); //读取数据并向远程服务器发送}4.2、发送图片数据本设计通过GSM移动数据模块发送图片数据。
该模块一次最多发送1k的数据量,适合进行小数据传输。
本次设计中图片尺寸为640*480,数据量大小约为12k,因此需要进行多次传输。
由于该模块不适合进行大数据传输,因此在传输时较为缓慢。
但是本设计旨在搭建通信平台,掌握Socket通信原理和图片组成结构及合成方法,对实时性要求不是很高,因此可以用其进行图片数据传输。
图片传输流程在3.4已详细说明,这里不再赘述,仅给出部分实现代码。
/*设备初始化*/Uart1Init(0,1,247); //COM1波特率设置38400GSMInit(); //GSM初始化/*拍摄照片并发送*/void TakePhoto(){Uart2SendHexs(camclear,5); //CAM清图片缓存delayms(50);Uart2SendHexs(camtake,5); //照相命令delayms(50);Uart2SendHexs(camlenth,25); //读取图片长度(二进制)delayms(800);Uart2SendHexs(camread,36); //读取数据并向远程服务器发送}/*GSM初始化函数*/void GSMInit(){DelaySec(3); //GSMCAM上电初始化时延Uart1Sends("AT\r"); //GSM握手连接delayms(100);Uart1Sends("AT+COPS?\r"); //GSM服务商查询delayms(100);Uart1Sends("AT+CDNSORIP=0\r"); //ip地址连接delayms(100);Uart1Sends("AT+CIPSTART=\"TCP\",\"125.67.129.171\",\"8080\"\r"); //改变主机IP DelaySec(5); //远程主机连接用时较长Uart1Sends("AT+CIPSPRT=0\r"); //发送数据时不等待'>'delayms(100);}/*发送数据*/void Uart2SendHexs(unsigned char *dat,unsigned int lenth){Uart1Sends("AT+CIPSEND=1024\r"); //发送数据长度delayms(100);unsigned int cnt=0;ES=0;while(cnt<lenth){SBUF=picture [cnt]; //发送数据while(TI==0);TI=0;cnt++;}ES=1;}4.3、PC端应用软件界面设计PC端界面设计遵循原则在3.5中已进行了详细的描述。
本次设计中的界面正在遵照了其设计原则,其效果图如图1所示。
从图中可以看出该应用软件具备服务端Socket监听功能,可以接收来自客户端的数据。
本设计中接收来自客户端的图片数据,然后内部进行图片的合成并在界面上进行显示。
图2 应用软件界面4.4、PC端应用软件程序设计服务端侦听套接字建立过程严格遵照3.3中所述流程。
为了在等待客户建立连接时,不影响应用软件其他功能的使用,需要开通一独立线程进行监听服务。
当有客户进行连接时,应为该客户另外单独开启一线程,进行数据的交互。
程序:4.4.1、建立服务端套接字try{//端口为8080String Port = "8080";//取得本机IP地址IPHostEntry IpHost = Dns.Resolve(Dns.GetHostName());IPAddress ServerIp = IpHost.AddressList[0];//建立服务端监听套接字ServerSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);//建立一个IP和端口类IPEndPoint serverhost = new IPEndPoint(ServerIp,Int32.Parse(Port));//绑定ServerSocket.Bind(serverhost);//监听最大个数为10ServerSocket.Listen(10);//建立监听线程,Client_Connect()为接收连接函数,随后详细给出ThreadStart serverThreadStart = new ThreadStart(Client_Connect);Thread serverThread = new Thread(serverThreadStart);serverThread.IsBackground = true;serverThread.Start();}catch (Exception ex){MessageBox.Show(ex.ToString());}4.4.2、响应客户端连接请求public void Client_Connect(){while (true){try{//接收客户端连接请求ClientSocket = ServerSocket.Accept();ClientNum++;//界面显示该客户ID号this.Invoke(new ComBoxAdd(ComBox_Add), ClientNum.ToString()); //保存该客户连接套接字allclients.Add(ClientNum, ClientSocket);//新开线程,同该客户进行信息交互。