资源描述
计算机应用与软件
Computer Applications and Software
基于Android的Socket(TCP/IP)在LED灯光控制系统中的应用
孙 剑,董 超,夏继媛
(深圳职业技术学院 电子与通信工程学院,广东 深圳 518055)
摘 要 论文中采用了Socket的通信方法,根据TCP/IP通信协议进行数据传输,基于Android操作系统平台,通过ZigBee无线通信与自组网技术,设计了以Android操作系统为平台的客户端应用程序,实现了通过无线wifi网络与Windows系统的电脑服务器之间进行通信,解决了如何利用基于Android系统的手持终端对ZigBee无线网络中的LED灯光进行远程调控的问题,提出并实现了一种新的LED灯的智能控制方案。
关键词 socket tcp/ip android zigbee 灯光调控
中图分类号 TP3 文献标识码 A
THE APPLICATION BASED ON THE ANDROID SOCKET (TCP/IP) IN THE LED LIGHTING CONTROL SYSTEM
Sun Jian , Dong Chao , Xia Jiyuan
(Electronic and communication engineering institute, Shenzhen Polytechnic, Shenzhen 518055, Guangdong province,China)
Abstract This paper used the Socket communication method, according to the TCP/IP communication protocols for data transmission, based on the Android platform, through the ZigBee wireless communication technology and the ad hoc network technology, design the android platform of the client application, realize the wifi network and server through wireless communication between, solve how to use the android system with terminal to the network to control the light in the ZigBee network. Proposed and implemented a new LED lamp intelligent control scheme.
Keywords socket tcp/ip android zigbee lighting control
1 引言
我国照明用电占总发电量的12%,而对照明时间长,照明场所多的学校、办公室、商场、街道等地点的照明灯具多为白炽灯、荧光灯和节能灯,照明耗电严重。LED被认为是21世纪的照明光源。LED发光器是冷光源,光效高,工作电压滴,而且能耗低,使用寿命长。用LED替代白炽灯或荧光灯,环保无污染,使用安全可靠,便于维护。
目前,公共建筑的照明灯具控制大多采用原始手动开关,不能连续调剂,有些地方不论有人或者无人,白天或者黑天都,灯都是持续点亮的,这样就造成了大量的能源浪费和使用上的不便,而且会缩短灯具的使用寿命。
设计一套LED灯光控制系统,可以根据工作环境的改变等来远程控制灯光的开关和亮暗程度,提高用电效率,从而节约电能和缓解了用电高峰的电力供应压力双重作用。
同时,增加灯具的控制终端种类,更能即时、方便的控制灯光,而且,自从Android操作系统的问世,它的开源、开放等诸多好处和Google公司的大力支持,使得越来越多的手机和平板厂商都使用Android系统作为其设备的操作系统。从当前的发展趋势看来,实现将控制程序移植到Android手机和平板电脑等移动终端上,达到远程控制灯光的目的,将会对LED灯的推广起到积极的推动作用。
孙剑:基于Android的Socket(TCP/IP)在LED灯光控制系统中的应用
2 Android系统简介
Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。
目前国际市场上,移动互联列终端基于的平台主要有:Symbian、Windows Mobile、iPhone IOS、Black Barry IOS,这四者与Android相比,Symbian缺乏创新、日落西山不可避免,Windows Mobile太昂贵,iPhone和Black Barry太封闭。Android的最大优势在于其开放性,自2007年11月推出后,Android得到了众多手机制造商、电信运营商、半导体公司和软件公司的大力支持。在移动智能终端支持方面,三星、摩托罗拉、HTC等国际一线厂商在2010年几乎倾倒性的发展Android,尤其摩托罗拉几乎将2010年发布的所有智能手机都预装Android平台,2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。此外,包括国外的三星和国内的联想等厂商已经开发并推出了一系列的以Android为操作系统的平板电脑,Android的应用范围正在进一步扩大。
早期的Android应用程序开发,通常通过Android SDK(Android软件开发包)下使用Java作为编程语言来开发应用程序,但通过不同的软件开发包,则使用的编程语言也不同。例如开发者可以通过Android NDK(Android Native开发包)使用C语言或者C++语言来作为编程语言开发应用程序。同时谷歌还推出了适合初学者编程使用的Simple语言,该语言类似微软公司的Visual Basic语言。此外,谷歌公司还推出了Google App Inventor开发工具,该开发工具可以快速地构建应用程序,方便新手开发者。不过,就目前的发展状况来看,SDK开发包的功能比较完善,所以大部分开发者都选择使用Java作为编程语言,而且考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源的占用。
3 Socket(TCP/IP)通信
3.1 Socket介绍
Socket在计算机网络中通常被成为“套接字”,用于描述IP地址和端口,是两台机器间通信的端点。应用程序通常通过“套接字”向网络发出请求或者答应网络请求。
以JDK1.7为例,Socket和ServerSocket类库都位于包中,ServerSocket用于服务器端,Socket是建立网络连接时使用的。ServerSocket端会有一个accept方法等待连接请求,当成功连接时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需要的对话,在这个网络连接里面,“套接字”是平等的,并不会因为在服务器端或是客户端而产生不同级别。
3.2 TCP/IP协议
TCP/IP是指一整套数据通信协议,其名字是由这些协议中的两个协议组成的,即传输控制协议(Transmission Control Protocol —TCP)和网间协议(Internet Protocol—IP)。虽然还有很多协议,但是TCP/IP显然是两个最重要的协议。
虽然TCP传输的效率不及UDP(User Datagram Protocol——无连接的协议),但是很多时候,对数据内容的正确性的检验是必需的,这样必然会相对更占用计算机的处理时间和网络带宽,不过,这样换来的是数据的可靠传输。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。如图1所示:
图1 TCP连接的正常建立
TCP 用一个校验和(Checksum)函数来检验数据是否有错误,在发送和接收时都要计算校验和。
3.3 开发一个Server-Client的程序
程序采用TCP/IP协议进行通信。
Server端(仅列举主要代码):
ServerSocket server;
server = new ServerSocket(int port);
上面的代码用于创建一个ServerSocket对象实例,int类型的port表示设定的通信端口,端口可以随意指定,但是由于1024以下的端口是保留端口,所以选择大于1024的端口。
Socket socket = server.accept();
在这一行代码中,accept方法用于产生一个“阻塞”,直到接受到一个正确的连接请求,连接成功并返回客户端一个Socket的对象实例。“阻塞”是一个术语,它使程序运行暂时“停留”在这个地方,直到一个网络对话产生,然后程序继续,这个“阻塞”通常是循环实现的,以达到持续监听对话请求的目的。如:while(true){
......
}
InputStream in = socket.getInputStream();
in.read();
OutputStream out =socket.getOutputStream();
out.write();
上面的代码中,getInputStream方法获得网络输入,并返回一个InputStream对象实例,getOutputStream方法连接的另一端获得输入,并返回一个OutputStream对象实例。
此外,上面代码的执行,需要在新启动的线程里面进行处理,这样才能保证Server端能够持续的接收Client端发送的数据,并且随时反馈数据,保证通信的可靠性。
如:new Thread(
new Runnable(){
......
}
).start;);
同时必须注意的是getInputStream方法和getOutputStream方法均可能会产生一个IOExpection,它必须被捕获,因为他们返回的流对象,通常会被另一个流对象使用。
如:try{
......
}catch(IOExpection e){
}
Client端(仅列举主要代码):
static Socket client;
client = new Socket(String site,int port);
在上面的代码中,字符串类型(String)的site是指服务器的IP地址,整数型(int)的port是指通信端口号,一旦IP地址和端口号都与服务器端匹配,客户端发送连接请求时就会被服务器端accept,正式建立对话。
OutputStream out =client.getOutputStream();
out.write();
InputStream in = client.getInputStream();
in.read();
上面代码的执行同样需要在一个新的线程里进行,也同样需要捕获IOException,理由均与Server端相同。
在服务器端(Server)和客户端(Client),分别创建OutputStream和InputStream的对象实例,便可以分别调用write方法和read方法进行通信对话。
4 系统设计
Android客户端
控制器
(Zigbee模块)
LED灯
控制器
(Zigbee模块)
Windows服务器
Zigbee网络
wifi 、socket
图2 系统通信流程
4.1 系统硬件设计
图2中的Zigbee模块组成Zigbee无线通信网络,在服务器端和LED灯都分别与Zigbee模块连接,与服务器连接的Zigbee模块是唯一的总控制终端,控制信号都是从这个模块上发出的,传给网络中的每个节点,与LED灯相连接的Zigbee模块就相当于组网中的节点,所以它并不是唯一的。
4.2 系统软件设计
软件设计主要有主界面设计,手动模式设计,自动模式设计。主界面的功能类似一个目录,可以从主界面中选择进入手动模式,进入自动模式,退出软件这三种功能,程序界面如图3所示。
图3主界面截图
4.2.1 手动模式
选择主界面中的手动模式,便可以手动调节LED灯光的亮度,如图4所示:
图4 手动模式截图
手动模式里面会显示出当前网络中的所有灯光场景分布,选定某一个场景时,就会显示出当前场景内分布了哪些LED灯,选择场景,就可以调节整个场景的亮度,并且会通知服务器对当前的设置进行保存,选择场景下面的单个LED灯,也可以分别调节场景内不同LED灯的亮暗。
4.2.2 自动模式
在自动模式中,将一天分成48个时段,可以分时段设置网络中全部LED灯的亮度,也可以设置某一个场景的亮度,只要选择开启自动模式功能,并将各个时段的亮度设置好,保存之后,设置便即时生效,如图5、图6所示。
图5 设置前自动模式
图6 设置后自动模式
4.3 设计公共通信类
创建一个客户端公共类Client,实现客户端与服务器的Socket(TCP/IP)通信,创建一个公共类,有利于代码的重复利用,提高编码的工作效率,也有利于将来对代码进行升级与维护。具体代码如下:
public class Client extends Thread{
static Socket client;
byte[] buf;
public Client(String site, int port){
//类函数,site为IP地址,port为端口号
try {
client = new Socket(site,port);
//创建客户端
}catch(UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}}
public void connectServer(){
//创建连接服务器方法
OutputStream out;
try{
out=client.getOutputStream();
byte[] b={0x1c,0x20,0x00,0x02,
0x0c,0x00,0x00,0x00,0x00,0x02,
0x00,0x00,0x00,0x1c};
//数组b为请求与服务器建立连接的数据
out.write(b);//发送数据
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMsg(byte[] msg){
//创建向服务器发数据msg的方法
try {
OutputStream out = client.getOutputStream(); byte[] buf1 = msg;
out.write(buf1);
out.flush();
}
catch (IOException e) {
e.printStackTrace();
}
}
public void getMsg(){
//创建接收服务器返回数据的方法
new Thread(
//利用独立线程持续监听服务器的返回情况
new Runnable(){
public void run() {
InputStream in;
while(true){
try{
in = client.getInputStream();
buf = new byte[2048];
in.read(buf);
//获取数据并存放到数组buf中 Thread.sleep(20); }
catch (IOException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}}}
}).start();
}
设计好公共类,便可以在手动模式和自动模式的通信实现中,分别创建公共类Client的对象实例,再分别调用Client中的connectServer,sendMsg,getMsg方法即可实现与服务器端的Socket通信。
4.4 系统测试
图7中可以看出,服务器端显示,已经接受了一个客户端请求的进程,同时也可以看出来客户端的IP地址为192.168.1.112,当服务器显示下图中的语句时,说明客户端已经成功连接到服务器端,后续的对话都是建立在这个基础之上的。
图7 服务器连接成功
4.4.1手动模式测试
图8 手动模式获取场景灯光数据
从图8中,能看出当前服务器端已有的场景的个数为5个,三次返回给客户端的数据长度分别为14、12和1028,单位为byte。第一次的数据是通知客户端成功建立了通信连接,第二次的数据是在客户端请求从服务器端获取场景数据之后,服务器做出“已收到正确请求指令”的回应,第三次的数据则是包含场景信息、灯光信息的数据。第二次和第三次返回数据的过程正是TCP通信过程,确保了通信的可靠性,当客户端收到第三次返回的数据之后,通过checksum位验证之后,也会返回给服务器反馈一帧数据,意为“已收到正确的数据”。
通过点击图4中的下拉框便可以改变亮度等级,通信成功时,服务器端如图9所示,意为“将第二个id对应的场景(对应图4中的‘场景一’)的亮度值调为40”。
图9 手动模式设定场景亮度
4.4.2 自动模式测试
自动模式中,不但要先进行获取场景信息的通信(与手动模式获取方式相同),还要获取各个时间段设置的参数(如亮度、场景分布等),获取自动模式参数的通信成功建立后,服务器端如图10所示。
图10 自动模式获取已设置数据
图11 自动模式更改设置
当设置完自动模式,打开自动调节开关点击保存,设置成功之后,服务器端如图11所示。
结 论
本文实现了一种基于Android平台的Socket(TCP/IP)通信,并成功的进行了与Windows端服务器的跨平台通信,实现了Android手持设备对灯光控制系统中LED灯的控制。此外,由于服务器端连续返回数据时存在时间间隔,所以在客户端读取数据时加入了线程等待,以确保与服务器端同步,收到准确的数据;而采用TCP的通信方式,更加大了通信过程的可靠性;同时考虑到通信过程中都会存在误码率的情况,对校验位Checksum进行验证,只响应正确的指令,也增加了系统的稳定性。通过这种可行性的设计,说明基于Android平台的程序设计不仅仅在娱乐、游戏方面有巨大的发展空间,在智能家居系统或者物联网的其他系统工程中同样可以广泛应用。
参 考 文 献
[1] 谭贞军.Java核心开发技术从入门到精通[M].北京:电子工业出版社.2009:289-320.
[2] 陈刚,陈智洁,宋泽源.Java开发入行真功夫[M].电子工业出版社,2009:347-375.
[3] 余志龙,陈昱勋,郑名杰,陈小凤,郭秩均.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2009:1-108.
[4] 勒岩,姚尚朗.Google Android开发入门与实践[M] .北京:人民邮电出版社,2010:1-124..
[5]KennethL.Calver&tMichaelJ.Donahoo.TCP/IP Sockets in Java[M].USA:MORGAN KAUFMANN PUBLISHERS.2007:10-8.
作者简介
第一作者简介:
姓名:孙剑,出生年月:1987年8月,性别:男,籍贯:北京市房山区,学历:工学硕士,单位:深圳职业技术学院,电子与通信工程学院,职务:联合培养研究生,研究方向:电子信息工程,Android与物联网应用,邮编:518055,联系电话:18620379597,E-mail:327688876@ 。
第二作者简介:
姓名:董超,出生年度:1987年,性别:女,学历:工学硕士,单位:深圳职业技术学院,电子与通信工程学院,职务:联合培养研究生,研究方向:Android与物联网应用。
第三作者简介:
姓名:夏继媛,性别:女,指导教师。
展开阅读全文