<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_一点一滴的Beer</title><subtitle type="text">　热爱学习，热爱DOTA，热爱我的小口琴;热爱工作，热爱运动；学会生存，学会生活;没有什么不良嗜好，但是偶尔喜欢喝点清凉可口的beer.　</subtitle><id>http://feed.cnblogs.com/blog/u/68050/rss</id><updated>2012-05-29T08:43:46Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/68050/rss"/><entry><id>http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html</id><title type="text">物联网——下一块大蛋糕</title><summary type="text">物联网——下一块大蛋糕作者：一点一滴的Beerhttp://beer.cnblogs.com/前言：写下本文的目的只作一下初步的展望，抛砖引玉，同时抒发一下心中的牢骚。一、物联网系统概述1.1网络发展的历史和趋势 从互联网到物联网。1965年，戈顿摩尔提出他那个著名定律：芯片发展18个月翻一番。人们认为这一预言的速度接近神话。如今在计算机网络领域这个定律不仅兑现，而且实际上互联网的用户数量已接近指数增长趋势，根本不用18个月就会翻一番。保守地预测也认为2012年互联网用户数将超过18亿，占到全球总人口的30左右。 互联网用户无非就是人口，在计算科技与网络技术发展的今天，智能化以无与伦比的迅..</summary><published>2012-02-05T17:45:00Z</published><updated>2012-02-05T17:45:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 22pt;"&gt;&lt;span style="font-family: 宋体;"&gt;物联网&amp;mdash;&amp;mdash;下一块大蛋糕&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt;"&gt;&lt;span style="font-family: 宋体;"&gt;作者：&lt;/span&gt;&lt;a href="http://beer.cnblogs.com/"&gt;&lt;span style="font-family: 宋体;"&gt;一点一滴的&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;Beer&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Verdana;"&gt;&lt;a href="http://beer.cnblogs.com/"&gt;&amp;nbsp;&lt;/a&gt;&lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;前言&lt;/strong&gt;：写下本文的目的只作一下初步的展望，抛砖引玉，同时抒发一下心中的牢骚。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;一、物联网系统概述&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;1.1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;网络发展的历史和趋势&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;从互联网到物联网。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1965&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年，戈顿摩尔提出他那个著名定律：芯片发展&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;18&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个月翻一番。人们认为这一预言的速度接近神话。如今在计算机网络领域这个定律不仅兑现，而且实际上互联网的用户数量已接近指数增长趋势，根本不用&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;18&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;个月就会翻一番。保守地预测也认为&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2012&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年互联网用户数将超过&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;18&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿，占到全球总人口的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;30&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;左右。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;互联网用户无非就是人口，在计算科技与网络技术发展的今天，智能化以无与伦比的迅猛速度，延展和覆盖下来。每一个有功能的对象都可以成为互联网的连接对象。黑格尔的话，也许终将会改成：存在的，就是上网的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;互联网虽然只进入人类世界短短&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;20&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年，但是已经渐渐成为人们日常生活的信息载体和平台，广泛参与到社会的运行和人们的各种活动中，在学术圈和工业圈孜孜不倦地探求互联网走向的时候，其实还有一条不太显眼的探索主线从没有放弃过，这就是马克维赛尔（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Mark Weiser&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）在互联网刚刚兴起的时候提出的普适计算（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Pervasive Computing&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）。一般认为互联网代表着主流的网络计算模式，把人们的使用吸引在信息空间（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Cyber Space&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）中，主要依赖桌面型计算获取服务与支持，而普适计算则倡导发展可以广泛部署的微小计算设备，并在此基础上实现透明和智能计算服务，又称为不可见计算（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Invisible Computing&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）。如果说互联网计算此前一起崇尚人围绕着网络进行，那么普适计算则主张让微小系统形成的网络围饶着人运转。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;普适计算的提出也是考虑到小型化或微型化成为计算机的发展趋势，各种小型计算设备如掌上电脑、智能手机、传感器、射频标签等崭露头角。同时，无线技术的运用也使移动计算变得日益成熟和普及。在这种趋势下，人们开始尝试突破桌面计算的模式，将计算和互联技术普及到日常生活中。普适计算的目的是日常生活的各种环境和场景中广泛部署微型化且具备一定计算能力的普适设备，并与已有的互联网技术结合，实现移动、无缝、透明和泛在的计算支持和服务。普适计算是人们摆脱计算设备对人类活动的束缚，将互联网推广到物理世界的初步尝试。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;由于普适计算设备大多是互联网上已有的各种计算系统的延伸和拓展，扮演探测和感知的角色，智能化程度相对较低；而服务对象主要是个体，如移动互联、家居、医疗、导游等，找不到真正穿透国民经济发展的突破点，很快沦落到一个尴尬的地位；每个人看了演示都觉得不错，但哪一个应用也没能大规模推广。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;无线传感网络（简称&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;传感网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）作为普适计算的一个实际延伸，数年前被美国加利福尼亚大学伯克利分校的戴维卡勒（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;David Culler&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）掀起一阵热潮之后，大鸭岛、斑马网、金门大桥监控、火山与泥石流、青岛海洋、精准农业、煤矿救援以及林业生态监控，一系列概念系统纷纷走进人们的视野。作为人们对物理世界进行有效感知和探测的手段，传感器早已开发、研究和使用了超过&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;100&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年；但是把传感器组成网络，形成智能化的自我协同、自我定位则是一个巨大的进步。在一个传感网中，大量的传感器等微型化计算设备自组织地连接在一起，将计算和服务从满足个人需要进一步延伸到制造、运输、能源、环境和建筑等国民经济生产领域，适应人们对探索、利用和管理物理世界的需求。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;另一方面，现实中，国民经济的发展对信息系统早已提出了更高的需求。在过往国民经济的各主要领域，物理基础设施和信息基础设施的建设往往是分开进行的。一方面人们不断地建设和完善周围的物理世界，如机场、公路、建筑物、交通工具等；另一方面，人们也在不遗余力地发展包含数据中心、个人计算机、宽带网络等的信息世界。两者是如此地割裂为两个次元。但现代经济的发展显然开始要求将计算技术拓展到整个人类生存和活动的空间，将人类的物理世界网络化、信息化，实现物理世界与信息系统整合统一。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;2011&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;月&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;28&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;日，美国总统奥巴马与美国工商业领袖举行的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;圆桌会议&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;上，对&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IBM&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;提出的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;智慧地球&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;概念给予了非常积极的回应：&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;经济刺激资金将会投入到宽带网络等新兴技术中去，毫无疑问，这就是美国在&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;21&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;世纪保持和夺回竞争优势的方式。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;""&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;智慧地球&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;主张更透彻的感知，更全面的互联互通和更深入的智能化。联网宽带进行升级、对公共建筑进行节能改造等内容。这个举措也使得物联网概念一举登上了网络大舞台。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网理理念的出现应该首先归功于物流系统的现代化需要。现代物流系统希望利用信息生成设备，如无线射频识别（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Radio Frequency Identification,RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）、传感器以及全球定位系统等种种装置与互联网结合起来而形成一个巨大的网络。类似于条形码这种自动识别技术（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Auto-ID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;），就是物联网的最初应用。除了物流领域，物联网还可以广泛应用在道路、交通、医疗、能源、家用电器监控等各个领域。物联网的发展要求将新一代信息化技术充分运用在各行各业之中，具体地说，就是把诸如感应器、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;标签等信息化设备嵌入和装备到电网、铁路、桥梁、隧道、公路、建筑、供水系统、大坝、油气管道、商品、货物等各种物理物体和基础设施中，甚至人体里，将它们普遍互联，并与互联网连接起来，形成&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。值得注意的是，物联网这个概念虽然来自于物流行业的需要，但是把它局限在物流领域里就显得视野狭窄了。当人们仔细审视这个概念的时候，忽然惊讶于它深远内涵：物联网无疑做到了十几年来人们一直想做的无线与有线在互联网上的有机融合；而潜在用户群一旦拓展到地球上所有的物体，摩尔定律竟然巧妙地继续有效了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在这种意义上来说，下一代互联网的发展远景立刻明晰起来。人们可以大胆假设下一代互联网将是物联化的互联网，或者称之为&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;大物联网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。大物联网不仅局限于目前互联网中信息系统和设备的连接与组合，还将继续和极大地拓展大型计算、桌面计算、普适计算、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;CPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;、物联网、云等计算模式的应用范畴，彻底地整合物理世界与信息系统，为未来人类建设统一的赖以生存的智能化环境。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;1.2&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联网简介&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的定义：通过射频识别（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）、红外感应器、全球定位系统（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）、激光扫描器等信息传感设备按约定的协议，把全体物品与互联网连接起来，进行信息交换和通信，以实现智能化识别、定位、跟踪、监控和管理的一种网络。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;从宏观的概念上讲，未来的物联网将使人转向于无所不在的网络之中，在不知不觉中，人可以随时随地与周围的人或物进行信息的交换，这时物联网也等同于泛在网络，或者说未来的互联网。物联网、泛在网络、未来的互联网，它们的名字虽然不同，但表达的都是同一个愿景，那就是人类可以随时随地使用任何网络联系任何人或物，达到信息自由交换的目的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;全面感知、可靠传送、智能处理是物联网的基本特征。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;全面感知&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;是指利用&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;、二维码、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;、摄像头、传感器、传感器网络等感知、捕获、测量的技术手段，随时随地对物体进行信息采集和获取。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;可靠传送&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;是指通过各种信息网络与互联网的融合，将物体接入信息网络，随时随地进行可靠的信息交互和共享。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;智能处理&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;是指利用云计算、模糊识别等各种智能计算技术，对少量的跨地域、跨行业、跨部门的数据和信息进行分析处理，提供对物理世界、经济社会各种活动和变化的洞察力，实现智能化的决策和控制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在这个网络中，物品（商品）能够彼此进行&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;交流&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，而无须人的干预。其实质是利用射频自动识别（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）、传感器网络、无线通信等智能化采集技术，通过互联网实现物品（商品）的自动识别和信息的互联与共享。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;概念的问世，打破了之前的传统思维。过去的思路一起是将物理基础设施和&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IT&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;基础设施分开：一方面是货物、交通、建筑，另一方面是数据中心电脑、宽带、移动网络等。而在&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;时代，物品的流动将与芯片、宽带整合为统一的基础设施，在此意义上，物联网基础设施更像是一块新的地球工地，世界的运转就在它上面进行，其中包括经济管理、生产运行、社会管理乃至个人生活。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;具体地说，就是把感应器嵌入和装备到电网、铁路、桥梁、隧道、公路、建筑、供水系统、大坝、油气管道等各种物体中，通过现有的互联网整合起来，实现人类社会与物理系统的整合。在这个整合的网络当中，存在能力超级强大的中心计算机群，能够对整个网络内的人员、机器、设备和基础设施进行实时的管理和控制。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的关键不在&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，而在&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。物联网实际上指的是在网络的范围之内，可以实现人对人、人对物以及物对物的互联互通，在方式上可以是点对点，也可以是点对面或面地点，它们经由互联网，通过适当的平台，可以获取相应的资讯或指令。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;当某一数字化的物体需要补充电能时，它可以通过网络搜索到自己的供应商，并发出需求信号，当收到供应商的回应时，能够从中寻找到一个优先方案来满足自我需求。而这个供应商，即可以由人来控制，也可以由物控制。这样的情形类似于人们现在利用的搜索引擎进行查询，得到结果后再进行处理一样。具备了数据处理能力的传感器，可以根据当前的善作出判断，从而发出供给或需求信号，而在网络上对这些信号的处理，成为物联网的关键所在。仅仅将物连接到网络，还远远没有发挥出它最大的威力。网的意义不仅是连接，更重要的是交互，以及通过互动学生出来的种种可利用的特性。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的精髓不仅是对物实现连接和操控，它通过技术手段的扩张，赋予网络新的含义，实现人与物、物与物之间的相融与互动，甚至是交流与沟通。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网正在以超越&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;爆炸&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的速度发展，如果我可以用一个豪迈的句子来结束这些小小探讨的时候，我（刘云浩）想说：&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;&lt;strong&gt;既然每个尘埃将有一个独立的地址，现在我们可以认真地考虑把它们连起来了。&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;1.3&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联网主要的应用&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;智能家居、智能医疗、智能城市、智能环保、智能交通、智能司法、智能农业、智能物流、智能校园、智能文博、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;M2M&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;平台、油田智能监控。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;1.4&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;前景展望&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;有不少&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IT&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;专家、经济学家、企业家和政府官员都认为，&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;物联网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;与&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;互联网&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的创新整合，将成为下一轮世界经济发展的技术驱动力。以物联网为代表的信息网络产业成为七大新兴战略性产业之一，成为推动产业升级，迈向信息社会的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;发动机&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。据称到&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2020&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年，全球物物互联的业务与现有人人互联业务之比将达到&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;30&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，物联网的大规模普及，将成为一个万亿美元级的产业。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;条码的普及花了&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;30&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年时间，&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;要完全达到条码的应用程度，还需要&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;20&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年左右的时间。物联网的普及需要大约&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;20&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年的时间。但应用的发展是伴随着技术的成熟而逐渐应用到各个方面的，并不是在等技术完全成熟以后才会开始应用。在某些领域，物联网将率先展开应用，同时，伴随着技术的进步，会逐渐拓展到我们生活的方方面面。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网被称为继计算机、互联网之后，世界信息产业的第三次浪潮。国际电联曾预测，未来世界是无所不在的物联网世界，到&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2017&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年将有&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;7&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;万亿传感器为地球上的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;70&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿人口提供服务。一方面物联网可以用于提高经济效益，大大节约成本；另一方面可以为全球经济的复苏提供技术动力。目前，美国、欧盟等都在投入巨资，深入研究探索物联网。我国也正在高度关注、重视物联网的研究，工业和信息化部门会同有关部门，在新一代信息技术方面正在开展研究，以形成支持新一代信息技术发展的政策措施。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;二、物联网的结构&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网形式多样、技术复杂、牵涉面广。根据信息生成、传输、处理和应用的原则，可以把物联网分为五层：感知识别层、数据通信层、网络互联层、管理服务层和综合应用层。物联网各层之间既相对独立又联系紧密。在综合应用层以下，同一层次上的不同技术互为补充，适用于不同环境，构成该层次技术的全套应对策略。而不同层次提供各种技术的配置和组合，根据应用需求，构成完整解决方案。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;感知识别层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;感知识别层主要是负责数据的产生层面。这一层次是由无数的物品标识和信息采集设备构成。所涉及的技术主要是信息采集相关技术：条码技术、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;（射频识别）技术、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;（全球定位系统）技术、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GIS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;（地理信息系统）技术。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.1.1 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;条码技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;20&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;世纪&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;40&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年代，由美国两位工程师研究出用于食品项目的代码及相应的自动识别设备，这标志着条码的诞生。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;70&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年代左右，条码得到真正的应用和发展。目前世界上各个国家和地区已普遍使用条码技术，并逐步渗透到了许多技术领域。目前和普通百姓联系最紧密的恐怕就是超市购物的条码系统了。条码技术就是最简单的物品标签（非电子标签，但是可以通过电子设备读取）。通过条码读取设备，可以很便捷读取到物品的相关信息。目前在一维码的基础上，人们已经逐步发展出更有用的二维码其它高维码。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;使用条码技术的优势就是技术门槛低，投资少，设备维护费用低等等，所以在简单的应用领域如超市零售业仍然发挥着重大的作用。这一技术应该还是成为将来小规模的民用物联网感知识别层的主流技术。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.1.2 RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;射频识别技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;射频识别技术是通过射频信号识别目标对象并获取相关数据信息的一种非接触式的自动识别技术。与传统的条码相比，射频识别是一种电子标签（具有电磁特性），并具有如下优势：非接触式数据读写、开关容易小型化和多样化、环境适应性强、可重复使用、穿透性强、数据的记忆容量大、安全性高等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在对现实生活中的事物进行大规模的管理时，我们最常规的想法就是对它们进行分类管理。笔者曾经在国家电网旗下的一家三产公司实习过，里面一位同事给我描述过这样的场景：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;近年，国家电网公司全面推进"三集五大"体系建设。推进人财物集约化管理和"大规划、大建设、大运行、大检修、大营销"体系建设。里面的财物集约化管理就涉及到用电设备的全国统一招标、统一采购，这就需要强大的物流管理系统。我们公司目前刚刚开发出一项RFID技术，将成百上千的电能表放在一个大箱子里面，无需进行拆封，使用我们的设备只需要几秒钟的时间进行一次扫瞄，就可以准确获得里面每一个设备的电子标签所带的信息。这对于国家电网在财物集约化管理的影响是极其巨大的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;将RFID技术引入到物联网的感知识别层，可以很好地实现从"精细管理"到"集约管理"的转变，将极大提高数据采集效率。这对于大规模的终端管理是很有帮助的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;随着RFID或类RFID技术的不断发展，我们可以构想以下场景：对于一个上百层、成千上万间办公室的写字楼，我们使用一个一架直升机"航拍式扫描"，就可以获取我们相关信息；在生物学上，我们在人体里面安装各种生物芯片，通过扫描实现"一秒钟体检"&amp;hellip;&amp;hellip;不过，上面描述的那些场景都离我们太遥远，我们可以触及到的比较近的，就是楼宇、小区、交通网、电网、生态网等等这些系统，还是大有作为的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.1.2 GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;1973&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年美国国防部协同有关军方机构共同研究开发新一代的卫星导航系统，就是&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;授时与测距导航系统&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;/&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;全球定位系统（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Navigation System Timing And Ranging/Global Positioning System,NAVSTAR/GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;），简称全球定位系统（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1994&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;系统基本建成，成为全球共享空间信息资源，是空间信息系统的一个重要组成部分。从&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1973&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年至今，美国政府还在不断地研究和更新&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的软硬件设备，累计耗资走过&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;200&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿美元。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的最终目标是建立&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;智慧地球&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，那么在地球上，每个物体都有一个基本的属性，主是地理位置。就像在社会上，不同的人都有它的基本属性，就是社会职位，不同的职位具有不同的权力和义务。通过对物体的地理位置的获取，可以方便对物体进行实时跟踪，以及以其影响范围的计算等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;GPS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;有静态应用和动态应用。静态应用则是为一些位置固定的基础设施进行定位，然后录入到永久数据库中，然后进行和位置相关的计算和管理，例如：电网中的变电站，杆塔等基本的用电设备的管理。动态应用则是对移动的物体进行位置实时定位，然后进行相应的跟踪，例如：物流系统中物品配送，车辆管理系统中对车辆的跟踪。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.1.2 GIS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;技术&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;地理信息系统（&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Geographic Information System&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GIS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;）是以地理空间数据为基础，采用地理模型分析方法，适时地提供多种空间的和动态的地理信息，是一种为地理研究和地理决策服务的计算机技术系统。其主要特征是存储、管理、分析与位置有关的信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在物联网系统中，&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GIS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;平台可以说是一个数据集成平台。将所有的终端设备都进行集成管理，让这些海量数据以形象的方式展现出来，提高系统动作效率、方便工作人员管理和决策。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.2&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;数据通信层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;通信方式主要是有线通信和无线通信。有线通信技术：今后以光纤通信为主；无线通信技术：&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;GSM&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;移动通信、、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;CDMA&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;移动通信、&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;3G&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;移动通信、集群通信技术、数字微波通信技术、卫星通信技术、短距离无线通信技术等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;通讯的对象包括：平行级通信和上下级通信。平行级通信主要是设备和设备之间的数据交流；上下级通信主要是数据的上下流通，包括下级数据向管理层传送和上级指令向下传输。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.3&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;网络互联层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在网络互联层涉及的技术有：&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IPv6&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;技术、组网技术。&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IPv6&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;可以为每个物体提供一个固定网络地址，组网技术而将这些物体连接进来。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;网络按照传输方式可以分为有线网和无线网。按照区域划分可以分为局域网、城域网、广域网和&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Internet&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;互联网。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;只有将所有的物体通过网络连接起来之后，我们才能够说：物联网的基础设施已经建成了，下面就是管理、运行和应用了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.4&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;管理服务层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;主要是收集设备终端的数据并对下属设备进行人工或者自动的指令下达。这一层次涉及到数据库建设、海量数据存储、搜索引擎、物联网智能决策、信息安全和隐私保护等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;2.5&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;综合应用层&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在物联网的基础设施建成并完成海量数据库建设之后，再往上就是综合应用层了。物联网在不同行业有着不同的应用，主要涉及的行业有：电力、交通、物流、建筑、环境等等。针对不同的行业铺设不同的传感器，组建不同的网络（或者最后成为大一统的互通网络），在海量数据的基础上开发出各式各样的应用程序来解决各种行业内部的问题。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如今嵌入式操作系统正进行着蓬勃地发展，各种搭载小型操作系统的智能设备开始大规模进入到工业和民用领域。嵌入式操作系统的推广，使得开发针对设备的应用程序的门槛降低了很多很多，这又极大地促进了嵌入式设备的应用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;随着各种操作系统中的浏览器地不断更新发展，跨平台的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Web&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;应用程序也逐渐发挥着越来越大地作用，结合&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;云计算&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的概念，将来只要一台连网的设备就可以从&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;云端&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;获得它想要的服务并执行相关动作，同时本地设备可以上传相关数据进入&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;云端&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;"&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;实现数据共享互通。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;三、物联网的产业链&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;一旦物联网开始大规模地推进，那么将带来一条相当可观的产业链。物联网是集基础设施建设和产品服务于一体的大系统。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的基础就是传感网。这需要大规模的布设传感器，这里面涉及的厂家和公司有传感器研发公司、移动设备研制公司、网络通信公司、工程建设公司等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网需要制定统一的标准。这块领地可以分给科研单位和高校及一些物联网大公司。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;数据的高效采集和高效利用。涉及到数据的搜索和挖掘分析，这时传统的软件公司和互联网公司都可以成功进入此领地，通过对数据的提炼分析，然后为指定的人群提供相应的服务。这一层次是属于高级应用层次。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;总之，当物联网形成规模后，就可以形成一个比较良好的产业生态流水线，流水线上各机构各司其职，共同分享这块蛋糕。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;四、物联网营利模式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.1&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;基础设备制造&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网的数据采集端是由无数的传感器和智能终端组成，这就需要大量的电子设备。因为这些设备还需要连接网络，所以对其智能化程度提出了一定的要求。在这一环节中，基础设施的投入为基础设备制造商提供了巨大的市场。这些制造商包括：&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;RFID&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设备制造商、传感器制造商、嵌入式终端设备制造商等等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.2&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;工程建设项目&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;因为物联网系统涉及到巨大的基础设施建设。所以本行业肯定会产生一些类似于土木建筑那样的工程公司，以竞标投标的方式进行工程承接和建设，营利模式和目前的工程类公司类似。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.3&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;通讯服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;如果是物联网的网络是采用公网，那么则一环节的营利则被国内几大网络运营商所瓜分了。但是如果建立局域网，那么这一产业可以催生出部分提供局域网络通讯服务的运营商，专门负责"物与物"之间的通信连接和维护的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.4&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;数据服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在信息化时代，一切都是数据，数据就是一切。人类每天都在产生数据，以目前互联网所构成的信息世界为例子来进行描述。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2005&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年，谷歌&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;CEO&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;埃里克&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;&amp;middot;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;施密特估算互联网包含&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;5*10&lt;sup&gt;9&lt;/sup&gt;GB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;数据。另所&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;IDC International Data Corporation&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;报告，全球&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2007&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年产生的数据量为&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;281*10&lt;sup&gt;9&lt;/sup&gt;GB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;；到&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2008&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;年底，全球数据内容的问题激增为&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;487*10&lt;sup&gt;9&lt;/sup&gt;GB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。作为对比，美国国会图书馆的存书大致相当于&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;2*10&lt;sup&gt;4&lt;/sup&gt;GB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;；而《四库全书》，包含&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;79337&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;卷，&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;36000&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;余册，汉字约&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;8&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿字，全文本大约&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;1.6GB&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;数据构成了这个世界，数据的产生来自于这个世界，对数据进行正确的分析可以让我们更加了解这个世界。目前很多互联网公司都在进行收据分析和数据挖掘，目的就是为了从用户不经意的网络足迹来对用户习惯或者社会行业趋势进行分析等等，用户的习惯和社会行业趋势对于企业或者国家进行重大决策具有重要的参考价值，产生的商业价值和社会价值自然不言而喻。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;由物联网终端产生的数据可以向广大的应用程序开发商开放，然后应用程序开发商通过这些数据营利后，再进行相应的利润反馈。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.5&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;广告服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;物联网会由终端设备产生大量的数据，对这些数据进行合理分析就有了有用的分析结果，然后就会有相应的用户群体，有了用户群体自然就有了广告群体，于是类似于目前已经成熟的互联网领域的营利模式就浮出水面了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在互联网领域，目前最直接最有效的营利模式估计就是网络广告了。同样，当物联网的传感器遍布到我们生活中的角角落落的时候，我们的广告位出伸向了世界的角角落落了。而且每个传感器都会配备一定的智能终端，这些终端都有特定的应用场景、特定的位置、特定的使用群体，于是投放的广告也更具有针对性。而且这些终端联网后，广告的投放将变得更加迅捷，广告的维护费用也大大降低。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: Times New Roman;"&gt;4.6&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;其它营利方式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;目前还没有想到，但是综合目前的一些大的互联网公司如&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Google&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;和腾讯的发展历程来看，只要用户数量有了，将来总会慢慢想到比较好的营利模式的。所以，可以先走一步看一步，相信总会有比较好的解决方法的。试想，一个触及到人类现代社会生活方方面面的传感网络，怎么可能找不到比较好的营利模式呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;四、已经发生的未来&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;&amp;mdash;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;移动互联网&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;这一节的标题是借用的以前看过的一本书的书名《已经发生的未来》。关于科技的趋势，很多时候都是可预测的，而且这些预测其实也不算是预测，因为它们已经逐渐在我们的生活当中发生了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;目前互联网领域内部处于风头浪尖的应该是"移动互联网"了。其实根据前面的描述，大家可以认为移动互联网是物联网的一种简单模式而已。它是以智能移动设备作为感知层，以人为中心产生数据，并通过无线网络接入公网并与&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;PC&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;等传统连网设备进行互联。也就是说它是一个极大地利用了现有的基础设施的简单物联网系统，只是目前的终端操作和数据产生源的主体还是人（在物联网系统内部，产生数据的主体是设备）。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;移动互联网和传统的物联网有区别也有联系，所以关于物联网的运维模式可以参考移动互联网的运维模式。由于目前移动互联网也是处于蓬勃发展的时期，关于其运营模式很多也是正处于探索之中，所以物联网运营模式更加需要我们的等待和探索。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;五、我们能做些什么&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;前面说了那么多的营业模式，带有物联网的那么多应用领域，其实想想，好多地方都被目前的几大企业给垄断了，对于民营企业来说太难插足进去了，更不用说那些小型的民营企业了。那么对于千千万万的没有太多社会资源的小企业来说，我们能做些什么呢？&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;从目前中国的社会各行各业来看。电力行业由电力部门掌管，交通行业由交通部门把控，通讯行业由几大巨头垄断，环境行业的门槛太高，测绘行业对生产资料需求太大，放眼望去，几乎无立足之地。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;我去过一些国家电网投资的称为"三产"的子公司里面实习过，国家电网虽然有大的工程去向社会公开招标，但是具有竞标门槛太高，入围竞争的公司就被强行淘汰得只剩下少数几家，然后再加上这种"嫡系"的子公司参与竞标，结果可想而知了。而且国企里面还涉及到错综复杂的关系网，作为没有太深厚背景的小型企业是很难打入到内部去的。电网如此，我相信像交通、通讯、测绘等行业也同样存在相应的问题吧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;但是多花点心思想想，世界的舞台其实远比上面所罗列的那样大好多好多，总有民营企业的立足之地的。像智能电网、智能交通这类的，普通的民营企业虽然无法取得主导地位，但是却可以在行业重大工程引起的周边产业内求得发展空间。例如设备制造，设备维护，数据服务，应用程序构建等等。术业有专攻，像前面所提到的电网"三产"子公司，即使它能够竞标成功，但是往往项目的工作量和难度都不是它一家能够承担下来的，它往往承担着工程组织和转包的职能，最后项目的实现还是需要众多的民营企业去完成。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;纵观目前国内有名的民营企业，白手起家而且快速崛起的大部分都是互联网公司：百度、阿里、腾讯、网易、新浪等等。它们成就了一个个新时代的神话，比如腾讯的公司愿景就是"要成为互联网的水和电"，因为国家政策的原因它肯定无法成为现实生活的水和电，但是它却可以在互联网这个世界里面尽情地攻城略地。虽然互联网如今也形成了几大巨大各种垄断，各种大规模互相拼杀，同时不给小公司以任何生存发展的空间。但是互联网创业有个好处就是它还算相对比较公平的，不会有太多的政府介入和错综复杂的国企关系网。虽然也会面临被巨头们打压的风险，但是相对于传统的一些国有垄断行业来说，互联网还算是一个相对公平且进入门槛较低的行业，做大做强不容易，但是做小规模和中等规模的互联网站点成功的案例却很多很多。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;不管互联网领域的竞争如何激烈，还有小公司可能面临的考验将有我严重，但是它至少让每个有梦想的人都有参与的机会。我认为，不管做什么事情都需要低调做事，然后慢慢将事情做大做强，但是仍然想尽办法低调行事，直到具有一定规模和扛风险能力之后，我们再扯掉外面那层面纱再来一个华丽的出场，这个时候即使面临外界的打压也应该有相应的对策了吧。物联网领域这块新画的大蛋糕来，中小企业想在这股浪潮中分一杯肯定是不能大张旗鼓地干事，而是要想办法转换思路从小地方做起，毛主席就教导过我们"走农村包围城市的路线"。其实我一直是想从互联网领域开始自己的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;idea&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;的，但是一想到目前互联网领域基本上就是几大巨头在拼杀，像我们这样初进入进去的，虽然可以做到小规模地成功，但是却感觉很难有大地发展前途。因为小规模的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;idea&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;一定发展到一定的规模后，肯定会有大公司来模仿，以大公司的人力、物力、财力，小公司是肯定耗不起的，最后的结果肯定是你的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;idea&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;被别人实现了，这是很悲剧的事情。所以，现在要做的事情就是低调做事，然后经过漫长地坚持，让自己的事业逐渐从底层向上层渗透，直到渗透到别人即使发现了也不能把你怎样的时候，你就基本上可以说是成功了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;毛主席就教导过我们"走农村包围城市的路线"，这一句话应该怎样实现呢？物联网应该为我们提供了一种思路了。现在的互联网公司都是建立在已有的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;PC&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;机和移动智能终端网络上的服务和应用，目前的交战都趋于白热化了，但是关于"物联"领域却还很少有商业公司涉足，所以我们完全可以从这个地方作为切入点向上逐渐渗透。以底层的嵌入式终端设备开始向上层的互联网应用渗透，这是一场"以&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;C&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;语言包围&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Java&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;语言的路线"，"以设备包围服务"的路线。后面的路还好长，好艰难，慢慢走吧，只要坚持，总会有黎明的一天的吧，乐观点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;前段时间看到过一篇文章《马云：下个大机会是物流&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;多数&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;B2C&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;企业将消失》&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://bbs.paidai.com/topic/77385"&gt;http://bbs.paidai.com/topic/77385&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;"五年以前我投资华谊的时候，我判断中国电影五年以内超过&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;100&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿市值，今年中国刚好&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;102&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;亿；十年以前我判断电子商务十年以后一定很大的市场。中国有机会行业很多很多，但是确保这个行业一定会成长、而且成倍数增长的行业并不多。但我觉得物流就是这么一个。""希望十年以后，在中国任何一个地方，人们只要在网上下订单，最多八个小时货物就能送到家，形成真正的农村都市化。这就需要建立一个真正属于二十一世纪的现代物流体系。"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;上面那些马云对"物流"的展望也是物联网的一个典型应用&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;&amp;mdash;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;"智能物流"。目前大的互联网公司已经开始涉足这些产业了，确实是很让人沮丧的一个消息，但是马云也说了这样一句话："今天最成功的物流公司绝大多数不会成为十年后最成功的物流公司，这就是对行业重新洗牌的结果。"他是在激励他公司的员工不要有所畏惧，勇于开拓。同样我也觉得应该用同样的话去和各位有梦想的同志们共勉，不要畏惧，如果因为畏惧而怕做事，最后你连失败的经验都没有，你什么都做不成的。既然发展的环境不是那么顺，那么就好好开动脑子想出路呗。舞台这么大，它一个公司不可能方方面面都能顾及到的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 宋体;"&gt;六、结语&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;--&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;对自己说的一些话&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;上学期找了一个学期的工作，纠结了一个学期，然后最后迎来了寒假，整个寒假自己就整理了这些内容，也不知道这些东西到底是不是胡思乱想。但是现在想想，人最痛苦的时候就是迷茫得一无所措的时候，所以现在为自己先画一张饼，然后今后十年甚至二十年都望着这张饼去努力奋斗吧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;在过去的半年，我经历了基本上所有的毕业生都经历的毕业抉择问题：读博还是工作、国企还是私企、要不要去北上广等等。最后自己选择了武汉光谷的一家民营企业。在私企别的不确定，但是辛苦却是肯定的，加上和那些出于安逸和稳定考虑的同学的对比，自己愈发地出现对未来的丝丝恐惧。因为自己不了解，不了解自己的真实需求也不了解自己即将迎来的生活。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;签约的对象是武昌光谷的一家从事楼宇用电相关设备的研发和生产的单位，今后从事嵌入式软件开发。回想自己近几年在学校的学习经历：一年的嵌入式开发、一年的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;WebGIS&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;开发、一年的&lt;/span&gt;&lt;span style="font-family: Times New Roman;"&gt;Web&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;三维网络控制实验室的学习和开发。觉得自己不好好利用物联网这个系统把这些经历穿起来，有些太不住自己这么耗洒掉的这么多年的青春啊。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;自己在找工作的时候，每次都是笔试都过不了，然后有些笔试要求不高的企业直接去参加面试的时候，面试官说像我这样的人可以去小公司，那种公司需要那种不精但是却涉猎广泛"一人独挡多面"的人。可能带有一些挖苦和讽刺，但是说的也并无道理，所以自己还是老实地找个小企业，慢慢干吧，适合自己就行。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;现在淡定一点吧，自己越来越像"农村包围城市"的感觉了。去了一家规模不算大的民营企业，留在了武汉这个二线城市，从设备研发的技术型工作做起。前面为自己规划的内容看今后有没有机会逐渐实现吧。以小地方小领域作为星星之火点，然后逐步向四周扩展，然后在武汉这个地方攻城略地，最后自己能不能生存下来，就看后面的造化了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;完成这篇文章是自己一个寒假零散地抽时间完成的，思考的时间肯定远不只一个小时，应该可以投上首页了吧，里面技术概述部分大量引用了别人的书本内容，所有本文的定位了仅限于是为自己今后的发展写一个小规划吧。发到首页其实也是想和大家交流一下，我抛破砖来引大家的美玉，希望各位前辈能不吝提点和提醒一下。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;昨天在人人网上看到这样一句话，结合自己这段时间一起出现的闹钟闹不醒的状况，还是蛮有感触的："&lt;span style="font-size: 10pt;"&gt;每天叫醒自己的不是闹钟，而是伟大的梦想&lt;/span&gt;"，今天就画好一个大大的蛋糕，希望今后的日子，自己每天能够想着这个蛋糕而高高兴起床，然后斗志昂扬地过好每一天。与各位在奋斗的路上的朋友共勉。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Times New Roman;"&gt;2012-2-6 &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;于武汉珞珈山&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;table style="border-collapse: collapse;" border="0"&gt;&lt;colgroup&gt;&lt;col style="width: 568px;" /&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: solid black 0.5pt;"&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;参考书目：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;《物联网基础技术》&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;中国物资出版社&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;任宗伟&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;编著&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;《物联网导论》&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;科学出版社会&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;刘云浩&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;编著&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 8pt;"&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt;"&gt;&lt;em&gt;&lt;span style="font-family: Verdana;"&gt;Author:&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;一点一滴的&lt;/span&gt;&lt;span style="font-family: Verdana;"&gt;Beer&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 8pt;"&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 8pt;"&gt;&lt;em&gt;From:&lt;a href="http://beer.cnblogs.com/"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 8pt;"&gt;&lt;em&gt;&lt;span style="font-family: Verdana;"&gt;Notes:&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Verdana; font-size: 8pt;"&gt;&lt;em&gt;Time:&lt;/em&gt;&lt;/span&gt; &lt;span style="font-family: Verdana; font-size: 8pt;"&gt;&lt;em&gt;2012-2-6&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html"&gt;http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html#&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/2339486.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2012/02/06/2339486.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2011/09/02/2163219.html</id><title type="text">WinCE平台下BMP转JPG代码备份</title><summary type="text">这大概是一年前做的事情了，当时的项目要求在WinCE平台下BMP转JPG，然后自己折腾了好几个月才终于搞定，现在时间过去了快一年了，估计自己今后再也不会碰WinCE相关的东西了吧，而且也准备把相关的学习笔记和代码项目全部删除掉。这些没有经过整理过的东西，放在电脑上也是垃圾，还不如整理一下，放到网上，让有需要的同学借鉴参考一下吧。开发环境：VS2005开发平台：EPC6960 WinCE开发板主要目标：在WinCE平台下完成BMP图片转JPG实现方法：使用C++编写转换的DLL文件，使用C#编写界面，然后调用DLL代码涉及知识点：1.DLL的创建。2.函数传入参数，传出参数。3.位图格式。4..</summary><published>2011-09-01T16:48:00Z</published><updated>2011-09-01T16:48:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2011/09/02/2163219.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2011/09/02/2163219.html"/><content type="html">&lt;p&gt;这大概是一年前做的事情了，当时的项目要求在WinCE平台下BMP转JPG，然后自己折腾了好几个月才终于搞定，现在时间过去了快一年了，估计自己今后再也不会碰WinCE相关的东西了吧，而且也准备把相关的学习笔记和代码项目全部删除掉。这些没有经过整理过的东西，放在电脑上也是垃圾，还不如整理一下，放到网上，让有需要的同学借鉴参考一下吧。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开发环境：&lt;/strong&gt;VS2005&lt;/p&gt;&lt;p&gt;&lt;strong&gt;开发平台：&lt;/strong&gt;EPC6960 WinCE开发板&lt;/p&gt;&lt;p&gt;&lt;strong&gt;主要目标：&lt;/strong&gt;在WinCE平台下完成BMP图片转JPG&lt;/p&gt;&lt;p&gt;&lt;strong&gt;实现方法：&lt;/strong&gt;使用C++编写转换的DLL文件，使用C#编写界面，然后调用DLL&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码涉及知识点：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.DLL的创建。&lt;/p&gt;&lt;p&gt;2.函数传入参数，传出参数。&lt;/p&gt;&lt;p&gt;3.位图格式。&lt;/p&gt;&lt;p&gt;4.位图的位运算及格式转换。&lt;/p&gt;&lt;p&gt;5.文件操作。&lt;/p&gt;&lt;p&gt;6.DLL的调用&lt;/p&gt;&lt;p&gt;7.&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、图片格式转换的DLL项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;//****************************&lt;/p&gt;&lt;p&gt;//**WinCeCppCamDll项目&lt;/p&gt;&lt;p&gt;//**本项目中引用了 开发板公司提供的摄像头驱动DLL文件一个&lt;/p&gt;&lt;p&gt;//****************************&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.1导入和引用DLL中的参数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EpcsCam.h&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt;*  对应CAM_IOCTL_SAMSUNG_CAM_PR，打开RGB通道后，从uiRGB_Addr中获取视频图像数据，注意访问uiRGB_Addr时，&lt;br/&gt;*  必须采用内核模式(kernel mode)，使用函数 SetKMode(TRUE)，并在读取uiRGB_Addr后设置flag = 0, 如果有下&lt;br/&gt;*  一帧数据来时，底层会将flag设为1，并设置uiRGB_Addr。这样方便读取每一帧数据&lt;br/&gt;*/&lt;br/&gt;typedef struct __PINGPONG_PR&lt;br/&gt;{&lt;br/&gt;unsigned int  uiRGB_Addr;&lt;br/&gt;unsigned char flag;                                            /* 为1时候，视频数据有效        */&lt;br/&gt;} PINGPONG_PR;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt;*  对应CAM_IOCTL_SAMSUNG_CAM，打开YUV通道后，从uiY_Addr, uiCb_Addr, uiCr_Addr中获取视频图像数据，注意访&lt;br/&gt;*  问三个地址时，必须采用内核模式(kernel mode)，使用函数 SetKMode(TRUE)，并在读取地址数据后设置flag = 0,&lt;br/&gt;*  如果有下一帧数据来时，底层会将flag设为1，并设置YUV三个地址值。这样方便读取每一帧数据&lt;br/&gt;*/&lt;br/&gt;typedef struct PINGPONG&lt;br/&gt;{&lt;br/&gt;unsigned int uiY_Addr;&lt;br/&gt;unsigned int uiCb_Addr;&lt;br/&gt;unsigned int uiCr_Addr;&lt;br/&gt;unsigned char flag;&lt;br/&gt;} PINGPONG;&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt;*  此结构体用于设置视频输出图像的大小，视频输出包含两个通道：RGB通道和YUV通道，其中RGB通道为RGB565数据&lt;br/&gt;*  格式，视频预览的时候使用RGB通道&lt;br/&gt;*/&lt;br/&gt;typedef struct __IMAGE_SIZE&lt;br/&gt;{&lt;br/&gt;DWORD dwRGB_Width;                                                  /* RGB 通道的输出图像的宽度     */&lt;br/&gt;DWORD dwRGB_Height;                                                 /* RGB 通道的输出图像的高度     */&lt;br/&gt;DWORD dwYUV_Width;                                                  /* YUV 通道的输出图像的宽度     */&lt;br/&gt;DWORD dwYUV_Height;                                                 /* YUV 通道的输出图像的高度     */&lt;br/&gt;DWORD dwHorOffset;                                                  /* 视频源的水平剪切偏移         */&lt;br/&gt;DWORD dwVerOffset;                                                  /* 视频源的垂直剪切偏移         */&lt;br/&gt;} IMAGE_SIZE;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;typedef BOOL(*pEpcCamCapture)(BOOL bIsRGB, BOOL bIsYUV);&lt;br/&gt;typedef BOOL(*pEpcCamPreviewOn)(DWORD dwXSize, DWORD dwYSize);&lt;br/&gt;typedef BOOL(*pEpcCamSetImage)(IMAGE_SIZE* pImageSize);&lt;br/&gt;typedef BOOL(*pEpcCamGetRgbFrame)(PINGPONG_PR *prAddInfo);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;class EpcsCam&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;EpcsCam(void);&lt;br/&gt;public:&lt;br/&gt;~EpcsCam(void);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;HINSTANCE hDLL;//载入DLL的实例句柄&lt;br/&gt;char *pBmpData;&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamCapture&lt;br/&gt;** Descriptions:    本函数用于打开或者关闭Camera的视频捕获，如果bIsRGB和bIsYUV为FALSE即为关闭视频捕获，&lt;br/&gt;**                          bIsRGB和bIsYUV其中任一个为TRUE，即为打开视频捕获&lt;br/&gt;** input parameters:       bIsRGB  为TRUE时候打开RGB通道，为FALSE的时候关闭RGB通道&lt;br/&gt;**                          bIsYUV  为TRUE时候打开YUV通道，为FALSE的时候关闭YUV通道&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamPreviewOn&lt;br/&gt;** Descriptions:    本函数用于启动预览图像，当启动视频捕获(打开RGB通道)后, 即可看到图像显示效果&lt;br/&gt;**                          建议启动预览时，设置图像的分辨率小于显示屏的分辨率&lt;br/&gt;**                          注意，有以下情况将操作失败：1、全屏模式下，2、RGB通道图像设置值大于360*288个象素&lt;br/&gt;** input parameters:       dwXSize:  预览图像的X坐标（以LCD的左上角为原点，可以为负值）&lt;br/&gt;**                          dwYSize:  预览图像的Y坐标（以LCD的左上角为原点，可以为负值）&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamSetImage&lt;br/&gt;** Descriptions:    本函数用于设置Camera输出图像的大小, 包含RGB通道和YUV通道的视频输出大小&lt;br/&gt;**                          打开该接口驱动后，RGB和YUV图像大小默认为320*240&lt;br/&gt;**                          注意，有以下情况将操作失败：1、正在视频捕获，2、打开预览，3，正在全屏模式&lt;br/&gt;** input parameters:       pImageSize: 用于设置两个通道的视频输出大小&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamGetRgbFrame&lt;br/&gt;** Descriptions:    本函数用于获取RGB通道的图像的数据缓存区地址&lt;br/&gt;** input parameters:       prAddInfo 存放获取的地址，注意访问该地址的图像数据时候使用SetKMode(TRUE)&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;BOOL epcCamCapture (BOOL bIsRGB, BOOL bIsYUV);&lt;br/&gt;BOOL epcCamPreviewOn (DWORD dwXSize, DWORD dwYSize);&lt;br/&gt;BOOL epcCamSetImage (IMAGE_SIZE* pImageSize);&lt;br/&gt;BOOL epcCamGetRgbFrame (PINGPONG_PR *prAddInfo);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;};&lt;br/&gt;&lt;/div&gt;&lt;p&gt;EpcsCam.cpp&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "StdAfx.h"&lt;br/&gt;#include "EpcsCam.h"&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamCapture&lt;br/&gt;** Descriptions:    本函数用于打开或者关闭Camera的视频捕获，如果bIsRGB和bIsYUV为FALSE即为关闭视频捕获，&lt;br/&gt;**                          bIsRGB和bIsYUV其中任一个为TRUE，即为打开视频捕获&lt;br/&gt;** input parameters:       bIsRGB  为TRUE时候打开RGB通道，为FALSE的时候关闭RGB通道&lt;br/&gt;**                          bIsYUV  为TRUE时候打开YUV通道，为FALSE的时候关闭YUV通道&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamPreviewOn&lt;br/&gt;** Descriptions:    本函数用于启动预览图像，当启动视频捕获(打开RGB通道)后, 即可看到图像显示效果&lt;br/&gt;**                          建议启动预览时，设置图像的分辨率小于显示屏的分辨率&lt;br/&gt;**                          注意，有以下情况将操作失败：1、全屏模式下，2、RGB通道图像设置值大于360*288个象素&lt;br/&gt;** input parameters:       dwXSize:  预览图像的X坐标（以LCD的左上角为原点，可以为负值）&lt;br/&gt;**                          dwYSize:  预览图像的Y坐标（以LCD的左上角为原点，可以为负值）&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamSetImage&lt;br/&gt;** Descriptions:    本函数用于设置Camera输出图像的大小, 包含RGB通道和YUV通道的视频输出大小&lt;br/&gt;**                          打开该接口驱动后，RGB和YUV图像大小默认为320*240&lt;br/&gt;**                          注意，有以下情况将操作失败：1、正在视频捕获，2、打开预览，3，正在全屏模式&lt;br/&gt;** input parameters:       pImageSize: 用于设置两个通道的视频输出大小&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/*********************************************************************************************************&lt;br/&gt;** Function name:   epcCamGetRgbFrame&lt;br/&gt;** Descriptions:    本函数用于获取RGB通道的图像的数据缓存区地址&lt;br/&gt;** input parameters:       prAddInfo 存放获取的地址，注意访问该地址的图像数据时候使用SetKMode(TRUE)&lt;br/&gt;** output parameters:   无&lt;br/&gt;** Returned value:         TRUE:成功;FALSE:失败&lt;br/&gt;*********************************************************************************************************/&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;EpcsCam::EpcsCam(void)&lt;br/&gt;{&lt;br/&gt;hDLL=LoadLibrary(CString("\\FlashDisk2\\epcCameraLib.dll"));//加载动态链接库MyDll.dll文件；&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;EpcsCam::~EpcsCam(void)&lt;br/&gt;{&lt;br/&gt;FreeLibrary(hDLL);//卸载MyDll.dll文件；&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL EpcsCam::epcCamCapture (BOOL bIsRGB, BOOL bIsYUV)&lt;br/&gt;{&lt;br/&gt;BOOL bCaptureSucced=FALSE;&lt;br/&gt;pEpcCamCapture epcCamCapture =NULL;&lt;br/&gt;epcCamCapture=(pEpcCamCapture)GetProcAddress(hDLL,CString("epcCamCapture"));&lt;br/&gt;if (epcCamCapture)&lt;br/&gt;{&lt;br/&gt;bCaptureSucced=epcCamCapture(bIsRGB,bIsYUV);&lt;br/&gt;}&lt;br/&gt;return bCaptureSucced;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL EpcsCam::epcCamPreviewOn (DWORD dwXSize, DWORD dwYSize)&lt;br/&gt;{&lt;br/&gt;BOOL bPreviewOnSucced=FALSE;&lt;br/&gt;pEpcCamPreviewOn epcCamPreviewOn =NULL;&lt;br/&gt;epcCamPreviewOn=(pEpcCamPreviewOn)GetProcAddress(hDLL,CString("epcCamPreviewOn"));&lt;br/&gt;if (epcCamPreviewOn)&lt;br/&gt;{&lt;br/&gt;bPreviewOnSucced=epcCamPreviewOn(dwXSize,dwYSize);&lt;br/&gt;}&lt;br/&gt;return bPreviewOnSucced;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL EpcsCam::epcCamSetImage (IMAGE_SIZE* pImageSize)&lt;br/&gt;{&lt;br/&gt;BOOL bSetImageSucced=FALSE;&lt;br/&gt;pEpcCamSetImage epcCamSetImage =NULL;&lt;br/&gt;epcCamSetImage=(pEpcCamSetImage)GetProcAddress(hDLL,CString("epcCamSetImage"));&lt;br/&gt;if (epcCamSetImage)&lt;br/&gt;{&lt;br/&gt;bSetImageSucced=epcCamSetImage(pImageSize);&lt;br/&gt;}&lt;br/&gt;return bSetImageSucced;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL EpcsCam::epcCamGetRgbFrame (PINGPONG_PR *prAddInfo)&lt;br/&gt;{&lt;br/&gt;BOOL betRgbFrameSucced=FALSE;&lt;br/&gt;pEpcCamGetRgbFrame epcCamGetRgbFrame =NULL;&lt;br/&gt;epcCamGetRgbFrame=(pEpcCamGetRgbFrame)GetProcAddress(hDLL,CString("epcCamGetRgbFrame"));&lt;br/&gt;if (epcCamGetRgbFrame)&lt;br/&gt;{&lt;br/&gt;betRgbFrameSucced=epcCamGetRgbFrame(prAddInfo);&lt;br/&gt;}&lt;br/&gt;return betRgbFrameSucced;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;　&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.2保存位图和保存异常日志等文件操作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;FileOperate.h&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;&lt;br/&gt;class FileOperate&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;FileOperate(void);&lt;br/&gt;~FileOperate(void);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;static void WriteLogMsg(char chLogMsg[]);&lt;br/&gt;static CString GetTimeTag();&lt;br/&gt;&lt;br/&gt;#if 1&lt;br/&gt;&lt;br/&gt;static void WriteBin(char chBin[]);&lt;br/&gt;//根据数据保存图片&lt;br/&gt;static BOOL bmpSaveImage (PTSTR pstrFileName, BITMAPFILEHEADER * pbmfh);&lt;br/&gt;&lt;br/&gt;// 保存位图&lt;br/&gt;static void SaveBitMap(void);&lt;br/&gt;static CString SaveBmp(char *pcBmpData,char *bmpFileData);&lt;br/&gt;static CString SaveBmp0(BYTE *pcBmpData);//C++调用的函数&lt;br/&gt;&lt;br/&gt;#endif&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;static void ImageConvertDemo(&lt;br/&gt;BYTE *pInBmp565Data,//输入的RGB565位图的数据实体部分（不包括文件头等信息）&lt;br/&gt;DWORD dwBitMapDataSize,//位图数据实体长度（不包括文件头等信息）&lt;br/&gt;BYTE **ppOutMallocData,//传出的JPG图片数据实体的指针&lt;br/&gt;DWORD * pdwOutJpegMemSize,//传出的JPG图片数据的大小&lt;br/&gt;int * pState //状态码：记录在执行此函数的过程中可能出现的问题&lt;br/&gt;//char *bmpFileData&lt;br/&gt;);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;};&lt;br/&gt;&lt;/div&gt;&lt;p&gt;FileOperate.cpp&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "StdAfx.h"&lt;br/&gt;#include "FileOperate.h"&lt;br/&gt;&lt;br/&gt;//#include "epccameralib.h"&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#include "initguid.h "//如果不引用此头文件，就会出现 无法解析外部符号的错误&lt;br/&gt;#include "IImageDemo.h"//图片转码测试&lt;br/&gt;&lt;br/&gt;FileOperate::FileOperate(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;FileOperate::~FileOperate(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;void FileOperate::WriteLogMsg(char chLogMsg[])&lt;br/&gt;{&lt;br/&gt;char strFilePath[40] = "\\FlashDisk2\\Log\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。&lt;br/&gt;char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候，要比实际长度多1，作为结尾符号&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;SYSTEMTIME sysTime; &lt;br/&gt;GetLocalTime( &amp;amp;sysTime ); //得到系统时间&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21"&lt;br/&gt;&lt;br/&gt;strcpy(strTimeFileName,"ErrorLog");&lt;br/&gt;strcat(strTimeFileName,".txt");//加上扩展名--登录日志&lt;br/&gt;strcat(strFilePath,strTimeFileName);//得到完整的路径名&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;FILE *fp;//文件指针&lt;br/&gt;&lt;br/&gt;if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西&lt;br/&gt;{&lt;br/&gt;//如果打开不成功，则一般表示没有Log目录&lt;br/&gt;//创建Log目录，然后再重新打开--一般情况下，如果目录存在的话，就不会创建成功的。&lt;br/&gt;if(!CreateDirectory(_T("\\FlashDisk2\\Log"),NULL)) &lt;br/&gt;{ //创建目录失败&lt;br/&gt;//printf("Create Directory failed!\n");&lt;br/&gt;return;&lt;br/&gt;}else &lt;br/&gt;{&lt;br/&gt;//printf("Create Directory succeed!\n");//cout &amp;lt;&amp;lt; "OK" &amp;lt;&amp;lt;endl; &lt;br/&gt;&lt;br/&gt;if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文本文件中写东西&lt;br/&gt;{&lt;br/&gt;//printf("Open Failed\n");&lt;br/&gt;//exit(0);&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;} &lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;char strTimeTag[30];//="2010-09-21"; //将时间转成字符串&lt;br/&gt;sprintf(strTimeTag,"%d-%d-%d  %d:%d:%d  ",sysTime.wYear,sysTime.wMonth,sysTime.wDay,&lt;br/&gt;sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"&lt;br/&gt;&lt;br/&gt;//strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&amp;amp;tim);//年月日时间字符串--作为登录日志中信息的时间标记头&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;fputs(strTimeTag,fp);//写入时间标记&lt;br/&gt;fputs("# ",fp);//分隔符号&lt;br/&gt;fputs(chLogMsg,fp);//写入消息日志&lt;br/&gt;fputs("\n",fp);//换行&lt;br/&gt;&lt;br/&gt;int i=fclose(fp);&lt;br/&gt;&lt;br/&gt;if (i==0)&lt;br/&gt;{&lt;br/&gt;//printf("succeed!\n");&lt;br/&gt;}else&lt;br/&gt;{&lt;br/&gt;//printf("fail!\n");&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;CString FileOperate::GetTimeTag()&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;CString strTimetag;&lt;br/&gt;&lt;br/&gt;SYSTEMTIME sysTime; &lt;br/&gt;GetLocalTime( &amp;amp;sysTime ); //得到系统时间&lt;br/&gt;&lt;br/&gt;strTimetag.Format(_T("%d%d%d-%d%d%d"),sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);&lt;br/&gt;//sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21"&lt;br/&gt;return strTimetag;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#if 1&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;void FileOperate::WriteBin(char chBin[])&lt;br/&gt;{&lt;br/&gt;char strFilePath[40] = "\\FlashDisk2\\Bins\\";//如果是"\\Log\\"则到了当前盘符的根目录下了。&lt;br/&gt;char strTimeFileName[20];//将当前时间转换成字符串---声明字符串长度的时候，要比实际长度多1，作为结尾符号&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;SYSTEMTIME sysTime; &lt;br/&gt;GetLocalTime( &amp;amp;sysTime ); //得到系统时间&lt;br/&gt;//sprintf(strTimeFileName,"%d-%d-%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay);//"2010-09-21"&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;sprintf(strTimeFileName,"%d%d%d-%d%d%d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,&lt;br/&gt;sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"&lt;br/&gt;&lt;br/&gt;strcat(strTimeFileName,".bins");//加上扩展名--登录日志&lt;br/&gt;strcat(strFilePath,strTimeFileName);//得到完整的路径名&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;FILE *fp;//文件指针&lt;br/&gt;&lt;br/&gt;if ((fp=fopen(strFilePath,"wb+"))==NULL)//以追加的形式往二进制文件中写东西&lt;br/&gt;{&lt;br/&gt;//如果打开不成功，则一般表示没有Log目录&lt;br/&gt;//创建Log目录，然后再重新打开--一般情况下，如果目录存在的话，就不会创建成功的。&lt;br/&gt;if(!CreateDirectory(_T("\\FlashDisk2\\Bins"),NULL)) &lt;br/&gt;{ &lt;br/&gt;printf("Create Directory failed!\n");&lt;br/&gt;}else &lt;br/&gt;{&lt;br/&gt;printf("Create Directory succeed!\n");//cout &amp;lt;&amp;lt; "OK" &amp;lt;&amp;lt;endl; &lt;br/&gt;&lt;br/&gt;if ((fp=fopen(strFilePath,"a"))==NULL)//以追加的形式往文件中写东西&lt;br/&gt;{&lt;br/&gt;printf("Open Failed\n");&lt;br/&gt;exit(0);&lt;br/&gt;}&lt;br/&gt;} &lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;char strTimeTag[30];//="2010-09-21"; //将时间转成字符串&lt;br/&gt;sprintf(strTimeTag,"%d-%d-%d  %d:%d:%d  ",sysTime.wYear,sysTime.wMonth,sysTime.wDay,&lt;br/&gt;sysTime.wHour,sysTime.wMinute,sysTime.wSecond);//"2010-09-21"&lt;br/&gt;&lt;br/&gt;//strftime(chTimeTag, sizeof(chTimeTag), "%Y/%m/%d %X",&amp;amp;tim);//年月日时间字符串--作为登录日志中信息的时间标记头&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//fputs(strTimeTag,fp);//写入时间标记&lt;br/&gt;//fputs(" : ",fp);//分隔符号&lt;br/&gt;//fputs(chLogMsg,fp);//写入消息日志&lt;br/&gt;//fputs("\n",fp);//换行&lt;br/&gt;&lt;br/&gt;fputs(chBin,fp);&lt;br/&gt;int i=fclose(fp);&lt;br/&gt;&lt;br/&gt;if (i==0)&lt;br/&gt;{&lt;br/&gt;printf("succeed!\n");&lt;br/&gt;}else&lt;br/&gt;{&lt;br/&gt;printf("fail!\n");&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;// 保存位图--最原来的模型&lt;br/&gt;void FileOperate::SaveBitMap(void)&lt;br/&gt;{&lt;br/&gt;// TODO: Add your control notification handler code here&lt;br/&gt;IMAGE_SIZE        tDispSize = {0};&lt;br/&gt;DWORD             dwPreMode;&lt;br/&gt;PINGPONG_PR       DataAddr;&lt;br/&gt;BITMAPFILEHEADER *pFileHead = NULL;                                 /*  位图文件的头指针            */&lt;br/&gt;BITMAPINFO       *pBmpInfo  = NULL;                                 /*  位图信息的指针              */&lt;br/&gt;char             *pcBmpData = NULL;                                 /*  位图数据区的指针            */&lt;br/&gt;DWORD             dwImgeX;                                          /*  位图水平像素                */&lt;br/&gt;DWORD             dwImgeY;                                          /*  位图垂直像素                */&lt;br/&gt;&lt;br/&gt;DWORD   dwFileHeadSize = sizeof(BITMAPFILEHEADER);                  /*  位图文件的头区域大小        */&lt;br/&gt;DWORD   dwInfoSize     = sizeof(BITMAPINFO) + 4 * 2;                /*  位图文件的信息区大小        */&lt;br/&gt;DWORD   dwBipMapSize;                                               /*  位图文件的数据区大小        */&lt;br/&gt;CString cstrPathname;&lt;br/&gt;&lt;br/&gt;cstrPathname="\\test.bmp";&lt;br/&gt;&lt;br/&gt;dwImgeX = 320;&lt;br/&gt;dwImgeY = 240;&lt;br/&gt;&lt;br/&gt;dwBipMapSize = 2 * dwImgeX * dwImgeY;                               /*  文件头指针指向整个位图的空间 320*240*2/1024 =150K*/&lt;br/&gt;pFileHead = (BITMAPFILEHEADER*)malloc(dwFileHeadSize + dwInfoSize + dwBipMapSize);&lt;br/&gt;pBmpInfo  = (BITMAPINFO *)malloc(dwInfoSize);&lt;br/&gt;&lt;br/&gt;pFileHead-&amp;gt;bfOffBits = dwFileHeadSize + dwInfoSize;                 /*  以下为填充位图的空间        */&lt;br/&gt;pFileHead-&amp;gt;bfSize    = dwFileHeadSize + dwInfoSize + dwBipMapSize;&lt;br/&gt;pFileHead-&amp;gt;bfType    = 0x4D42;&lt;br/&gt;&lt;br/&gt;pcBmpData = (char *) pFileHead + pFileHead-&amp;gt;bfOffBits;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biHeight       = 0 - (signed)dwImgeY;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biWidth        = dwImgeX ;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biBitCount     = 16;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrImportant = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrUsed      = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_BITFIELDS;&lt;br/&gt;//pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_RGB;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biPlanes       = 1;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSizeImage    = dwBipMapSize;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbBlue     = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbGreen    = 0xF8;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbBlue     = 0xE0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbGreen    = 0x07;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbBlue     = 0x1F;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbGreen    = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbReserved = 0x00;&lt;br/&gt;&lt;br/&gt;memcpy((void*)(pFileHead + 1), (void*)pBmpInfo, dwInfoSize);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//最后将RGB565的图片数据全部COPY到pcBmpData中了----这里可以通过读文件的形式将这些数据读上来。!!!!!!&lt;br/&gt;//只需要在此处将那个RGB565的文件用二进制的格式读进来就OK了!!!&lt;br/&gt;CFile hFile;&lt;br/&gt;hFile.Open(_T("\\2010-9-23.bins"),CFile::modeRead);&lt;br/&gt;hFile.Read(pcBmpData,dwBipMapSize);&lt;br/&gt;&lt;br/&gt;bmpSaveImage((PTSTR)cstrPathname.GetBuffer(0), pFileHead);      /*  保存成BMP图片               */&lt;br/&gt;cstrPathname.ReleaseBuffer();&lt;br/&gt;&lt;br/&gt;free(pFileHead);&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;hFile.Close();//关闭文件&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//带参数的保存位图函数&lt;br/&gt;BOOL FileOperate::bmpSaveImage(PTSTR pstrFileName, BITMAPFILEHEADER *pbmfh)&lt;br/&gt;{&lt;br/&gt;BOOL   bSuccess ;&lt;br/&gt;DWORD  dwBytesWritten ;&lt;br/&gt;HANDLE hFile;&lt;br/&gt;&lt;br/&gt;hFile = CreateFile (  pstrFileName, GENERIC_WRITE, 0, NULL, &lt;br/&gt;CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;&lt;br/&gt;&lt;br/&gt;if (hFile == INVALID_HANDLE_VALUE) {  &lt;br/&gt;return FALSE ;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;bSuccess = WriteFile (hFile, pbmfh, pbmfh-&amp;gt;bfSize, &amp;amp;dwBytesWritten, NULL);&lt;br/&gt;&lt;br/&gt;CloseHandle (hFile) ;&lt;br/&gt;&lt;br/&gt;if (!bSuccess || (dwBytesWritten != pbmfh-&amp;gt;bfSize)) {&lt;br/&gt;DeleteFile (pstrFileName) ;&lt;br/&gt;return FALSE ;&lt;br/&gt;}&lt;br/&gt;return TRUE ;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//************************************&lt;br/&gt;// Method:    SaveBmp&lt;br/&gt;// FullName:  FileOperate::SaveBmp&lt;br/&gt;// Access:    public static &lt;br/&gt;// Returns:   CString 位图的名称&lt;br/&gt;// Qualifier: 保存位图&lt;br/&gt;// Parameter: char * pcBmpDataTemp 位图数据区内容&lt;br/&gt;//************************************&lt;br/&gt;CString FileOperate::SaveBmp0(BYTE *pcBmpDataTemp)&lt;br/&gt;{&lt;br/&gt;// TODO: Add your control notification handler code here&lt;br/&gt;IMAGE_SIZE        tDispSize = {0};&lt;br/&gt;DWORD             dwPreMode;&lt;br/&gt;PINGPONG_PR       DataAddr;&lt;br/&gt;BITMAPFILEHEADER *pFileHead = NULL;                                 /*  位图文件的头指针            */&lt;br/&gt;BITMAPINFO       *pBmpInfo  = NULL;                                 /*  位图信息的指针              */&lt;br/&gt;char             *pcBmpData = NULL;                                 /*  位图数据区的指针            */&lt;br/&gt;DWORD             dwImgeX;                                          /*  位图水平像素                */&lt;br/&gt;DWORD             dwImgeY;                                          /*  位图垂直像素                */&lt;br/&gt;&lt;br/&gt;DWORD   dwFileHeadSize = sizeof(BITMAPFILEHEADER);                  /*  位图文件的头区域大小        */&lt;br/&gt;DWORD   dwInfoSize     = sizeof(BITMAPINFO) + 4 * 2;                /*  位图文件的信息区大小        */&lt;br/&gt;DWORD   dwBipMapSize;                                               /*  位图文件的数据区大小        */&lt;br/&gt;CString cstrPathname;&lt;br/&gt;&lt;br/&gt;cstrPathname+="\\FlashDisk2\\bmp\\";&lt;br/&gt;cstrPathname+=GetTimeTag();&lt;br/&gt;cstrPathname+=".bmp";&lt;br/&gt;dwImgeX = 320;&lt;br/&gt;dwImgeY = 240;&lt;br/&gt;&lt;br/&gt;dwBipMapSize = 2 * dwImgeX * dwImgeY;                               /*  文件头指针指向整个位图的空间 320*240*2/1024 =150K*/&lt;br/&gt;pFileHead = (BITMAPFILEHEADER*)malloc(dwFileHeadSize + dwInfoSize + dwBipMapSize);&lt;br/&gt;pBmpInfo  = (BITMAPINFO *)malloc(dwInfoSize);&lt;br/&gt;&lt;br/&gt;pFileHead-&amp;gt;bfOffBits = dwFileHeadSize + dwInfoSize;                 /*  以下为填充位图的空间        */&lt;br/&gt;pFileHead-&amp;gt;bfSize    = dwFileHeadSize + dwInfoSize + dwBipMapSize;&lt;br/&gt;pFileHead-&amp;gt;bfType    = 0x4D42;&lt;br/&gt;&lt;br/&gt;pcBmpData = (char *) pFileHead + pFileHead-&amp;gt;bfOffBits;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biHeight       = 0 - (signed)dwImgeY;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biWidth        = dwImgeX ;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biBitCount     = 16;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrImportant = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrUsed      = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_BITFIELDS;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biPlanes       = 1;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSizeImage    = dwBipMapSize;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbBlue     = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbGreen    = 0xF8;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbBlue     = 0xE0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbGreen    = 0x07;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbBlue     = 0x1F;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbGreen    = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbReserved = 0x00;&lt;br/&gt;&lt;br/&gt;memcpy((void*)(pFileHead + 1), (void*)pBmpInfo, dwInfoSize);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//最后将RGB565的图片数据全部COPY到pcBmpData中了----这里可以通过读文件的形式将这些数据读上来。!!!!!!&lt;br/&gt;//只需要在此处将那个RGB565的文件用二进制的格式读进来就OK了!!!&lt;br/&gt;/*CFile hFile;&lt;br/&gt;hFile.Open(_T("\\2010-9-23.bins"),CFile::modeRead);&lt;br/&gt;hFile.Read(pcBmpData,dwBipMapSize);*/&lt;br/&gt;memcpy(pcBmpData,pcBmpDataTemp,dwBipMapSize);//将图片数据区值COPY过来&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//memcpy(bmpFileData,pFileHead,153666);//当程序运行到此处，C#程序中的临时数组已经有值了。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;bmpSaveImage((PTSTR)cstrPathname.GetBuffer(0), pFileHead);      /*  保存成BMP图片               */&lt;br/&gt;cstrPathname.ReleaseBuffer();&lt;br/&gt;&lt;br/&gt;free(pFileHead);&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;&lt;br/&gt;return cstrPathname;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//************************************&lt;br/&gt;// Method:    SaveBmp&lt;br/&gt;// FullName:  FileOperate::SaveBmp&lt;br/&gt;// Access:    public static &lt;br/&gt;// Returns:   CString 位图的名称&lt;br/&gt;// Qualifier: 保存位图&lt;br/&gt;// Parameter: char * pcBmpDataTemp 位图数据区内容&lt;br/&gt;//************************************&lt;br/&gt;CString FileOperate::SaveBmp(char *pcBmpDataTemp,char *bmpFileData)&lt;br/&gt;{&lt;br/&gt;// TODO: Add your control notification handler code here&lt;br/&gt;IMAGE_SIZE        tDispSize = {0};&lt;br/&gt;DWORD             dwPreMode;&lt;br/&gt;PINGPONG_PR       DataAddr;&lt;br/&gt;BITMAPFILEHEADER *pFileHead = NULL;                                 /*  位图文件的头指针            */&lt;br/&gt;BITMAPINFO       *pBmpInfo  = NULL;                                 /*  位图信息的指针              */&lt;br/&gt;char             *pcBmpData = NULL;                                 /*  位图数据区的指针            */&lt;br/&gt;DWORD             dwImgeX;                                          /*  位图水平像素                */&lt;br/&gt;DWORD             dwImgeY;                                          /*  位图垂直像素                */&lt;br/&gt;&lt;br/&gt;DWORD   dwFileHeadSize = sizeof(BITMAPFILEHEADER);                  /*  位图文件的头区域大小        */&lt;br/&gt;DWORD   dwInfoSize     = sizeof(BITMAPINFO) + 4 * 2;                /*  位图文件的信息区大小        */&lt;br/&gt;DWORD   dwBipMapSize;                                               /*  位图文件的数据区大小        */&lt;br/&gt;CString cstrPathname;&lt;br/&gt;&lt;br/&gt;cstrPathname+="\\FlashDisk2\\bmp\\";&lt;br/&gt;cstrPathname+=GetTimeTag();&lt;br/&gt;cstrPathname+=".bmp";&lt;br/&gt;dwImgeX = 320;&lt;br/&gt;dwImgeY = 240;&lt;br/&gt;&lt;br/&gt;dwBipMapSize = 2 * dwImgeX * dwImgeY;                               /*  文件头指针指向整个位图的空间 320*240*2/1024 =150K*/&lt;br/&gt;pFileHead = (BITMAPFILEHEADER*)malloc(dwFileHeadSize + dwInfoSize + dwBipMapSize);&lt;br/&gt;pBmpInfo  = (BITMAPINFO *)malloc(dwInfoSize);&lt;br/&gt;&lt;br/&gt;pFileHead-&amp;gt;bfOffBits = dwFileHeadSize + dwInfoSize;                 /*  以下为填充位图的空间        */&lt;br/&gt;pFileHead-&amp;gt;bfSize    = dwFileHeadSize + dwInfoSize + dwBipMapSize;&lt;br/&gt;pFileHead-&amp;gt;bfType    = 0x4D42;&lt;br/&gt;&lt;br/&gt;pcBmpData = (char *) pFileHead + pFileHead-&amp;gt;bfOffBits;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biHeight       = 0 - (signed)dwImgeY;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biWidth        = dwImgeX ;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biBitCount     = 16;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrImportant = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrUsed      = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_BITFIELDS;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biPlanes       = 1;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSizeImage    = dwBipMapSize;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbBlue     = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbGreen    = 0xF8;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[0].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbBlue     = 0xE0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbGreen    = 0x07;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[1].rgbReserved = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbBlue     = 0x1F;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbGreen    = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbRed      = 0x00;&lt;br/&gt;pBmpInfo-&amp;gt;bmiColors[2].rgbReserved = 0x00;&lt;br/&gt;&lt;br/&gt;memcpy((void*)(pFileHead + 1), (void*)pBmpInfo, dwInfoSize);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//最后将RGB565的图片数据全部COPY到pcBmpData中了----这里可以通过读文件的形式将这些数据读上来。!!!!!!&lt;br/&gt;//只需要在此处将那个RGB565的文件用二进制的格式读进来就OK了!!!&lt;br/&gt;/*CFile hFile;&lt;br/&gt;hFile.Open(_T("\\2010-9-23.bins"),CFile::modeRead);&lt;br/&gt;hFile.Read(pcBmpData,dwBipMapSize);*/&lt;br/&gt;memcpy(pcBmpData,pcBmpDataTemp,dwBipMapSize);//将图片数据区值COPY过来&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;memcpy(bmpFileData,pFileHead,153666);//当程序运行到此处，C#程序中的临时数组已经有值了。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;bmpSaveImage((PTSTR)cstrPathname.GetBuffer(0), pFileHead);      /*  保存成BMP图片               */&lt;br/&gt;cstrPathname.ReleaseBuffer();&lt;br/&gt;&lt;br/&gt;free(pFileHead);&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;&lt;br/&gt;return cstrPathname;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#endif&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//pcBmpDataTemp--从摄像头中得到的565数据区内容&lt;br/&gt;void FileOperate::ImageConvertDemo(BYTE *pInBmp565Data,//输入的RGB565位图的数据实体部分--不包括位图文件等信息&lt;br/&gt;   DWORD dwBitMapDataSize,//位图数据实体长度（不包括文件头等信息）153600&lt;br/&gt;   BYTE **ppOutMallocData,//传出的JPG图片数据实体&lt;br/&gt;   DWORD * pdwOutJpegMemSize,//传出的JPG图片数据的大小&lt;br/&gt;   int * pState //状态码：记录在执行此函数的过程中可能出现的问题   &lt;br/&gt;   )&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;BYTE * pOutRgb555BmpData=NULL;//输出的555格式的位图数据实体&lt;br/&gt;DWORD dwRgb555BmpFileDataLength=0;//153666;//暂时先赋一个值，最终还是要通过传递得到的----######&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;dwRgb555BmpFileDataLength=sizeof(BITMAPFILEHEADER) //位图文件信息头：14&lt;br/&gt;+ sizeof(BITMAPINFOHEADER) //位图信息头：40&lt;br/&gt;+ 3*sizeof(RGBQUAD)//RGB掩码：12&lt;br/&gt;+ dwBitMapDataSize;//数据实体部分：153600&lt;br/&gt;&lt;br/&gt;IImageDemo imgDemo;&lt;br/&gt;&lt;br/&gt;//FileOperate::SaveBmp0(pInBmp565Data);//测试代码：此处测试表明，可以取得到实时的数据了&lt;br/&gt;imgDemo.ConvertBmpRgb565To555(pInBmp565Data,dwRgb555BmpFileDataLength,&amp;amp;pOutRgb555BmpData);//测试转码&lt;br/&gt;&lt;br/&gt;BYTE * pJpegData=NULL;&lt;br/&gt;DWORD dwpJpegDataLength;//Jpeg数组的长度&lt;br/&gt;imgDemo.ConvertRgb555BmpToJpgInMem(pOutRgb555BmpData,dwRgb555BmpFileDataLength,&amp;amp;pJpegData,&amp;amp;dwpJpegDataLength);//因为是在函数内部动态分配的内存，所以需要用指针的指针&lt;br/&gt;&lt;br/&gt;//传出数据&lt;br/&gt;*pdwOutJpegMemSize=dwpJpegDataLength;//传出长度---在最终代码中要简化&lt;br/&gt;*ppOutMallocData=pJpegData;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1.3转换图片格式&lt;/p&gt;&lt;p&gt;GetImage.h&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#include "initguid.h "//如果不引用此头文件，就会出现 无法解析外部符号的错误&lt;br/&gt;#include "imaging.h"//图片转码测试&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;class GetImage&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;GetImage(DWORD dwRGB_Width,DWORD dwRGB_Height);&lt;br/&gt;GetImage(void);&lt;br/&gt;~GetImage(void);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;DWORD dwRGB_Width;                                                  /* RGB 通道的输出图像的宽度     */&lt;br/&gt;DWORD dwRGB_Height;                                                 /* RGB 通道的输出图像的高度     */&lt;br/&gt;&lt;br/&gt;public:&lt;br/&gt;//转换图片格式，并得到jpeg文件的数组&lt;br/&gt;void GetJpegBytes(&lt;br/&gt;BYTE *pInBmp565Data,//输入的RGB565位图的数据实体部分（不包括文件头等信息）&lt;br/&gt;DWORD dwBitMapDataSize,//位图数据实体长度（不包括文件头等信息）&lt;br/&gt;BYTE **ppOutMallocData,//传出的JPG图片数据实体的指针&lt;br/&gt;DWORD * pdwOutJpegMemSize,//传出的JPG图片数据的大小&lt;br/&gt;int * pState //状态码：记录在执行此函数的过程中可能出现的问题&lt;br/&gt;);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;private:&lt;br/&gt;&lt;br/&gt;//将Rgb565编码格式的位图转成Rgb555的位图&lt;br/&gt;void ConvertBmpRgb565To555(&lt;br/&gt;BYTE * pInRgb565BmpData, //输入的565格式的位图数据实体&lt;br/&gt;DWORD dwRgb555BmpFileDataLength,//位图文件大小&lt;br/&gt;BYTE ** ppOutRgb555BmpData//输出的555格式的位图数据实体&lt;br/&gt;);&lt;br/&gt;&lt;br/&gt;//将数组转换到IStream中&lt;br/&gt;void CopyByteArrayToISream(&lt;br/&gt;BYTE *pInByteArray,//输入的字节数组&lt;br/&gt;DWORD dwArrayLength,//字节数组的长度&lt;br/&gt;IStream **ppOutIStream//传出的由字节转换的流&lt;br/&gt;);&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt;*函数介绍：根据编码器类型名称，得到指定的编码器CLSID&lt;br/&gt;*入口参数：pImagingFactory: Image工厂接口对象&lt;br/&gt;wszMimeType : Image编码格式名称&lt;br/&gt;*出口参数：pclsid :编码器的CLSID&lt;br/&gt;*返回值：TRUE : 成功; FALSE: 失败&lt;br/&gt;*/&lt;br/&gt;BOOL GetEnCodecCLSID(IImagingFactory * pImagingFactory, WCHAR * wszMimeType , CLSID * pclsid);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//Rgb555编码的BMP位图转JPG－－在内存中进行&lt;br/&gt;void ConvertRgb555BmpToJpgInMem(&lt;br/&gt;BYTE * pInRgb555BmpFileData, //输入的RGB555位图文件流－－包括位图数据实体及文件和位图信息&lt;br/&gt;DWORD dwRgb555BmpFileDataLength,//RGB555位图文件流的长度&lt;br/&gt;BYTE ** ppOutJpegData,//输出的JPG位图文件数据流&lt;br/&gt;DWORD * dwpOutJpegDataLegth//转码后的JPG位图大小&lt;br/&gt;);&lt;br/&gt;&lt;br/&gt;};&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;GetImage.cpp&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "StdAfx.h"&lt;br/&gt;#include "GetImage.h"&lt;br/&gt;&lt;br/&gt;#include "CamException.h"&lt;br/&gt;&lt;br/&gt;//#include "epccameralib.h"//摄像头驱动&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;GetImage::GetImage(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;GetImage::GetImage(DWORD dwWidth,DWORD dwHeight)&lt;br/&gt;{&lt;br/&gt;dwRGB_Height=dwHeight;&lt;br/&gt;dwRGB_Width=dwWidth;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;GetImage::~GetImage(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;void GetImage::GetJpegBytes(&lt;br/&gt;BYTE *pInBmp565Data,//输入的RGB565位图的数据实体部分--不包括位图文件等信息&lt;br/&gt;DWORD dwBitMapDataSize,//位图数据实体长度（不包括文件头等信息）153600&lt;br/&gt;BYTE **ppOutMallocData,//传出的JPG图片数据实体&lt;br/&gt;DWORD * pdwOutJpegMemSize,//传出的JPG图片数据的大小&lt;br/&gt;int * pState //状态码：记录在执行此函数的过程中可能出现的问题   &lt;br/&gt;   )&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;try&lt;br/&gt;{&lt;br/&gt;BYTE * pOutRgb555BmpData=NULL;//输出的555格式的位图数据实体&lt;br/&gt;DWORD dwRgb555BmpFileDataLength=0;//位图文件长度153666&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;dwRgb555BmpFileDataLength=sizeof(BITMAPFILEHEADER) //位图文件信息头：14&lt;br/&gt;+ sizeof(BITMAPINFOHEADER) //位图信息头：40&lt;br/&gt;+ 3*sizeof(RGBQUAD)//RGB掩码：12&lt;br/&gt;+ dwBitMapDataSize;//数据实体部分：153600&lt;br/&gt;&lt;br/&gt;//将位图数据转码成555数据，并加上相关文件头，最后形成555位图文件&lt;br/&gt;ConvertBmpRgb565To555(pInBmp565Data,dwRgb555BmpFileDataLength,&amp;amp;pOutRgb555BmpData);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#pragma region //测试没有取到图片的情况&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//CFile hSaveFile;   &lt;br/&gt;//hSaveFile.Open(L"\\565bmp.bin",CFile::modeCreate | CFile::modeWrite |CFile::modeNoTruncate);&lt;br/&gt;////创立一个txt文件。&lt;br/&gt;//hSaveFile.SeekToEnd();   //文件末尾&lt;br/&gt;&lt;br/&gt;//hSaveFile.Write(pInBmp565Data,dwBitMapDataSize);&lt;br/&gt;//hSaveFile.Close();&lt;br/&gt;&lt;br/&gt;#pragma endregion&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if (pOutRgb555BmpData==NULL)&lt;br/&gt;{&lt;br/&gt;throw CString("ConvertBmpRgb565To555位图图片格式转码失败");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;BYTE * pJpegData=NULL;&lt;br/&gt;DWORD dwpJpegDataLength;//Jpeg数组的长度&lt;br/&gt;ConvertRgb555BmpToJpgInMem(pOutRgb555BmpData,dwRgb555BmpFileDataLength,&amp;amp;pJpegData,&amp;amp;dwpJpegDataLength);&lt;br/&gt;//因为是在函数内部动态分配的内存，所以需要用指针的指针&lt;br/&gt;&lt;br/&gt;if (pOutRgb555BmpData!=NULL)&lt;br/&gt;{&lt;br/&gt;free(pOutRgb555BmpData);//555位图数据使用完毕后，就释放&lt;br/&gt;pOutRgb555BmpData=NULL;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;if (pJpegData==NULL)&lt;br/&gt;{&lt;br/&gt;throw CString("ConvertRgb555BmpToJpgInMem位图压缩失败");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//传出数据&lt;br/&gt;*pdwOutJpegMemSize=dwpJpegDataLength;//传出长度---在最终代码中要简化&lt;br/&gt;*ppOutMallocData=pJpegData;&lt;br/&gt;}&lt;br/&gt;catch(CString exMsg)&lt;br/&gt;{&lt;br/&gt;exMsg=L"GetJpegBytes(BYTE*,DWORD,BYTE**,DWORD*,int*):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;catch (CException* e)&lt;br/&gt;{&lt;br/&gt;TCHAR szCause[255];&lt;br/&gt;e-&amp;gt;GetErrorMessage(szCause, 255);&lt;br/&gt;CString exMsg=CString(szCause);&lt;br/&gt;exMsg=L"GetJpegBytes(BYTE*,DWORD,BYTE**,DWORD*,int*):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//将Rgb565编码格式的位图转成Rgb555的位图---位图的大小不会变化，只是数据的编码方式发生变化&lt;br/&gt;void GetImage::ConvertBmpRgb565To555(&lt;br/&gt;BYTE * pInRgb565BmpData,//输入的565格式的位图数据实体----不包括位图文件信息&lt;br/&gt;DWORD dwRgb555BmpFileDataLength,//位图文件大小153666&lt;br/&gt;BYTE ** ppOutRgb555BmpFileData//输出的555格式的位图文件数据流－－可以形成完整文件&lt;br/&gt;   )&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;try&lt;br/&gt;{&lt;br/&gt;#pragma region //设置位图文件&lt;br/&gt;BITMAPFILEHEADER *pFileHead = NULL;                                 /*  位图文件的头指针            */&lt;br/&gt;BITMAPINFO       *pBmpInfo  = NULL;                                 /*  位图信息的指针              */&lt;br/&gt;char             *pcBmpData = NULL;                                 /*  位图数据区的指针            */&lt;br/&gt;DWORD             dwImgeX;                                          /*  位图水平像素                */&lt;br/&gt;DWORD             dwImgeY;                                          /*  位图垂直像素                */&lt;br/&gt;&lt;br/&gt;DWORD   dwFileHeadSize = sizeof(BITMAPFILEHEADER);                  /*  位图文件的头区域大小        */&lt;br/&gt;DWORD   dwInfoSize     = sizeof(BITMAPINFO) + 4 * 2;                /*  位图文件的信息区大小        */&lt;br/&gt;DWORD   dwBipMapSize;                                               /*  位图文件的数据区大小        */&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;dwBipMapSize = 2 * dwRGB_Height * dwRGB_Width; //文件头指针指向整个位图的空间 320*240*2/1024 =150K&lt;br/&gt;pFileHead = (BITMAPFILEHEADER*)malloc(dwFileHeadSize + dwInfoSize + dwBipMapSize);&lt;br/&gt;if (pFileHead==NULL)&lt;br/&gt;{&lt;br/&gt;throw CString("pFileHead位图信息头内存分配失败");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;pBmpInfo  = (BITMAPINFO *)malloc(dwInfoSize);&lt;br/&gt;&lt;br/&gt;if (pBmpInfo==NULL)&lt;br/&gt;{&lt;br/&gt;free(pFileHead);&lt;br/&gt;pFileHead==NULL;//释放已经申请到的内存&lt;br/&gt;throw CString("pBmpInfo位图信息头内存分配失败");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;pFileHead-&amp;gt;bfOffBits = dwFileHeadSize + dwInfoSize;                 /*  以下为填充位图的空间        */&lt;br/&gt;pFileHead-&amp;gt;bfSize    = dwFileHeadSize + dwInfoSize + dwBipMapSize;&lt;br/&gt;pFileHead-&amp;gt;bfType    = 0x4D42;//位图文件的　类型代码&lt;br/&gt;&lt;br/&gt;pcBmpData = (char *) pFileHead + pFileHead-&amp;gt;bfOffBits;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biHeight       = 0 - (signed)dwRGB_Height;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biWidth        = dwRGB_Width ;&lt;br/&gt;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biBitCount     = 16;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrImportant = 0;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biClrUsed      = 0;&lt;br/&gt;//pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_BITFIELDS;//RGB565格式&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biCompression  = BI_RGB;//RGB555格式&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biPlanes       = 1;&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);&lt;br/&gt;pBmpInfo-&amp;gt;bmiHeader.biSizeImage    = dwBipMapSize;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;memcpy((void*)(pFileHead + 1), (void*)pBmpInfo, dwInfoSize);&lt;br/&gt;memcpy(pcBmpData,pInRgb565BmpData,dwBipMapSize);//将摄像头数据复制到位图文件内存缓冲区中&lt;br/&gt;&lt;br/&gt;#pragma endregion&lt;br/&gt;&lt;br/&gt;#pragma region //进行颜色分量提取，并转码成RGB555&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;char * p555Data=NULL;&lt;br/&gt;p555Data=(char*)malloc(dwBipMapSize);//申请一片数据作为555数据的缓冲区&lt;br/&gt;&lt;br/&gt;if (p555Data==NULL)&lt;br/&gt;{&lt;br/&gt;free(pFileHead);&lt;br/&gt;pFileHead=NULL;&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;pBmpInfo=NULL;&lt;br/&gt;throw CString("p555Data内存分配失败");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;DWORD width=dwRGB_Width;//320&lt;br/&gt;DWORD height=dwRGB_Height;//240&lt;br/&gt;int pitch=width+width%2;//偏移量&lt;br/&gt;&lt;br/&gt;for (int i=0;i&amp;lt;height;i++)//图片的高度是240&lt;br/&gt;{&lt;br/&gt;for (int j=0;j&amp;lt;width;j++)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;//分解出RGB三分量---RGB565的&lt;br/&gt;UCHAR b=pcBmpData[(i*pitch+j)*2]&amp;amp;0x1F;&lt;br/&gt;UCHAR g=((((pcBmpData[(i*pitch+j)*2+1]&amp;lt;&amp;lt;5)&amp;amp;0xFF)&amp;gt;&amp;gt;2) &amp;amp; 0x38) +((pcBmpData[(i*pitch+j)*2]&amp;gt;&amp;gt;5)&amp;amp;0x07);&lt;br/&gt;UCHAR r=(pcBmpData[(i*pitch+j)*2+1]&amp;gt;&amp;gt;3)&amp;amp;0x1F;&lt;br/&gt;&lt;br/&gt;g=g/2;//把g分量从RGB565标准转码成RGB555标准&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//将新的RGB分量弄到RGB555的图片数据区中．&lt;br/&gt;p555Data[(i*pitch+j)*2] = ((g&amp;lt;&amp;lt;5)&amp;amp;0xE0)+b;//gb分量&lt;br/&gt;p555Data[(i*pitch+j)*2+1] = (r&amp;lt;&amp;lt;2)+(g/8);//rg分量&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;memcpy(pcBmpData,p555Data,dwBipMapSize);//将新的数据区内容复制到原来的数据区中进行了数据覆盖&lt;br/&gt;&lt;br/&gt;#pragma endregion&lt;br/&gt;&lt;br/&gt;//---*****传出参数&lt;br/&gt;*ppOutRgb555BmpFileData=(BYTE *)malloc(dwRgb555BmpFileDataLength);&lt;br/&gt;if (*ppOutRgb555BmpFileData==NULL)&lt;br/&gt;{&lt;br/&gt;free(pFileHead);&lt;br/&gt;pFileHead=NULL;&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;pBmpInfo=NULL;&lt;br/&gt;free(p555Data);&lt;br/&gt;p555Data=NULL;&lt;br/&gt;throw CString("*ppOutRgb555BmpFileData内存分配失败");&lt;br/&gt;}&lt;br/&gt;memcpy(*ppOutRgb555BmpFileData,pFileHead,dwRgb555BmpFileDataLength);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;free(pFileHead);&lt;br/&gt;free(pBmpInfo);&lt;br/&gt;free(p555Data);&lt;br/&gt;}&lt;br/&gt;catch(CString exMsg)&lt;br/&gt;{&lt;br/&gt;exMsg=L"ConvertBmpRgb565To555(BYTE*,DWORD,BYTE**):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;catch (CException* e)&lt;br/&gt;{&lt;br/&gt;TCHAR szCause[255];&lt;br/&gt;e-&amp;gt;GetErrorMessage(szCause, 255);&lt;br/&gt;CString exMsg=CString(szCause);&lt;br/&gt;exMsg=L"ConvertBmpRgb565To555(BYTE*,DWORD,BYTE**):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;// //Rgb555编码的BMP位图转JPG－－在内存中进行&lt;br/&gt;void GetImage::ConvertRgb555BmpToJpgInMem(&lt;br/&gt;BYTE * pInRgb555BmpFileData, //输入的RGB555位图文件流－－包括位图数据实体及文件和位图信息&lt;br/&gt;DWORD dwRgb555BmpFileDataLength,//RGB555位图文件流的长度&lt;br/&gt;BYTE ** ppOutJpegData,//传出的JPG文件数据流&lt;br/&gt;DWORD * dwpOutJpegDataLegth//JPG文件流大小&lt;br/&gt;)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;try&lt;br/&gt;{&lt;br/&gt;#pragma region&lt;br/&gt;HRESULT hr;//保存每个步骤的中间结果，判断过程运行是否正确----到时候有必要写个异常日志记录&lt;br/&gt;TCHAR *tszMime;//输出图片格式&lt;br/&gt;tszMime = L"image/jpeg";    //指定转换后，图象文件的格式&lt;br/&gt;&lt;br/&gt;IStream *pRgb555BmpStream = NULL; // 流接口对象---读取BMP文件，然后在内存中保存此文件数据&lt;br/&gt;IStream * pJpegStream=NULL;//用来保存转换的JPG文件&lt;br/&gt;IImagingFactory * pImagingFactory = NULL ; //Image工厂接口对象&lt;br/&gt;IImageSink *pImageSink = NULL; //Image Sink接口对象&lt;br/&gt;IImageDecoder *pImageDecoder = NULL;   //解码器接口对象&lt;br/&gt;IImageEncoder *pImageEncoder = NULL;   //编码器接口对象&lt;br/&gt;CLSID clsidEncoder;  //编码器CLSID&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//小技巧：有些变量虽然只在函数体里局部用到，但是因为是动态分配的内存，需要最后手动释放内存，最好放在最前面声明，防止最后遗忘了。&lt;br/&gt;STATSTG * pIStreamState=NULL;//得到pJpegStream的状态&lt;br/&gt;BYTE * pJpegData=NULL;//用来存储从文件流中剥出来的数据。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//初始化COM环境&lt;br/&gt;if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))&lt;br/&gt;{&lt;br/&gt;TRACE(L"COINIT_MULTITHREADED ERROR");&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;CopyByteArrayToISream(pInRgb555BmpFileData,dwRgb555BmpFileDataLength,&amp;amp;pRgb555BmpStream);//承接数据&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//将流指针移到流起点。-----一般都要进行一下这样的测试&lt;br/&gt;LARGE_INTEGER  dlibMove0;&lt;br/&gt;dlibMove0.HighPart=0;&lt;br/&gt;dlibMove0.LowPart=0;&lt;br/&gt;pRgb555BmpStream-&amp;gt;Seek(dlibMove0,STREAM_SEEK_SET,NULL);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//得到Image工厂接口对象---用指定的类标识符创建一个Com对象,用指定的类标识符创建一个未初始化的对象。&lt;br/&gt;hr = CoCreateInstance(CLSID_ImagingFactory,//创建的Com对象的类标识符(CLSID)&lt;br/&gt;NULL,//指向接口IUnknown的指针&lt;br/&gt;CLSCTX_INPROC_SERVER,//运行可执行代码的上下文&lt;br/&gt;IID_IImagingFactory,//创建的Com对象的接口标识符&lt;br/&gt;(void**) &amp;amp;pImagingFactory);//用来接收指向Com对象接口地址的指针变量&lt;br/&gt;&lt;br/&gt;if (FAILED(hr))&lt;br/&gt;{&lt;br/&gt;TRACE(L"IMAGE FACTORY CREATED ERROR");&lt;br/&gt;goto finish;&lt;br/&gt;}  &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//创建解码器接口&lt;br/&gt;if (FAILED(hr = pImagingFactory-&amp;gt;CreateImageDecoder(pRgb555BmpStream, DecoderInitFlagBuiltIn1st, &amp;amp;pImageDecoder)))&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;//根据编码器类型名称得到编码器CLSID&lt;br/&gt;if (!GetEnCodecCLSID(pImagingFactory,tszMime, &amp;amp;clsidEncoder ))//tszMime = L"image/jpeg";    //指定转换后，图象文件的格式&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;if (FAILED(hr = CreateStreamOnHGlobal(NULL,TRUE,&amp;amp;pJpegStream)))//必需要和某个内存区域关联，或者进行一次实例化，比如用COleStreamFile&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;if (FAILED(hr = pImagingFactory-&amp;gt;CreateImageEncoderToStream(&amp;amp;clsidEncoder, pJpegStream, &amp;amp;pImageEncoder)))&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//得到编码器接口的sink对象。此ImageSink接口作为一个槽或者管道来理解；&lt;br/&gt;//是用于负责pImageEncoder和pImageDecoder之间的传输&lt;br/&gt;if (FAILED(hr = pImageEncoder-&amp;gt;GetEncodeSink(&amp;amp;pImageSink)))&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;//开始解码&lt;br/&gt;if (FAILED(hr = pImageDecoder-&amp;gt;BeginDecode(pImageSink, NULL)))&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;//循环解码，直到结束&lt;br/&gt;for(;;)//for循环其实只运行了一个周期&lt;br/&gt;{&lt;br/&gt;//解码&lt;br/&gt;hr = pImageDecoder-&amp;gt;Decode();//解码后，生成一个8K的文件&lt;br/&gt;//继续解码后面的部分&lt;br/&gt;if (E_PENDING == hr)&lt;br/&gt;{&lt;br/&gt;Sleep(500);&lt;br/&gt;} //失败&lt;br/&gt;else if (FAILED(hr))&lt;br/&gt;{&lt;br/&gt;//终止解码&lt;br/&gt;pImageDecoder-&amp;gt;EndDecode(hr);&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//解码成功&lt;br/&gt;break;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;pImageDecoder-&amp;gt;EndDecode(hr);//结束解码&lt;br/&gt;pImageSink-&amp;gt;Release();//释放pImageSink对象&lt;br/&gt;pImageSink = NULL;&lt;br/&gt;pImageEncoder-&amp;gt;TerminateEncoder();//结束编码，此时就已经完成了文件格式的转换&lt;br/&gt;&lt;br/&gt;#pragma  region //从流中提取数据到BYTE数组中&lt;br/&gt;&lt;br/&gt;DWORD dwStreamLengthLowPart;//状态中的长度分量--低位(因为实际图片数据不需要高位那么长)&lt;br/&gt;//得到pJpegStream的长度--然后提取出数据，保存到BYTE数组中&lt;br/&gt;pIStreamState=(STATSTG *)malloc(sizeof(STATSTG));//如果不动态开辟空间，将无法传值进来。&lt;br/&gt;if (NULL == pIStreamState)//如果申请内存没有成功&lt;br/&gt;{&lt;br/&gt;CamException::WriteToFile(L"pIStreamState申请内存失败");&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;if (FAILED(hr=pJpegStream-&amp;gt;Stat(pIStreamState,STATFLAG_NONAME)))&lt;br/&gt;{&lt;br/&gt;CamException::WriteToFile(L"pJpegStream获取状态失败");&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;dwStreamLengthLowPart = pIStreamState-&amp;gt;cbSize.LowPart;//取出流状态中的长度分量&lt;br/&gt;free(pIStreamState);&lt;br/&gt;pIStreamState=NULL;//指针置空，防止野指针出现&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;pJpegData = (BYTE *)malloc(dwStreamLengthLowPart);//用来存储从文件流中剥出来的数据。&lt;br/&gt;if (NULL == pJpegData)//如果申请内存没有成功&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//将流指针移到流起点。&lt;br/&gt;LARGE_INTEGER  dlibMove;&lt;br/&gt;dlibMove.HighPart=0;&lt;br/&gt;dlibMove.LowPart=0;&lt;br/&gt;pJpegStream-&amp;gt;Seek(dlibMove,STREAM_SEEK_SET,NULL);&lt;br/&gt;&lt;br/&gt;hr=pJpegStream-&amp;gt;Read(pJpegData,dwStreamLengthLowPart,NULL);//将流文件内容放置到数据中&lt;br/&gt;if (FAILED(hr))&lt;br/&gt;{&lt;br/&gt;goto finish;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#pragma endregion&lt;br/&gt;&lt;br/&gt;*ppOutJpegData=pJpegData;//将图片数据指针传递出去&lt;br/&gt;*dwpOutJpegDataLegth = dwStreamLengthLowPart;//此处传值可能出了点小故障，明天就干脆把这两个参数封装到一个自定义的结构里面，然后动态生成吧。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;finish:&lt;br/&gt;&lt;br/&gt;//释放pRgb555BmpStream对象&lt;br/&gt;if (pRgb555BmpStream)&lt;br/&gt;pRgb555BmpStream-&amp;gt;Release();&lt;br/&gt;if (pJpegStream)&lt;br/&gt;pJpegStream-&amp;gt;Release();&lt;br/&gt;&lt;br/&gt;//释放pImageSink对象&lt;br/&gt;if (pImageSink)&lt;br/&gt;pImageSink-&amp;gt;Release();&lt;br/&gt;//释放pImageDecoder对象&lt;br/&gt;if (pImageDecoder)&lt;br/&gt;pImageDecoder-&amp;gt;Release();&lt;br/&gt;//释放pImageEncoder对象&lt;br/&gt;if (pImageEncoder)&lt;br/&gt;pImageEncoder-&amp;gt;Release();&lt;br/&gt;//释放IImagingFactory接口对象&lt;br/&gt;if (pImagingFactory)&lt;br/&gt;pImagingFactory-&amp;gt;Release();&lt;br/&gt;//释放程序占用的COM资源&lt;br/&gt;CoUninitialize();&lt;br/&gt;#pragma endregion&lt;br/&gt;}&lt;br/&gt;catch(CString exMsg)&lt;br/&gt;{&lt;br/&gt;exMsg=L"ConvertBmpRgb565To555(BYTE*,DWORD,BYTE**):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;catch (CException* e)&lt;br/&gt;{&lt;br/&gt;TCHAR szCause[255];&lt;br/&gt;e-&amp;gt;GetErrorMessage(szCause, 255);&lt;br/&gt;CString exMsg=CString(szCause);&lt;br/&gt;exMsg=L"ConvertBmpRgb565To555(BYTE*,DWORD,BYTE**):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;void GetImage::CopyByteArrayToISream(&lt;br/&gt; BYTE *pInByteArray,//输入的字节数组&lt;br/&gt; DWORD dwArrayLength,//字节数组的长度&lt;br/&gt; IStream **ppOutIStream//传出的由字节转换的流&lt;br/&gt;)&lt;br/&gt;{&lt;br/&gt;try&lt;br/&gt;{&lt;br/&gt;HRESULT hrRet = S_FALSE;&lt;br/&gt;HGLOBAL hg = NULL;&lt;br/&gt;BYTE* pbLocked = NULL;&lt;br/&gt;&lt;br/&gt;//分配内存--此方法已经过时，现在一般都用malloc或者new了&lt;br/&gt;hg = GlobalAlloc(GMEM_MOVEABLE, dwArrayLength);&lt;br/&gt;if (NULL == hg)&lt;br/&gt;{&lt;br/&gt;CamException::WriteToFile(L"hg分配内存失败");&lt;br/&gt;goto error;&lt;br/&gt;}&lt;br/&gt;//得到已经分配的内存指针&lt;br/&gt;pbLocked = (BYTE*) GlobalLock(hg);&lt;br/&gt;if (NULL == pbLocked)&lt;br/&gt;{&lt;br/&gt;CamException::WriteToFile(L"pbLocked获取指针失败");&lt;br/&gt;goto error;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;memcpy(pbLocked,pInByteArray,dwArrayLength);//不从文件中读取，而是直接在内存地址区间进行复制&lt;br/&gt;GlobalUnlock(hg);//解锁已经分配全局内存，对应GlobalLock(hg)&lt;br/&gt;hrRet = CreateStreamOnHGlobal(hg, TRUE, ppOutIStream);//创建Stream对象&lt;br/&gt;&lt;br/&gt;return;&lt;br/&gt;&lt;br/&gt;error: //错误处理,并释放内存（没有出现错误的话，不会出现在此处）&lt;br/&gt;if (pbLocked)&lt;br/&gt;GlobalUnlock(hg);&lt;br/&gt;if (hg)&lt;br/&gt;GlobalFree(hg);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;catch(CString exMsg)&lt;br/&gt;{&lt;br/&gt;exMsg=L"CopyByteArrayToISream(BYTE*,DWORD,IStream **):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;catch (CException* e)&lt;br/&gt;{&lt;br/&gt;TCHAR szCause[255];&lt;br/&gt;e-&amp;gt;GetErrorMessage(szCause, 255);&lt;br/&gt;CString exMsg=CString(szCause);&lt;br/&gt;exMsg=L"CopyByteArrayToISream(BYTE*,DWORD,IStream **):" + exMsg;&lt;br/&gt;CamException::WriteToFile(exMsg);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;BOOL GetImage::GetEnCodecCLSID(&lt;br/&gt;IImagingFactory * pImagingFactory, &lt;br/&gt;WCHAR * wszMimeType , &lt;br/&gt;CLSID * pclsid&lt;br/&gt;)&lt;br/&gt;{&lt;br/&gt;UINT uiCount;&lt;br/&gt;ImageCodecInfo * codecs;&lt;br/&gt;HRESULT hr;&lt;br/&gt;BOOL fRet = FALSE;&lt;br/&gt;//枚举系统已经安装的编码器&lt;br/&gt;hr = pImagingFactory-&amp;gt;GetInstalledEncoders(&amp;amp;uiCount, &amp;amp;codecs);&lt;br/&gt;//查找制定编码器的CLSID&lt;br/&gt;for (UINT i = 0; i &amp;lt; uiCount; i++)&lt;br/&gt;{&lt;br/&gt;if (wszMimeType &amp;amp;&amp;amp; !wcscmp(wszMimeType, codecs[i].MimeType))&lt;br/&gt;{&lt;br/&gt;*pclsid = codecs[i].Clsid;&lt;br/&gt;fRet = TRUE;&lt;br/&gt;break;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;//释放内存&lt;br/&gt;CoTaskMemFree(codecs);&lt;br/&gt;//&lt;br/&gt;return fRet;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;截止上面已经完成了在内存当中对图片的转换了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;二、使用C#项目调用DLL&lt;/p&gt;&lt;p&gt;里面为了防止内存泄漏，专程让这个转换做了1000次，最后发现没有问题了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;using System;&lt;br/&gt;using System.Collections.Generic;&lt;br/&gt;using System.Text;&lt;br/&gt;using System.Runtime.InteropServices;//引入dll文件中的函数&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;// 添加新的命名空间。&lt;br/&gt;using System.IO;&lt;br/&gt;//using System.Drawing.Imaging;&lt;br/&gt;//using System.Drawing;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;namespace WinCeCsUseDll&lt;br/&gt;{&lt;br/&gt;    class Program&lt;br/&gt;    {&lt;br/&gt;        &lt;br/&gt;&lt;br/&gt;        [DllImport("WinCeCppCamdll.dll", CharSet = CharSet.Auto)]//WinCE平台下，居然没有ANSI这个编码选项。&lt;br/&gt;        private static extern void GetCamShoot(&lt;br/&gt;                                    int imgWidth,//图片宽度&lt;br/&gt;                                    int imgHeight,//图片高度&lt;br/&gt;                                    ref IntPtr ppOutMallocJpegData,//传出的JPG图片数据实体&lt;br/&gt;                                    ref int pdwOutJpegMemSize,//传出的JPG图片数据的大小&lt;br/&gt;                                    ref int pState //状态码：记录在执行此函数的过程中可能出现的问题&lt;br/&gt;                                    );&lt;br/&gt;&lt;br/&gt;        [DllImport("WinCeCppCamdll.dll", CharSet = CharSet.Auto)]//WinCE平台下，居然没有ANSI这个编码选项。&lt;br/&gt;        private static extern void FreeMemory(ref IntPtr intPtr);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        static void Main(string[] args)&lt;br/&gt;        {&lt;br/&gt;            try&lt;br/&gt;            {&lt;br/&gt;                #region 用C#承接C++的DLL开辟的内存空间中的数据&lt;br/&gt;                int imageWidth = 640;&lt;br/&gt;                int imageHeight = 480;&lt;br/&gt;&lt;br/&gt;                for (int i = 0; i &amp;lt; 10000; i++)&lt;br/&gt;                {&lt;br/&gt;                    //下面再对内存区间进行传递&lt;br/&gt;                    int memSize = 0;&lt;br/&gt;                    int intState = 0;&lt;br/&gt;                    IntPtr intPtr = new IntPtr();&lt;br/&gt;&lt;br/&gt;                    GetCamShoot(imageWidth, imageHeight, ref intPtr, ref memSize, ref intState);&lt;br/&gt;&lt;br/&gt;                    ////因为采用　致远公司提供的驱动有点奇怪，每次捕捉的好像都是一一次内存中的东西&lt;br/&gt;                    ////如果是第一次启动程序，那么会出现没有数据的情况。所以需要进行一次容错--再读一次数据&lt;br/&gt;                    //if (intPtr.Equals(IntPtr.Zero))&lt;br/&gt;                    //{&lt;br/&gt;                    //    //  GetCamShoot(ref intPtr, ref memSize, ref intState);&lt;br/&gt;                    //}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;                    byte[] btTemp = new byte[memSize];&lt;br/&gt;                    Marshal.Copy(intPtr, btTemp, 0, memSize);&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;                    //将BYTE数组写成文件--测试代码&lt;br/&gt;                    string path = "\\";&lt;br/&gt;                    string SendFileName = "recvBmpData.jpg";&lt;br/&gt;                    FileStream MyFileStream = new FileStream(path + SendFileName, FileMode.Create, FileAccess.Write);&lt;br/&gt;                    MyFileStream.Write(btTemp, 0, btTemp.Length); //将接收到的数据包写入到文件流对象   &lt;br/&gt;                    MyFileStream.Close();//关闭文件流         &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;                    ////Marshal.FreeHGlobal(intPtr);&lt;br/&gt;                    FreeMemory(ref intPtr);&lt;br/&gt;                    ////Marshal.FreeCoTaskMem(intPtr);//free tha memory---用FreeHGlobal释放会出现错误，不知道这个函数是不是真正实现了释放。&lt;br/&gt;                    ////intPtr = IntPtr.Zero;&lt;br/&gt;                    if (i == 9999)&lt;br/&gt;                        break;&lt;br/&gt;                }&lt;br/&gt;                #endregion&lt;br/&gt;            }catch(Exception e)&lt;br/&gt;            {&lt;br/&gt;                int a = 3;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;         &lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;虽然说今后可能再也不会碰这些东西了，但这毕竟是自己几个月的心血，所以还是贴下来吧，里面涉及的知识点太多了，今后自己有可能还有些参考价值的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/2163219.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2011/09/02/2163219.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2011/07/08/2101492.html</id><title type="text">Web三维技术：Flash Builder+away3d平台搭建（含演示视频）</title><summary type="text">Web三维技术：Flash Builder+away3d平台搭建作者：一点一滴的Beerhttp://beer.cnblogs.com/前言：作为页面中实验设备的显示层，需要一个swf作为显示的UI。虽然可以用FlashMX进行简单的flash设计，但是FlashMX一般是偏向于动画设计，而不是程序设计，所以在进行相关的开发时，支持性不是太好，于是笔者就想到了转用Flex Builder来进行开发。一、开发语言和开发环境 ActionScript是 Macromedia（现已被Adobe收购）为其Flash产品开发的 ，最初是一种简单的脚本语言，现在最新版本3.0，是一种完全的面向对象的编程语</summary><published>2011-07-08T14:38:00Z</published><updated>2011-07-08T14:38:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2011/07/08/2101492.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2011/07/08/2101492.html"/><content type="html">&lt;p&gt;&lt;span style="font-size: 18pt;"&gt;&lt;strong&gt;Web三维技术：Flash Builder+away3d平台搭建&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-size: 8pt;"&gt;&lt;span style="font-family: 宋体; background-color: #faf7ef;"&gt;作者：&lt;a href="http://beer.cnblogs.com/"&gt;一点一滴的&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;&lt;a href="http://beer.cnblogs.com/"&gt;Beer&lt;/a&gt;&amp;nbsp;&lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;前言：&lt;/strong&gt;作为页面中实验设备的显示层，需要一个swf作为显示的UI。虽然可以用FlashMX进行简单的flash设计，但是FlashMX一般是偏向于动画设计，而不是程序设计，所以在进行相关的开发时，支持性不是太好，于是笔者就想到了转用Flex Builder来进行开发。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、开发语言和开发环境&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ActionScript是 Macromedia（现已被Adobe收购）为其Flash产品开发的 ，最初是一种简单的脚本语言，现在最新版本3.0，是一种完全的面向对象的编程语言，功能强大，类库丰富，语法类似JavaScript，多用于Flash互动性、娱乐性、实用性开发，网页制作和RIA应用程序开发。&lt;/p&gt;&lt;p&gt;ActionScript 是一种基于ECMAScript的脚本语言，可用于编写Adobe Flash动画和应用程序。 由于ActionScript和JavaScript都是基于ECMAScript语法的，理论上它们互相可以很流畅地从一种语言翻译到另一种。不过JavaScript的文档对象模型（DOM）是以浏览器窗口，文档和表单为主的，ActionScript的文档对象模型（DOM）则以SWF格式动画为主，可包括动画，音频，文字和事件处理。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;由于软件和库文件存在版本多样的问题，所以在进行介绍之前进行说明。本文中所演示例子使用的软件版本如下：&lt;/p&gt;&lt;p&gt;Flash Builder：4.5&lt;/p&gt;&lt;p&gt;Flex SDK：4.5.1&lt;/p&gt;&lt;p&gt;Away3D：3.5.0&lt;/p&gt;&lt;p&gt;Flash Player：10 debug版本或者更高&lt;/p&gt;&lt;p&gt;1.1 Flash Builder集成开发环境&lt;/p&gt;&lt;p&gt;Adobe&amp;reg; Flash&amp;reg; Builder&amp;trade; 4.5 软件（曾为 Adobe Flex&amp;reg; Builder&amp;trade;）是基于 Eclipse&amp;trade; 的开发工具，使用 ActionScript&amp;reg; 和开源 Flex 框架快速构建具有表现力的移动、Web 和桌面应用程序。软件可以在Adobe主页上去下载。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/20110708224021112.png" /&gt;&lt;/p&gt;&lt;p&gt;安装了Flash Builder4.5之后，Flex SDK4.5也自动被集成到了开发环境中了。然后就可以利用此IDE进行一般的Flex开发了，但是如果要进行3d开发，则还需要引入3d的引擎库。&lt;/p&gt;&lt;p&gt;Flash Builder 4.5下载页面：&lt;a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder&amp;amp;loc=zh_cn"&gt;https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash_builder&amp;amp;loc=zh_cn&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1.2 Away3D引擎库&lt;/p&gt;&lt;p&gt;提供了一个3d引擎库。在Flash Builder中建立项目，然后引入此库，可以迅速进行3d的Flash开发。&lt;/p&gt;&lt;p&gt;Away3D引擎属于一个免费开源的项目，而且持续开发和更新中，所有存在版本众多的问题。目前我们主要使用的是稳定版本的3.5版。在Away3d的主页中可以下载到如下资源：Away3d库、Away3d Examples例程、Away3d Documents参考文档。&lt;/p&gt;&lt;p&gt;Away3d 3.5下载页面：&lt;a href="http://away3d.com/download/away3d_3.5.0"&gt;http://away3d.com/download/away3d_3.5.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1.3 Flash Player播放器&lt;/p&gt;&lt;p&gt;编程的语言ActionScript目前主要分为2.0和3.0两个版本，Flash播放器相当于ActionScript的编译环境，对于不同版本的ActionScript需要不同的播放器支持，如果使用了低版本的Flash Player则会出现编译无法通过。对于Away3d_3.5库，需要至少Flash Player10的支持。如果希望能够在Flash Builder中对源代码进行调试，则需要到Adobe主页上下载一个debug版本的Flash Player10。&lt;/p&gt;&lt;p&gt;在Adobe主页上下载Flash Player的时候，除了有发布版和调试版之分，也有IE和非IE之分。如果你使用的是IE或者基于IE内核的浏览器，则下载基于IE的debug版Flash Player10，如果是使用Chrome或者Firefox这些非IE内核的浏览器，则下载相应的播放器。&lt;/p&gt;&lt;p&gt;Flash Player 10下载页面：&lt;a href="http://www.adobe.com/support/flashplayer/downloads.html"&gt;http://www.adobe.com/support/flashplayer/downloads.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;先到网上下载到上述的软件后，就可以遵循下述步骤进行环境搭建：&lt;/p&gt;&lt;div&gt;&lt;table border="0" style="border-collapse: collapse;"&gt;&lt;colgroup&gt;&lt;col style="width: 568px;" /&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;"&gt;&lt;p&gt;1.卸载本机上的旧版本的Flash Player，安装Flash Player10。&lt;/p&gt;&lt;p&gt;2.安装Flash Builder4.5到指定目录，例如：&lt;/p&gt;&lt;p&gt;"D:\Program Files\Adobe\Adobe Flash Builder 4.5"&lt;/p&gt;&lt;p&gt;如果成功安装，则Flex Sdk4.5也会被成功安装上，在目录：&lt;/p&gt;&lt;p&gt;"D:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks"&lt;/p&gt;&lt;p&gt;里面包含了不同版本的Flex SDK，今后如果Adobe发布新的SDK，则只需要下载新的SDK然后解压到此目录中即可。&lt;/p&gt;&lt;p&gt;3.解压Away3d的库文件到指定目录。例如：&lt;/p&gt;&lt;p&gt;"D:\FlashBuilder_Libs\Away3d_lib"&lt;/p&gt;&lt;p&gt;在后面进行Away3d开发时，需要引用此路径中的库文件。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;完成上述工作后，就可以进行Away3d的Flex开发了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、建立ActionScript项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于如何建立一般的Flex项目，在此不再赘述，有兴趣的可以到网上找到很多相关例子。本文重点在让Away3d 3.5提供的Examples成功跑起来。&lt;/p&gt;&lt;p&gt;2.1项目建立与设计&lt;/p&gt;&lt;p&gt;打开Flash Builder，然后新建项目，选择"ActionScript Project"，然后输入项目名称点击Finish。在Package Explorer中右击项目选择"Properties"进行相关设置。设置内容包括：&lt;/p&gt;&lt;p&gt;1.设置Flex SDK版本。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/201107082240238485.png" /&gt;&lt;/p&gt;&lt;p&gt;一般情况下，在建立项目的时候就已经对SDK进行了指定，但是如果在项目建立完毕后需要修改SDK，可以在此界面下进行修改:ActionScript Build Path&lt;span style="font-family: Wingdings;"&gt;&amp;agrave;&lt;/span&gt;Library path&lt;/p&gt;&lt;p&gt;2.设置Away3d库的引用路径。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/201107082240283007.png" /&gt;&lt;/p&gt;&lt;p&gt;在ActionScript Build Path&lt;span style="font-family: Wingdings;"&gt;&amp;agrave;&lt;/span&gt;Source path中，可以添加Away3d的引擎库，也就是我们下载下来解压下来的文件夹，添加解压目录src中的内容。&lt;/p&gt;&lt;p&gt;3.设计编译器版本&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/201107082240302219.png" /&gt;&lt;/p&gt;&lt;p&gt;ActionScript的编译环境就是Flash Player，Away3d 3.5需要10以下的版本的播放器的支持。在Flash Builder4.5中没有必要对此进行设置，因为默认的就是10.2的版本，但是如果今后3d库升级需要更高版本的播放器支持，则需要在此进行相应的设置。&lt;/p&gt;&lt;p&gt;2.2Away3d Examples项目移植&lt;/p&gt;&lt;p&gt;将从Away3d主页上下载的3.5版本对应的"examples_3_5_0.zip"解压，然后将根目录下的文件复制到新建的ActionScript项目的根目录下进行覆盖。在Flash Builder中对项目的目录进行刷新。然后就可以了。&lt;/p&gt;&lt;p&gt;如果想要运行某文件，例如："Basic_LoadModel.as"则只需要右击此文件，然后选择"Set as Default Application"，再右击选择Run as&lt;span style="font-family: Wingdings;"&gt;&amp;agrave;&lt;/span&gt; Web Application，然后就可以在浏览器中看到运行的效果图了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/201107082240436438.png" /&gt;&lt;/p&gt;&lt;p&gt;在项目的bin-debug目录下面，会生成对应的swf文件，这个可以独立运行的。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/beer/201107/201107082240513562.png" /&gt;&lt;/p&gt;&lt;p&gt;Away3d Examples的演示效果见如下视频：&lt;/p&gt;&lt;p&gt;&lt;a href="http://v.youku.com/v_show/id_XMjgzMzI2MDgw.html"&gt;http://v.youku.com/v_show/id_XMjgzMzI2MDgw.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;object style="display: block; margin-left: auto; margin-right: auto;" width="640" height="480" data="http://player.youku.com/player.php/sid/XMjgzMzI2MDgw/v.swf" type="application/x-shockwave-flash"&gt;&lt;param name="data" value="http://player.youku.com/player.php/sid/XMjgzMzI2MDgw/v.swf" /&gt;&lt;param name="src" value="http://player.youku.com/player.php/sid/XMjgzMzI2MDgw/v.swf" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-family: Verdana; font-size: 8pt; background-color: #faf7ef;"&gt;2011-7-8&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-size: 8pt;"&gt;&lt;span style="font-family: 宋体; background-color: #faf7ef;"&gt;于武汉大学&lt;/span&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-family: Verdana; font-size: 8pt; background-color: #faf7ef;"&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-size: 8pt;"&gt;&lt;em&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;Author:&lt;a href="http://www.cnblogs.com/beer"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; background-color: #faf7ef;"&gt;一点一滴的&lt;/span&gt;&lt;/em&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;&lt;em&gt;Beer&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-family: Verdana; font-size: 8pt; background-color: #faf7ef;"&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-family: Verdana; font-size: 8pt; background-color: #faf7ef;"&gt;&lt;em&gt;From:&lt;a href="http://www.cnblogs.com/beer"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-size: 8pt;"&gt;&lt;em&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;Notes:&lt;/span&gt;&lt;span style="font-family: 宋体; background-color: #faf7ef;"&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/span&gt;&lt;/em&gt;&lt;span style="font-family: Verdana; background-color: #faf7ef;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #464646; font-family: Verdana; font-size: 8pt; background-color: #faf7ef;"&gt;&lt;em&gt;original:&lt;a href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html"&gt;http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html&lt;/a&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/2101492.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2011/07/08/2101492.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html</id><title type="text">Linux及Arm-Linux程序开发笔记（零基础入门篇）</title><summary type="text">Linux及Arm-Linux程序开发笔记（零基础入门篇）作者：一点一滴的Beer http://beer.cnblogs.com/本文地址：http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html目录一、Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二、...</summary><published>2011-05-05T03:37:00Z</published><updated>2011-05-05T03:37:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html"/><content type="html">&lt;p align="center"&gt;&lt;b&gt;Linux及Arm-Linux&lt;/b&gt;&lt;b&gt;程序开发笔记（零基础入门篇）&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p align="center"&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;本文地址：&lt;a href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html"&gt;http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;目录&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;一、Arm-Linux程序开发平台简要介绍... 3 &lt;/p&gt;&lt;p&gt;1.1程序开发所需系统及开发语言... 3 &lt;/p&gt;&lt;p&gt;1.2系统平台搭建方式... 4 &lt;/p&gt;&lt;p&gt;二、Linux开发平台搭建... 5 &lt;/p&gt;&lt;p&gt;2.1安装虚拟工作站... 5 &lt;/p&gt;&lt;p&gt;2.2安装Linux虚拟机... 5 &lt;/p&gt;&lt;p&gt;2.3虚拟机的一些基本配置... 7 &lt;/p&gt;&lt;p&gt;2.3.1建立共享目录... 8 &lt;/p&gt;&lt;p&gt;2.3.2调整桌面分辨率... 9 &lt;/p&gt;&lt;p&gt;2.4安装软件... 11 &lt;/p&gt;&lt;p&gt;三、Fedora-linux系统... 11 &lt;/p&gt;&lt;p&gt;3.1控制终端的基本操作命令... 12 &lt;/p&gt;&lt;p&gt;3.2编程工具简介... 12 &lt;/p&gt;&lt;p&gt;3.2.1 Fedora-Eclipse CDT. 13 &lt;/p&gt;&lt;p&gt;3.2.2 Qt库及Qt界面设计软件... 14 &lt;/p&gt;&lt;p&gt;四、使用Eclipse CDT开发Linux程序... 15 &lt;/p&gt;&lt;p&gt;4.1建立控制台程序... 15 &lt;/p&gt;&lt;p&gt;4.2建立Linux窗口程序... 16 &lt;/p&gt;&lt;p&gt;五、使用Eclipse开发Arm-linux程序... 19 &lt;/p&gt;&lt;p&gt;5.1 Arm-linux硬件平台... 19 &lt;/p&gt;&lt;p&gt;5.2开发控制台程序... 20 &lt;/p&gt;&lt;p&gt;5.2.1使用Eclipse CDT编写代码... 20 &lt;/p&gt;&lt;p&gt;5.2.2建立交叉编译环境... 20 &lt;/p&gt;&lt;p&gt;5.2.3编译并运行程序... 22 &lt;/p&gt;&lt;p&gt;5.3一些常用的软件介绍... 23 &lt;/p&gt;&lt;p&gt;5.4开发arm-linux窗口程序... 24 &lt;/p&gt;&lt;p&gt;5.4.1建立Qt交叉编译环境... 25 &lt;/p&gt;&lt;p&gt;5.4.2编译生成可执行窗体程序... 26 &lt;/p&gt;&lt;p&gt;六、高级Linux程序设计... 28 &lt;/p&gt;&lt;p&gt;6.1多文件控制台项目... 29 &lt;/p&gt;&lt;p&gt;6.2多文件Qt项目... 29 &lt;/p&gt;&lt;p&gt;6.2.1使用Qt Designer设置界面... 29 &lt;/p&gt;&lt;p&gt;6.2.2多文件Qt开发时的一些经典错误... 31 &lt;/p&gt;&lt;p&gt;6.3关于makefile. 32 &lt;/p&gt;&lt;p&gt;七、学习资料... 32&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt;前言：&lt;/b&gt;本文记录了自己从一个完全不懂Linux的人如何一步步学会Linux程序开发的过程。当然也希望本文能够达到它的目的，让那些和我一样没有任何基础的人也能快速入门Linux程序开发。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355015"&gt;&lt;/a&gt;&lt;a name="_Toc292354884"&gt;&lt;strong&gt;一、Arm-Linux&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;程序开发平台简要介绍&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arm-Linux程序的开发并不像我们以前接触的Windows程序开发那样，关于平台的搭建就繁琐很多，所以在正式进入程序开发之前先对这种开发模式进行简要介绍，让一个即使没有任何Linux开发经验的程序员也能够看懂后面的内容。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355016"&gt;&lt;/a&gt;&lt;a name="_Toc292354885"&gt;&lt;strong&gt;1.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;程序开发所需系统及开发语言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 开发arm-linux程序至少需要三种系统：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Windows&lt;/b&gt;&lt;b&gt;系统&lt;/b&gt;。&lt;b&gt;     &lt;br /&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 主要用来文件传送和一些简单的文本文件编辑。这个系统其实并非必需，只是因为目前PC机上最流行的系统仍然是Windows系统，我们的很多关于PC的文件和数据的操作习惯都是在Windows系统上养成的，已经对其形成了严重的依赖，所以Windows系统扮演着的&amp;ldquo;辅助开发系统&amp;rdquo;的角色。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;PC-Linux&lt;/b&gt;&lt;b&gt;系统&lt;/b&gt;。    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在此系统上安装arm-Linux交叉编译器后，就可以对代码文本文件进行编译，生成可在arm-Linux系统中运行可执行程序。此系统被称为&amp;ldquo;Linux宿主机&amp;rdquo;，我们对Linux程序的开发工作（包括代码编写、调试和编译生成可执行文件）基本上就是在此系统上进行的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Arm-Linux&lt;/b&gt;&lt;b&gt;系统&lt;/b&gt;。    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arm-Linux程序运行的平台。此系统的硬件载体是一块小型的嵌入式arm板，我们在Linux宿主机上开发好程序并编译生成arm-linux可执行程序后，将可执行程序文件传送到嵌入式arm板中，然后就可以在arm板上直接运行此程序了。&lt;/p&gt;&lt;p&gt;三种系统的职能和联系如下图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136035435.png"&gt;&lt;img border="0" width="672" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136032893.png" alt="image" height="488" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p align="center"&gt;&amp;ldquo;三系统&amp;rdquo;职能和关联图&lt;/p&gt;&lt;p&gt;&amp;nbsp; 关于每个系统的职能及操作还有文件如何传送交流都在后面详细介绍。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 关于开发语言，因为目前购买的Arm-Linux嵌入式板提供的编译库都是C/C++的，所以一般选择C/C++进行程序设计。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355017"&gt;&lt;/a&gt;&lt;a name="_Toc292354886"&gt;&lt;strong&gt;1.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;系统平台搭建方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 关于&amp;ldquo;三系统&amp;rdquo;的搭建方式，有两种方法：三台分立的单系统机器组合或者一台双系统PC机和一台单系统Arm板机器。但是不管采用哪种组合方式，各种系统的职能都是一样的，而且都是通过FTP、Telnet或者SSH等网络协议进行文件传输交流。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;ldquo;三机器&amp;rdquo;组合模式。将三个系统分别安装在三台机器上并将三台机器组建局域网。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;ldquo;两机器&amp;rdquo;组合模式。在PC机上利用虚拟工作站可以同时运行两个系统，虚拟机上的Linux系统基本可以完成所有的实体PC-Linux机器的所有任务，当然也能够组建局域网。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136032304.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136042794.jpg" alt="clip_image004" height="419" style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="clip_image004" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;ldquo;三机器&amp;rdquo;组合模式图&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136042205.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136059664.jpg" alt="clip_image006" height="418" style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="clip_image006" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&amp;ldquo;两机器&amp;rdquo;组合模式图&lt;/p&gt;&lt;p&gt;&amp;nbsp; 如果开发人员对机器性能要求比较高，那么建议采用&amp;ldquo;三机器&amp;rdquo;组合模式。因为&amp;ldquo;两机器&amp;rdquo;组合模式要求一台机器运行双系统，每个系统都需要分配一定的硬件资源，可能会对每个系统运行的流畅程序都造成影响。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 如果开发人员只进行一些简单的程序开发，则建议采用&amp;ldquo;两机器&amp;rdquo;组合模式。这样可以节省硬件设备的投资，而且开发环境的搭建、开发的流程等等都会简单一些。而且下面的内容都是基于这种&amp;ldquo;两机器&amp;rdquo;组合的开发模式。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355018"&gt;&lt;/a&gt;&lt;a name="_Toc292354887"&gt;&lt;strong&gt;二、Linux&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;开发平台搭建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355019"&gt;&lt;/a&gt;&lt;a name="_Toc292354888"&gt;&lt;strong&gt;2.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;安装虚拟工作站&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 目前比较流行的虚拟工作站比较多，推荐使用VM-ware WorkStation。建立虚拟工作站的目的就是为了使一台机器同时运行多个不同类型的系统，方便开发人员进行跨平台开发应用程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp; (&lt;b&gt;关于VMware&lt;/b&gt;&lt;b&gt;，可以到网上搜索到详细介绍和使用方法，在此不再赘述&lt;/b&gt;)&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355020"&gt;&lt;/a&gt;&lt;a name="_Toc292354889"&gt;&lt;strong&gt;2.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;安装Linux虚拟机&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 安装虚拟机的过程和安装实体机一样，唯一的区别是，虚拟机安装是从VMware中打开并安装的。先准备Linux安装文件，一般可以到网上下载到Linux的iso安装文件，然后从VMware中安装此系统。&lt;/p&gt;&lt;p&gt;&amp;nbsp; (&lt;b&gt;关于虚拟机安装，在网上可以搜索到详细的步骤，在此不再赘述&lt;/b&gt;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; 几点建议：&lt;/p&gt;&lt;p&gt;&amp;nbsp; 1.安装Fedora-10并选择完全安装，即把所以的包和选项都勾上。这样在安装完毕后，系统就自带了很多开发工具和相关的库，避免自己去重新进行烦琐的基本开发平台搭建。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 2.在VMware中为虚拟系统配置硬件资源。建议分配硬盘空间16G，内存1G以上。因为今后主要的Linux程序开发工作是在虚拟机上进行了，所以为了保证虚拟机流畅运行，需要分配比较丰富的硬件资源。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 在第一次从ISO文件中安装完毕虚拟机后，在安装目录下面会生成一系列的文件，将这些文件进行备份后，在其它机器上安装虚拟机的时候就花几个小时去从ISO中安装了，将这个目录下的文件复制到相应的目录下面（在第一次从ISO中安装的时候设定的目录相同），然后只需要从VMware中打开此目录下的文件就行了。&lt;/p&gt;&lt;p&gt;执行VMware Workstation中的【View】--【Home】，调出Home视图，然后打开虚拟工作站系统文件。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136055694.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136068136.jpg" alt="clip_image008" height="418" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image008" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 打开后，就可以看到一个虚拟机的硬件资源配置了。这些参数有一部分是在只能在初次使用iso安装的时候配置的，比如硬盘大小。另外一些参数比如内存大小、共享目录等等可以在后期随时人工更改的。&lt;/p&gt;&lt;p&gt;（&lt;b&gt;详细设置内容，到网上可以找到很多相关内容，在此不再赘述&lt;/b&gt;）&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136069498.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136078876.jpg" alt="clip_image010" height="408" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image010" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 两种方法的区别就是WinXp的安装盘和Ghost盘的区别吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 安装完毕Fedora后，就可以从虚拟工作站中启动Fedora Linux系统了。系统桌面如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136118480.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136112035.jpg" alt="clip_image012" height="350" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image012" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355021"&gt;&lt;/a&gt;&lt;a name="_Toc292354890"&gt;&lt;strong&gt;2.3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;虚拟机的一些基本配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 在第一次安装完毕虚拟机后开启虚拟机，默认的分辨率是800*600，同时没有全能共享目录。为了获得比较好的操作界面，同时方便文件共享和转移，需要进行一些基本的配置。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355022"&gt;&lt;/a&gt;&lt;a name="_Toc292354891"&gt;&lt;/a&gt;&lt;strong&gt;2.3.1建立共享目录&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 在同一个硬件PC机上运行的两个系统。Windows实体系统用来做一般的用途，比如联网，处理文档等等；Fedora Linux虚拟系统则用来开发Linux程序并进行编译生成可执行文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 先需要安装vmware tools&lt;/p&gt;&lt;p&gt;&amp;nbsp; 在VMware上面，选择菜单【VM】--【Install VM tools】，然后在Linux虚拟机上会生成目录/media，同时里面产生一个rpm文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 然后打开控制终端并su登录超级用户：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;cd /media&lt;/p&gt;&lt;p&gt;rpm &amp;ndash;ivh VMwareTools-7.8.5-156735.i386.rpm&lt;/p&gt;&lt;p&gt;cd /usr/bin&lt;/p&gt;&lt;p&gt;然后在/usr/bin下面看到wmware-config-tools.pl&lt;/p&gt;&lt;p&gt;再在Teminal中输入wmware-config-tools.pl&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后一路回车下去。然后今后就可以建立共享目录。&lt;/p&gt;&lt;p&gt;&amp;nbsp; （&lt;b&gt;详细过程也可以在网上搜索相关内容&lt;/b&gt;）&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136119494.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136124444.jpg" alt="clip_image014" height="332" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image014" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 共享目录的好处是可以将这些文件在Windows系统中提取出来，然后可以通过我们熟悉的windows系统进行网络传输和一些其它命令操作。这个设置在后面程序开发的时候会提到其使用方法。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在VMware中建立共享目录，执行菜单命令【VM】--【Settings&amp;hellip;】&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136131837.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136141181.jpg" alt="clip_image016" height="378" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image016" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 然后在Linux虚拟机文件系统中可以找到对应的共享目录：/mnt/hgfs/xplinux&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136153001.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113616983.jpg" alt="clip_image018" height="386" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image018" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 建立共享目录可以方便虚拟机和实体机进行文件交流。例如，我们可以将在Linux机器上编译生成好执行文件放置到共享目录中，然后可以通过Windows机器提取出来并通过网络传送到arm-linux嵌入式板上。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355023"&gt;&lt;/a&gt;&lt;a name="_Toc292354892"&gt;&lt;/a&gt;&lt;strong&gt;2.3.2调整桌面分辨率&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在VMware工作站中调整虚拟机桌面分辨率。一般默认是800*600，而且现在的显示器，一般是1024*768甚至更高，以我目前使用的电脑显示器为例，分辨率是1440*900。需要将虚拟机桌面分辨率进行适当调整，然后全屏，那么就可以获得比较友好的操作界面。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在VMware中启动虚拟机，虚拟机启动后的登录界面如下：&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136171407.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113617818.jpg" alt="clip_image020" height="502" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image020" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后登录系统，设置分辨率，系统菜单：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 【System】--【Preferences】--【Hardware】--【Screen Resolution】&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136186325.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136181832.jpg" alt="clip_image022" height="261" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image022" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136185702.jpg"&gt;&lt;img border="0" width="285" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136192048.jpg" alt="clip_image024" height="275" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image024" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 设置好分辨率后，就可以在获得全屏状态的Linux操作界面了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/2011050511361963.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136202190.jpg" alt="clip_image026" height="350" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image026" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.3.2其它设置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 比如设置桌面背景，系统字体，还有资源管理器的模式等等，这些可以自己去实地操作并进行熟悉。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355024"&gt;&lt;/a&gt;&lt;a name="_Toc292354893"&gt;&lt;strong&gt;2.4&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;安装软件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然Fedora已经自带了一些必要的软件，如Open Office办公软件，gedit记事本软件，Firefox网页浏览器等等。但是既然是操作系统，我们也可以安装一些我们需要的软件。比如中文输入法（如：小企鹅输入法），聊天工具（如QQ）等等。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：在Terminal终端中安装程序的时候需要启用su超级用户权限。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355025"&gt;&lt;/a&gt;&lt;a name="_Toc292354894"&gt;&lt;strong&gt;三、Fedora-linux&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;系统&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fedora-linux虚拟机安装完毕并进行基本设置后，就可以开始了程序开发环节了。在正式开始程序开发时，还需要对Linux的一些基本编程工具进行简要介绍，当然如果已经有此基础的，可以直接略过这一章。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355026"&gt;&lt;/a&gt;&lt;a name="_Toc292354895"&gt;&lt;strong&gt;3.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;控制终端的基本操作命令&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 执行系统菜单命令【Applications】--【System Tools】--【Terminal】，打开Terminal终端：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136202157.jpg"&gt;&lt;img border="0" width="368" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136202124.jpg" alt="clip_image028" height="332" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image028" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 熟悉Windows系统的DOS操作界面的人肯定也会对此操作终端也不会陌生。通过在Terminal中输入命令，用户可以很方便地完成Linux下的一系列操作，在正式进入自主程序设计之前，用户有必要对下面一些最基本命令进行熟悉（其它的命令在项目需要的时候再到网上查找相关资料）。   &lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="127" valign="top"&gt;&lt;p&gt;文件操作命令&lt;/p&gt;&lt;/td&gt;&lt;td width="441" valign="top"&gt;&lt;p&gt;文件/文件夹的创建、修改、复制、删除、移动等等。（如rm/mv/vi/cat等等）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="127" valign="top"&gt;&lt;p&gt;网络设置命令&lt;/p&gt;&lt;/td&gt;&lt;td width="441" valign="top"&gt;&lt;p&gt;个性IP、开启FTP、开启Telnet、开启SSH等等。（如ifconfig/telnetd等等）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="127" valign="top"&gt;&lt;p&gt;用户管理命令&lt;/p&gt;&lt;/td&gt;&lt;td width="441" valign="top"&gt;&lt;p&gt;系统用户的添加、删除、密码修改等等。（如，addusr/passwd等等）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="127" valign="top"&gt;&lt;p&gt;文件编译命令&lt;/p&gt;&lt;/td&gt;&lt;td width="441" valign="top"&gt;&lt;p&gt;这个涉及到编译环境的建立，将在后面正式进入到自主程序设计时进行详细介绍。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然目前Fedora为用户提供了比较良好的操作界面，但是Linux最初是从命令行的操作系统发展起来的，很多强大的功能都是需要依靠Terminal控制终端来实现的，所以作为开发人员有必要先对这些基本命令进行熟悉并熟练操作。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355027"&gt;&lt;/a&gt;&lt;a name="_Toc292354896"&gt;&lt;strong&gt;3.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;编程工具简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果在安装Fedora的时候，选择的是完全安装，系统会自带很多开发工具。其中Fedora -Eclipse CDT和Qt库及相关设计器Qt Designer是我们今后开发的主要工具。&lt;/p&gt;&lt;p&gt;当然，如果用户没有选择安全安装，则可以到网上下载到各类开发工具的安装文件，并自己进行安装。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355028"&gt;&lt;/a&gt;&lt;a name="_Toc292354897"&gt;&lt;/a&gt;&lt;strong&gt;3.2.1 Fedora-Eclipse CDT&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Fedora中执行系统菜单【Application】--【Programming】--【Eclipse】&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136214043.jpg"&gt;&lt;img border="0" width="297" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136227880.jpg" alt="clip_image030" height="255" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image030" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后就可以看到Fedora Eclipse的启动画面&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136229799.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136226942.jpg" alt="clip_image032" height="350" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image032" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后就是下面就是Eclispe的IDE环境了，有过Windows下的Java编程经验的人来说，这个界面是再熟悉不过了，完全可以直接过渡到Linux下的C/C++程序开发上来，这样就极大地减少了程序员的学习周期。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113623257.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136234335.jpg" alt="clip_image034" height="350" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image034" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eclipse的好处，第一就是开源，第二就是免费，第三就跨平台。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为开源，所以可扩展性很强，Eclipse实际上就是一个万能的程序开发环境，只需要在设置中对相关语言的库进行引用并连接相应的编译器，就可以对基于任何语言的程序进行开发；因为免费，所以省去了注册软件等等琐事。因为跨平台，所以当用户进行跨平台程序设计的时候，可以极大减少学习周期。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eclispe在Windows平台下一般都是作为Java的开发环境，用来开发Java桌面应用程序和Jsp网页应用程序甚至目前比较流行的Android手机终端软件。在Linux下面对C/C++的库编译器进行了连接后，则成为Linux下的C/C++开发环境，在Linux下安装JDK后则可以进行Linux下的Java程序设计，如果给Linux系统安装tomcat网页服务器，则可以进行Linux下的网页应用程序开发，如果给Linux安装mysql数据库服务，则可以进行数据库连接操作等等（因为目前我们的目标主要是arm-linux窗口程序开发，所以主要对C/C++进行研究）。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355029"&gt;&lt;/a&gt;&lt;a name="_Toc292354898"&gt;&lt;/a&gt;&lt;strong&gt;3.2.2 Qt库及Qt界面设计软件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果只是编写C/C++控制台软件，则只需要Eclipse CDT就完全可以解决。但是如果要进行窗体化编程，就需要引用一些开源的界面库。例如目前比较流行的Qt库。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的，很容易扩展，并且允许真正地组件编程。基本上，Qt 同 X Window 上的 Motif，Openwin，GTK 等图形界 面库和 Windows 平台上的 MFC，OWL，VCL，ATL 是同类型的东西，但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Eclipse中对项目Build选项进行设置，对Qt库进行连接，然后就可以进行Linux下的Qt程序进行开发了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为Eclipse没有提供可视化的窗体程序设计器，所以需要借助第三方工具，QtDesigner可以很好的解决Qt的UI设计问题并编译生成对应的*.h和*.cpp文件（具体的操作步骤将在下面的内容中详细介绍）。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136243189.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136245631.jpg" alt="clip_image036" height="338" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image036" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所谓&amp;ldquo;工欲善其事，必先利其器&amp;rdquo;，前面花了大量篇幅来介绍，都是为了&amp;ldquo;磨刀&amp;rdquo;，现在开始进入&amp;ldquo;砍柴&amp;rdquo;环节。下面将以Eclipse CDT作为开发环境来介绍Linux和arm-linux程序开发的一般方法。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355030"&gt;&lt;/a&gt;&lt;a name="_Toc292354899"&gt;&lt;strong&gt;四、使用Eclipse CDT&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;开发Linux程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355031"&gt;&lt;/a&gt;&lt;a name="_Toc292354900"&gt;&lt;strong&gt;4.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;建立控制台程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用Eclipse CDT建立基于C++的&amp;ldquo;Hello World&amp;rdquo;控制台程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 打开Eclipse开发环境。执行【File】--【New】--【C++ Project】&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113625582.jpg"&gt;&lt;img border="0" width="558" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136275301.jpg" alt="clip_image038" height="190" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image038" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后进入到C++ Project向导，有C++的Hello World模板&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136289172.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136281614.jpg" alt="clip_image040" height="436" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image040" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 点击Finish，然后Eclispe就会建立一个基于C++的HelloWorld项目，运行程序后，能够在控制台中输出&amp;ldquo;Hello World&amp;rdquo;：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136291199.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136307022.jpg" alt="clip_image042" height="276" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image042" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 说明：如果是开发控制台程序，则不需要进行任何其它设计，只需要直接编写C++代码即可，不用对编译库和编译器进行设置，Eclipse已经为我们自动完成了这些内容。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355032"&gt;&lt;/a&gt;&lt;a name="_Toc292354901"&gt;&lt;strong&gt;4.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;建立Linux窗口程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 就像在Window环境下，如果要用C++开发窗口程序，我们一般需要使用Windows API或者MFC。同样，在Linux环境下，我们可能在C++项目中引用Qt库来进行Linux下的窗口程序开发。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在完整版的Fedora中，自带了Qt的库，在目录/usr/lib下面：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136309464.jpg"&gt;&lt;img border="0" width="558" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136318003.jpg" alt="clip_image044" height="195" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image044" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 系统默认自带有两个版本的Qt库qt-3.3和qt4，一般我们用qt-3.3。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编写窗口程序，我们只需要在建立了C++ Project的情况下，对C/C++ Build路径进行设置，指向qt-3.3的库即可。主要开发流程如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136311350.gif"&gt;&lt;img border="0" width="367" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136319922.gif" alt="clip_image046" height="193" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image046" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第一步：使用Eclipse CDT建立C++ Project。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第二步：设置Build路径指向Qt。在项目管理器中右击项目文件设置项目属性，在C/C++ Build的Settings的Tool Settings中进行设置。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113631968.jpg"&gt;&lt;img border="0" width="501" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136322298.jpg" alt="clip_image048" height="325" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image048" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 【GCC C++ Compiler】--【Directories】添加包含的文件路径：/usr/lib/qt-3.3/include。这个是C++的编译器包含的头文件路径，因为是建立的C++ Project，所以一定要设置。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136337805.jpg"&gt;&lt;img border="0" width="501" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136337215.jpg" alt="clip_image050" height="326" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image050" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 【GCC C Compiler】--【Directories】添加包含的文件路径：/usr/lib/qt-3.3/include。这个是设置C语言编译器包含的头文件路径，因为有时候C++中会考虑到兼容一些C语言的语法和关键字，所以最好也进行相关设置。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113633214.jpg"&gt;&lt;img border="0" width="501" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136348545.jpg" alt="clip_image052" height="329" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image052" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 【GCC C++ Linker】--【Libraries】添加编译时引用的库路径：/usr/lib/qt-3.3/lib(注意：不要写成include了)。并设置库搜索命令参数：qt-mt。&lt;/p&gt;&lt;p&gt;第三步：编写引用了Qt库的C++程序。&lt;/p&gt;&lt;p&gt;第四步：运行程序。&lt;/p&gt;&lt;p&gt;程序运行效果如下图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113635638.jpg"&gt;&lt;img border="0" width="558" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136354509.jpg" alt="clip_image054" height="254" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image054" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 总结：通过上面对Linux下面的控制台程序及窗口程序的介绍，我们已经对Linux系统下的简单程序开发流程有了简单了解。下面开始介绍arm-Linux程序的开发。&lt;/p&gt;&lt;p&gt;&lt;b&gt;五、使用Eclipse&lt;/b&gt;&lt;b&gt;开发Arm-linux&lt;/b&gt;&lt;b&gt;程序&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;5.1 Arm-linux&lt;/b&gt;&lt;b&gt;硬件平台&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136386654.jpg"&gt;&lt;img border="0" width="340" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136392967.jpg" alt="clip_image056" height="265" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image056" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arm-Linux机器采用的是飞凌嵌入式技术公司的FL2440开发板。在飞凌公司购买开发板的时候，会随开发板一起赠送的相关入门教程《飞凌开发板配套教程》并附有一张光盘，里面有各种写FL2440相关的开发资源。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在正式进入程序开发之前，先对FL2440开发板及arm-linux系统进行熟悉。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fl2440开发板：熟悉Bootloader的使用方法、学会烧写内核、烧写文件系统等等。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arm-linux系统：熟悉利用一些文件系统和网络设置相关的命令。如果你对Linux命令已经有了一定了解，那么arm-linux上的命令也基本一样。&lt;/p&gt;&lt;p&gt;（&lt;b&gt;详细操作过程请参考《飞凌开发板配套教程》一书&lt;/b&gt;）&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355035"&gt;&lt;/a&gt;&lt;a name="_Toc292354904"&gt;&lt;strong&gt;5.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;开发控制台程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 主要开发流程图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113641850.png"&gt;&lt;img border="0" width="832" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136419388.png" alt="image" height="521" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在早期的开发环境方式中，是先用文本编辑器编写c或者cpp文件，然后再直接在Linux机器上通过交叉编译命令，编译代码文本文件并生成可执行程序，然后将可执行程序传送到arm-linux板上，然后就可以在arm-linux机器上运行程序了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 现在的开发模式和早期的开发模式一样，只是在编写代码的工具上进行了改进。早期编写代码的工具只要是能编辑文本的软件就可以，甚至在Linux中通过终端的vi命令就可以搞定，Linux机器的职能仅仅是编写代码和编译代码。现在则使用Eclipse CDT，可以在Linux机器上编写C/C++代码并进行调试，Linux机器基本上可以模拟arm-linux系统上除了一些硬件相关度高的应用程序（如驱动程序）之外的绝大部分其它程序的运行环境。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355036"&gt;&lt;/a&gt;&lt;a name="_Toc292354905"&gt;&lt;/a&gt;&lt;strong&gt;5.2.1使用Eclipse CDT编写代码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其实和用Eclipse CDT编写Linux环境下的控制台程序是完全一样。除了在一些特别的场合，比如编写驱动程序，需要注意差别外，其余的功能的实现方法基本上一样。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这方面属于程序设计的基本功，需要长期学习和积累，所以在此不再多述。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355037"&gt;&lt;/a&gt;&lt;a name="_Toc292354906"&gt;&lt;/a&gt;&lt;strong&gt;5.2.2建立交叉编译环境&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然生成程序的源码是一样的，但是在Linux机器上编译生成的可执行文件是不能在arm-linux系统上运行的，需要用arm-linux专用的编译器进行编译后，才能生成可在arm-linux系统上运行的可执行文件，当然此时应用程序又显然不能在Linux系统上运行了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将交叉编译工具cross-2.95.3.tar.bz2（可以到网上下载，也可以到开发板附带的光盘资源中找到）通过共享目录传送到Linux系统中，然后在Linux系统终端中先进入其文件目录，然后执行解压命令：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;tar xjvf cross-2.95.3.tar.bz2&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后在/usr/local/arm文件目录下可以看到解压后的2.95.3的库了，或者如果你解压的是cross-3.4.1.tar.bz2的版本，那么将会在对应目录下生成3.4.1的目录。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136421307.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136424306.jpg" alt="clip_image060" height="244" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image060" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后设置环境变量。因为Linux机器上存在不止一种编译器，为了避免环境变量冲突，最好新建一个账号，比如新建账号arm-linux-gcc,然后在对应的账号目录中找到.bash_profile文件，设置环境变量，编辑.bash_profile，在最后一行增加路径（vi打开文本文件，按i表示insert修改文本文件，然后Esc退出insert模式，再shift zz表示保存退出文件，详细的命令介绍可以到网上查阅相关资料）：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;export PATH=/usr/local/arm/2.95.3/bin:$PATH&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136423716.jpg"&gt;&lt;img border="0" width="558" src="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113645944.jpg" alt="clip_image062" height="421" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image062" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以通过echo $PATH来查看环境变量是否设置成功：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136466418.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136463876.jpg" alt="clip_image064" height="408" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image064" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355038"&gt;&lt;/a&gt;&lt;a name="_Toc292354907"&gt;&lt;/a&gt;&lt;strong&gt;5.2.3编译并运行程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在编辑好了代码文件并建立好了交叉编译环境后，就开始编译代码生成可执行程序，并移植到arm板上运行程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Linux系统的终端中通过输入arm-linux-gcc/arm-linux-g++来编译C/C++文件。例如，我们对前面编写的最简单的CppHelloWorld.cpp文件进行编译：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;arm-linux-g++ CppHelloWorld.cpp &amp;ndash;o CppHello&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136466875.jpg"&gt;&lt;img border="0" width="514" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136475206.jpg" alt="clip_image066" height="133" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image066" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后在对应目录下会生成一个可在arm-linux系统上运行的应用程序CppHello。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后通过SSH服务和FTP服务，将可执行文件从Linux文件系统网络传送到arm-linux文件系统（在此用到了两个小软件SSH Secure和LeapFTP，在后面再对软件的功能进行一下简要介绍）。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136474616.jpg"&gt;&lt;img border="0" width="465" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136483089.jpg" alt="clip_image068" height="347" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image068" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后在Windows机器上远程登录arm-linux系统开发板，并控制程序运行&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136491104.jpg"&gt;&lt;img border="0" width="440" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136497483.jpg" alt="clip_image070" height="264" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image070" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：需要先通过chmod +x CppHello来告诉系统此文件是可执行文件，然后再通过./CppHello来运行程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 我们可以看到程序运行的结果：在屏幕上打印出一行字&amp;ldquo;Hello World&amp;rdquo;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355039"&gt;&lt;/a&gt;&lt;a name="_Toc292354908"&gt;&lt;strong&gt;5.3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;一些常用的软件介绍&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在上面介绍的一些操作中，在进行文件传送的时候用到了一些软件，在此进行简要介绍。   &lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="91" valign="top"&gt;&lt;p&gt;LeapFtp&lt;/p&gt;&lt;/td&gt;&lt;td width="477" valign="top"&gt;&lt;p&gt;一个基于Ftp协议的文件互传软件。一般情况下，我们对arm-linux机器上开启Ftp服务，然后就可以实现Windows机器和arm-linux机器之间文件互传。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="91" valign="top"&gt;&lt;p&gt;SSH Secure File Transfer Client&lt;/p&gt;&lt;/td&gt;&lt;td width="477" valign="top"&gt;&lt;p&gt;一个基于SSH协议的文件互传软件，可以实现FTP的功能。虽然Linux机器和Windows机器之间可以通过共享目录进行文件交互，但是因为共享目录实际上相当于Linux机器的一个虚拟的外接设备，在每次编写代码保存后，系统都会重读一次，给操作上造成一点小麻烦，所以建议使用SSH进行文件传送。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="91" valign="top"&gt;&lt;p&gt;SSH Secure Shell Client&lt;/p&gt;&lt;/td&gt;&lt;td width="477" valign="top"&gt;&lt;p&gt;一个基于SSH的远程登录软件，可以实现telnet功能。因为Fedora默认关闭了telnet功能，而采用更安全的SSH协议来实现telnet的相关功能。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 三系统之间的主要网络架构如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136499402.png"&gt;&lt;img border="0" width="766" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136495465.png" alt="image" height="170" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.如果arm-linux系统的ftp和telnet连接不上，一般情况下是arm-linux默认没有开启相应的服务或者默认ip和windows机器不在同一网段。可以通过串口线将arm板连接到电脑上，然后打开超级终端，输入命令vsftpd&amp;amp;开启ftp服务，输入命令telnetd开启telnet服务，ifconfig eth0 192.168.1.16设置IP到同一网段。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.如果Linux系统的SSH连接不上，则一般情况下是Linux系统开启了SSH的防火墙，则只需要在Linux系统中对防火墙进行相关设置，关闭针对SSH的防火墙。【System】--【Administration】--【Firewall】，然后勾选全能SSH。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136501528.jpg"&gt;&lt;img border="0" width="272" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136504004.jpg" alt="clip_image074" height="142" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image074" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136515333.jpg"&gt;&lt;img border="0" width="381" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136511887.jpg" alt="clip_image076" height="277" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image076" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 还有一些其它软件，比如小组协作时候，需要使用SVN进行代码管理；还有远程桌面VNC Viewer，可以进行远程桌面控制（但是效果不太好，桌面显示的延时好像比较严重）等等。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355040"&gt;&lt;/a&gt;&lt;a name="_Toc292354909"&gt;&lt;strong&gt;5.4&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;开发arm-linux窗口程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355041"&gt;&lt;/a&gt;&lt;a name="_Toc292354910"&gt;&lt;/a&gt;&lt;strong&gt;5.4.1建立Qt交叉编译环境&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Linux系统中新建目录/root/yizhi，然后将已经编译好的arm-QT库复制到此目录下面。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/20110505113652184.jpg"&gt;&lt;img border="0" width="469" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136532627.jpg" alt="clip_image078" height="187" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image078" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后将上面那六个tar.gz压缩文件解压到/root/yizhi目录。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136532561.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136543607.jpg" alt="clip_image080" height="208" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image080" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在进行arm-linux下的Qt编译的时候，也涉及到环境变量设置问题，所以我们也最好再新建一个账户，专门用于编译arm-Qt程序。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 例如，在Linux系统终端中添加用户zsm，然后进入到/home/zsm中，对.bash_profile进行修改，设置环境变量：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136546050.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136558492.jpg" alt="clip_image082" height="349" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image082" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在命令终端中ls &amp;ndash;a 显示隐藏的所有文件 找到.bash_profile，输入：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;gedit .bash_profile &amp;amp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用geidt打开此文件后，在最后面添加下面的环境变量设置：&lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="568" valign="top"&gt;&lt;p&gt;export PATH=/root/yizhi/qtopia-free-2.2.0/qtopia/bin:/root/yizhi/qtopia-free-2.2.0/tmake/bin:/root/yizhi/qtopia-free-2.2.0/qt2/bin:/usr/local/arm/2.95.3/bin:$PATH&lt;/p&gt;&lt;p&gt;export QTDIR=/root/yizhi/qtopia-free-2.2.0/qt2&lt;/p&gt;&lt;p&gt;export QTEDIR=/root/yizhi/qtopia-free-2.2.0/qtopia/&lt;/p&gt;&lt;p&gt;export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH&lt;/p&gt;&lt;p&gt;export CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc&lt;/p&gt;&lt;p&gt;export TMAKEDIR=/root/yizhi/qtopia-free-2.2.0/tmake&lt;/p&gt;&lt;p&gt;export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 设置好后最好重新登录此账号，然后在终端中输入echo $PATH来检验环境变量是否设置成功：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136558459.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136555918.jpg" alt="clip_image084" height="124" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image084" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果出现上面的输出，则表示arm-linux平台下的Qt交叉编译环境的环境变量已经设置成功。接下来就可以进行Qt程序开发了。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355042"&gt;&lt;/a&gt;&lt;a name="_Toc292354911"&gt;&lt;/a&gt;&lt;strong&gt;5.4.2编译生成可执行窗体程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在3.2节中已经写好了一个单文件的项目QtHello，并在项目的src目录下生成了一个QtHello.cpp文件，然后我们要做的就是利用arm-linux下的Qt编译器对其进行编译。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 编译Qt窗体项目比编译普通控制台项目要稍微麻烦一点，需要自己写makefile来建立编译规则，编译如上的QtHello.cpp的makefile有如下模板：   &lt;/p&gt;&lt;table border="1" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="568" valign="top"&gt;&lt;p&gt;#############################################################################&lt;/p&gt;&lt;p&gt;# Makefile for building hello&lt;/p&gt;&lt;p&gt;# Generated by tmake at 20:58, 2011/04/14&lt;/p&gt;&lt;p&gt;# Project: hello&lt;/p&gt;&lt;p&gt;# Template: app&lt;/p&gt;&lt;p&gt;#############################################################################&lt;/p&gt;&lt;p&gt;####### Compiler, tools and options&lt;/p&gt;&lt;p&gt;CC = arm-linux-gcc&lt;/p&gt;&lt;p&gt;CXX = arm-linux-g++&lt;/p&gt;&lt;p&gt;CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG&lt;/p&gt;&lt;p&gt;CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG&lt;/p&gt;&lt;p&gt;INCPATH = -I. -I$(QTDIR)/include&lt;/p&gt;&lt;p&gt;LINK = arm-linux-gcc&lt;/p&gt;&lt;p&gt;LFLAGS =&lt;/p&gt;&lt;p&gt;LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte&lt;/p&gt;&lt;p&gt;MOC = $(QTDIR)/bin/moc&lt;/p&gt;&lt;p&gt;UIC = $(QTDIR)/bin/uic&lt;/p&gt;&lt;p&gt;TAR = tar -cf&lt;/p&gt;&lt;p&gt;GZIP = gzip -9f&lt;/p&gt;&lt;p&gt;####### Files&lt;/p&gt;&lt;p&gt;TARGET = &lt;b&gt;QtHello&lt;/b&gt;&lt;/p&gt;&lt;p&gt;HEADERS = $(TARGET).h&lt;/p&gt;&lt;p&gt;SOURCES = $(TARGET).cpp&lt;/p&gt;&lt;p&gt;OBJECTS = $(TARGET).o &lt;/p&gt;&lt;p&gt;DIST =&lt;/p&gt;&lt;p&gt;INTERFACE_DECL_PATH = .&lt;/p&gt;&lt;p&gt;####### Implicit rules&lt;/p&gt;&lt;p&gt;.SUFFIXES: .cpp .cxx .cc .C .c&lt;/p&gt;&lt;p&gt;.cpp.o:&lt;/p&gt;&lt;p&gt;$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $&amp;lt;&lt;/p&gt;&lt;p&gt;.cxx.o:&lt;/p&gt;&lt;p&gt;$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $&amp;lt;&lt;/p&gt;&lt;p&gt;.cc.o:&lt;/p&gt;&lt;p&gt;$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $&amp;lt;&lt;/p&gt;&lt;p&gt;.C.o:&lt;/p&gt;&lt;p&gt;$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $&amp;lt;&lt;/p&gt;&lt;p&gt;.c.o:&lt;/p&gt;&lt;p&gt;$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $&amp;lt;&lt;/p&gt;&lt;p&gt;####### Build rules&lt;/p&gt;&lt;p&gt;all: $(TARGET)&lt;/p&gt;&lt;p&gt;$(TARGET): $(OBJECTS)&lt;/p&gt;&lt;p&gt;$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)&lt;/p&gt;&lt;p&gt;dist:&lt;/p&gt;&lt;p&gt;$(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)&lt;/p&gt;&lt;p&gt;$(GZIP) hello.tar&lt;/p&gt;&lt;p&gt;clean:&lt;/p&gt;&lt;p&gt;-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)&lt;/p&gt;&lt;p&gt;-rm -f *~ core&lt;/p&gt;&lt;p&gt;####### Sub-libraries&lt;/p&gt;&lt;p&gt;###### Combined headers&lt;/p&gt;&lt;p&gt;####### Compile&lt;/p&gt;&lt;p&gt;$(TARGET).o: $(TARGET).cpp &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用zsm账号登录（因为关于arm-Qt库的编译环境变量是在此账号中设置的），然后执行如下步骤：&lt;/p&gt;&lt;p&gt;1.将makefile模板文件放置到src目录下面&lt;/p&gt;&lt;p&gt;2.用eclipse或者其它文本编辑器，修改makefile里面的TARGET一项为当前项目名称&lt;/p&gt;&lt;p&gt;3.打开Teminal控制终端，进入到src目录，输入make&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136568916.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136564739.jpg" alt="clip_image086" height="130" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image086" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;4.然后会在src目录下面生成一个指定名称相应的QtHello文件，这个就是arm目标板上的运行程序了。&lt;/p&gt;&lt;p&gt;5.将QtHello文件传送到arm板并运行程序（详细操作方法在4.2.3节中有介绍）。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051136577181.jpg"&gt;&lt;img border="0" width="517" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137037600.jpg" alt="clip_image088" height="185" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image088" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Windows机器上远程登录arm板，控制程序运行，然后可以看到arm板上运行的结果了。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355043"&gt;&lt;/a&gt;&lt;a name="_Toc292354912"&gt;六、高级Linux&lt;/a&gt;程序设计&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面所介绍的不管是控制台还是窗体程序，都属于单文件项目的范围。而当程序的功能比较复杂时，则往往需要很多模块和文件，这样在向arm-linux上移植程序时会更加繁琐一些，需要开发人员自己写makefile，建立多文件的编译规则。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为我对此没有进入深入一点的研究，所以只能提供下大致思路和在开发程序时遇到的一些常见问题及解决方案。如果今后有机会有时间的话，则会对makefile进行深入一点的研究，最好是能以Eclipse自己生成的makefile模板为基础进行简单的修改，然后就可以编译生成arm板上的可执行程序。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355044"&gt;&lt;/a&gt;&lt;a name="_Toc292354913"&gt;6.1&lt;/a&gt;多文件控制台项目&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 多文件的控制台程序的makefile可能会容易一些，自己也没有研究过，以前在使用Magic C++编写C++控制台程序的时候，只需要对Magic C++生成的makefile模块中的编译器进行修改就可以轻松为多文件生成基于arm-linux平台上的控制台程序。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137045931.jpg"&gt;&lt;img border="0" width="558" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137046978.jpg" alt="clip_image090" height="378" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image090" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; （关于如何对Eclipse的makefile模板进行修改，目前还没有研究过，今后有时间研究的话，再补充上吧。）&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355045"&gt;&lt;/a&gt;&lt;a name="_Toc292354914"&gt;&lt;strong&gt;6.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;多文件Qt项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 目前只对简单的多文件项目进行了尝试：一个main函数文件，一个窗体头文件，一个窗体实现文件。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355046"&gt;&lt;/a&gt;&lt;a name="_Toc292354915"&gt;&lt;/a&gt;&lt;strong&gt;6.2.1使用Qt Designer设置界面&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Linux系统中打开Qt Designer，然后进行可视化窗口设计。然后点击保存为mydialog.ui文件。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137045832.jpg"&gt;&lt;img border="0" width="594" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137057369.jpg" alt="clip_image092" height="373" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image092" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 打开mydialog.ui文件，发现其实只是一个xml文件:&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137061240.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137065318.jpg" alt="clip_image094" height="371" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image094" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 显然这个文件是不能直接被C++项目引用的，需要使用Qt Designer的编译器进行编译，生成和界面对应的h和cpp文件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Terminal终端里面运行以下命令：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;uic xxx.ui -o xxx.h 生成.h文件&lt;/p&gt;&lt;p&gt;uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137073093.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137078600.jpg" alt="clip_image096" height="228" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image096" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后生成的mydialog.h和mydialog.cpp文件就是和mydialog.ui相对应的程序代码文件了。可以在Eclipse项目中直接对此文件进行引用，就可以显示对应的窗体了。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355047"&gt;&lt;/a&gt;&lt;a name="_Toc292354916"&gt;&lt;/a&gt;&lt;strong&gt;6.2.2多文件Qt开发时的一些经典错误&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 经典错误一：&lt;/b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&amp;ldquo;undefined reference to &amp;hellip;&amp;hellip;&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137072155.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137087105.jpg" alt="clip_image098" height="132" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image098" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这是在引用Qt的库时，产生了某些歧义，需要进行一些预先处理，生成和界面文件相对应的moc文件，关于问题的详细介绍可以参考下面的帖子：&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html"&gt;http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 解决方案：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Linux控制终端中进入到项目代码文件目录，执行&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;qmake &amp;ndash;project&lt;/p&gt;&lt;p&gt;qmake&lt;/p&gt;&lt;p&gt;make&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然后此目录下会生成一系列的文件，如moc_xx.cpp,moc_xx.o,src,src_pro等等。然后再到Eclipse中编译此项目，则错误消失。&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 经典错误二：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Linux机器上能运行的Qt窗口程序，在arm-linux下的Qt编译器下无法通过。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可能的问题是Qt库版本问题，或者是有些Qt运行环境在Linux机和arm-linux机上有所不同，这就需要重新寻找新的代替解决方案。正是因为这些很多不确定的因素，所以在进行arm-linux界面程序开发时，需要经常在编写一段新代码就要在arm板上进行测试，可以避免做太多无用功。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355048"&gt;&lt;/a&gt;&lt;a name="_Toc292354917"&gt;&lt;strong&gt;6.3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;关于makefile&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于多文件Qt项目向arm-linux系统上的移植，比较核心的技术应该就在makefile上吧，目前自己了解太少，只限于对模板的应用，所以下面的就写不下去了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面有一篇到网上找到的关于makefile结构分析的帖子，今后有机会再研究吧。&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://blog.csdn.net/liang13664759/archive/2007/09/04/1771246.aspx"&gt;http://blog.csdn.net/liang13664759/archive/2007/09/04/1771246.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc292355049"&gt;&lt;/a&gt;&lt;a name="_Toc292354918"&gt;&lt;strong&gt;七、学习资料&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于Linux下的Qt开发，在安装了的Fedora里面有相关的本地reference和相关的源码。如：Qt Assistant&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137085959.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137095370.jpg" alt="clip_image100" height="350" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image100" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于arm-linux下的Qt开发，安装交叉编译环境时候，也有相关文档和源码：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137094465.jpg"&gt;&lt;img border="0" width="557" src="http://images.cnblogs.com/cnblogs_com/beer/201105/201105051137102447.jpg" alt="clip_image102" height="279" style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image102" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;//**************************************************************************&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结语：&lt;/strong&gt;OK,写到这里了。在上个学期就花过一段时间学习Linux，然后中断了半年，这个学期又进行了深入的学习，把以前的内容和现在的内容串接起来了，终于有了比较清晰一点的思路和体会了，所以总结一下，也让将来的自己再回头学习时有一点借鉴吧。感谢胡师兄的一点一滴的指导。&lt;/p&gt;&lt;p&gt;2011-5-5&lt;/p&gt;&lt;p&gt;于武汉大学&lt;/p&gt;&lt;p&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Author:&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;From:&lt;a href="http://www.cnblogs.com/beer"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Notes:&lt;/em&gt;&lt;em&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;original:&lt;a href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html"&gt;http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/2037449.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2011/01/03/1924378.html</id><title type="text">2010年终人生的思考</title><summary type="text">我也不知道是什么时候，自己开始逐渐意识到人会老，人会死。应该是在高中的时候吧，某个哥们发神经似地问“人活着是为了什么”，当时居然都答不上来，他发神经就算了，还搞得我也跟着发起了一阵的神经。后来由于忙着准备高考，然后忙着上大学，忙些乱七八糟的事情，就逐渐把这件事情抛诸脑后了。还是有前段时间，同班的一些哥们在我们寝室闲谈，从学校生活谈到工作，从工作谈到社会问题，从社会问题谈到人生问题，谈人生问题就无法避免地谈生老病死的问题，最后越谈越悲凉，直勾起我，当然也是很多人心中最深层次地恐惧了，也就是那个哲学的经典问题“人活着是为了什么”。为什么会思考“人活着是为了什么”这个问题啊。因为人会死，不管你是</summary><published>2011-01-02T21:16:00Z</published><updated>2011-01-02T21:16:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2011/01/03/1924378.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2011/01/03/1924378.html"/><content type="html">&lt;p&gt;我也不知道是什么时候，自己开始逐渐意识到人会老，人会死。应该是在高中的时候吧，某个哥们发神经似地问&amp;ldquo;人活着是为了什么&amp;rdquo;，当时居然都答不上来，他发神经就算了，还搞得我也跟着发起了一阵的神经。后来由于忙着准备高考，然后忙着上大学，忙些乱七八糟的事情，就逐渐把这件事情抛诸脑后了。还是有前段时间，同班的一些哥们在我们寝室闲谈，从学校生活谈到工作，从工作谈到社会问题，从社会问题谈到人生问题，谈人生问题就无法避免地谈生老病死的问题，最后越谈越悲凉，直勾起我，当然也是很多人心中最深层次地恐惧了，也就是那个哲学的经典问题&amp;ldquo;人活着是为了什么&amp;rdquo;。&lt;/p&gt;&lt;p&gt;为什么会思考&amp;ldquo;人活着是为了什么&amp;rdquo;这个问题啊。因为人会死，不管你是王孙贵族还是贩夫走卒，在死亡面前人人平等，当然可能会有医疗条件上的差异，但是终都会一样的尘归尘、土归土。在战国初期最早实现中国大一统的秦始皇，最后在晚年的时候，也是不断派人去寻长生不死之药，但是最终也还是难逃一死，当然作为始皇帝，他可以拉下很多人殉葬，但是还是无法改变他死的事实。&lt;/p&gt;&lt;p&gt;以前查阅历史或者观察生活，好多事情和现象都不是太理解。比如，在春秋战国时期，为何有那么多舍生取义的义士；汉代，为何司马迁可以忍受腐型而著史；三国时期，诸葛亮为何选择了刘备，而不是当时势头正旺的孙权或者曹操；为何生活中的爷爷奶奶们都是慈详和坦然的；为何这个社会上那么多人会选择自杀；为何某某官员会变质&amp;hellip;&amp;hellip;还有，太多了。这些事情可能在我们小的时候，都想不明白。但是当自己逐渐长大，逐渐明白人是会生老病死，而且总有一天会降临到自己身上的时候，这个时候你就发现这个事实总不经意间左右着你的想法和行为。这个社会上为何有小三，为何这么多人想要房子，为何要结婚，生孩子。等等。因为我们每天都在变老，而且都终会死去，我们无法改变，我们能做的顶多在这个生命时限上下波动一些时限，但是最终结果却无法改变，所以&amp;ldquo;天生我材必要用，千金散尽还复来&amp;rdquo;，&amp;ldquo;人生得意需尽欢，莫使金樽空对月&amp;rdquo;，&amp;ldquo;花开堪折直需折，莫待无花空折枝&amp;rdquo;。还有前些日子看的《走向共和》，里面袁世凯也算是近代历史一代枭雄，作为北洋新军的创始人也是个接受了新思想的人，为何后来居然也会要选择逆历史潮流去称帝呢，里面有个场景比较记忆犹新，在护国战争反对袁世凯称帝并取得成功后，袁世凯在在他的夫人面前无可奈何地哭着说&amp;ldquo;我终于让你当了一回皇后了&amp;rdquo;，其实袁的称帝不同于封建皇帝，而是欲效法英国和日本的君主立宪，说白了，也是为了在有生之年过一把当皇帝的瘾，人生何其短啊。&lt;/p&gt;&lt;p&gt;人生短暂，所以&amp;ldquo;不死药&amp;rdquo;，&amp;ldquo;修道寻仙&amp;rdquo;成了很多人的追求，这点在文学影视作品中体现的比较多。秦始皇求不死药这在如今的影视作品中已经成为经典的神话题材了；文学作品中有大家比较熟悉的《西游记》，唐僧为何那么抢手?就是因为吃了他的肉可以长生不老。无论是秦始皇还是妖怪们，在寻求永生的过程中，都没有得到过好下场。当然也有影视作品中讲一些得到永生的人，但是显然他们在得到永生后，却也并不是那么的快活，比如香港片《我和僵尸有个约会》，美国机器科幻片《变人》，得到永生的要么是吸血的僵尸人，要么就是没有体温的机器人，他们得到永生的代价就是不能和心爱的人在一起，而且还要忍受身边的人慢慢老去，然后一个个地离开自己的痛苦。当然，你也可以认为这是导演们吃不到葡萄说葡萄酸的心理在作祟，但是我想说的是长寿真的不见得是什么好东西。记得在我读高三的那年吧，中国文坛的参天大树巴金倒下离开了我们。当时媒体上到处登载着他的事迹和作品。里面有段话，我印象深刻&amp;ldquo;巴金说：&amp;lsquo;长寿是一种罪过，但活着是一种责任。&amp;rsquo;他爱他的国家他的生命他的周围的亲人和人民。可是他同时代的人相继的离去了，他的爱人也去了天国，就剩下他孤独的挣扎着，我相信他最后的岁月不是为自己而活着，因为这样活着太痛苦了。&amp;rdquo;所谓的永生的吸血僵尸人和所谓的不会生老病死的机器人，从广义上来讲都还不算永生，只是说是一种广义上的&amp;ldquo;长寿&amp;ldquo;而已，因为他们只是形体上超越了生老病死，但是他们的身体还是以物质形态存在着，而且还是生活在自然环境中，终究会有一天也会永远消失的（这个会在下一节中解释），眼看着身边的人相继离去，最后也会只剩下他孤独的挣扎着。&lt;/p&gt;&amp;nbsp;&amp;lt;二&amp;gt;&lt;p&gt;//*******************来自于网络的零散摘录拼接*********************&lt;/p&gt;&lt;p&gt;太阳系产生的时间为45.68亿年前，而地球产生的年龄要比太阳系晚30万年到4500万年左右，大约为 45亿年前左右。在我们人类产生之前，地球上的霸主是恐龙。百科上是这么说的&amp;ldquo;恐龙是生活在距今大约2亿3500万年至6500万年前的、能以后肢支撑身体直立行走的的一类动物，支配全球陆地生态系统超过1亿6千万年之久。大部分恐龙已经灭绝，但是恐龙的后代&amp;mdash;&amp;mdash;鸟类存活下来，并繁衍至今&amp;rdquo;。而人类呢，目前,学术界一般认为,古猿转变为人类始祖的时间在700万年前，也就是说的人类的历史才不过上千万年，人类这个群体将能在地球上存在多长的时候还不知道。&lt;/p&gt;&lt;p&gt;好吧，那么我们就假想人类作为一个特别的群体，这个群体一旦产生于地球上，那么就休想有人从地球上将其消灭，除非一天地球没了。OK，我们再讨论地球的寿命问题。地球本身的寿命几乎是无限的，但地球离太阳很近，所以，地球寿命还受太阳寿命的制约，在太阳进入红巨星状态时（目前是主序星），被急剧膨胀的太阳的光辉所淹没，离太阳更近的水星金星那时已是太阳的盘中餐。有些科学家认为或许地球不至于会成为太阳的一部分，但地球上大部分物质也都会被高温汽化，地球的体积也会缩小。之后太阳会进入一个体积不断变化（扩大再缩小再扩大再缩小&amp;hellip;&amp;hellip;）的变星 不稳定状态。这期间太阳会把大部分物质抛离自己，可能残活下来的地球和其他行星也会被一股股太阳的呕吐物吹离自己原有的轨道。由于太阳的体积不够大，所以其本身的燃料无法支撑其核聚变的继续，所以太阳也无法继续成长，也因此不会有后续的超新星爆炸出现在太阳身上。最终太阳应该会在高温高热物质都抛离自己后逐渐缩小冷却，留下一个冰冷的内核 一颗小的白矮星，大小和现在的地球没什么大的出入，同时太阳的光辉也会永远的消散。整个过程时间推测会持续50亿年以上。 地球最后的结局不是被太阳吃了，就是孤单地飘落在荒茫的宇宙空间中。被其他恒星捕获的几率太低。 太阳大概还有50亿年的时间，也就是地球作为一颗物质星球的存在，可以存活的上限也是50亿年。当然，这50亿年地球经得起折腾，我们人类经不经得起折腾就不敢说了，不过，我们也可以假想人类这个群体太特殊了，经和起各种折腾。好，就算太阳系没有了，地球也很侥幸没有被太阳给吃掉，而且我们人类也很侥幸在这样的折腾下面活下来了。（真是巧合啊，这个概率，让我想起了网上的一个有趣的比方，其&amp;ldquo;侥幸&amp;rdquo;程度就象我双手在键盘上乱敲，而打出一部《鹿鼎记》。即使，就那么&amp;ldquo;侥幸&amp;rdquo;了，&amp;ldquo;而且我们更幸运的是，地球也恰好被另外一颗行星给捕获了&amp;rdquo;，那么概率就如是拉只猴子来电脑前打部《鹿鼎记》。这可能吗？），OK，就算世界上真的有这么巧的事，拉只猴子来在键盘上乱敲，它还打出了一部《鹿鼎记》了。我们再讨论一个更大尺度的，宇宙的寿命。&lt;/p&gt;&lt;p&gt;目前的主流宇宙学说。宇宙的最初源头是一个奇点，即所谓的&amp;ldquo;宇宙蛋&amp;rdquo;，它凝聚了所有的时空质能，孕育着未来物质世界的一切，包括天体和生命。大约150亿年以前，宇宙蛋在一场无与伦比的大爆炸中猝然爆发。大爆炸震撼出时空，物质世界破壳面出，宇宙史的纪元从此开始。&lt;/p&gt;&lt;p&gt;刚刚诞生的宇宙，空间从无到有并急剧猛增，仅仅10-32秒后，就暴胀到大约1光年的直径。在1 秒钟时，由于大爆炸产生的极强高能辐身均匀地充满整个空间，宇宙成为100亿k高温的熔炉，所有物质被熬成一锅基本粒子汤。 紧接着，一场肆虐的原始宇宙风暴开始了，基本粒了之间发生猛烈撞击，中了熔入质子形成了氦核。这个过程延续了大约三分钟，直至所有的中子消耗殆尽为止。有约22%质量的物质聚合成氦核，余下的物质几乎为没有聚合的质子，即氢核，仅有十万分之几属于同位素氦3和氘，百亿分之几归之于锂。原始星云形成――星系形成――恒星形成――生命的形成与进化 &amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;宇宙的终结。&lt;/p&gt;&lt;p&gt;19世纪50年代，克劳修斯和威廉.汤姆逊提出了热力学第二定律。它指出，一个孤立系统，无论其初始条件和历史如何，它的一个状态函数－熵会随时间的推移单调啬，直到达到势力学平衡态时趋于极大，从而指明了不可逆过程的方向性，即&amp;ldquo;时间箭头&amp;rdquo;只能指向熵增加的方向。20世纪以来，在电磁学和量子力学中也发现了时间之矢，振荡电磁所产生的电磁波只能从点源向无限远处辐射传播，而不能从无限远处向点源集合；在原子内部，电子能从高激发态能级自发地跃迁到低能级，相反的过程却不能自发发生，必须受到外力的激发。&lt;/p&gt;&lt;p&gt;1965年，克劳修斯将热力学第二定律应用于宇宙演化，提出了著名的&amp;ldquo;宇宙热寂论&amp;rdquo;，认为整个宇宙的总能量是一个常量，随着熵的不断增大，所有的能量形式，机械的、物理的、化学的、生命的都将转化成热能，而热又总是自发地由高温部分流向低温部分，直到温度处处相等的热平衡状态（此时宇宙的熵趋于极大值）；而一旦达到这一状态，任何进一步的变化都不会发生了，于是宇宙就进入了一个热的，然而是死寂的永恒状态。&lt;/p&gt;&lt;p&gt;下面是网上一段关于宇宙终结的一段描述：&lt;/p&gt;&lt;p&gt;宇宙的未来命运如何？科学家、哲学家和神学家都提出了自己的观点。一个目前被普遍认同的观点是：宇宙作为物质世界的全部，也就遵守物质自身和规律；而根据热力学第二定律，得出的结论实在令人难以接受：宇宙将在遥远的未来走向死亡&amp;mdash;&amp;mdash;永恒的死亡。&lt;/p&gt;&lt;p&gt;设想在非常非常遥远的未来，所有恒星因缺乏燃料而熄灭，宇宙一片黑暗。在这漆黑的浩瀚太空中，潜伏着许多带自转的黑洞、离散的中子星和黑矮星，另外还有一些行星级的天体，它们在引力的作用下进行着一场战争，战争的结局是星系解散了，绝大多数天体被引力弹弓抛入星系际空间，永远漫游在膨胀着的太空中；而星系中心的黑洞取得了兼并战的局部胜利，它吞并了百分之几的天体，形成了更大的黑洞。这场战争持续时间长得超乎想象，大约是今天宇宙年龄的十亿倍。&lt;/p&gt;&lt;p&gt;在又一段长长得超乎想象的时间里，当宇宙背景辐射由于膨胀降至足够低的程度时，所有的黑洞最终都会在一阵快辐射中一下子化为乌有，在宇宙永恒夜幕中划出一道道瞬现即逝的闪光；而其它天体也将在这漫长和时间里发生衰变而渐渐蒸发，直至完全消失，变成正电子或其它粒子；宇宙变成一锅令人难以置信的稀汤，其中有光子、中微子及数量正在逐渐减少的电子和正电子。宇宙曾经拥有的辉煌，包括闪烁的群星及智慧生命创造的无数奇迹，都湮没在这荒凉而又空虚的宇宙中，不留下任何记忆，只有时间在无休止地流逝，空间在无止境地膨胀&amp;hellip;&amp;hellip; &lt;/p&gt;&lt;p&gt;&amp;ldquo;热寂说&amp;rdquo;提出一百多年来，无论是在科学上还是在哲学上，各种争论此起彼伏，无休无止。有许多赞同者，也有许多反对者。他们都在孜孜不倦地寻求着这一疑难的最后答案。然而，最终都令无数英雄竞折腰。难怪大哲学家罗素(B.Russel)发出这样悲观的感叹，&lt;strong&gt;&amp;ldquo;&lt;/strong&gt;&lt;strong&gt;一切时代的结晶，一切信仰，一切灵感，一切人类天才的光华，都注定要随太阳系的崩溃而毁灭。人类全部成就的神殿将不可避免地会被埋葬在崩溃宇宙的废墟之中&lt;/strong&gt;&lt;strong&gt;--&lt;/strong&gt;&lt;strong&gt;所有这一切，几乎如此之肯定，任何否定它们的哲学都毫无成功的希望。唯有相信这些事实真相，唯有在绝望面前不屈不挠，才能够安全地筑起灵魂的未来寄托&lt;/strong&gt;&lt;strong&gt;&amp;rdquo;&lt;/strong&gt;。即使是像控制论之父维纳(N.Wiener)这样的科学巨匠，最终也&amp;ldquo;控制&amp;rdquo;不住自己沮丧的感情，几乎是在绝望中悲叹，&lt;strong&gt;&amp;ldquo;我们迟早会死去，很有可能，当世界走向统一的庞大的热平衡状态，那里不再发生任何真正新的东西时，我们周围的宇宙将由于热寂而死去，什么也没有留下&lt;/strong&gt;&lt;strong&gt;&amp;hellip;&amp;hellip;&lt;/strong&gt;&lt;strong&gt;&amp;rdquo;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当然，关于&amp;ldquo;宇宙热寂论&amp;rdquo;也有很多反对的观点。比如&amp;ldquo;大爆炸&amp;rdquo;理论。&lt;/p&gt;&lt;p&gt;长期以来，对&amp;ldquo;热寂说&amp;rdquo;疑难的回答，无论从科学上看还是从哲学上看似乎都未能切中要害，缺乏说服力，因而一再爆发争论。然而20世纪六、七十年代以后，自从&amp;ldquo;大爆炸&amp;rdquo;宇宙模型逐渐得到天体物理学界公认以来，对&amp;ldquo;热寂说&amp;rdquo;疑难的讨论发生了根本性的转向，这一时期成了&amp;ldquo;热寂说&amp;rdquo;争论史上一个划时代的转折点。&lt;/p&gt;&lt;p&gt;1994年10月，《科学美国人》杂志以&amp;ldquo;宇宙中的生命&amp;rdquo;为主题隆重推出了一期专刊，其中登载了四位著名科学家的综述，全面介绍了当代天体物理学界关于宇宙起源与演化问题的研究成果--大爆炸宇宙模型。该理论认为，宇宙大约是在100～200亿年以前，从高温高密的物质与能量的&amp;ldquo;大爆炸&amp;rdquo;而形成。随着宇宙的不断膨胀，其中的温度不断降低，物质密度也不断减小，逐渐衍生成众多的星系、星体、行星等，直至出现生命。&amp;ldquo;大爆炸&amp;rdquo;理论中指出，经典热力学的结论是不考虑引力，在静态空间下证明的，不适用于引力占主导地位的膨胀宇宙。所以宇宙热寂也是不会发生的。于是，人类终于从百年梦魇中醒来，爆发出热情的欢呼，&amp;ldquo;宇宙不但不会死，反而会从早期的热寂状态（热平衡态）下生机勃勃地复苏&amp;rdquo;，&amp;ldquo;热寂说的一页，已被翻过去了&amp;rdquo;！然而，人类的欢呼似乎来得早了一点。尽管热力学意义上的宇宙&amp;ldquo;热寂&amp;rdquo;状态永远不会到来，但宇宙的命运却不会因此而变得更加令人乐观。宇宙的结局完全取决于它的初始条件，宇宙的创生与终结始终紧密相连。大爆炸理论发现了宇宙起源的真相，同时也预言了它遥远的未来。&lt;/p&gt;&lt;p&gt;在大爆炸理论中有一个极其重要的参量&amp;Omega;=&amp;rho;[,0]/&amp;rho;[,c]，其中&amp;rho;[,c]是与哈勃常数密切相关的一种宇宙临界密度，&amp;rho;[,0]是现在的宇宙密度。若&amp;rho;[,0]＜&amp;rho;[,c]，即&amp;Omega;＜1，表明宇宙是膨胀的，并且一直膨胀下去；若&amp;rho;[,0]＞&amp;rho;[,c]，即&amp;Omega;＞1，表示宇宙起初膨胀，到达一定时刻后，就将转化为收缩。若&amp;rho;[,0]=&amp;rho;[,c]，则宇宙处于两者之间的临界状态。由于大多数人承认的观测结果是&amp;Omega;＜1，因此宇宙一直永远膨胀下去成为最可能的一种状态。假使如此，未来所有恒星上的热核反应都将逐渐停止，留下的将是各种各样的宇宙&amp;ldquo;熔渣&amp;rdquo;--黑矮星、中子星和黑洞，而宇宙的背景辐射温度将不断下降，以至于无限地趋近于绝对零度，最终达到另一种意义上的&amp;ldquo;冷寂&amp;rdquo;。宇宙另一种可能的状态是，当膨胀达到最高点，背景辐射的温度降到最低，此时宇宙开始收缩，温度又重新上升。当宇宙不断收缩至愈来愈接近它的最后阶段时，环境条件同大爆炸后不久起支配作用的那些条件越来越相似，宇宙又重新回到处于&amp;ldquo;热寂&amp;rdquo;状态的基本粒子&amp;ldquo;羹汤&amp;rdquo;状态。这实际上是一个反演过程。在宇宙暴缩的最后时刻，引力成为占绝对优势的作用，所有的物质都将因挤压而不复存在，包括时空本身在内的一切有形的东西统统将被消灭，只剩下一个时空奇点。无论宇宙最后出现哪一种状态，其结果对人类来说都将是灭顶之灾。&lt;/p&gt;&lt;p&gt;这就是大爆炸理论为人类预言的宇宙未来和世界末日。由于这一理论也不合人们的期望，因而当它提出之日起同样也遭到了来自各方面的反对，并认为它是一个&amp;ldquo;倒了头&amp;rdquo;的宇宙&amp;ldquo;热寂说&amp;rdquo;。然而，自然规律毕竟不以人的意志为转移，人类必须正确对待，最好的心态是，&amp;ldquo;我们决不能忽视物之有生亦必有死的事实，死亡或许正是为创生不得不付出的代价&amp;rdquo;。&lt;/p&gt;&lt;p&gt;当然，还存在着一些其他并非毫无科学根据的宇宙模型，也许会带给人类新的光明和希望。人类不应该气馁。&amp;ldquo;我们的后代也许还有数十亿年甚至数万亿年的时间来对付这场最后的大屠杀。在这段时间里，生命能够扩展到整个宇宙&amp;hellip;&amp;hellip;并对它加以控制，因此他们可以调整自己的位置，支配一切可能的资源来对抗这场大危机&amp;rdquo;。&lt;/p&gt;&lt;p&gt;//************************ *************************&lt;/p&gt;&lt;p&gt;以上关于宇宙的演化都为网络的零散摘录拼接而成。可能有理，也可能无理，而我也没有时间去搜集那些资料了，我觉得那些也不是重点了。就像一个人死快要死了，但是他却是想知道他的房子将来会是什么样子的结局，但是这个房子不管是什么结局，都一点都不能改变他将要死的这个事实一样，探究这个房子的归宿的作用仅是让其死得瞑目一点点而已，也就是满足一下人类小小的好奇心罢了。所以，谁对谁错，暂时不属于本文讨论的内容吧。&lt;/p&gt;&lt;p&gt;&amp;lt;三&amp;gt;&lt;/p&gt;&lt;p&gt;以前高中时候有段时间迷上了卫斯理科幻小说，在《天书》里面见过一句话&amp;ldquo;不知道外面世界的阿米巴是幸福的阿米巴&amp;rdquo;。（注：阿米巴是一种生活在泥水中的原虫，一种没有思考能力的原虫）。我们可能觉得阿米巴这种没有任何思维能力的小虫的一生是多么的无趣和可笑，但是知道了宇宙的人类难道就不可悲了么？&lt;/p&gt;&lt;p&gt;好吧，上一节说完了大尺度了的宇宙，再回到我们的小尺度的个体人生：10的二次方年的时间尺度，10的一次方米的身高尺度，光一秒就能绕7圈的地球范围内的活动空间尺度。&lt;/p&gt;&lt;p&gt;再说说我们大学生作为一个普通个体的生活吧，每天上上网，女生喜欢看看电视剧，男生喜欢打打游戏，明天我还要英语口语考试，后天还有数学作业要交，马上就要过年，马上就经毕业，马上就要找工作，马上就要离开校园，马上就要开始可能是日复一日的划直线的工作，马上为了房子操劳奔波，马上要结婚，马上要生小孩，马上要养小孩，马上要抱孙子，马上要老去，马上要死去&amp;hellip;&amp;hellip;一切的一切在宇宙时间尺度上用&amp;ldquo;马上&amp;ldquo;来形容都觉得太过了。&lt;/p&gt;&lt;p&gt;我想大家一定都还记得高中课本上苏轼的那篇《赤壁赋》吧。&lt;/p&gt;&lt;p&gt;&amp;ldquo;苏子愀然，正襟危坐而问客曰：&amp;ldquo;何为其然也？&amp;rdquo;客曰：&amp;ldquo;&amp;lsquo;月明星稀，乌鹊南飞&amp;rsquo;,此非曹孟德之诗乎？西望夏口，东望武昌。山川相缪，郁乎苍苍，此非孟德之困于周郎者乎？方其破荆州，下江陵，顺流而东也，舳舻千里，旌旗蔽空，酾酒临江，横槊赋诗，固一世之雄也，而今安在哉?况吾与子渔樵于江渚之上，侣鱼虾而友麋鹿,驾一叶之扁舟，举匏樽以相属。寄蜉蝣于天地，渺沧海之一粟。哀吾生之须臾，羡长江之无穷。挟飞仙以遨游，抱明月而长终。知不可乎骤得，托遗响于悲风。&amp;rdquo;&lt;/p&gt;&lt;p&gt;里面的这段关于有限人生和无限时空的对比的伤感，想必当时高中的我们很难体会出来吧，因为，我们当时只知道我们在长大，只有&amp;ldquo;生&amp;rdquo;没有&amp;ldquo;老病死&amp;rdquo;的概念，是无法体会到一个人到中年却官场失意的人的心境的。但是，事情就是这么有戏剧性，只有当我们体会不到这种心境的时候，恰恰是我们最幸福快乐的时候。&lt;/p&gt;&lt;p&gt;所以有人说&amp;ldquo;猪从某种程度上来说是一种很幸福的动物&amp;rdquo;也是有道理的。&lt;/p&gt;&lt;p&gt;&amp;lt;四&amp;gt;&lt;/p&gt;&lt;p&gt;前面说了那么多，好像也一直没有给出如何解开&amp;ldquo;死亡的困惑&amp;rdquo;这个结的方法。我也给不出，我不是哲学家，我想哲学家估计也不好给出吧。&lt;/p&gt;&lt;p&gt;前些天，看了一个关于YALE大学的关于死亡的开放课，我只看了一集，里面那个大胡子先讲了关于那种宗教的灵魂永生，等等，但是后来他说，他开这个课的目的就是要告诉你们这是错误的。其实相信有永生的灵魂是没用的，只有真正从内心上克服了对死亡的恐惧，才能坦然面对死亡，否则，你即使有宗教信仰，你还是因为对死亡的恐惧才去信仰的。&lt;/p&gt;&lt;p&gt;关于面对死亡，有一些其它描述。比如以前在大二的时候，听&amp;ldquo;四大名嘴&amp;rdquo;赵林的西方哲学史的时候，好像古希腊有个哲学家的人生信条是&amp;ldquo;生时我还没死，不用怕；死后时我又什么都不知道了，不会怕&amp;rdquo;。还有，奥斯卡&amp;middot;王尔德的&amp;ldquo;生就当从来没有死，死就当从来没生过&amp;rdquo;。&lt;/p&gt;&lt;p&gt;或者有一个自己坚定的信仰。在科学技术极为发达的美国，信仰基督教的人仍然很多，因为科学往往只能从物质上给人带来便利，而不能直接从心灵上给人带来生活上的幸福感。&lt;/p&gt;&lt;p&gt;曾经有个网友，向我推荐过一部动漫，由日本著名动漫大师手冢治虫创作的动漫作品《火鸟》。这部动漫从哲学的高度来讲不同的人对待生死的态度。网上有评语&amp;ldquo;作品吸收了大量的神话故事,传说及史实,为读者展示了各个时代人类面对生与死的不同态度,笔力之厚重,主题之深邃均前所未有&amp;rdquo;。手冢自己也对其进行过概括：&amp;ldquo;一定要说这部作品的主题那就是：&amp;lsquo;在某个时间的某个地方，有某个生命在发出声音&amp;hellip;&amp;hellip;&amp;rsquo;&amp;rdquo;是啊，武士和强盗，机械人和外星生命&amp;hellip;&amp;hellip;它们共同演绎的是生命的主题，在时空的大河里一个生命可以渺小的连沙子都不如，但并不代表它不存在。美好的梦想可以眨眼间被打得粉碎，但整个宇宙的生命大合唱却生生不息，永无休止，就好像火中的凤凰&amp;hellip;&amp;hellip;（自己两年前没看太懂，现在也没有时间看，所以只作推荐，不作评论了）&lt;/p&gt;&lt;p&gt;还有，关于宇宙终结论，还有一些说法。比如平行宇宙，时间穿梭，空间虫洞，可以会使得人类一直停留在某个时间段中，而达到局部的死循环，但也不知这是喜还是悲，喜的是人类因此会得到永生，不会消亡。悲的是，日复一日的循环，会不会终究有一天会完成一个周期而进入下一个周期，从此的除了时间上是重复，事件上也是在重复了？&lt;/p&gt;&amp;nbsp;&lt;p&gt;&amp;lt;五&amp;gt;&lt;/p&gt;&lt;p&gt;上面说的那些东西，好像还是离我们的生活还是很远。那么就在这个地方说下上面那些思考对我自己现实生活的影响吧。&lt;/p&gt;&lt;p&gt;正如我在开始本文的时候，我就提到，在高中的时候，我就因为一个神经兮兮的哥们的一个问题也跟着他神经兮兮了好一阵。后来我好像是找到了一个心理寄托点了吧。因为当时的历史书上有这么一句话&amp;ldquo;有的人流芳千古，有的人遗臭万年&amp;rdquo;，虽然人生只有短短几十载，但是如果成为一个特别优秀的人，还是可以达到流芳千古的所谓&amp;ldquo;不朽&amp;rdquo;，这个想法比较天真吧，呵呵。后来我在看一本书《美的历程》的时候，居然发现还有个家伙也有这样的思想，那就是魏文帝曹丕。曹丕地位甚高，后来又做了皇帝，极人世之崇荣，应该是实现了人生的最高理想了吧，然而并不。他依然感到&amp;ldquo;年寿有时而尽，荣乐止乎其身，二者必至之常期，未若文章之无穷&amp;rdquo;。帝王将相、富贵功名很快便是白骨荒丘，真正不朽、能够世代流传的却是精神产生的东西。&amp;ldquo;不假良史之词，不托飞驰之势，而声名自传于后。&amp;rdquo;显赫一进的皇帝可以湮没无闻，华丽优美的辞章并不依赖什么却被人们长久传诵文章不朽当然也就是人的不朽。当时还在高中的自己，思想也比较简单，看到书上的那些人，就想，自己一定要努力，将来也要让自己的名字成为书本的一部分，以达到所谓的&amp;ldquo;不朽&amp;rdquo;。当然，现在这个时候再看，希望是越来越渺茫了呃，都快和要一只猴子乱敲键盘打出一部《鹿鼎记》差不多的概率了。唉，不过还是很佩服当年自己的勇气的，果然是年少轻狂啊。不过，我大学还有位室友有这样的想法，而且还有声有色地努力着，真为他感到高兴，他现在还可以立下&amp;ldquo;为中华之崛起而读书，为中国的控制事业奋斗终生&amp;rdquo;这样的豪言壮语，但是我不能了，我只能在内心深处弱弱地对自己说&amp;ldquo;穷则独善其身，达则兼济天下&amp;rdquo;吧。&lt;/p&gt;&lt;p&gt;在大尺度的时空长河里面，我们真是太渺小太渺小了。其实有时候想想，名和利的追逐，势力的攀比这都不是自找难受么？其实最实在的就是自己酿造自己生活中的幸福了。&lt;/p&gt;&lt;p&gt;一代人只做一代人的事，一个时期只做一个时期的事，任何时期都有它好的一面，也有它坏的一面，不要有过多的欲望，不能顾此失彼，顾彼失此。&lt;/p&gt;&lt;p&gt;未来无法改变，所以我要积极快乐而自由地生活。以前在CCTV体育频道上看到过一句广告词，很喜欢：人生就像一场旅行，在乎的不是终点，而是沿途的风景及欣赏风景的心情。以前自己总是喜欢等待，过了多少就到了什么什么日子，然后再等多少多少天就到了另外一个什么好日子了。于是在这样的不断翘首盼望中，好多大好时光从眼前悄悄溜走了。所以，以后，不要让太多时间在等待中流失了，珍惜好时间，尽量过好每一天，让自己留下尽可能多的美好回忆。&lt;/p&gt;&lt;p&gt;一个星期前的研究生元旦晚会，虽然那些节目都不算专业，有些甚至还有些蹩脚，但是每个节目都会让看的人感到快乐和幸福同时还会带一点小小莫名的感动，因为我们都可以强烈地感受到&amp;ldquo;年轻真好&amp;rdquo;，因为年轻，我们精力充沛；因为年轻，我们可以肆意而为；因为年轻，我们会自己包容自己的犯傻同时还很享受。&lt;/p&gt;&lt;p&gt;好了，还有一年半的校园生活了，接下来的打算就是要尽力过好每一天。&lt;/p&gt;&lt;p&gt;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;&amp;lt;六&amp;gt;&lt;/p&gt;&lt;p&gt;心中一直积压着这个结，终于利用这个晚上畅吐出来了。好生痛快。&lt;/p&gt;&lt;p&gt;2011-1-3&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1924378.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2011/01/03/1924378.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2010/12/13/1904690.html</id><title type="text">WebGIS学习感悟</title><summary type="text">WebGIS学习感悟作者：一点一滴的Beer http://beer.cnblogs.com/在刚接触WebGIS的时候，自己只知道安装了ArcGIS，然后可以用VS2008 .NET开发WebGIS，在最开始的时候，连ArcGIS本地有帮助文档都不知道。然后自己站在今天这个时候再回望过去的时候，都唏嘘不已啊。每天一点一滴，真的可以量变引起质变的。这些都是自己当年做的笔记啊，好多文档都是一个字一个字敲进去的。开始什么都不会，然后都是一点一点地看书。那个帮助文档全部是英文的，自己英文又不是太好，就用了个最笨的方法，把一个章节的前面多少页复制到Word里面，然后一页页翻译成中文，然后翻译了</summary><published>2010-12-13T08:34:00Z</published><updated>2010-12-13T08:34:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904690.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904690.html"/><content type="html">&lt;p&gt;WebGIS学习感悟&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在刚接触WebGIS的时候，自己只知道安装了ArcGIS，然后可以用VS2008 .NET开发WebGIS，在最开始的时候，连ArcGIS本地有帮助文档都不知道。然后自己站在今天这个时候再回望过去的时候，都唏嘘不已啊。每天一点一滴，真的可以量变引起质变的。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131633371561.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image002" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131633386412.jpg" border="0" alt="clip_image002" width="531" height="245" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131633404819.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image004" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131633418557.jpg" border="0" alt="clip_image004" width="515" height="490" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这些都是自己当年做的笔记啊，好多文档都是一个字一个字敲进去的。开始什么都不会，然后都是一点一点地看书。那个帮助文档全部是英文的，自己英文又不是太好，就用了个最笨的方法，把一个章节的前面多少页复制到Word里面，然后一页页翻译成中文，然后翻译了几页的中文后，自己就大致了解是什么意思了。然后就开始根据需求来直接节选地看英文的帮助文档了。&lt;/p&gt;&lt;p&gt;今天整理硬盘，将这些东西全部删除吧，因为估计以后永远也用不着这些东西了，谨立图作为纪念吧，今天作此总结，也算了却心中的一个疙瘩吧。从此可能永远和网页技术及GIS技术说再见了哦。做完这些事，说完这些话，我心中不禁一阵轻松了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1904690.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2010/12/13/1904690.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2010/12/13/1904561.html</id><title type="text">配电网WebGIS研究与开发[5]</title><summary type="text">配电网WebGIS研究与开发[5]作者：一点一滴的Beer http://beer.cnblogs.com/第4章发布配电网WebGIS4.1 准备好发布的数据1.网页的编译文件用VS2008打开需要发布的网页源文件，执行操作“菜单à生成à发布网站”，然后编译器会将所有的服务器端代码即“*.cs”文件编码成动态链接库即“*.dll”文件存放在指定目录下的一个文件夹内部。这样做一方面是为了生成性能更加优越的发布版本的网站。一方面也是为了隐藏服务器端代码，保护知识产权并防止遭受意外网络攻击。2.地理数据通过ArcMap创建的地图文件，需要放置在服务器上供客户端调用访问。3.非地理数据</summary><published>2010-12-13T07:42:00Z</published><updated>2010-12-13T07:42:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904561.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904561.html"/><content type="html">&lt;p&gt;&lt;strong&gt;配电网&lt;/strong&gt;&lt;strong&gt;WebGIS研究与开&lt;/strong&gt;&lt;strong&gt;发&lt;/strong&gt;&lt;strong&gt;[5]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153149"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/a&gt;&lt;a name="_Toc263153149"&gt;&lt;strong&gt;第4章　发布配电网WebGIS&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153209"&gt;&lt;/a&gt;&lt;a name="_Toc263153150"&gt;&lt;strong&gt;4.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 准备好发布的数据&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.网页的编译文件&lt;/p&gt;&lt;p&gt;用VS2008打开需要发布的网页源文件，执行操作&amp;ldquo;菜单&amp;agrave;生成&amp;agrave;发布网站&amp;rdquo;，然后编译器会将所有的服务器端代码即&amp;ldquo;*.cs&amp;rdquo;文件编码成动态链接库即&amp;ldquo;*.dll&amp;rdquo;文件存放在指定目录下的一个文件夹内部。这样做一方面是为了生成性能更加优越的发布版本的网站。一方面也是为了隐藏服务器端代码，保护知识产权并防止遭受意外网络攻击。&lt;/p&gt;&lt;p&gt;2.地理数据&lt;/p&gt;&lt;p&gt;通过ArcMap创建的地图文件，需要放置在服务器上供客户端调用访问。&lt;/p&gt;&lt;p&gt;3.非地理数据&lt;/p&gt;&lt;p&gt;本次毕业设计所涉及到非地理数据是通过SQL服务提供的，在另外一台服务器上已经安装，可以通过网络进行访问。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153210"&gt;&lt;/a&gt;&lt;a name="_Toc263153151"&gt;&lt;strong&gt;4.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 安装.NET环境和GIS运行环境&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假设服务器上只安装了纯净版的Server 2003操作系统，那么还需要给系统安装一些组件才能够运行WebGIS网页。安装过程比较繁琐，所以有必要在此进行介绍。&lt;/p&gt;&lt;p&gt;然后开始安装WebGIS运行的服务器环境&lt;/p&gt;&lt;p&gt;安装流程如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131541426712.gif"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image002" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131541438598.gif" border="0" alt="clip_image002" width="266" height="235" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;4.1&lt;/strong&gt; 服务器端WebGIS运行环境搭建流程图&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153152"&gt;&lt;strong&gt;第5章　结论和展望&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153212"&gt;&lt;/a&gt;&lt;a name="_Toc263153153"&gt;&lt;strong&gt;5.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 结论&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;a name="OLE_LINK8"&gt;&lt;/a&gt;配电网是电力系统的重要组成部分，其安全可靠性将直接影响着国民经济发展和人民生活水平。据不完全统计，我国用户停电故障中的80%是由于配电网故障引起的。因此如何对配电网供电可靠性进行管理就具有了非常重要的意义。&lt;/p&gt;&lt;p&gt;　配电网系统是一个线路复杂、分布地域广阔和系统，而且现在电网规模日益扩大，随之而来的就是电网所承载的信息量也越来越大：电力设备数据，用户数据，企业规划数据都随着电网规模的扩大而呈几何级的速度增长。传统的的信息处理方式已经不再满足海量数据分析的需求了。而GIS则可以极大限度将这些信息汇总，并且以地理图为底图，将电网数据直观呈现在决策者面前。因为是以地理图为蓝底，所以配电系统决策者可以很方便地结合人口，资源，经济，社会群体等因素进行决策。计算机技术融合GIS技术，可以方便地对各种信息进行直观地统计分析， 极大地方便了调度员和相关的管理员的工作，提高了管理效率，更加保障了电网的安全有效运行。&lt;/p&gt;&lt;p&gt;　而网络的发展，使得信息的传播速度空前加快，所以将配电网GIS系统放置在Web平台上，使得信息流通更顺畅更方便，便于配电企业各个部门访问分析和决策。&lt;/p&gt;&lt;p&gt;　综上所述，研究配电网WebGIS，对于加快信息流通和产生，提高生产效率，降低生产风险有着很重要和现实的意义。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153213"&gt;&lt;/a&gt;&lt;a name="_Toc263153154"&gt;&lt;strong&gt;5.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 展望&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本次毕业设计所完成的功能都分属于不同的页面，这些页面都还是以分离的状态单独存在着的。但是显然现在的一些已经商业化的WebGIS服务，比如百度地图，Google地图，都是将所有的功能集成在一个页面中实现，为的就是将检索出来的信息能够随时放在地图上，实现非地理数据和地理数据之间的无缝连接。这个要求有很强大的JavaScript基础，能够熟练使用Web2.0的前端技术，本次毕业设计由于时间仓促和个人能力原因没能实现，在此只能展望一下：因为网页的无状态性，所以不同页面之间的通讯问题是个很麻烦的问题，本次毕业设计虽然完成了配电网GIS中的三个主要功能，但是却没能够做到连接整合。如果要实现各模块之间的统一，必需将所有的内容全部整合到一个页面中通过JavaScript导航控件，来根据用户需求动态创建客户端页面元素，而不是用导航菜单仅仅实现页面之间的跳转。如果真的想要将WebGIS做成一个各模块联系紧密的系统，还需要更对网页前端技术进行深入研究。&lt;/p&gt;&lt;p&gt;本次毕业设计对浏览器的兼容性还不够强。Web应用程序虽然不用安装客户端，但是客户端CSS只能做到在IE6下正常运行，在在其它浏览器下因为不同浏览器对于CSS有着不同的标准，这将会导致同样的页面在不同的浏览器中将呈现不同的布局，这样势必会导致在某些浏览器中页面布局完全乱套，所以如果要做到在各个浏览器下都能正常运行，还需要针对不同的浏览器提供不同的CSS样式表，以实现页面的兼容性。&lt;/p&gt;&lt;p&gt;本次毕业设计所开发和实现的系统&amp;mdash;&amp;mdash;配电网WebGIS能够更高效、直观管理空间和属性数据，比单纯的基于属性数据库的管理信息系统具有更直观、信息容量更大、信息分析能力更高效的优点。本次毕业设计结果虽然还具体很多需要改进的地方，但是却完成了基本框架的搭建，为今后后续开发和功能展望构建了平台，并且能为解决技术攻关时提供相关引导。本系统对于配电网信息的Web化、可视化、交互化、自动化提供了实现思路和方法，也具有一定的借鉴价值。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153214"&gt;&lt;/a&gt;&lt;a name="_Toc263153155"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考文献&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;[1] 李彩峰. GIS的应用现状及前景[J]. 华北国土资源, 2009,(03):62&lt;/p&gt;&lt;p&gt;[2]李付生.电力GIS现状及前景分析[EB/OL].曹县供电公司 274400&lt;/p&gt;&lt;p&gt;[3]刘光,唐大仕.WebGIS开发－ArcGIS Server与.NET[M].第一版.北京:清华大学出版社,2009年4月:前言.&lt;/p&gt;&lt;p&gt;[4]张新长,马林兵,张青年.地理信息系统数据库[M].北京:科学出版社,2005年2月.&lt;/p&gt;&lt;p&gt;[5]ESRI.ArcGIS Desktop Help[M] .USA:Esri.2008&lt;/p&gt;&lt;p&gt;[6]吴功和,丛明日.基于ArcGIS Server的分布式GIS应用[J].测绘科学技术学报,2006,23(1):52-55&lt;/p&gt;&lt;p&gt;[7]Scottie Barnes.Server-Based GIS[J]. Geospatial Solutions, 2004,5(14):15-16.&lt;/p&gt;&lt;p&gt;[8]沈百玲.ArcGIS Server体系结构和开发简介[R].北京:ESRI中国（北京）有限公司，2004.&lt;/p&gt;&lt;p&gt;[9]ESRI.Developer Help For ArcGIS v9.3[M].USA:Esri.2008．&lt;/p&gt;&lt;p&gt;[10]康玲,傅俊锋,王怀清,蔡劲松.基于ArcGIS Server的WebGIS应用系统开发[J]. 水电能源科学,2007年2月,第25期:26-29.&lt;/p&gt;&lt;p&gt;[11]ESRI.ArcGIS Server Developers Guide[R] 2008．&lt;/p&gt;&lt;p&gt;[12]萨师煊,王珊.数据库系统概论[M].第三版.北京:高等教育出版社,2002年2月:91-115. &lt;/p&gt;&lt;p&gt;[13]雷宁.零基础学HTML+CSS[M].第一版.北京:机械工业出版社,2009年1月.&lt;/p&gt;&lt;p&gt;[14]Duda,C.;Frey,G.;Kossmann,D.;Matter,R.;Chong Zhou;Making AJAX Applications Searchable[J].Data EngineeringMarch 29 2009-April 2 2009,78 - 89 .&lt;/p&gt;&lt;p&gt;[15]Mesbah, A.;Bozdag, E.;van Deursen, A.;Delft Univ. of Technol.,Delft Crawling AJAX by Inferring User Interface State Changes[J],Web Engineering,14-18 July 2008 , 122 -134.&lt;/p&gt;&lt;p&gt;[16]Weiguo Han;Liping Di;Peisheng Zhao;Xiaoyan Li;Using Ajax for desktop-like geospatial web application development[J].Geoinformatics,12-14 Aug. 2009, 1-5 .&lt;/p&gt;&lt;p&gt;[17]Marchetto,A.;Tonella,P.;Ricca,F.;State-Based Testing of Ajax Web Applications[J],Software Testing,9-11 April 2008, 121 - 130 .&lt;/p&gt;&lt;p&gt;[18]Zepeda,J.S;Chapa,S.V.;From Desktop Applications Towards Ajax Web Applications[J],Electrical and Electronics Engineering,5-7 Sept. 2007,193 &amp;ndash; 196.&lt;/p&gt;&lt;p&gt;[19]刘光,唐大仕.WebGIS开发－ArcGIS Server与.NET[M].第一版.北京:清华大学出版社,2009年4月:68-69.&lt;/p&gt;&lt;p&gt;[20]祝红涛,刘海松,郝军启. Ajax从入门到精通[M].第一版.北京:电子工业出版社, 2008年6月:8.&lt;/p&gt;&lt;p&gt;[21]ESRI. AJAX and ASP.NET[J].Developer Help For ArcGIS v9.3.USA:Esri.2008．&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153215"&gt;&lt;/a&gt;&lt;a name="_Toc263153156"&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;致谢&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 经过将近六个月的忙碌工作，本次的毕业设计也已经接近尾声了。灿烂的四年大学时光也在无声无息之间要向我们挥手告别了。在武汉大学这所美丽的学校里，我度过了一段人生中最美好的时光。优美的学习环境，浓郁的文化氛围，自由的培育理念都熏陶着我，影响着我。在这里，武汉大学除了教会我作为将来在社会上的立身之本的科学知识外，还培养了我坚毅的品质，让我学会了团结、合作、交流，让我有了更加强烈的责任感，最重要的是在这里我开始有了自我意识，更加深刻的认识了自己&amp;hellip;&amp;hellip;感谢武汉大学给我的启迪和教育，今后不管在哪里我都会以母校感到自豪，同时我也会尽我能力，做一个对社会有用的人，发挥武汉大学积极向上的影响力，用实际行动报答母校的培养，让&amp;ldquo;武大明天以我为自豪&amp;rdquo;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;　 首先要感谢是自己的父母，感谢他们默默在后面无私地支持着我鼓励着我，让我顺利度过了美好的大学时光，然后才让后面的一切成为了可能，在此提出特别感谢。&lt;/p&gt;&lt;p&gt;&amp;nbsp; 　感谢邓老师在课题的研究和论文的撰写过程中给予的悉心指导和帮助，而且邓老师严谨的治学态度，科学的思维方式，精益求精的工作作风，以及对科学研究的热情也深深地激励着我。在整个毕业设计过程中，他能以身作则，以自身行动鼓舞着我，鞭策着我，让我时刻都能感觉到一股无形的精神力量一直在支持着我。故在此谨向老师致以诚挚的谢意和崇高的敬意。在完成课题的过程中，我的学习能力和吸收新知识的能力得到了很大的提高，这对于将来对知识的研究和创新是很有帮助的。 &lt;/p&gt;&lt;p&gt;　 感谢周教授和实验室的师兄们。是你们让我对自动化学科有了更加深刻的认识，让我更加明确了自己的学习目标，更加坚定了自己的学习信念。&lt;/p&gt;&lt;p&gt;　 最后，再次感谢所有给予我帮助的朋友，感谢你们一起陪伴我度过了大学最后的这段时光，愿你们今后人生的道路一路顺风，前程似锦。&lt;/p&gt;&lt;p&gt;201006于武汉大学珞珈山&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1904561.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2010/12/13/1904561.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2010/12/13/1904543.html</id><title type="text">配电网WebGIS研究与开发[4]</title><summary type="text">配电网WebGIS研究与开发[4]作者：一点一滴的Beer http://beer.cnblogs.com/3.2 WebGIS停电区域显示 停电区域是指供电公司在某一天的某些区域的台区进行停电，台区的下属表箱均受到影响。这是一个地域性问题，所以通过在地图上进行标识这些区域，将数据可视化地展示到分析人员面前，可以很直观看到当天停电影响区域，极大地方便了后续工作的展开。 要求：工作人员将停电计划录入到SQL数据库中，并指示当天的台区停电计划，有的台区有可能有一系列的下属表箱，每个表箱都对应着一个地理坐标，这些表箱散点构成一个区域，“停电区域显示”就是要将这些停电影响区域在地图上高亮显示出</summary><published>2010-12-13T07:27:00Z</published><updated>2010-12-13T07:27:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904543.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904543.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="OLE_LINK2"&gt;&lt;/a&gt;&lt;a name="OLE_LINK3"&gt;&lt;strong&gt;配电网&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;WebGIS&lt;/strong&gt;&lt;strong&gt;研究与开&lt;/strong&gt;&lt;strong&gt;发[4]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153203"&gt;&lt;/a&gt;&lt;a name="_Toc263153144"&gt;&lt;strong&gt;3.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; WebGIS停电区域显示&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 停电区域是指供电公司在某一天的某些区域的台区进行停电，台区的下属表箱均受到影响。这是一个地域性问题，所以通过在地图上进行标识这些区域，将数据可视化地展示到分析人员面前，可以很直观看到当天停电影响区域，极大地方便了后续工作的展开。&lt;/p&gt;&lt;p&gt; 要求：工作人员将停电计划录入到SQL数据库中，并指示当天的台区停电计划，有的台区有可能有一系列的下属表箱，每个表箱都对应着一个地理坐标，这些表箱散点构成一个区域，&amp;ldquo;停电区域显示&amp;rdquo;就是要将这些停电影响区域在地图上高亮显示出来，方便工作人员查看，同时还要提供停电区域的基本查询功能，让工作人员了解到停电区域更加详细的数据。&lt;/p&gt;&lt;p&gt; 基于Web ADF开发的应用系统包含三结构，分别是客户端、Web端以及GIS服务器端，因此在Web ADF地图中绘制图形可以在三个层次的任何一个层次来实现。每一层的相关开发环境都不一样，因此转换和渲染地图上的图形元素的方法也不一样。由于Web ADF的目的是在同一个应用程序中使用多种数据源，因此它提供更多的是在Web端创建与管理图形的方法。&lt;/p&gt;&lt;p&gt; 非常重要的是，开发人员必须了解通常需要在哪创建图形，以及Web ADF是如何集成每个层次的图形的。下图表明在每个层次上可以在哪里创建图形图层。Web ADF管理着一系列的数据源，如：Web ADF图形，ArcGIS Server和ArcIMS。Web ADF图形资源使用Web ADF的功能创建图形图层与生成地图图片。而ArcGIS Server与ArcIMS资源使用它们各自在GIS服务器端的服务功能，来创建图形图层，并与地图中其它图层数据合并生成一张地图图片。如果将地图控件的ImageBlendingMode属性设置为Browser，这通常是默认值，那么所有的地图图片，依据资源的顺序在浏览器中叠加。此外，客户端浏览器可使用浏览器的功能来创建图形。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526489096.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image002" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526493980.jpg" border="0" alt="clip_image002" width="525" height="311" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.16&lt;/strong&gt; 各层次创建图形的方法&lt;/p&gt;&lt;p&gt;&lt;strong&gt;客户端：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 对于Web应用程序来说，客户端大多数情况总是一个浏览器。通常，浏览器的显示和交互总是和一些Web标准相关联的，例如：HTML，CSS，JavaScript等等。在其开发环境中，可用工具受限于浏览器的支持。CSS可以将页面元素，比如图形，放置在其它页面元素之上。浏览器对矢量图形的支持的区别也很大，但是SVG（Scalable Vector Graphics，可缩放矢量图形）与VML（Vector Markup Language，矢量可标记语言）在网页上的其它元素之上绘制矢量图形。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Web&lt;/strong&gt;&lt;strong&gt;端：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; ArcGIS在Web端提供了一个资源丰富全面的开发环境而且可以直接访问服务器端的数据源。ASP.NET Web应用程序直接继承了Microsoft .NET Framework框架和它的所有优点。.NET环境提供了一些方法对地图进行图形绘制，但是实现的方法却比较繁琐。然而，.NET框架提供给Web ADF一系列的对象去通过简单的API扩展其功能达到在地图上创建图层的目的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;服务器端：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 一般情况下，在服务器端处理图片就意味着需要使用服务器来创建一个地图图片，这个图片可能随后为Web ADF使用。服务器端创建图片的能力是取决于服务器端的数据源服务的能力的。ArcIMS和ArcGIS Server都可以创建一般的地图图形。然而，既然都可以提供不同的接口去创建图形，它们也将使用不同的API接口，添加到服务器上的图形将成为地图图片的一部分返回到客户端。既然会有另外一个数据源可能覆盖掉服务器端生成的图形，你必需考虑地图数据源的一些规则去决定这些图形是否可见。&lt;/p&gt;&lt;p&gt; 三种方法各有各的特点，因为在本次毕业设计要求绘制的停电区域是一个动态区域，所以最好是一个虚拟图层，故先排除了服务器端创建的可能性。除了动态绘制区域外，还要提供区域的点查询等功能，故选择在Web端操作图形。&lt;/p&gt;&lt;p&gt; Web ADF提供了一个独一无二的图形数据源。图形数据源能够以图层（Graphics Layer）的形式添加到&lt;a name="OLE_LINK44"&gt;MapResourceManager&lt;/a&gt;控件中然后和Map控件相关联并展示出来。一个图层数据源是一个可以包含很多DataTables的一个System.Data.DataSet类型。你可以通过Graphics Layer数据源的Graphics属性来访问Web ADF的GraphicsDataSet&lt;/p&gt;&lt;p&gt; Web ADF定义了两种图层类型：ElementGraphicsLayer 和 FeatureGraphicsLayer. 两种类型都是System.Data.DataTable的结构类型,因此它们都可以添加到GraphicsDataSet表集合中。图层的内容被Web应用程序存储在内存（in-memory ）中。因此，图层中的内容总量是要和Web应用程序所占用的内存相适应的。注意图层类型必需通过程序来创建和管理。&lt;/p&gt;&lt;p&gt; ElementGraphicsLayers（几何图形层）：只包含基本图形元素，几何信息和样式表。一个几何图形层能够存储不同的几何类型的图元。一般情况下，几何图形层可以用于展示地图上选中的要素。注意：几何图形层在设计时就不能包括任何属性信息。&lt;/p&gt;&lt;p&gt; &lt;a name="OLE_LINK43"&gt;FeatureGraphicsLayers&lt;/a&gt;（要素图形层）： 被设计成一个可以完全模拟真实的要素图层的一个虚拟图层。每个图层都只支持一种几何类型，Web ADF的渲染器可以通过对此图层的属性表的读取并将特别的标识符号应用到这种图层上面。要素图形层同样也支持查询&lt;/p&gt;&lt;p&gt; 在绘制停电区域后，还需要根据停电时段来对不同区域进行不同颜色的渲染，这就需要对这个虚拟图层拥有一些属性信息便于着色器进行读取并进行特别的着色处理。所以本次毕业设计最终选择FeatureGraphicsLayers作为停电区域绘制的载体。Web ADF提供了一系列的几何类型，标识符号和一些着色器（渲染器）可以去处理图层，而且Web ADF的符号体系支持不同的透明度显示，使得停电区域高亮区域不至于完全覆盖掉下面的的图层。&lt;/p&gt;&lt;p&gt;在准备好的基本模板（有导航工具条，地图显示框等等基本控件，能够在页面显示地图并提供基本功能的基本）的情况下，在MapResourceManager控件中添加一个虚拟图层如下图左所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526509421.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image004" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526519605.jpg" border="0" alt="clip_image004" width="520" height="175" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.17&lt;/strong&gt; 添加虚拟图层&lt;/p&gt;&lt;p&gt; 虚拟图层的类型为GraphicsLayer，数据存储类型是&amp;ldquo;In Memory&amp;rdquo;和添加本地实体地图数据源不同――本地实地地图数据源的类型和存储如上图右所示。&lt;/p&gt;&lt;p&gt;绘制停电区域的绘图流程如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526533617.gif"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image006" src="http://images.cnblogs.com/cnblogs_com/beer/201012/20101213152654453.gif" border="0" alt="clip_image006" width="463" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.18&lt;/strong&gt; 停电区域的绘图流程&lt;/p&gt;&lt;p&gt; 上述流程中有一个比较重要的环节就是对SQL数据库进行查询得到停电影响区域，这里面涉及到一个根据散点群来计算外包区域的算法：&lt;/p&gt;&lt;p&gt;通过对数据库的查询，得到某一停电台区下属表箱相关数据，每个表箱都有一个坐标属性，要绘制停电区域就需要对这些坐标在地图上对应的散点群进行&amp;ldquo;覆盖区域&amp;rdquo;计算。从所以的表箱的纬度值中选中最大纬度和最小纬度，然后再将纬度进行分级（分级越多，最后绘制出来的区域边界也就就越平滑，但计算也越复杂，所以如何分组依据需求而定），分级后，所以的表箱坐标就分布在一些水平的纬度带状区域内部了。然后对每个带状区域内部的表箱坐标集合选出经度值的最大值和最小值，这样就找到了此处带状区域内部表箱的一个&amp;ldquo;覆盖区域&amp;rdquo;了，然后依此类推，最终找到全部表箱的整体&amp;ldquo;覆盖区域&amp;rdquo;，也就是停电区域。&lt;/p&gt;&lt;p&gt; 除了上述算法外，还要注意在mapResourceManager里面mapResourceItem对DisplaySetting设置Image Format为PNG24，否则虚拟图层即使相互之间是透明的，但是仍然会完全遮挡住实体地图图层，除了上述问题外其余的都是一些SQL查询的单一技术问题，所以不再详细介绍。对停电区域的查询以及查询结果显示方式和上一部分的&amp;ldquo;电力参数查询&amp;rdquo;过程类似，也不再重复介绍。下面是运行效果图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526559732.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image008" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526566253.jpg" border="0" alt="clip_image008" width="244" height="216" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.19&lt;/strong&gt; &amp;ldquo;绘制停电区域&amp;rdquo;运行效果图&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153204"&gt;&lt;/a&gt;&lt;a name="_Toc263153145"&gt;&lt;strong&gt;3.3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; WebGIS设备统计&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 设备统计页面要求：用户对检索条件进行选择，或者输入筛选字段，然后向服务器提交检索条件集合，服务器向SQL数据库中查询出符号要求的设备结果并传送到客户端，客户端浏览器要将这些结果显示出来，并以统计图表的形式显示统计结果。&lt;/p&gt;&lt;p&gt; &amp;ldquo;设备统计页面&amp;rdquo;主要涉及的是数据库编程，除了数据库查询技术外，完成本页面功能的最重要的技术就是AJAX技术。基本的AJAX技术在第三章中进行了简单的介绍，本模块所采用的AJAX框架主要是&amp;ldquo;ASP.NET客户端回调&amp;rdquo;框架，数据编码和解码主要采用JOSN方法。&lt;/p&gt;&lt;p&gt; ASP.NET客户端回调（ASP.NET Client Callback）是微软在.NET环境下为开发人员提供的一种异步通讯方式，开发人员可以通过接口ICallbackEventHandler来实现客户端页面和服务器之间的异步通讯。注：在某些场合&amp;ldquo;ASP.NET客户端回调&amp;rdquo;也被称为&amp;ldquo;ASP.NET脚本回调（ASP.NET script callbacks）&amp;rdquo;&lt;/p&gt;&lt;p&gt;通过XmlHttpRequest进行异步通讯时要在客户端通过JavaScript声明一个异步通讯请求对象，这个对象和浏览器内核有关，例如在IE下面是ActiveXObject("Msxml2.XMLHTTP")。而通过ICallbackEventHandler来实现异步通讯时，则要在服务器端的页面代码文件中，要让页面实现ICallbackEventHandler接口，只要在页面的继承类中加入ICallbackEventHandler类即可。&lt;/p&gt;&lt;p&gt; 在页面的继承类中加入ICallbackEventHandler类之后，那么页面中就有两个函数可以直接使用了：public void RaiseCallbackEvent(string eventArgument)和public string GetCallbackResult()。&lt;/p&gt;&lt;p&gt; RaiseCallbackEvent是服务器端接收客户端数据的函数，其参数eventArgument就是数据接口，用来接收客户端在请求时向服务器端发送的数据（目前为止，笔者所了解到的，这种数据格式好像仅仅限于字符串）。GetCallbackResult则返回数据，这个数据直接返回给客户端。这两个函数就是服务器端的数据通讯接口。&lt;/p&gt;&lt;p&gt; 服务器端的clientscript = Page.ClientScript.GetCallbackEventReference(this, "arg", "AjaxCallBackComplete", null);语句则定义用于生成客户端脚本。通过查看MSDN可以知道，第二个参数"arg"指客户端要发送的JavaScript字符串变量，这个变量在服务器端由RaiseCallbackEvent(string eventArgument)的eventArgument承接，第三个参数是客户端在服务器端完成回调后接收服务器端发来的数据并进行处理的JavaScrpipt函数。&lt;/p&gt;&lt;p&gt; 回调的流程如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;1.用户点击页面链接触发JS函数doCallBack &lt;/p&gt;&lt;p&gt;2.doCallBack准备好数据放于arg变量中，并调用由服务器端生成的客户端脚本&amp;lt;%= clientscript %&amp;gt;&lt;/p&gt;&lt;p&gt;3.服务器端RaiseCallbackEvent收到数据并调用相关服务器端函数进行处理并赋值给一个全局字符串变量&lt;/p&gt;&lt;p&gt;4.由GetCallbackResult函数将服务器准备好的字符串数据返回到客户端&lt;/p&gt;&lt;p&gt;5.客户端由GetCallbackEventReference（）设置的JS函数接收来自服务器端返回的字符串数据，然后再对数据进行处理并操作页面元素对数据进行显示等等。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt; 以上便是ASP.NET客户端回调的完整过程。开发人员只需要让页面继承一个ICallbackEventHandler类，然后找到数据接口和函数接口就可以轻松实现异步通讯了。此方法流程清晰，同时也将很多开发人员不关心的问题，如通讯过程，通讯等待等等过程都进行了封装，所以本次毕业设计的&amp;ldquo;设备统计&amp;rdquo;页面就选用此异步通讯方法。第三章中介绍了三种数据的编码和解码方式，在本页面中数据的通讯属于轻量级别的，所以就采用了JSON编码和解码（当然用XML技术也可以）。&lt;/p&gt;&lt;p&gt;需要通过AJAX技术解决的问题：&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153205"&gt;&lt;/a&gt;&lt;a name="_Toc263153146"&gt;&lt;/a&gt;&lt;strong&gt;3.3.1&lt;/strong&gt;&lt;strong&gt; &lt;a name="OLE_LINK45"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;多级下拉框无刷新联动&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 在最初对此页面进行制作时，采用的是ASP.NET的服务&lt;a name="OLE_LINK48"&gt;&lt;/a&gt;&lt;a name="OLE_LINK47"&gt;器控件&lt;/a&gt;&lt;a name="OLE_LINK46"&gt;DropdownList&lt;/a&gt;，可以达到多级下拉框联动的效果，但是每次第一级下拉框内容变化时，为了更新二级下拉框内容，页面都会刷新一次，使得页面体验效果变得很差。正如第三章所介绍，AJAX的出现正是为增强客户端页面交互体验效果而产生的，关于AJAX的一个典型应用就是&amp;ldquo;多级下拉框无刷新联动&amp;rdquo;。&lt;/p&gt;&lt;p&gt; 虽然上面提到为了达到比较好的客户端端体验效果，页面中应该尽量避免使用ASP.NET的服务器控件，而应该尽量选用HTML控件，但是考虑到服务器控件在经过渲染后发达到客户端页面后，实际上也对应着某一种HTML控件，比如：ASP.NET的DropdownList对应着HTML的Select控件，而且服务器控件的初始状态页面（第一次在客户端生成页面）设置在服务器端设置起来比较容易。所以在页面中用于对统计条件进行选择的下拉框选项的控件仍然选用器控件DropdownList，但只在第一次初始化页面时在服务器端进行初始化操作，在页面后期运行时，则均只在客户端用JavaScript对其进行操作，例如读取数值，设定数据等等。服务器端只负责接收数据，计算数据，发送数据。具体流程如下（涉及AJAX的部分省去）：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526574517.gif"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image010" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131526584418.gif" border="0" alt="clip_image010" width="463" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.20&lt;/strong&gt; &amp;ldquo;客户端下拉框无刷新联动&amp;rdquo;流程&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153206"&gt;&lt;/a&gt;&lt;a name="_Toc263153147"&gt;&lt;/a&gt;&lt;strong&gt;3.3.2&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;客户端Grid控件显示查询结果&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 当用户点击页面的&amp;ldquo;查询&amp;rdquo;按钮后，客户端通过JS将客户端表单数据编码成JSON字符串，然后提交给服务器，服务器再解码得到检索条件，然后向SQL数据库中检索出满足要求的设备记录表，然后再回复到客户端。其过程和&amp;ldquo;下拉框&amp;rdquo;无刷新联动完全一样，只是编码的数据量大一点而已。但最终关于客户端如何显示这个表格数据就是一个难点，最初尝试使用服务器控件GridView，但后来发现使用此服务器控件缺点太多（可能是没有进行深入研究吧），比如翻页刷新问题，单元格变形问题等等。最后到网上找到一种JavaScript框架――ActiveWidget提供了一种客户端的JavaScript编写的Grid控件，开发人员只需要将一个JavaScript数组传递到此JS表格的数据接口就行了。这样的客户端Grid控件支持滚动条，当单元格数据长度比较长时，会自动隐藏部分数据，单元格宽度可以拖动改变&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt; 在本页面中还使用过一个ActiveWidget框架提供的JS控件――Tab控件，可以在页面中实现类似桌面应用程序的选项卡效果，而且使用起来很简单。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153207"&gt;&lt;/a&gt;&lt;a name="_Toc263153148"&gt;&lt;/a&gt;&lt;strong&gt;3.3.3&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;生成统计图表&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 在解决如何生成统计图的问题时，曾经试过多种方法，比如利用Excel的图表插件进行编程，或者利用GDI作图，然后再到页面中引用，但效果都不理想，而且编程过程很繁琐。后来到网上找到一个专业的统计图生成控件：dotNetCharting。在程序中引用dotNetCharting控件后，然后只要将一个两列的DataTable作为数据源传递给dotNetCharting中的Chart，它就可以自动生成一个外观友好的统计图，如下图所示。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131527002334.gif"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image012" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131527006380.gif" border="0" alt="clip_image012" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.21&lt;/strong&gt; 统计图效果&lt;/p&gt;&lt;p&gt; 关于如何在客户端异步刷新图片资源的问题，已经在第三章进行了介绍，所以在此不再赘述。每次点击&amp;ldquo;生成统计图表&amp;rdquo;按钮，客户端将在客户端第二个选项卡页面中无刷新地生成一个统计图。&lt;/p&gt;&lt;p&gt; 页面运行效果图：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/20101213152702708.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image014" src="http://images.cnblogs.com/cnblogs_com/beer/201012/20101213152703609.jpg" border="0" alt="clip_image014" width="244" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.22&lt;/strong&gt; 查询结果数据表&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131527041905.jpg"&gt;&lt;img style="display: inline; border: 0px;" title="clip_image016" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131527052886.jpg" border="0" alt="clip_image016" width="244" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.23&lt;/strong&gt; 查询结果统计图&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Author:&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;From:&lt;a href="http://www.cnblogs.com/beer"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Notes:&lt;/em&gt;&lt;em&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1904543.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2010/12/13/1904543.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2010/12/13/1904520.html</id><title type="text">配电网WebGIS研究与开发[3]</title><summary type="text">配电网WebGIS研究与开发[3]作者：一点一滴的Beer http://beer.cnblogs.com/第3章 配电网WebGIS基本功能实现 在上一章中，对基本的AJAX进行了一些介绍，但是Web GIS开发框架Web ADF提供的AJAX对上述基本的AJAX又进行了一层封装。ArcGIS Server9.3的Web ADF为开发人员提供了可以在AJAX环境中管理客户端与服务器之间传输的框架。这个框架称之为“callback results framework“，包括服务器端的一些类(CallbackResultCollection，CallbackResult)及控件(Web AD</summary><published>2010-12-13T07:12:00Z</published><updated>2010-12-13T07:12:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904520.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904520.html"/><content type="html">&lt;p&gt;&lt;a name="OLE_LINK2"&gt;&lt;/a&gt;&lt;a name="OLE_LINK3"&gt;&lt;strong&gt;配电网&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;WebGIS&lt;/strong&gt;&lt;strong&gt;研究与开&lt;/strong&gt;&lt;strong&gt;发[3]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153199"&gt;&lt;/a&gt;&lt;a name="_Toc263153140"&gt;&lt;strong&gt;第3章&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;配电网WebGIS基本功能实现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 在上一章中，对基本的AJAX进行了一些介绍，但是Web GIS开发框架Web ADF提供的AJAX对上述基本的AJAX又进行了一层封装。ArcGIS Server9.3的Web ADF为开发人员提供了可以在AJAX环境中管理客户端与服务器之间传输的框架。这个框架称之为&amp;ldquo;callback results framework&amp;ldquo;，包括服务器端的一些类(CallbackResultCollection，CallbackResult)及控件(Web ADF controls)和客户端的JavaScript库(Web ADF JavaScript)，如下图所示。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511076225.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image002" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511129841.jpg" border="0" alt="clip_image002" width="474" height="325" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.1&lt;/strong&gt; Web ADF回调结构框架图示&lt;/p&gt;&lt;p&gt; 服务器与客户端之间的响应是通过CallbackResult来实现的。事实上，一个CallbackResult是由服务器端的Web ADF control生成的、特定的、以JSON格式化的字符串。所有的Web ADF controls都具有CallbackResults属性，通过CallbackResultsCollection可以添加、删除这些CallbackResults，或者将其转换为字符串显示。当然，也可以自己定义一个CallbackResult，而不是由服务器控件生成，这将在后面的内容中介绍。服务器端将CallbackResult传到客户端之后，就交由客户端的Js函数ESRI.ADF.System.processCallbackResult()来实现客户端内容的刷新。总体上说来，callback result框架简化了开发人员的工作，以异步的方式实现了ADF以及非ADF控件内容的刷新。&lt;/p&gt;&lt;p&gt; 按照需要刷新控件的不同，我们分Web ADF控件和非Web ADF控件的刷新两部分来介绍。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、Web ADF控件的刷新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; Web ADF为开发者提供了一系列的控件，比如常用的Map、Toc、Toolbar等。改变地图范围、图层是否可视、地图渲染等都需要刷新上述控件。之前提到每个ADF控件都具有CallbackResult属性，我们需要做的就是将需要刷新的ADF控件的CallbackResult复制到Map.CallbackResults，再返回给客户端的Web ADF Js函数processCallbackResult()处理。&lt;/p&gt;&lt;p&gt; 例如，添加了一个新的图层，需要刷新Map以及Toc，我们就需要添加如下代码：&lt;/p&gt;&lt;p&gt;Toc1.Refresh(); &lt;/p&gt;&lt;p&gt;Map1.CallbackResults.CopyFrom(Toc1.CallbackResults);&lt;/p&gt;&lt;p&gt;实际的过程如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511142500.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image004" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511159860.jpg" border="0" alt="clip_image004" width="501" height="315" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.2&lt;/strong&gt; Web ADF控件的刷新&lt;/p&gt;&lt;p&gt; 在Web ADF控件之间管理callback result依赖于CallbackResultCollection类。它提供了一些方法，可以方便的添加、删除CallbackResult。最常用到的包括Add方法和CopyFrom方法。前者用于向CallbackResultCollection添加自定义的CallbackResult实例，后者用于复制某个CallbackResultCollection实例到另一个CallbackResultCollection实例。当然，你也可以用ToString方法将CallbackResult转换为字符串。更多关于CallbackResultCollection类的使用请参照ArcGIS Server的离线帮助，这里不一一赘述。&lt;/p&gt;&lt;p&gt; 这里需要强调的是，并不是所有ADF控件的刷新都需要明确的在服务器调用刷新方法，这在Map控件上体现的尤为明显。比如，地图范围的改变或者地图比例的变化都会引起Map控件自动更新其callback result collection。其他情况，如更改地图的可见性或者添加删除某个地图资源都需要明确调用刷新方法。下面列出一些Web ADF控件之间的内联关系，在这些情况下，不需要明确调用刷新方法。&lt;/p&gt;&lt;p&gt;1.当工具栏控件绑定到地图控件，在工具栏上的任何操作都会自动将地图的callback result添加到工具栏的call back result collection。&lt;/p&gt;&lt;p&gt;2.当Toc控件绑定到地图控件，控制Toc里图层可见性的按钮也会实现自动刷新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、非Web ADF控件的刷新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 页面中除了Map、TOC等ADF控件，一般还包含有很多非ADF控件，比如Button、Label、GridView等等。刷新这些控件的内容，可以完全脱离ArcGIS Server的CallbackResult，比如用UpdatePanel。如果你还想使用CallbackResult，当然也是可以的，但必须自己定制CallbackResult字符串。&lt;/p&gt;&lt;p&gt;CallbackResult类定义了一些静态方法可以方便开发者快速定制自己刷新客户端非Web ADF控件的内容。如表3.1所示。&lt;/p&gt;&lt;p&gt;表&lt;strong&gt;3.1&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;CallbackResult提供的方法    &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CallbackResult&amp;nbsp; Static Method&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateSetContent&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Set the outerHTML property of an html element. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateSetInnerContent&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Set the innerHTML property of an html element.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateSetImageSource&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Set the src property of an image element. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateJavaScript&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Execute JavaScript. on the client.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateIncludeJavaScript&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Include JavaScript. on the client&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="202"&gt;&lt;p&gt;CreateIncludeStyleSheet&lt;/p&gt;&lt;/td&gt;&lt;td width="313"&gt;&lt;p&gt;Include a CSS style. sheet on the client&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 服务器端定制的CallbackResult实例都会被客户端的Web ADF Javascript函数processCallbackResult()处理。processCallbackResult函数将包含以下代码来处理定制的CallbackResult内容：   &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="491" valign="top"&gt;&lt;p&gt;[JavaScript]&lt;/p&gt;&lt;p&gt;if(action==='javascript') {&lt;/p&gt;&lt;p&gt;var method = function() {&lt;/p&gt;&lt;p&gt;try { eval(params[0]); }&lt;/p&gt;&lt;p&gt;. . .}&lt;/p&gt;&lt;p&gt;else if (action==="content") {&lt;/p&gt;&lt;p&gt;var o = $get(controlID);&lt;/p&gt;&lt;p&gt;if (o) { o.outerHTML=params[0]; }&lt;/p&gt;&lt;p&gt;. . .}&lt;/p&gt;&lt;p&gt;else if (action==="innercontent") {&lt;/p&gt;&lt;p&gt;var o2 = $get(controlID);&lt;/p&gt;&lt;p&gt;if (o2) { o2.innerHTML=params[0]; validResponse = true; }&lt;/p&gt;&lt;p&gt;. . .}&lt;/p&gt;&lt;p&gt;else if (action==="image")&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;var o3 = $get(controlID);&lt;/p&gt;&lt;p&gt;if (o3) { o3.src = params[0]; }&lt;/p&gt;&lt;p&gt;. . .}&lt;/p&gt;&lt;p&gt;else if (action=='include') {&lt;/p&gt;&lt;p&gt;var id = params[0];&lt;/p&gt;&lt;p&gt;var elm = (id?$get(id):null);&lt;/p&gt;&lt;p&gt;. . .&lt;/p&gt;&lt;p&gt;if(elm) { elm.parentNode.removeChild(elm); }&lt;/p&gt;&lt;p&gt;document.getElementsByTagName('head').item(0).appendChild(elm);&lt;/p&gt;&lt;p&gt;. . .}&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 最后要强调的是，无论使用哪种AJAX模式，回调技术(callback)还是部分页面刷新(partial postback,或称为ASP.NET AJAX)，callback result的内容以及客户端处理callback result的函数都是一样的。&lt;/p&gt;&lt;p&gt; 有了上述&amp;ldquo;callback results framework&amp;ldquo;的AJAX基础后，就可以对下面的功能的具体实现过程进行开发和研究了。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153200"&gt;&lt;/a&gt;&lt;a name="_Toc263153141"&gt;&lt;strong&gt;3.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; WebGIS电力设备参数查询&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 要求：在已经存在的WebGIS 基本模板上加入对电力设备图层的查询功能。对电力设备进行查询，查询方式包括两种：一种是利用工具条对地图中指定位置的设备进行查询，这是以地理位置作为查询依据；另外一种是用户输入相关字符然后对数据库进行查询，这是以设备的属性字段作为查询依据。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153201"&gt;&lt;/a&gt;&lt;a name="_Toc263153142"&gt;&lt;/a&gt;&lt;strong&gt;3.1.1&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;地图交互查询&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 要求：用户在客户端通过鼠标和地图控件进行&amp;ldquo;点选交互&amp;rdquo;，然后客户端显示出在鼠标所在地图位置被点选中的设备详细信息。&lt;/p&gt;&lt;p&gt; 在服务器端（注：本文中提到的&amp;ldquo;服务器端&amp;rdquo;就是指建立C#编写的服务器端代码，同样&amp;ldquo;客户端&amp;rdquo;则指用HTML标记语言或者JavaScript编写客户端运行代码，虽然在进行开发的时候都是在本地PC上建立的，但是这样描述可以让各种源文件的职能分工更加明确）建立一个继承于ESRI.ArcGIS.ADF.Web.UI.WebControls.WebControl的控件MapIdentify，并让其隶属于名空间&amp;ldquo;WebMapApp&amp;rdquo;，然后此控件就拥有了回调函数和回调队列等等服务器和客户端端的ADF数据接口和函数接口供调用，开发人员可以通过编写服务器端和客户端代码来实现其相关的功能（主要功能和框架模板已经给出），在客户端只需要在页面文件前面加入对此名空间的引用声明即可使用此控件：   &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="581" valign="top"&gt;&lt;p&gt;&amp;lt;%--自定义服务器控件－地图查询控件--%&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;%@ Register Assembly="App_Code" Namespace="WebMapApp" TagPrefix="uc1" %&amp;gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511165824.gif"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image006" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511183184.gif" border="0" alt="clip_image006" width="557" height="339" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.3&lt;/strong&gt; 地图交互查询实现流程&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;&lt;strong&gt; 客户端鼠标交互产生坐标信息：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; ESRI公司为了适应WebGIS的需要，除了提供了大量的服务器端控件和API外，还提供了资源丰富的客户端JavaScript库，这个库称为"Web ADF JavaScript Library "它是在ASP.NET AJAX JavaScript Library基础上创建的，提供了一套复杂的客户端框架，通过这套框架可以在脚本环境中与Web ADF控件或组件进行交互。这将意味着你可以使用javascript和Web ADF控件进行交互，比如浏览地图，添加graphics到地图上，创建map tips，不需要任何的服务器端代码。从另一个角度来说，Web ADF JavaScript Library为web adf开发人员提供了另外一个工具。Web ADF JavaScript 设计用来利用客户端的技术来增强Web ADF应用，以支持客户端/服务器端的同步以及纯客户端的交互，而不是代替服务器端编程独立使用的。这套library只要页面中有Web ADF控件便可使用，它不需要独立安装，嵌入在web adf控件中，不可更改。它在Web ADF之外不可使用，它主要用来配合arcgis server web adf进行开发使用的。&lt;/p&gt;&lt;p&gt;Web ADF JavaScript Library依赖于ASP.NET AJAX JavaScript Library，ASP.NET AJAX JavaScript Library提供了一个复杂的基础，在此基础上用来创建AJAX的解决方案（数据交换层次如图3.4）。它管理着客户端与远程服务，以及服务器端的控件的交互。它提供一种机制在客户端呈现Web控件以及客户端的事件处理。另外，它提供了跨浏览器的支持，所有的这些特性都在Web ADF JavaScript Library被使用了。下面是它们几者的关系图。关于Web ADF JavaScript Library的详细帮助可以在arcgis server的帮助中查到。&lt;/p&gt;&lt;p&gt; 通过Web ADF JavaScript Library所提供的一些客户端API，我们可以直接在客户端对Web ADF控件进行一些操作，例如：设置地图控件呈现的范围，对地图中指定位置进行色彩着重显示，控制Web ADF服务器控件在客户端的外观和显隐，获取Web ADF服务器控件在客户端的一此状态信息并捕捉其客户端发生的事件等等。通过Web ADF JavaScript Library对Web ADF控件进行的一些操作是不需要经过服务器端的纯客户端操作，一般只是负责页面显示和数据收集等工作，涉及到数据更新时，还是需要和服务器端进行通讯获取新数据。&lt;/p&gt;&lt;p&gt; 在进行地图交互查询时，查询的依据是设备在地图上的坐标值，这个坐标在用户使用鼠标和客户端地图控件进行交互时的事件产生，通过客户端Web ADF JavaScript Library中的接口函数很容易就能够提取到这个坐标并进行简单的字符编码：   &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="581" valign="top"&gt;&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;var mappnt = new ESRI.ADF.Geometries.Point(geom.get_x(), geom.get_y());//提取坐标&lt;/p&gt;&lt;p&gt;&lt;a name="OLE_LINK33"&gt;&amp;hellip;&amp;hellip;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;var argument = "mode=identify&amp;amp;coords=" + geom.get_x() + ":" + geom.get_y();//编码 &amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;this.doCallback(argument,this);//执行回调――向服务器端发送数据&lt;/p&gt;&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 客户端对地图坐标值进行编码后，然后再将编码的字符串通过异步的方式传递给服务器，然后再由服务器端来承接此数据，并进行相关操作。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511198624.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image008" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511203509.jpg" border="0" alt="clip_image008" width="292" height="359" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.4&lt;/strong&gt; Web ADF控件数据交换层次图&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;&lt;strong&gt; 服务器端数据查询：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 客户端向服务器端发起请求并将坐标数据传至服务器端，服务器端将对此请求作出响应，服务器端通过一个重载的函数GetCallbackResult来对客户端请求进行响应，通过Web ADF控件中的_&lt;a name="OLE_LINK19"&gt;callbackArg&lt;/a&gt;成员来承接客户端传送的数据。然后Web应用程序的运行地由客户端转向服务器了，下面就由服务器来处理回调请求了。&lt;/p&gt;&lt;p&gt; 服务器端对收到的字符串进行解码并提取出坐标数值（具体解码过程已经在上一章运行了详细介绍了），然后调用Web ADF提供的API对地图数据库进行检索并得到满足要求的地图属性表，具体操作流程如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511204838.gif"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image010" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511216932.gif" border="0" alt="clip_image010" width="381" height="321" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.5&lt;/strong&gt; 地图图层查询流程&lt;/p&gt;&lt;p&gt; 对如下图所示的地理数据源（以&amp;ldquo;分接箱&amp;rdquo;图层为例）进行检索，得到的是一个满足查询要求的数据集合：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511234607.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image012" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511242490.jpg" border="0" alt="clip_image012" width="485" height="313" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.6&lt;/strong&gt; &amp;ldquo;分接箱&amp;rdquo;地理数据表&lt;/p&gt;&lt;p&gt; 得到的查询结果中，数据表一般包括两类字段：图元几何字段和图元附加属性字段。如上图所示的数据表中，前面两个字段&amp;ldquo;FID&amp;rdquo;（图形要素编号），&amp;ldquo;Shape&amp;rdquo;（几何类型，比如此处是多点类型）就是和几何相关的字段，后面两个字段&amp;ldquo;NAME&amp;rdquo;（名称），&amp;ldquo;SBBH&amp;rdquo;（设备编号）则是作为附加属性对图元的描述，通过这些描述型字段我们可以和SQL非地理数据库进行相连，进行更详细的信息查询。&lt;/p&gt;&lt;p&gt;从地理数据库中查询到指定位置的设备的地理数据后，再根据地理数据中的附加属性和SQL数据库连接，就可以查询到一些更详细的附加信息了，在本模块的所以环节中，虽然SQL数据库检索是最繁琐的一部分，但是因为面临的实际技术问题单一，所以就不再详细介绍了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511365729.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image014" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511379708.jpg" border="0" alt="clip_image014" width="489" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.7&lt;/strong&gt; &amp;ldquo;分接箱&amp;rdquo;非地理数据表&lt;/p&gt;&lt;p&gt; 在完成对地理数据库检索和非地理数据库检索后，就得到一个数据表集合，此时这个数据表集合，这个数据表集合就存储在MapIdentify控件的回调结果集合CallbackResults中，然后再通过GetCallbackResult接口函数将结果返回到客户端。具体实现方法如下：&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="581" valign="top"&gt;&lt;p&gt;&lt;a name="OLE_LINK27"&gt;&amp;hellip;&amp;hellip;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;CallbackResult cResponse = PointIdentify(map, mapPoint); //对指定位置的设备进行信息检索&lt;/p&gt;&lt;p&gt;CallbackResults.Add(cResponse);&lt;a name="OLE_LINK28"&gt;//&lt;/a&gt;父类WebControl的成员函数--一个stack类型的回调消息队列。&lt;/p&gt;&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&lt;p&gt;return base.&lt;a name="OLE_LINK30"&gt;GetCallbackResult&lt;/a&gt;();//返回回调结果至客户端&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;&lt;strong&gt;客户端接收数据并进行显示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 服务器端对客户端请求的数据进行回复后，客户端通过processCallbackResult客户端JavaScript函数来对回复的数据进行承接，并通过客户端的一个类似于MapTips的JavaScript控件进行显示，这个JavaScript控件主要由一个下拉框、一个检索信息显示表和一个图层路径提示条组成。下拉框是对要显示的图层进行选择，因为鼠标点击处可能有多个图层有满足要求的检索结果，检索信息显示表用来对下拉框中指定的图层的检索结果进行显示，图层路径提示条对当前显示的图层路径进行显示，具体效果如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511392051.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image016" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511404394.jpg" border="0" alt="clip_image016" width="406" height="402" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.8&lt;/strong&gt; 地图交互查询效果图&lt;/p&gt;&lt;p&gt; 客户端显示数据查询结果的JavaScript控件的基本功能模板已经给出，开发人员只需要找到传递数据的接口导入自己的数据，并对一些页面元素进行汉化就可以达到如上效果，所以具体过程也不再赘述了。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153202"&gt;&lt;/a&gt;&lt;a name="_Toc263153143"&gt;&lt;/a&gt;&lt;strong&gt;3.1.2&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;设备属性查询&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 要求：用户通过输入电力设备的已知属性（这些属性），比如&amp;ldquo;设备编号&amp;rdquo;、&amp;ldquo;设备名称&amp;rdquo;来进行关键字检索，将检索结果显示在页面中，然后选中的查询结果在地图中着重标识出来，并提供放大定位功能和查询详细信息。需要使用或者设置的Web ADF控件有：&lt;/p&gt;&lt;p&gt;&lt;a name="OLE_LINK34"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;SearchAttributesTask：用来承接来自服务输入的关键字并地图资源进行检索。&lt;a name="OLE_LINK22"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;MapResourceManager：设置对地图数据源进行的查询参数。&lt;/p&gt;&lt;p&gt;TaskResults：任务结果，在页面中将查询结果以树形格式展现在，并提供一些其它基本功能。&lt;/p&gt;&lt;p&gt;TaskManager：将上述两种控件绑定――实现数据相关联。&lt;/p&gt;&lt;p&gt;1. &lt;a name="OLE_LINK21"&gt;SearchAttributesTask&lt;/a&gt;控件设置&lt;/p&gt;&lt;p&gt; 利用系统自带的SearchAttributesTask控件经过简单的控件属性设置就可以满足本次毕业设计的要求，在页面中点击 SearchAttributesTask控件进行参数配置，会弹出如下的参数配置对话框：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511421131.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image018" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511434031.jpg" border="0" alt="clip_image018" width="459" height="305" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.9&lt;/strong&gt; SearchAttributesTask控件设置界面&lt;/p&gt;&lt;p&gt; 在&amp;ldquo;General&amp;rdquo;选项卡中对控件进行一些提示字符设置，在&amp;ldquo;Settings&amp;rdquo;选项卡中对地图检索字段范围进行设置（这个很重要），在&amp;ldquo;Results&amp;rdquo;选项卡中对查询结果纪录上限和显示方式进行设置（一般都采用默认选择）。&lt;/p&gt;&lt;p&gt;2.MapResourceManager相关设置&lt;/p&gt;&lt;p&gt; 和地图数据源查询相关的一些设置。通过对MapResourceManger控件中的MapResourceItem中的LayerDefinition进行设置，设置界面如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511457246.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image020" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511463210.jpg" border="0" alt="clip_image020" width="501" height="412" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.10&lt;/strong&gt; MapResourceManager设置界面&lt;/p&gt;&lt;p&gt;&amp;ldquo;Symbols&amp;rdquo;选项卡：查询结果高亮显示标记。&lt;/p&gt;&lt;p&gt;&amp;ldquo;Fields&amp;rdquo;选项卡：设置在&lt;a name="OLE_LINK35"&gt;TaskResults&lt;/a&gt;中需要显示的字段（例如FID,ID这些我们不关心的字段可以选择不显示）。&lt;/p&gt;&lt;p&gt;&amp;ldquo;Records&amp;rdquo;选项卡：设置TaskResults显示字段的别名（这是汉化的一部分工作）。&lt;/p&gt;&lt;p&gt;3. &lt;a name="OLE_LINK36"&gt;TaskResults&lt;/a&gt;自定义控件使用说明&lt;/p&gt;&lt;p&gt; 系统提供的基本控件里面有如下缺点：&lt;/p&gt;&lt;p&gt; 菜单项目固定，可扩展性太弱。&lt;/p&gt;&lt;p&gt; 菜单提示默认英文的，难以找到接口进行汉化。&lt;/p&gt;&lt;p&gt; 所以本次毕业设计中采用自定义的TaskResults控件的方式来进行对查询结果的显示，并对每条记录增加一些页面右击快捷菜单：&amp;ldquo;清除&amp;rdquo;，&amp;ldquo;放大定位&amp;rdquo;，&amp;ldquo;显示详细信息&amp;rdquo;。&lt;/p&gt;&lt;p&gt; 在服务器端建立一个继承于ESRI.ArcGIS.ADF.Web.UI.WebControls.WebControl. TaskResults的类CustomTaskResults，然后就对其具体内容和功能进行编写了。在客户端代码中，和上面的&amp;ldquo;地图交互查询&amp;rdquo;控件一样，只需要在页面元素代码中加入一段控件名空间引用声明就可以了。&lt;/p&gt;&lt;p&gt; 关于如何搭建此控件的基本平台，在安装ArcGIS时，有一段学习代码可以直接借鉴过来，所以在此就不再描述，本次毕业设计所解决的问题是向CustomTaskResults中对检索的每一条结果添加右键菜单命令：&amp;ldquo;清除&amp;rdquo;，&amp;ldquo;放大定位&amp;rdquo;，&amp;ldquo;显示详细信息&amp;rdquo;&lt;/p&gt;&lt;p&gt;首先在ArcGIS的开发帮助文档中查看&lt;a name="OLE_LINK40"&gt;TaskResults&lt;/a&gt;结构：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511476143.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image022" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511482423.jpg" border="0" alt="clip_image022" width="520" height="273" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.11&lt;/strong&gt; TaskResults结构&lt;/p&gt;&lt;p&gt; 不难发现，一个TaskResults提供了四种右键快捷菜单，分别是：&lt;/p&gt;&lt;p&gt;&lt;a href="ms-help://ESRI.EDNv9.3/ArcGIS.ADF.Web.UI.WebControls/ESRI.ArcGIS.ADF.Web.UI.WebControls~ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults~TaskResultContextMenu.html"&gt;TaskResultContextMenu&lt;/a&gt;：是一个任务结果框架的最顶层右键菜单。&lt;/p&gt;&lt;p&gt;&lt;a href="ms-help://ESRI.EDNv9.3/ArcGIS.ADF.Web.UI.WebControls/ESRI.ArcGIS.ADF.Web.UI.WebControls~ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults~GraphicsLayerContextMenu.html"&gt;GraphicsLayerContextMenu&lt;/a&gt;：图层信息节点的右键菜单 ，处于第二层。&lt;/p&gt;&lt;p&gt;&lt;a href="ms-help://ESRI.EDNv9.3/ArcGIS.ADF.Web.UI.WebControls/ESRI.ArcGIS.ADF.Web.UI.WebControls~ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults~FeatureContextMenu.html"&gt;FeatureContextMenu&lt;/a&gt;： 图层下属要素结点的右键菜单，处于第三层。&lt;/p&gt;&lt;p&gt;&lt;a href="ms-help://ESRI.EDNv9.3/ArcGIS.ADF.Web.UI.WebControls/ESRI.ArcGIS.ADF.Web.UI.WebControls~ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults~RemoveOnlyContextMenu.html"&gt;RemoveOnlyContextMenu&lt;/a&gt;：当没有任何检索结果时，&amp;ldquo;空白提示&amp;rdquo;节点的右键菜单。&lt;/p&gt;&lt;p&gt; 本次毕业设计中对三级菜单都做了自定义，由于篇幅原因，就只对实现第三级菜单的功能进行介绍，自定义&lt;a href="ms-help://ESRI.EDNv9.3/ArcGIS.ADF.Web.UI.WebControls/ESRI.ArcGIS.ADF.Web.UI.WebControls~ESRI.ArcGIS.ADF.Web.UI.WebControls.TaskResults~FeatureContextMenu.html"&gt;FeatureContextMenu&lt;/a&gt;：&lt;/p&gt;&lt;p&gt;在重载过的CreateChildControls成员函数中对第三级菜单进行外观设置：   &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="581" valign="top"&gt;&lt;p&gt;//判断是否成功自定义了右键菜单。&lt;/p&gt;&lt;p&gt;bool exists = false;&lt;/p&gt;&lt;p&gt;foreach (ContextMenuItem item in base.FeatureContextMenu.Items)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;if (item.Text == "放大定位")&lt;/p&gt;&lt;p&gt;exists = true;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;//如果没有，那么加入自定义的右键选项--三级目录&lt;/p&gt;&lt;p&gt;if (!exists)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;base.FeatureContextMenu.Items.Clear();&lt;/p&gt;&lt;p&gt;contextmenu = base.FeatureContextMenu;&lt;/p&gt;&lt;p&gt;//放大&lt;/p&gt;&lt;p&gt;ContextMenuItem menuItemzoomin = new ContextMenuItem("images/show-magnify.png", "放大定位", "");&lt;/p&gt;&lt;p&gt;contextmenu.Items.Add(menuItemzoomin); &lt;/p&gt;&lt;p&gt;//清除&lt;/p&gt;&lt;p&gt;ContextMenuItem menuItemclear = new ContextMenuItem("images/dismiss_solid.png", "清除", "");&lt;/p&gt;&lt;p&gt;contextmenu.Items.Add(menuItemclear);&lt;/p&gt;&lt;p&gt;//显示&lt;/p&gt;&lt;p&gt;ContextMenuItem menuItemview = new ContextMenuItem("images/11.bmp", "显示设备详细信息", "");&lt;/p&gt;&lt;p&gt;contextmenu.Items.Add(menuItemview);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; 经过上面的定义后，在自定义的CustomTaskResults中的第三级节点上右击时会出现三个菜单：&amp;ldquo;放大定位&amp;rdquo;、&amp;ldquo;清除&amp;rdquo;、&amp;ldquo;显示设备详细信息&amp;rdquo;。但是点击这些命令还不会有任何反应，需要在其成员函数中OnLoad为这些命令增加对应的响应函数：   &lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="581" valign="top"&gt;&lt;p&gt;this.FeatureContextMenu.ItemClicked += new ContextMenuItemClickedEventHandler(FeatureContextMenu_ItemClicked);&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;函数FeatureContextMenu_ItemClicked就这样和第三级菜单事件绑定在一起了，只需要对此函数内部编写响应代码即可：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511504799.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image024" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511513272.jpg" border="0" alt="clip_image024" width="477" height="327" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.12&lt;/strong&gt; 服务器端快捷菜单响应函数代码框架图&lt;/p&gt;&lt;p&gt; 三条命令的实现方法：&lt;/p&gt;&lt;p&gt; &amp;ldquo;放大定位&amp;rdquo;：&lt;/p&gt;&lt;p&gt; 服务器端得到当前要素节点的信息，从中提取出几何点坐标，并设置一个以此几何点为中心的一定大小的封套（显然要比当前地图展示的范围要小，否则就不叫&amp;ldquo;放大&amp;rdquo;了），然后将地图控件的范围设置成此封套，并以此封套的中心为中心，就达到了&amp;ldquo;放大定位&amp;rdquo;的效果。具体实现流程图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511525124.gif"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image026" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511535549.gif" border="0" alt="clip_image026" width="463" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.13&lt;/strong&gt; 实现&amp;ldquo;放大定位&amp;rdquo;功能流程&lt;/p&gt;&lt;p&gt; &amp;ldquo;清除&amp;rdquo;：&lt;/p&gt;&lt;p&gt; 主要流程和&amp;ldquo;执行放大&amp;rdquo;一样，只是在服务器端的代码不同而已,只需要将CustomTaskResults中的Feature节点进行删除，然后再将命令加入到FeatureContextMenu的回调队列中，即可实现客户端对此节点的删除。&lt;/p&gt;&lt;p&gt; &amp;ldquo;显示设备详细信息&amp;rdquo;：&lt;/p&gt;&lt;p&gt; 要求程序能够通过要素节点包含的地理信息到SQL数据库中检索得到更详细的信息，并在客户端浏览器中进行显示，CustomTaskResults的节点数据结构是一个XML字符串，因此可以通过对要素节点内容的XML文档进行解析（解析XML文档的方法在上一章进行了介绍）得到地理信息中的附加信息，此附加信息可用于连接SQL数据库，再通过要素节点的父节点名称可以得到需要检索的SQL表名称，于是可以得到详细的设备信息了。得到数据后，需要在客户端进行显示，为了达到比较好的客户端体验，显示方法选用网上比较流行的一款JavaScript对话框artDialog（关于artDialog的用法不是本文重点，所以不详细介绍了）。artDialog只需要传递一个div层的数据，然后调用JS函数打开对话框，就可以在客户端将指定的div里面的内容显示出来。本模块的主要实现流程图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511547368.gif"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image028" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511569679.gif" border="0" alt="clip_image028" width="463" height="286" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.14&lt;/strong&gt; 实现&amp;ldquo;清除&amp;rdquo;功能流程&lt;/p&gt;&lt;p&gt; 完成上述的菜单命令后，&amp;ldquo;设备属性查询&amp;rdquo;模块也就基本完成，效果图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511578990.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image030" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131511582446.jpg" border="0" alt="clip_image030" width="525" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;3.15&lt;/strong&gt; &amp;ldquo;设备属性查询&amp;rdquo;运行效果图&lt;/p&gt;&lt;p&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Author:&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;From:&lt;a href="http://www.cnblogs.com/beer"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Notes:&lt;/em&gt;&lt;em&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1904520.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2010/12/13/1904520.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/beer/archive/2010/12/13/1904487.html</id><title type="text">配电网WebGIS研究与开发[2]</title><summary type="text">配电网WebGIS研究与开发[2]作者：一点一滴的Beer http://beer.cnblogs.com/第2章 总体方案的设计2.1 系统整体业务结构 本次毕业设计所涉及平台有服务器和客户端两个平台、所处理的数据有地理数据和非地理数据、所涉及的编程语言主要有C#和JavaScript，都比较多样化，所以在进行系统全面介绍前，先展示系统整体业务结构，如图2.1。图2.1 系统整体业务结构 WebGIS应用程序放置于一台服务器上，两种数据源放置在另外的两台服务器上，这些服务器能够通过网络进行互联，当然Web应用程序和两种数据源也可以放置在同一台服务器上，但分开放置的设计理念主要是为了体现出本系</summary><published>2010-12-13T06:46:00Z</published><updated>2010-12-13T06:46:00Z</updated><author><name>一点一滴的Beer</name><uri>http://www.cnblogs.com/beer/</uri></author><link rel="alternate" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904487.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/beer/archive/2010/12/13/1904487.html"/><content type="html">&lt;p&gt;&lt;a name="OLE_LINK2"&gt;&lt;/a&gt;&lt;a name="OLE_LINK3"&gt;&lt;strong&gt;配电网&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;WebGIS&lt;/strong&gt;&lt;strong&gt;研究与开&lt;/strong&gt;&lt;strong&gt;发[2]&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt; &lt;a href="http://beer.cnblogs.com/"&gt;http://beer.cnblogs.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153186"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153119"&gt;&lt;strong&gt;第2章&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;总体方案的设计&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153187"&gt;&lt;/a&gt;&lt;a name="_Toc263153120"&gt;&lt;strong&gt;2.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 系统整体业务结构&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本次毕业设计所涉及平台有服务器和客户端两个平台、所处理的数据有地理数据和非地理数据、所涉及的编程语言主要有C#和JavaScript，都比较多样化，所以在进行系统全面介绍前，先展示系统整体业务结构，如图2.1。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446076362.gif"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image002" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446085391.gif" border="0" alt="clip_image002" width="440" height="346" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.1&lt;/strong&gt; 系统整体业务结构&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebGIS应用程序放置于一台服务器上，两种数据源放置在另外的两台服务器上，这些服务器能够通过网络进行互联，当然Web应用程序和两种数据源也可以放置在同一台服务器上，但分开放置的设计理念主要是为了体现出本系统的开放性和分布性。Web应用程序服务器可以和地理数据库、非地理数据库服务器通过网络自由交换数据（主要是Web应用程序访问数据库），用户在本地机的浏览器中打开Web应用程序链接，第一次向Web应用程序服务器发起请求，然后服务器将页面内容发送至客户端PC机上，用户再和Web应用程序进行交互交向应用程序服务器提交相关数据（这些客户端事件和数据处理方法由JavaScript编写），Web应用程序服务器接收数据，并对地理数据和非地理数据进行查询和计算（这些服务器端事件和数据处理方法由C#编写），然后再将数据发回到客户端进行计算和显示。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于系统整体业务结构以及几种平台、数据库、编程语言之间的联系如上所述，一起构成了WebGIS系统。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153188"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153121"&gt;&lt;strong&gt;2.2&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 系统开发所需的软件和环境&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebGIS是一个比较高层的应用系统，开发起来的难度也比较大，但是ESRI公司提供了.NET开发框架和模板，大大降低了开发的难度和门槛。所以，在进行开始之前需要安装一些必要的软件和框架，必需安装的软件名称及主要作用如下表所示：&lt;/p&gt;&lt;p&gt;表&lt;strong&gt;2.1&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;系统开发所需安装的软件和环境&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;Microsoft SQL Server&lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;访问和查看SQL数据库，并协助数据库编程的相关调试。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;Microsoft Visual Studio 2008&lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;.NET FrameWork，ASP.NET网页开发集成环境，客户端C#和服务器端JavaScript代码和编写环境。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;VS 2008 MSDN&lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;服务器端端相关代码编写的主要参考文档。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;ArcGIS Server for the Microsoft .NET FrameWork &lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;Web地图数据源的基本框架，Web应用程序运行框架，应用程序开发框架Web ADF&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;&lt;a name="_Hlk262286355"&gt;ArcDesktop&lt;/a&gt;&lt;/p&gt;&lt;p&gt;(ArcMap,ArcCatalog)&lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;ArcMap：访问和查看地图图形视图以及图元属性数据库，而且可以作一些地图的地图要素和地图图元属性的编辑。&lt;/p&gt;&lt;p&gt;ArcCatalog：建立ArcGIS的Web服务，使得程序可以通过Web访问服务器器上的地图数据。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="211" valign="top"&gt;&lt;p&gt;网络信息服务IIS&lt;/p&gt;&lt;/td&gt;&lt;td width="370" valign="top"&gt;&lt;p&gt;IIS用来在本地PC机上提供一个虚拟的网络信息服务，让本地机可以充当临时的服务器。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 其它一些辅助软件：&lt;/p&gt;&lt;p&gt;DreamWeaver：方便用户进行页面前台设计和CSS样式设定。&lt;/p&gt;&lt;p&gt;UltraEdit：一个良好的JavaScript代码编辑和查看环境（主要是因为VS2008的编辑环境对JavaScritp脚本编辑所提供的支持太少）&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153189"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153122"&gt;&lt;strong&gt;2.3&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 系统开发所需要的数据源&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 本次毕业设计所开发的配电网WebGIS系统所涉及到的数据库有两种&lt;sup&gt;[4]&lt;/sup&gt;：地理信息数据库（存储地理信息）和非地理信息数据库（存储非地理信息）。地理信息数据，即ESRI的Shape格式地图数据，其主要作用是作为承载整个配电网信息的数据框架，主要内容是和地图相关的一此几何要素和呈现的样式以及一些必要的附加属性（可以用来和非地理信息数据相连接）。非地理信息数据则是和配电相关的一些设备或者线路的详细信息，这些数据就是在配电分析和决策的数据实体，也就是需要被地理数据所承载的数据。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153190"&gt;&lt;/a&gt;&lt;a name="_Toc263153123"&gt;&lt;/a&gt;&lt;strong&gt;2.3.1&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;地理数据库&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 地理信息数据有三种基本视图[参考ArcDesktop帮助文档]：地理数据视图，地图视图，工具箱视图。这三种视图通过地理数据表（一个GIS可视为一系列地理图片数据集），地图（一个GIS可视为一个智能化的地图视图）和工具箱（一个GIS可视为一系列的空间地理信息处理工具）来表现的&lt;sup&gt;[5]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/20101213144609243.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image004" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446105999.jpg" border="0" alt="clip_image004" width="398" height="323" /&gt;&lt;/a&gt;    &lt;br /&gt;图&lt;strong&gt;2.2&lt;/strong&gt; GIS的三种视图&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个地图就是一系列的地图元素在页面上摆开并组织起来。普通地图元素包括由地图图层，缩放工具条，指北针，标题，描述文本，和符号图例组成的地图框架。最根本的地图元素就是地图框架，它提供了地理信息的展示规则。在地图框架中，地理学内容被展示为一系列的覆盖了一定地图范围的地图图层&amp;mdash;&amp;mdash;例如，像道路、河流、地图名称、建筑、行政区域划分、表面海拔高度、和卫星图 图层&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446121963.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image006" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446135179.jpg" border="0" alt="clip_image006" width="372" height="343" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.3&lt;/strong&gt; 图层是地图框架组成&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有一些普遍的规则用来限定GIS如何展示，操作，管理和分享地理信息的。地理学表现方式有四种基本的类型：要素（点，线，面的集合）；属性；图像；连续的表面（例如海拔标高）。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在GIS中，描述的属性一般在表中进行管理，这些表是基于一系列简单的必要的关系数据库概念。一个关系数据库提供了一个简单的，普通的数据模型来存储和操作这些属性信息。数据库管理系统天生的开放性，是因为他们的简单和灵活使得它们支持一些宽范围的应用程序，包括关键字关系概念。这些表可以用来在对一些图层上的不同元素进行特别的附加属性，比如在本次毕业设计中，设备编号则作为附加属性存储在地理数据库中。这些描述属性就是地理数据和非地理数据相联系的纽带。例如在进行点查询的时候，可以根据鼠标交互，得到地图控件上操作的几何对象，然后根据地图的属性表找到附加属性，再以此附加属性作为入口到SQL中检索中更加详细的信息的，实现了两种数据源的连接。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 地理数据可以用ArcDesktop中的ArcMap和ArcCatalog来进行创建。具体的创建过程不是本文重点，所以在此就不赘述了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446147522.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image008" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446167357.jpg" border="0" alt="clip_image008" width="490" height="350" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.4&lt;/strong&gt; 地图图层结构以及图层属性表&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 地图数据的Web访问平台是基于ArcGIS Server，所以在创建好地图数据后，如果在进行网络平台的应用，那么还需要安装其网络运行服务ArcGIS Server。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGIS Server是同行业中第一个在企业级服务器构架中实现GIS 全功能的技术，它是对传统桌面应用和客户端/服务器应用的发展，为广域网中实现高性能的GIS功能提供了新的解决方案&lt;sup&gt;[6]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArcGIS Server用于构建集中管理、支持多用户的企业级GIS应用&lt;sup&gt;[7]&lt;/sup&gt;。开发者使用ArcGIS Server可构建Web应用、Web服务以及其他运行在标准的.NET 和J2EE Web服务器上的企业级应用，如EJB。它可让开发者和系统设计员实现一个集中的GIS，并支持多用户访问。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153191"&gt;&lt;/a&gt;&lt;a name="_Toc263153124"&gt;&lt;/a&gt;&lt;strong&gt;2.3.2&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a name="OLE_LINK20"&gt;&lt;strong&gt;非地理数据库&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 非地理数据库用来存储关于配电网的设备信息以及操作信息，这些数据都是由供电公司平时办公时录入的数据，这些数据才是办公人员进行分析和决策的依据。在地理数据源的属性表中，会有一个字段可以将这两种数据源在逻辑上关联起来，因此这两种表可以通过程序来进行交叉查询。在本次毕业设计中我们使用的非地理数据库是由Microsoft推出的一种新型的对象关系型的数据库管理系统Microsoft SQL Server 2000。它功能强大，提供了良好的扩展性，一度在数据库领域占有领先地位。SQL是一种介于关系代数与关系演算之间的结构化查询语言，其功能不仅仅是查询。SQL是一个通用的、功能极强的关系数据库语言&lt;sup&gt;[12]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/20101213144618780.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image010" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446197234.jpg" border="0" alt="clip_image010" width="520" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.5&lt;/strong&gt; SQL非地理数据库&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SQL数据库作为一种数据服务，主要是面向网络访问的，所以对构建网络数据库具有先天的优势，这也是它能作为本次毕业设计的非地理数据库的重要原因。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153192"&gt;&lt;/a&gt;&lt;a name="_Toc263153125"&gt;&lt;strong&gt;2.4&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 构建基本的B/S模式的WebGIS框架&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ESRI公司为.NET开发提供了一套完整的基本模板，模板中包含了地图展示模块，图层显示控制模块，基本的地图导航工具，地图视图控制工具（缩放、漫游、测距、放大工具、全图、鹰眼等等）。虽然模板提供了基本的功能，但是要在本次毕业设计中因为要结合实际需求，还需要对模板进行必要的修改，主要修改内容如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 将模板地图数据源和自己准备好地图数据源相连接。将页面文字由简体中文代替。因为模板是完全基于英文的，所以要找到编程接口，进行基本的汉化。并对页面外观进行必要的修改，使得通用模板风格更加本地化，删除一些不需要的工具控件。这些过程都比较容易，只需要对源代码进行一些简单的修改和删除就可以完成，所以就不再详细介绍了。&lt;/p&gt;&lt;p&gt;为WebGIS添加和配电网相关的基本功能。这些功能主要目的是来实现非地理数据在地理数据上的展示，如何实现这些功能，将在后面的章节中进行详细介绍。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153193"&gt;&lt;/a&gt;&lt;a name="_Toc263153126"&gt;&lt;strong&gt;2.5&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; WebGIS的网页技术基础－AJAX&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在进行下面的工作前，先要了解WebGIS的一些基本技术。因为WebGIS实际上就是一个交互性很强的地图数据展示系统，在交互性很强的同时也很注重用户的体验，最大限度地让Web应用程序有桌面应用程序的交互体验效果。于是AJAX技术就毫无疑问成了本系统最基本的技术了。&lt;/p&gt;&lt;p&gt;HTML是一种用来制作超文本文档的简单标记语言。用HTML编写的超文本文档称为HTML文档，自1990年以来，HTML就一直被当作WWW上的信息表示语言，用于描述网页的格式设计和它与WWW上其他页面连接信息&lt;sup&gt;[13]&lt;/sup&gt;。但是以纯HTML语言编写的页面一直以来只能作为展示普通文本信息，也就是所谓的静态页面。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当前的一些搜索引擎中，比如Google（如图2.6）和Yahoo！ 都是网络上流行的搜索引擎。在动态的客户端Web页面进行的搜索，然而，要么不存在或者远离完美，而且不能处理已经存在的工作，比如Deep Web。这个问题直到AJAX和RIA在上普遍应用后才得到解决&lt;sup&gt;[14]&lt;/sup&gt;。技术是一种很有前景的用来提供更丰富的次交互性和表现力的网络应用程序。同时，AJAX技术粉碎了一些推崇者认为搜索引擎的基础是网络&amp;ldquo;页面&amp;rdquo;的比喻&lt;sup&gt;[15]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446205499.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image012" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446217352.jpg" border="0" alt="clip_image012" width="437" height="312" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.6&lt;/strong&gt; Google主页搜索建议&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 作为Web2.0的标志，Ajax带来交互性更强，反应更迅速，更主观，内容更动态的特点。因为这些丰富的组合和技术，Ajax为地理空间网络应用程序提供了强大的基础&lt;sup&gt;[16]&lt;/sup&gt;。AJAX提供了丰富的客户端页面应用程序，通过提供原始的执行异步的请求和动态更新页面结结构和内容。通常，Ajax页面应用程序由单一的页面元素组成，但是这些页面元素却可以通过回调来进行异步激活，由用户或者用品&amp;ldquo;激活&amp;rdquo;动态改变这个页面内容&lt;sup&gt;[17]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt; Ajax 是一系列的不同的技术放到一起后产生的一种新的作用巨大的网络应用程序&lt;sup&gt;[18]&lt;/sup&gt;。在ASP.NET网页的默认模型中，单击按钮或执行一些其他操作会导致回发，此时将重新创建页及其控件，并在服务器上运行页代码，且新版本的页被呈现到浏览器。但是，在有些情况下，需要从客户端运行服务器代码，而不执行回发。如果页中的客户端脚本维护一些状态信息（例如变量值），那么发送页和获取页的新副本就会损坏该状态。此外，页回发会导致处理开销，这会降低性能，且会让用户不得不等待处理并重新创建页。若要避免丢失客户端状态并且不导致服务器往返的处理开销，可以使用客户端回调。在客户端回调中，客户端脚本函数会向ASP.NET网页发送一个请求。该网页运行其正常生命周期的修改版本&amp;mdash;&amp;mdash;初始化页并创建其控件和其他成员，然后调用特别标记的方法。该方法执行代码中编写的处理过程，然后向浏览器返回可由另一客户端脚本函数读取的值。在此过程中，该页一直驻留在浏览器中。回调使用了一系列的标准技术，这些技术统称为Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)&lt;sup&gt;[19]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446223872.jpg"&gt;&lt;img style="border: 0px none; display: block; margin-left: auto; margin-right: auto;" title="clip_image014" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446242628.jpg" border="0" alt="clip_image014" width="571" height="202" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.7&lt;/strong&gt; 回发同步(左)和回调异步（右图）通讯过程对比图&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ajax技术则是在Web 2.0时代的需求下应运而生的一种注重用户交互体验的浏览器技术。Ajax为用户提供了复杂的、运转良好的应用，改变了用户的交互体验。Ajax中主要技术之间的关系如下所述：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JavaScript将各个部分粘合在一起，定义应用的工作流程和业务逻辑，通过使用JavaScript操作DOM来改变和刷新用户界面，不断地重绘和重新组织显示给用户的数据，并且处理用户基于鼠标和键盘的交互。CSS为应用提供了一致的外观，并且为以编程方式操作DOM提供了强大的捷径。XMLHttpRequest对象（或者类似的机制）则用来与服务器进行异步通信，在用户工作时提交用户的请求并获取最新的数据&lt;sup&gt;[20]&lt;/sup&gt;。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AJAX具体功能和其名称的对应关系如下表2.2。&lt;/p&gt;&lt;p&gt;表&lt;strong&gt;2.2&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;AJAX的组成&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153127"&gt;A: &lt;/a&gt;Aschronorous&lt;/p&gt;&lt;/td&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153128"&gt;异步通讯，负责数据在服务器和客户端后台之间传输数据。&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153129"&gt;J: &lt;/a&gt;JavaScript&lt;/p&gt;&lt;/td&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153130"&gt;客户端编程语言，负责客户端数据编码解码数和数据的发送和接收以及通过操作&lt;/a&gt;DOM来改变和更新客户端浏览器中的页面内容。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153131"&gt;A: &lt;/a&gt;And&lt;/p&gt;&lt;/td&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153132"&gt;连接词，和。&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153133"&gt;X: &lt;/a&gt;XML&lt;/p&gt;&lt;/td&gt;&lt;td width="284" valign="top"&gt;&lt;p&gt;&lt;a name="_Toc263153134"&gt;（&lt;/a&gt;Extensible Markup Language）即可扩展标记语言。负责数据的编码和解码。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通过上面的介绍不难发现AJAX主要由三部分组成，现在将分别对三个部分进行详细介绍&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153194"&gt;&lt;/a&gt;&lt;a name="_Toc263153135"&gt;&lt;/a&gt;&lt;strong&gt;2.5.1&lt;/strong&gt;&lt;strong&gt; A&lt;/strong&gt;&lt;strong&gt;schronorous&lt;/strong&gt;&lt;strong&gt;异步通讯的几种框架&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最基本的&lt;/strong&gt;&lt;strong&gt;XmlHttpRequest&lt;/strong&gt;&lt;strong&gt;：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlHttpRequest基本上是所以的框架的基础，很多教程对AJAX的介绍也都是以此为起点的。在后面介绍的几种实现起来更加简单的框架在除去华丽的外衣后，其内部运行机制也都是基于XmlHttpRequest。因此本框架的基础性也造成了其开发代码量繁重的缺点，所以在实际开发中一般采用对其改进的框架。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASP.NET&lt;/strong&gt;&lt;strong&gt;客户端回调：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在ASP.NET 2.0的发布版本中，微软介绍了一种简单的客户端回调（实际上是对XmlHttpRequest的一个封装框架），在Web应用程序中的一种轻量级，而且高效的AJAX解决方案。通过一个ICallbackEventHandler接口,一个客户端script manager类和一个单独的JavaScript文件（WebForms.js）就能够提供处理服务器端和客户端的异步通讯问题了。客户端回调(Client Callback)优点在于回调时发送请求和返回结果的字符串都由开发者自定义和解析，更为灵活和轻便。当然，ArcGIS Server中提供了CallbackResult和processCallbackResult函数，更加方面了开发者。另外，客户端整个页面的生命周期比传统Postback短(无论是同步或者异步)，更为高效。缺点是需要开发者编写客户端脚本和服务器代码。&lt;/p&gt;&lt;p&gt;本次毕业设计的&amp;ldquo;设备统计&amp;rdquo;页面属于一个典型的数据库访问和分析页面，采用的AJAX通讯方式也主要是基于ASP.NET 客户端回调。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ASP.NET AJAX &lt;/strong&gt;&lt;strong&gt;：&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在ASP.NET 2.0 Web应用程序中，微软提供了两种解决方案来处理异步回发：一个是利用ASP.NET客户端回发的回调框架解决方案，另外一个是ASP.NET AJAX的完全框架解决方案&lt;sup&gt;[21]&lt;/sup&gt;。ASP.NET AJAX(partial page postback页面局部刷新)为了提供一个更全面的AJAX解决方案，微软于2007年初提出了ASP.NET AJAX。该方案在服务器端提供一系列AJAX控件(ScriptManager，UpdatePanel等)和API用于管理异步通信，同时通过客户端的Microsoft AJAX Library动态更新页面内容，这就使得开发人员甚至不用编写任何客户端脚本就可以实现异步刷新。&lt;/p&gt;&lt;p&gt;本次毕业设计中涉及地图查询和浏览的主页中的AJAX框架就是基于ASP.NET AJAX的，因此使用此框架只需要拖动一些ASP.NET AJAX控件可以很方便地做出界面友好，动态性能优越的页面框架来，大大减少了开发的工作量和难度。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153195"&gt;&lt;/a&gt;&lt;a name="_Toc263153136"&gt;&lt;/a&gt;&lt;strong&gt;2.5.2&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;strong&gt; 运行在客户端的程序&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JavaScript作为客户端脚本，在ASP网页开发中扮演的地位完全不亚于C#，可以说应该是等同的，一个运行于客户端一个运行于服务器端。目前笔者对这两种语言的定位就是：JavaScript运行于客户端，负责浏览器上页面的程序设计，C#运行于服务器端，负责响应客户端的请求并计算和处理数据，然后通过网络通讯技术数据的交换将服务器和客户端Web应用程序联系起来成为一个整体。&lt;/p&gt;&lt;p&gt;JavaScript主要处理的事情有：&lt;/p&gt;&lt;p&gt;1.客户端发起异步通讯请求（上一节已经提到）&lt;/p&gt;&lt;p&gt;2.接收来自服务器端异步发来的数据并完成解码（下一章将提到）&lt;/p&gt;&lt;p&gt;3.操作页面元素（基于DOM模型），负责数据在客户端的计算和呈现&lt;/p&gt;&lt;p&gt;总之，JavaScript就像&amp;ldquo;胶水&amp;rdquo;一样将异步通讯的各个过程粘合到一起。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153196"&gt;&lt;/a&gt;&lt;a name="_Toc263153137"&gt;&lt;/a&gt;&lt;strong&gt;2.5.3&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;XML&lt;/strong&gt;&lt;strong&gt;通讯消息的编码&lt;/strong&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户端和服务器之间数据交换一般是以字符串的形式进行的，当涉及到比较复杂的数据集合时就需要对字符串进行合理地编码，这就是AJAX中的XML的内容了。对数据编码掌握后，就可以成异步通讯数据的规模&amp;ldquo;从一到万&amp;rdquo;的质变。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面将介绍几种常用的数据编码技术：&lt;/p&gt;&lt;p&gt;1 用户自定义分隔符编码（微量级别）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 简单的URL后面的传递：&lt;/p&gt;&lt;p&gt;比如：string strEncode=&amp;rdquo;a=10&amp;amp;b=20&amp;amp;c=30&amp;rdquo;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这样以特殊符号作为分隔符的编码方法比较适用于结构单一的数据集合，数据在客户端和服务器端的编码和解码也是最简单的，编码只需要字符串相加即可，解码只需要用split()函数（C#和JS两种语言都有此函数）按照编码的分隔符规则进行分离并提取出有用信息即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 总述：此方法好处是数据编码和解码很容易，坏处也显而易见，字符串所表示的数据集合结构层次不明，当数据集合稍微有点大的时候，字符串的可读性将变得很差。所以本方法只适合于传递的数据量比较少层次比较少的微量级别，比如一般传递不多于5组的层次单一的数据，如上例所示，但即使如此，也可以满足一般的开发者的需求了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面再讲的JSON编码是对于轻量级别（比微量级别要复杂一些）的数据的一种编码方式，&lt;/p&gt;&lt;p&gt;2 JSON编码技术（轻量级别）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于JSON的介绍，网上有这么一段话：JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式易于人阅读和编写同时也易于机器解析和生成。 JSON采用完全独立于语言的文本格式，但是也使用了类似于C语言家族的习惯（包括C, C++, C#, Java, JavaScript, Perl, Python等）这些特性使JSON成为理想的数据交换语言。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于JSON编码更详细的介绍可以到网上查找相关文档，或者直接访问其官方网站&lt;a href="http://json.org/"&gt;json.org&lt;/a&gt;。在从事JSON的应用时应先到官网上下载两个文件：json.js和JSON.CS。分别作为客户端和服务器端JSON的编码和解码库文件。&lt;/p&gt;&lt;p&gt;（1）服务器端JSON编码和解码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用从json.org网页中下载的&amp;ldquo;JSON.CS&amp;ldquo;文件，然后在服务器端中引用引文件，就可以在写C#函数的时候调用里面的函数了。&amp;rdquo;JSON.CS&amp;ldquo;文件&lt;a name="OLE_LINK29"&gt;里面函数虽然众多，但是直接给外部调用的只有两个：&lt;/a&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="568" valign="top"&gt;&lt;p&gt;public static object &lt;a name="OLE_LINK15"&gt;JsonDecode(string json)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;public static string&lt;a name="OLE_LINK16"&gt; JsonEncode(object json)&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 即一个是编码函数一个是解码函数：编码函数将服务器端的object对象转换成字符串对象，然后传递到客户端;解码函数将从服务器端接收到的string对象转换成object对象供服务器提取数据。其余的函数都是供这两个函数调用的。&lt;/p&gt;&lt;p&gt;需要说明的是，上面所说的string类型的数据不是一般的任意字符串，而是有一些特别分隔符组成的&amp;ldquo;JSON字符串&amp;ldquo;，只有这样格式良好的string字符串才能够被此文件中的函数进行解码，而编码的作用也就是将object数据类型编码成这样的格式良好的&amp;ldquo;JSON字符串&amp;ldquo;，正因为遵守了这样的规则才使得JSON编码能够跨语言传递数据了。&lt;/p&gt;&lt;p&gt;（2）客户端JSON编码和解码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从json.org网页中下载的&amp;rdquo;json.js&amp;rdquo;文件,然后在客户端引用此文件，就可以在写JS函数的时候调用里面的函数了。和服务器端的&amp;rdquo;JSON.CS&amp;rdquo;相对应的，&lt;a name="OLE_LINK23"&gt;它里面虽然代码众多，但是供外界调用的也只有两个函数――一个编码函数一个解码函数：&lt;/a&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="568" valign="top"&gt;&lt;p&gt;JSON.stringify(value, replacer, space);//后面两个参数是可选项&lt;/p&gt;&lt;p&gt;JSON.parse(text, reviver);//后面的参数是可选项&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; json是JavaScript里面的一种数据格式，其地位相当于C语言中的结构体一样，是一个数据集合，用户可以通过&amp;ldquo;结构体&amp;ldquo;的点运算符直接对里面的数据进行提取和引用。&lt;/p&gt;&lt;p&gt;（3）中文字符串的编码和解码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 服务器端&amp;ldquo;JSON.CS&amp;ldquo;中编码函数对中文有比较好的支持，可以直接将中文编码成Unicode的编码，在程序运行期间查看这些中文字符串的时候，看不到中文，但是可以看到其对应的数字编码，经过客户端的JavaScript解码函数解码后得到的json对象可以直接被识别这样的Unicode，并直接以中文呈现在页面中的。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户端&amp;ldquo;json.js&amp;ldquo;中对json object的中文编码则不那么&amp;ldquo;智能&amp;rdquo;了，需要另外处理才能够传递中文字符。 只需要对中文字符串进行一个escape()的JS方法转码后就可以了，在服务器端和escape()转码函数相对应的反转码函数为UrlDecode()。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 总述：&lt;/strong&gt;JSON是一种比较有潜力的网页编码格式，它具有良好的可读性（结构清晰）的移植性，对比下面XML来说其编码效率比较高――即用来表示格式的字符占整体字符数目的比例比XML字符串小多了，所以对于轻量级别的字符编码是很高效实用的，而且因为JSON格式本来就是一种JavaScript对象，所以对于客户端的JavaScript语言有着天然的亲和力，很适合传递JavaScript变量。JSON编码解码流程可参考下图：&lt;/p&gt;&lt;p&gt;&lt;a name="OLE_LINK32"&gt;&lt;/a&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446259115.gif"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image016" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446262363.gif" border="0" alt="clip_image016" width="513" height="291" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.8&lt;/strong&gt; JSON编码解码流程图&lt;/p&gt;&lt;p&gt;3 XML编码技术（重量级别）&lt;/p&gt;&lt;p&gt;（1）服务器端XML编码和解码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用.NET里面的System.Xml里面相关类可以很容易实现对XML字符串的编码和解码。关于XML的解码在.NET提供了一个XmlDocument类，并提供了大量操作XML文档节点和属性的接口函数，通过这个类，用户可以很方便实现节点定位从而实现XML文档的编码和解码。对于编码XML文档，还有一个更加容易的方法，用户直接将数据字符串和XML节点字符串相加就可以得到一个XML格式的字符串了（字符串累加法），然后就可以用于异步通讯传输了。&lt;/p&gt;&lt;p&gt;（2）客户端XML编码和解码&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户端利用JavaScrpt对数据进行XML编码的方法和客户端比较类似，也可以利用最 &amp;ldquo;字符串累加法&amp;rdquo;进行编码，解码也是在客户端用JavaScript构造一个XML文档对象，通过Xpath或者对节点进行遍历进行解码&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 总述：&lt;/strong&gt;网上的观点是XML是一种重量级别数据编码方式，它有很多优点，对中文字符串的编码和解码有比较好的支持，文档的结构性很好，不管是编码还是解码，过程都清晰明了。对比JSON来说，缺点也很显明，就是编码的效率不是太高，往往对一个字符进行编码就需要额外至少2个字符的标签来规定格式。但是对于性能要求不是太高的网页中，不管是轻量级别的应用还是重量级别的应用，开发人员都可以选择XML，因为它的编码和解码过程相比JSON要简单很多，而且不难发现HTML其实也是一种拥有特别标签的XML文档而已，所以XML和HTML文档有着天然的亲和性，很适合传递一些HTML页面内容。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446277804.gif"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="clip_image018" src="http://images.cnblogs.com/cnblogs_com/beer/201012/201012131446285197.gif" border="0" alt="clip_image018" width="503" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;图&lt;strong&gt;2.9&lt;/strong&gt; XML字符编码解码流程图&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153197"&gt;&lt;/a&gt;&lt;a name="_Toc263153138"&gt;&lt;/a&gt;&lt;strong&gt;2.5.4&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;非字符串内容的传递方法&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面说的都是对一些基本数据的传输，但有时候也会遇到一些其它内容要传输，比如文件，图片资源&amp;hellip;&amp;hellip;这是应用AJAX技术时无法避免的，所以有必要简要介绍下。&lt;/p&gt;&lt;p&gt;1 XML文件&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面介绍的数据编码技术，都是一些在内存中的操作，就是对一些临时变量的操作和运算，但有时候我们也需要对XML文件进行传送。一些不是经常变化的信息，如：网页异常记录日志，页面参数配置文件等等，平时都存放在服务器的硬盘中，在需要的时候再调用出来。和传输其它数据一样，对XML文件的异步传输出是从客户端的请求开始的，客户端请求XML文件有两种方式：一种是通过xmlHttpRequest去异步请求，另外一种是直接声明一个ActiveXObject然后下载服务器端的XML文件。&lt;/p&gt;&lt;p&gt;2 图片文件&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在网页中引用的图片一般分为两种图片：静态图片和动态图片。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 静态图片：&lt;/strong&gt;不会经常改变的图片文件。比如，电力系统对设备拍摄的照片，作为设备附加数据供用户查看，这种图片一般都只用于读取，不会进行改写，即某一个地址对应的图片永远不变。这种图片常常是直接存放在服务器的硬盘中，服务器只需要将图片资源的在硬盘中的地址发送给客户端，再由客户端对资源地址进行引用即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 动态图片：&lt;/strong&gt;根据不同请求而动态呈现的图片。比如，一般网页的验证码图片和本系统中的统计图片，这些图片虽然对应的资源链接是一样，但是却会根据不同时刻的请求，或者客户端提交不同的数据而呈现出不同的样子。这些图片因为涉及到频繁的改写，所以最好存放在内存中。内存图片一般是通过一个单独的页面来输出图片流来实现，这个图片流页面可以根据每次客户端请求的不同数据来生成不同的图片流，客户端可以直接将此页面链接看成一个图片资源地址来引用，客户端只需要向服务器发送一次请求告知服务器在内存中改变图片流，那么客户端的图片控件也能得到相应动态更新。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 注意：&lt;/strong&gt;不管是传送动态图片还是静态图片，如果图片的资源地址相同，但图片内容不同时，在图片地址后面一定要加入一随机数，否则在异步通讯情况下，客户端将无法做到&amp;ldquo;无刷新&amp;rdquo;更新图片内容，客户端将永远只显示上一次下载到本地缓存中的图片资源。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 总述：&lt;/strong&gt;不管是哪种编码访求，因为数据编码和解码是一个比较实际的一个问题，所以遇到具体的问题还需要开发人员自己多去查阅相关资料采取具体的解决方案。&lt;/p&gt;&lt;p&gt;&lt;a name="_Toc263153198"&gt;&lt;/a&gt;&lt;a name="_Toc263153139"&gt;&lt;/a&gt;&lt;strong&gt;2.5.5&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;strong&gt;客户端JS框架介绍&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; JavaScript对数据进行解码后，然后数据就要各司其责，开始分发到浏览器上的各个控件上去进行显示。此时就需要JavaScript来动态控制浏览器客户端的显示内容了，JavaScript通过DIV+CSS来动态改变网页的外观显示，通过DOM文档对象模型来改变更新页面中的数据内容。&lt;/p&gt;&lt;p&gt;在进行Web应用程序开发时，服务器只作数据计算和数据传送，而不对客户端元素进行任何操作，客户端则请求和接收数据，并负责数据的展示。服务器端和客户端两种语言，各司其责，互不干涉。要做出动态性很好的客户端页面，就需要熟练掌握JavaScrpit的应用，因为JavaScript是一种解释性语言，所以个人进行大规模开发是很难的，但是现在网上有大量的客户端JS框架来供大家使用，很多都是开源的，这大大降低了客户端编程的门槛。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 目前一些流行的JavaScritp框架有：EXTJS，&lt;a name="OLE_LINK26"&gt;ACTIVEWIDGETS&lt;/a&gt;，DOJO，jQuery，YUI等等，而且其官网上都有具体应用和介绍方便开发人员查看。由于本次毕业设计时间有限，所以就没有对此进行更深入研究了。本次毕业设计客户端程序也只对ACTIVEWIDGETS框架进行了一些最简单的应用，例如：&amp;ldquo;设备统计&amp;rdquo;页面中客户端表格和客户端选项卡效果都采用的是ACTIVEWIDGETS框架的控件，从而达到了比较好的客户端体验效果。&lt;/p&gt;&lt;p&gt;&lt;em&gt;------------------------------------------------------------------&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Author:&lt;a href="http://www.cnblogs.com/beer"&gt;一点一滴的Beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Email /Gtalk:dreamzsm@gmail.com&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;From:&lt;a href="http://www.cnblogs.com/beer"&gt;http://www.cnblogs.com/beer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Notes:&lt;/em&gt;&lt;em&gt;欢迎转贴，但请在页面中加个链接注明出处&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/beer/aggbug/1904487.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/beer/archive/2010/12/13/1904487.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
