WIFI遥控小车论文报告_第1页
WIFI遥控小车论文报告_第2页
WIFI遥控小车论文报告_第3页
WIFI遥控小车论文报告_第4页
WIFI遥控小车论文报告_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中国地质大学(武汉)大学生 科研立项报告项目名称 基于手机WIFI技术的遥控小车 项目负责人 所在学院 机械与电子信息学院 参加人员 联系 指导老师 中国地质大学(武汉)机电学院 二一二年十月目 录引言21设计任务及要求3 1.1 设计任务与要求3 HYPERLINK l _Toc30791 1.2 设计时要考虑的问题 PAGEREF _Toc30791 3 2系统总体设计4 HYPERLINK l _Toc20267 2.1 方案论证 PAGEREF _Toc20267 42. 2总体框图53 系统硬件设计63.1 手机端设计6手机选择6手机端软件开发环境7小型路由器选择73.3 单片机电路

2、7单片机选择8晶振选择10软件设计123.4 显示系统13电机驱动模块153.6 电机153.7电源设计154 结束语20附录附录1 部分电路原理图22附录2 液晶驱动程序23附录3 电机驱动程序25附录4 单片机主函数27附录5 手机端软件源代码27 引言: 智能手机现在已经全方位的进入了我们的生活,说到智能手机不得不提及他们操作系统的龙头的Android。由于安卓操作系统的实际性和可操作性使得安卓迅速成为现在主流操作系统的原因,此外安卓的最大优点是开源,这样对于安卓软件的开发就没有了限制,使得用户可以用到广泛的免费软件,这样安卓软件的开发就有了空前的市场,安卓开发迎来了一轮热潮。因为系统的

3、开源性与可操作性,同时系统的流畅性以及大量的亲民化的可选择的设备,使得安卓系统在智能手机市场上占了头把交椅。根据市场研究机构ComScore发布的最新调查显示,Android智能手机在美国的优势进一步扩大,市场份额达到43.7%,因此我们小组的基于安卓手机wifi技术的遥控小车有着广大的潜在用户,2011年11月数据,Android占据中国智能手机操作系统市场58%,其应用领域和市场份额也在急速向平板电脑、消费电子、智能家电领域扩张。目前基于Android手机和WIFI技术开发的娱乐软件较多,而控制机电产品的软件和专利相对较少。我们小组设计的“基于手机WIFI技术的遥控小车”将是以手机作为手持

4、终端,通过WIFI传输指令的新型玩具小车,由于遥控器是手机,因此携带极其方便。基于WIFI的控制系统不仅可以控制小车,稍做改动就可用来控制电脑、家用电器甚至探测、排爆机器人等,同时也可用于地质检测设备的手持终端。因此,该项目的成果将不仅仅局限于一个遥控小车,更具有价值的是手机远程控制系统。1 设计任务及要求1.1 设计任务与设计要求 本课题要求利用基于Android(安卓)手机系统开发一个控制软件,该软件将实现用WIFI技术对玩具小车进行遥控控制,包括小车前进、后退、转弯等功能。(1)实现手机与小车WIFI连接;(2)能够通过手机对小车进行实时控制。 设计时要考虑的问题a、由于该课题的小车端是

5、通过单片机串口通信接收收手机是控制指令,因此需要对单片机定时器初值进行设置,若采用常用12M晶振,初值不一定是整数,通信时便会产生积累误差,进而产生波特率误差,影响通信的同步性。采用11.0592M晶振可以得到非常准确的数值,因此在制作过程中最好采用11.0592M或其整数倍的晶振。 我们采用的波特率为4800。b、小车电机启动时电流较大,可能会将电源的电压瞬间拉低,导致单片机和路由器不能正常工作,因此必须设计一个可靠的供电系统。c、由于Android系统所有源代码都已公开并且可以免费使用,各手机公司在开发自己产品时可以随意改动代码,进而在市场上出现了所谓的“基于Android的改良系统”手机

6、,这些手机对安卓手机软件兼容性有所差异,因此必须选择“安卓原版”的手机开发软件,我们采用了“”版本的操作系统。d、由于单片机IO口电流为mA级,无法直接驱动电机,必须设计专门的电机驱动模块。2 系统总体设计2.1 方案论证要实现手机通过WIFI控制小车,有两种方案可以实现:方案一:通过SIM卡来实现。系统框图如下图所示:手机端发送控制指令 手机用户WIFI服务器小车端SIM卡接收指令 转化为串口指令小车响应控制小车端单片机接收指令方案二:通过小型路由器来实现。该方案是在小车端安装一个小型路由器,是小车周围一定范围具有WIFI覆盖,然后将手机连接到路由器IP地址,对其发送指令,路由器接收指令后对

7、单片机串口发送数据指令,实现控制。系统框图如下:小车端路由器收指令手机端发送控制指令 小车响应控制小车端路由器收指令 转化为串口指令通过比较以上两种方案。方案一虽然可以实现小车超远程控制,但开发成本较高,相对于大一学生来说技术难度较大,而且控制过程要消耗上网流量。而方案二则相对简单,开发难度较低,适合制作玩具小车,因此我们选择了方案二。2.2 总体设计框图电机电机驱动模块1602显示单片机手机小型路由器 遥控小车系统总框图如下所示 串口通信3 系统硬件设计系统的硬件框图如图所示,包括六个部分组成。下面将分别介绍该六个单元。3.1 手机端设计手机选择由于安卓系统的极速发展,现在安卓智能机的价格已

8、经能降到600元以下,基于安卓的应用软件层出不穷。由于安卓系统所有源代码都已公开并且可以免费使用,各手机公司在开发自己产品时可以随意改动代码,进而在市场上出现了所谓的“基于Android的改良系统”手机,源代码的改动会影响手机对安卓软件的兼容性,增大开发难度,因此必须选择“安卓原版”的手机开发软件,我们采用了“”版本的操作系统。手机端软件开发环境Google公司提供的Android SDK中包括模拟硬件设备的Emulator,资源打包工具,调试监视服务,DX工具等。Android应用程序使用Java语言编写,而使用Java必须有JDK,需要下载和安装JDK,如IBM公司的Eclipse平台。可

9、以使用AVD在电脑上模拟一个虚拟的真实设备,可以由用户自己配置硬件配置,版本的选择,设备的屏幕尺寸大小等。通过Eclipse插件ADT便可以方便的创建一个Android应用。小型路由器选择目前,专门用于制作WIFI小车的小型无线路由器可以再淘宝网上买到,已经刷有OP系统,安装好摄像头的驱动程序,安装路由与单片机通信的数据包,同时还带有上位机调试软件。此外还带有相应的开发例程,方便用户使用,使用时只要参考他的例程编写单片机程序即可。 3.3 单片机电路单片机选择在这里,单片机要实现对电机驱动模块的控制,同时还要有路由器进行串口通信,为了能够控制电机转速,可以使用单片机的定时器来实现,利用单片机定

10、时器功能控制IO口产生PWM波,通过调节占空比里调节电机转速。考虑到单片机要实现以上功能,选择使用STC89C52来构成电路。STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash HYPERLINK :/baike.baidu /view/87697.htm存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,HYPERLINK :/baike.baidu /view/1313309

11、.htm看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 HYPERLINK :/baike.baidu /view/281961.htm定时器/计数器,一个6向量2级中断结构,全双工HYPERLINK :/baike.baidu /view/1060187.htm串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种HYPERLINK :/baike.baidu /view/37.htm软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,HYPERLINK :

12、/baike.baidu /view/1012.htm单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。 此外,STC89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。该单片机主要特性: 8031 CPU与MCS-51 兼容 8K字节可编程FLASH存储器(寿命:1000写/擦循环) 全静态工作:0H

13、z-24KHz 三级程序存储器保密锁定 128*8位内部RAM 32条可编程I/O线 两个16位定时器/计数器 6个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路单片机TXRX与路由器相连,P1.0P1.5与电机驱动模块相连。单片机的P3.4,P口接到液晶屏的控制端,P1口接到液晶屏数据口。设置定时/计数器0工作方式为16位计数器,并对中断做出定义。其电路如下所示:晶振选择由于该课题的小车端是通过单片机串口通信接收收手机是控制指令,因此需要对单片机定时器初值进行设置,若采用常用12M晶振,初值不一定是整数,通信时便会产生积累误差,进而产生波特率误差,影响通信的同步性。采用

14、11.0592M晶振可以得到非常准确的数值,因此在制作过程中最好采用11.0592M或其整数倍的晶振。软件设计 单片机应用系统设计与一般电子系统设计的差别在于,它既要构成硬件逻辑电路,也要设计相应的支持软件。Keil C51是美国Keil Software 公司出品的51系列兼容单片机C语言软件开发系统,该系统全WINDOWS界面且库函数丰富,调试功能强大、生成代码率很高。 本程序的主要思路是,利用单片机的计数器计时,控制IO口产生PWM波用于控制电机转速。利用P0口控制1602液晶显示。其控制流程大致如下如所示: 开始是否连接到 上位机系统初 始 化否 是是否接受到 串口指令 进入控 制模式

15、 否 结束 响应 控制 是3.4 显示系统显示系统既可以选择使用LED,也可以选择使用LCD。就本系统的功能来说,使用LED已经可以实现功能,不过考虑到使用LCD,可以输出英文字符,从而使得显示系统能够更加美观,同时也能更好的达到提高自己的目的,所以最后选择使用液晶屏LCD。由于本次设计所要显示的内容不多,并不需要太大的液晶屏来显示。所以选择使用1602来进行显示。1602液晶每次可以显示2行16个字符,总共32个字符,而且可以显示所有的ASCII码,包括标点,数字,英文大小写等,因此,使用该液晶屏可以很好的实现显示功能。1602显示屏的主要技术指标如表3.4所示。表3.4 1602液晶显示屏

16、的主要技术指标LCD1620显示容量:16X2个字符芯片工作电压:工作电流:2.0mA(5V)最佳工作电压:5V字符尺寸:2.95X4.35(WXH)mm1602液晶显示屏共有16个引脚,其各个引脚的功能如下表,表3.5中所示。表3.5 1602液晶显示屏的各个引脚功能编号符号引脚说明编号符号引脚说明1VSS电源地9D2DATAI/O2VDD电源正极10D3DATAI/O3VL液晶显示偏压信号11D4DATAI/O4RS数据命令选择端(H/L)12D5DATAI/O5R/W读写数据端(H/L)13D6DATAI/O6E使能信号14D7DATAI/O7D0DATAI/O15BLA背光源正极8D1

17、DATAI/O16BLK背光源负极使用1602,所设计的显示电路部分如下图所示:电机驱动模块 由于小车底盘电机额定电压为12V,度电机驱动模块选择了常用12V电机驱动芯片L298N。L298N恒压恒流桥式2A驱动芯片,L298N可接受标准TTL逻辑电平信号VSS,VSS可接457 V电压。4脚VS接电源电压,VS电压范围VIH为2546 V。输出电流可达25 A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动。3.6 电机12V 138rpm直流电机3.7电源设计 小

18、车电机启动时电流较大,可能会将电源的电压瞬间拉低,导致单片机和路由器不能正常工作,因此必须设计一个可靠的供电系统。解决该问题常用以下三种方法:、选用性能更好的的电源:、采用独立电源供电,即使用两个电源分别给单片机和电机供电;、在电源附近并联一个较大值的电容,当电机启动时,电流较大,电容中的电可以补偿一部分电流,保证电压不至于太低。以上三种方案中,方案1)成本过高,方案2)电路繁琐,均不适合小型设备的应用,所以我们选择了方案3)。 4 结束语该项目的独特创新之处在于小车的控制是通过手机来实现,而不是遥控手柄或电脑,从而使用更加方便,实现用WIFI技术对玩具小车进行遥控控制,包括小车前进、后退、转

19、弯等功能。该项目开发的Android软件和基于WIFI的控制系统不仅可以控制小车,稍做改动就可用来控制电脑、家用电器甚至探测、排爆机器人等,同时也可用于地质检测设备的手持终端。因此,该项目的成果将不仅仅局限于一个遥控小车,更具有价值的是手机远程控制系统。如今国外的几家公司推出了基于苹果手机控制航模和玩具赛车的产品。目前基于Android手机和WIFI技术开发的娱乐软件较多,而控制机电产品的软件和专利相对较少。 2011年11月数据,Android占据中国智能手机操作系统市场58%,其应用领域和市场份额也在急速向平板电脑、消费电子、智能家电领域扩张。WIFI具有较强的数据传输能力,普通智能手机完

20、全能达到1M/S以上的速度。因此,今后在此方面的的研究一定会大大增加,具有很好的实用价值。参考文献4(美)昊斯特曼 著,叶乃文,邝劲筠,杜永萍译 java核心技术卷1-基础知识 附 录附录1 部分电路原理图 1602液晶显示 单片机最想系统 电机驱动模块 电源模块附录2 液晶驱动程序#define uchar unsigned char#define uint unsigned intsbit lcden=P34;sbit lcdrs=P35;sbit wela=P27;sbit dula=P26;uint num;uchar code table1=I AM WIFI CAR;uchar c

21、ode table2=RX 00 00 0;void init();void delay(z);void write_com(com);void write_date(date);void write_com(uchar com)lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void lcd_init()char num;wela=0;dula=0;lcden=0;write_com(0 x38);write_com(0 x0e);write_com(0 x06);write_com(0 x01);write_com(0 x80);for(n

22、um=0;num13;num+)write_date(table1num);delay(5);write_com(0 x80+0 x40);for(num=0;num0;x-)for(y=110;y0;y-);void print(uchar add,uchar date)write_com(0 x80+0 x40+add);write_date(date); 附录3 电机驱动程序#defineuchar unsigned char#defineuint unsigned int/* L298N */sbit LEFT_IN1 =P13; /左边电机sbitLEFT_EN =P14;sbitL

23、EFT_IN2 =P15; sbit RIGHT_IN1 =P10; /右边电机sbitRIGHT_EN =P11;sbitRIGHT_IN2 =P12;/*PWM定义产生*/#define PWM_PERIOD 100uchar PWM_COUNTER = 0; /pwm产生周期 100*100usuchar LEFT_PWM_DUTY = 50; /左边电机占空比uchar RIGHT_PWM_DUTY = 50; /右边电机占空比/*延时 10us 级*/void Delay_10Us(uint us)while( us- );/*延时 ms 级*/void DelayMs(uint m

24、s)unsigned int i,j;for( i = 0; i 0; j -);/* 内部资源初始化*/void motor_init()TMOD = 0 x22; /设定T1的工作模式为1:16bit计数模式,设定T0的工作模式为2:8bit重装初值模式TH0 = 0 x9c; /100us定时 28-100=156=9cHTL0 = 0 x9c;IP = 0 x03;/ 中断优先级:定时器0,外部中断0优先EA = 1; / 开总中断 EX1 = 1;/ 打开外部中断1ET0 = 1; / 定时器0允许中断 TR0 = 1; / 启动定时器0 /*定时器0中断服务函数*函数功能: 输出P

25、WM波*/void Timer0(void) interrupt1 PWM_COUNTER +;if(PWM_COUNTER LEFT_PWM_DUTY) LEFT_EN = 0;if(PWM_COUNTER RIGHT_PWM_DUTY) RIGHT_EN = 0;else PWM_COUNTER = 0;LEFT_EN = 1;RIGHT_EN = 1;/*前进*/void GoHead(uchar speed_left,uchar speed_right)LEFT_IN1 = 1;LEFT_IN2 = 0;RIGHT_IN1 =1;RIGHT_IN2 =0;LEFT_PWM_DUTY =

26、 speed_left;RIGHT_PWM_DUTY = speed_right;/走直线占空比校正/*后退*/void GoBack(uchar speed_left,uchar speed_right)LEFT_IN1 = 0;LEFT_IN2 =1;RIGHT_IN1 =0;RIGHT_IN2 =1;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直线占空比校正/*左正右反-右转*/void GoLeft(uchar speed_left,uchar speed_right)LEFT_IN1 = 0;LEFT_IN2 =

27、1;RIGHT_IN1 =1;RIGHT_IN2 =0;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直线占空比校正/*右正左反-左转*/void GoRight(uchar speed_left,uchar speed_right)LEFT_IN1 = 1;LEFT_IN2 =0;RIGHT_IN1 =0;RIGHT_IN2 =1;LEFT_PWM_DUTY = speed_left;RIGHT_PWM_DUTY = speed_right;/走直线占空比校正附录4 单片机主函数/Wifi 智能小车 第二版#include

28、 /包含STC52系列单片机的头文件#includemotor.h#includeLCD_1602.hsbit KEY1=P36;sbit KEY2=P37;#define sensor_IROA P3/跟上面定义一样,取P33-P35unsigned int PWM_G1=33;/初始化中心值unsigned int PWM_G2=33;/unsigned char R_date3=0;unsigned char RBuff_date4=0;unsigned char pattern=0;/0:stop 1:startunsigned char flag_phone=0;/用于手机控制标记u

29、nsigned char check_phone=0;unsigned char flag_PC=0;unsigned char sen_inp_IROA()unsigned IROA_date;IROA_date=sensor_IROA;IROA_date=IROA_date;IROA_date &=0 x38;IROA_date=3;return(IROA_date);void init_system()unsigned int i;GoHead(0,0);for(i=0;i3;i+)R_datei=0;RBuff_datei=0;void init_uart()/4800 波特率TH1=

30、0XFA;TL1=0XFA;TR1=1;REN=1; SM0=0;SM1=1;EA=1;ES=1;void SCI_TX(unsigned char date)SBUF=date;while(!TI);TI=0;void uart(void) interrupt 4if(RI)RI=0;/add your code here.if(flag_phone=0)check_phone= RBuff_date0;RBuff_date0= RBuff_date1;RBuff_date1= RBuff_date2;RBuff_date2=SBUF;/判断是否是手机连接if(check_phone=0 x

31、44 & RBuff_date0=0 x44 & RBuff_date1=0 x31 & RBuff_date2=0 x0a)flag_phone=1;pattern=1;/print(0 x03,A); /PC控制if(RBuff_date0=0 x3C & RBuff_date1=0 x31 & RBuff_date2=0 x3E)pattern=2;/print(0 x4f,2);/beed_ctrl(500,4);if(RBuff_date0=0 x3C & RBuff_date1=0 x30 & RBuff_date2=0 x3E)pattern=1;/print(0 x4f,1);

32、if(RBuff_date0=0 x7B & RBuff_date1=0 x31 & RBuff_date2=0 x7D)pattern=1;/print(0 x4f,1);/print(0 xe3, );else if(RBuff_date0=0 x7B & RBuff_date1=0 x30 & RBuff_date2=0 x7D)pattern=0;/print(0 x4f,0);init_system();else if( RBuff_date0=0 x50 & RBuff_date2=0 x00 )GoBack(10,10); elseR_date0=RBuff_date0;R_da

33、te1=RBuff_date1;R_date2=RBuff_date2;elseRBuff_date0= RBuff_date1;RBuff_date1= RBuff_date2;RBuff_date2= RBuff_date3;RBuff_date3=SBUF;R_date0=RBuff_date0;R_date1=RBuff_date1;R_date2=RBuff_date2;elseTI=0;main(void)init_uart();init_system();while(1)lcd_init(); SCI_TX(0 x55);/发送“0 x55“SCI_TX(0 xf0); /发送“

34、0 xf0“if(pattern=1) switch(R_date0)case 0 x44:switch(R_date1)case 0 x4c:switch(R_date2)case 0 x31: GoHead(20,20); break;case 0 x32: GoHead(20,90); break;case 0 x33: GoHead(90,20); break;default:break;break;case 0 x44:switch(R_date2)case 0 x31: GoLeft(30,30); break;case 0 x32: GoLeft(30,0); break;cas

35、e 0 x33: GoLeft(0,30); break;default:break; break;case 0 x52:switch(R_date2)case 0 x31: GoRight(30,30); break;case 0 x32: GoRight(30,0); break;case 0 x33: GoRight(0,30); break;default:break; break;default:break;break;case 0 x46:switch(R_date1)case 0 x4c:switch(R_date2)case 0 x31: break;/控制前车灯case 0

36、x32: break;case 0 x33: break;/控制车前灯case 0 x34: break;default:break;break;default:break;break;default:break;else;附录5 手机端软件源代码Java源码import . URLConnection; /引用java中net包中的所有类import .MalformedURLException;import .URL;import java.io.*; /引用java中io包中所有的类import android.app.Activity; /创建Android应用的Activity类im

37、port android.graphics.Bitmap; /导入Android中的资源文件 import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget

38、.TextView;import java.io.InputStream; public class wificar extends Activity /创建wificar应用Activity类 /* Called when the activity is first created. */ EditText edAlias,edIP,edPort,edUser,edPW; TextView t; Button button1; URL videoUrl; private URLConnection conn; Bitmap bmp; public static String CameraIp

39、; private Handler mHandler ; private ImageView iv; MySurfaceView r; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); edIP=(EditText)findViewById(R.id.editIP); edPort=(EditText)findViewById(R.id.editPort); button1=(Button)find

40、ViewById(R.id.button1); edIP.setText( :/:8080/?action=snapshot); CameraIp =edIP.getText().toString(); button1.setOnClickListener(new Button.OnClickListener() public void onClick(View v) r=new MySurfaceView(wificar .this); setContentView(r); r.GetCameraIP(CameraIp); /通过路由得到图片,然后不断刷新从而得到视频

41、); Mysurface 类代码import java.io.InputStream; /引用java包中的所有类import . URLConnection;import .MalformedURLException;import .URL;import android.view.SurfaceHolder.Callback;import android.content.Context; import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas; im

42、port android.graphics.Color;import android.graphics.Paint; import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.animation.Animation;public class MySurfaceView extends SurfaceView implements Callback, Runnable private SurfaceHolder sfh; private Thread th; private Canv

43、as canvas; private Paint paint; private int ScreenW, ScreenH; URL videoUrl; private String url; URLConnection conn; Bitmap bmp; public MySurfaceView(Context context) /窗口程序的显示 super(context); th = new Thread(this); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setAntiAlias

44、(true); paint.setColor(Color.RED); this.setKeepScreenOn(true); /保持屏幕常亮 Override public void startAnimation(Animation animation) super.startAnimation(animation); public void surfaceCreated(SurfaceHolder holder) /获取窗口程序的长宽 ScreenW = this.getWidth(); ScreenH = this.getHeight(); th.start(); private void

45、 draw() /获得图片或者颜色资源 try InputStream inputstream; inputstream = null; videoUrl=new URL(url); conn = ( URLConnection)videoUrl.openConnection(); conn.setDoInput(true); conn.connect(); inputstream = conn.getInputStream(); bmp = BitmapFactory.decodeStream(inputstream); canvas = sfh.lockCanvas(); canvas.d

46、rawColor(Color.WHITE); canvas.drawBitmap(bmp, 0, 0, paint); sfh.unlockCanvasAndPost(canvas); conn.disconnect(); catch (Exception ex) finally /if (canvas != null) /sfh.unlockCanvasAndPost(canvas); public void run() while (true) draw(); public void surfaceChanged(SurfaceHolder holder, int format, int

47、width, int height) public void surfaceDestroyed(SurfaceHolder holder) public void GetCameraIP(String p)url=p; /用于在窗口上面显示视频布局代码: /窗口各个组件的布局显示 Xml 资源使用 /版本与编码的声明 /manifest指定命名空间,包名称,版本信息 /获得用户许可,以获得连接网络,使用网络的权限 /属性表明名字引用,action表明该Activity是程序的入口 手机端控制命令java代码import java.io.BufferedReader;import java.io

48、.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .InetAddress;import .NetworkInterface;import .ServerSocket;import .Socket;import .SocketAddress;import .SocketException;import java.util.Enumeration;import android.app.Activity; import android.content.Context;import andr

49、oid.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.StrictMode;import android.text.method.ScrollingMovementMethod;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;impor

50、t android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class wificar extends Activity /创建wificar Activity 类 private Button startButton;private EditText IPText;private Button ForWard;private Button BackWard;private Button Stop;private Button TurnLeft;private Butto

51、n TurnRight;private TextView recvText;private Context mContext;private boolean isConnecting = false;private Thread mThreadClient = null;private Socket mSocketClient = null;static BufferedReader mBufferedReaderServer= null;static PrintWriter mPrintWriterServer = null;static BufferedReader mBufferedRe

52、aderClient= null;static PrintWriter mPrintWriterClient = null;private String recvMessageClient = ;private String recvMessageServer = ; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; StrictMode.setThreadPoli

53、cy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build(); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .penaltyLog() .penaltyDeath() .build(); IPText= (EditText)findViewById(R.id.IPText); /IPText

54、.setText(5:); IPText.setText(00); startButton= (Button)findViewById(R.id.StartConnect); startButton.setOnClickListener(StartClickListener); ForWard= (Button)findViewById(R.id.ForWard); ForWard.setOnClickListener(ForWardClickListener); Stop= (Button)findViewById(R.id.Stop); Stop.se

55、tOnClickListener(StopClickListener); TurnLeft= (Button)findViewById(R.id.TurnLeft); TurnLeft.setOnClickListener(TurnLeftClickListener); TurnRight= (Button)findViewById(R.id.TurnRight); TurnRight.setOnClickListener(TurnRightClickListener); BackWard= (Button)findViewById(R.id.BackWard); BackWard.setOn

56、ClickListener(BackWardClickListener); recvText= (TextView)findViewById(R.id.RecvText); recvText.setMovementMethod(ScrollingMovementMethod.getInstance(); private OnClickListener StartClickListener = new OnClickListener() Overridepublic void onClick(View arg0) if (isConnecting) isConnecting = false;tr

57、y if(mSocketClient!=null)mSocketClient.close();mSocketClient = null;mPrintWriterClient.close();mPrintWriterClient = null; catch (IOException e) e.printStackTrace();mThreadCerrupt();startButton.setText(开始连接);IPText.setEnabled(true);recvText.setText(ok:n);elseisConnecting = true;startButton.s

58、etText(停止连接);IPText.setEnabled(false);mThreadClient = new Thread(mRunnable);mThreadClient.start();private OnClickListener ForWardClickListener = new OnClickListener() Overridepublic void onClick(View arg0) / TODO Auto-generated method stubif ( isConnecting & mSocketClient!=null) String PWM1 =PWM 1 1

59、00 50;String PWM2 =PWM 2 100 50;String OUTPUT =OUTPUT 0;try mPrintWriterClient.print(PWM1);/发送PWM1信息给路由 mPrintWriterClient.flush(); mPrintWriterClient.print(PWM2);/发送PWM2信息给路由 mPrintWriterClient.flush(); Thread.sleep(600); mPrintWriterClient.print(OUTPUT);/发送方向给路由 mPrintWriterClient.flush();catch (E

60、xception e) / TODO: handle exceptionToast.makeText(mContext, 发送异常: + e.getMessage(), Toast.LENGTH_SHORT).show();elseToast.makeText(mContext, 没有连接, Toast.LENGTH_SHORT).show();private OnClickListener StopClickListener = new OnClickListener() Overridepublic void onClick(View arg0) / TODO Auto-generated

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论