版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于蓝牙技术的考勤系统-蓝牙通信设计摘要作为当代大学生,上课的时候都避免不了老师的考勤,现在的考勤还是主要以老师点名为主。往往点完名后就已经占了课堂的小一部分时间,不仅仅低效,而且考勤很多同学可以帮别人顶替,所以漏洞很大。而在企业中,考勤主要是以指纹和扫描脸部为主,这样的考勤成本高,也浪费一定的社会资源,不利于推广。基于信息化的蓝牙考勤系统就应运而生,适应时代的发展。当一推出这蓝牙考勤方式时,就十分受高校的欢迎,毕竟能使上课时间多了很多也高效很多。遏制住学生代签到帮同学的行为,也不会因为考勤系统等烦杂事务影响教学管理。本设计是基于蓝牙技术的考勤系统创建一个能检测蓝牙并且完成签到的APP,蓝牙可以再一定的距离之内来检测学生或者员工有没有到指定的地方上课或者工作。该考勤系统只用到手机端的蓝牙,十分方便。原理是使用蓝牙的客户端BluetoothSocket和服务端BluetoothServerSocket两个功能,创建一个使用bluetoothadapter为主的蓝牙列表,这个APP系统能自动搜索蓝牙设备,这个APP还能登陆检查签到,并对事先做好的蓝牙设备地址数据库进行对比从而完成学生的考勤登记。所以基于蓝牙技术的考勤系统设计的意义很重大不仅能够减少考勤成本,还能是教学管理更为高效。关键词:蓝牙;bluetoothadapter;BluetoothSocket;BluetoothServerSocketAttendanceSystemBasedonBluetoothTechnology-BluetoothCommunicationDesignAbstractAsacontemporarycollegestudent,theattendanceofteacherscannotbeavoidedinclass,andtheattendanceisstillmainlybasedontheteacher'srollcall.Oftenaftertherollcallhastakenupasmallpartoftheclass,isnotonlyinefficient,butalsoattendancemanystudentscanhelpotherstoreplace,sobigflaws.Inenterprises,attendanceismainlybasedonfingerprintandfacescanning,whichcostsalotandwastessomesocialresources,whichisnotconducivetopromotion.Thebluetoothattendancesystembasedoninformationarisesatthehistoricmoment,thedevelopmentofTheTimes,andismoreandmorepopular.Becausetheschoolcanbringamoreefficientwaytodealwithattendance,teachingmanagementcanbecarriedoutsmoothly,sothatstudentswillnothaveloopholestodrill,alsowillnotaffecttheteachingmanagementbecauseoftheattendancesystemandothercomplicatedthings.ThebluetoothattendancesystembasedoninformationarisesatthehistoricmomentandADAPTStothedevelopmentofTheTimes.Whentheintroductionofthisbluetoothattendancemethod,itisverypopularwithcolleges,afterall,canmaketheclasstimealotmoreefficient.ThisdesignisbasedonthebluetoothtechnologyattendancesystemtocreateanAPPthatcandetectthebluetoothandcompletethecheck-in.Thebluetoothcandetectwhetherstudentsoremployeesareattendingclassesorworkinginthedesignatedplacewithinacertaindistance.TheattendancesystemonlyUSESbluetoothonthemobileterminal,whichisveryconvenient.TheprincipleistousebluetoothclientBluetoothSocketandserviceBluetoothServerSockettwofunctions,tocreateabluetoothadapterbasedbluetoothlist,theAPPsystemcanautomaticallysearchforbluetoothdevices,theAPPcanalsologincheckin,andthepre-madebluetoothdeviceaddressdatabaseforcomparisontocompletethestudentattendanceregistration.Therefore,thedesignofattendancesystembasedonbluetoothtechnologyisofgreatsignificance,whichcannotonlyreducetheattendancecost,butalsomaketheteachingmanagementmoreefficient.Curbthebehaviorofstudentstosigntohelpclassmates,alsowillnotaffecttheteachingmanagementbecauseoftheattendancesystemandothercomplicatedthings.Keywords:bluetooth;bluetoothadapter;bluetoothSocket;bluetoothServerSocket目录一、引言 11.1本设计的目的、意义及应达到的技术要求 11.2本设计在国内外的发展概况及存在的问题 21.3本设计应解决的主要问题 2二、基于蓝牙的考勤系统设计的整体设计方案 22.1基于蓝牙设计的考勤系统组成 22.2系统需求分析 32.2.1蓝牙通信模块设计的功能需求分析 32.2.2蓝牙通信模块设计的非公能需求分析 42.3系统的设计对象选择及介绍 42.4系统设计语言的选择以及介绍 5三、编程环境的搭建 83.1AndroidStudio的环境搭建 83.2MyEclipse的环境搭建 11四、蓝牙技术在Android开发中的应用 114.1蓝牙的介绍 114.2蓝牙技术协议的协议栈和协议栈体系结构 124.2.1蓝牙的底层协议 134.2.2蓝牙的中间层协议 134.2.3蓝牙的应用层协议 144.3Android系统中的Android.Bluetooth包 14蓝牙通信模块设计的具体实现 165.1设计思路 175.2建立蓝牙的连接 175.3读取数据,发送消息和文件 185.4监听蓝牙设备 21总结和工作展望 226.1总结 226.2工作展望 23参考文献 24致谢 25附录 26一、引言在如今的大学考勤系统中,很多都是以纸张为载体的考勤,而且浪费老师讲课的时间,最主要很多学生可以蒙混过关,想不去上课就不去上课,造成当代大学生很多人没有很好完成大学学业。而企业的考勤系统,是用了指纹和扫描脸部为主,在这些考勤中,效率是提高了很多,也很难出现考勤的错误,唯一的缺点就是成本高而且还有复杂的操作,在资源有限的社会,不利于推广。在科技不断发展的如今,这一类考勤慢慢会被社会所抛弃,所以这时候基于蓝牙设计的考勤系统应运而生。基于蓝牙设计的考勤系统,就是通过APP连接到手机的蓝牙,登录自己的信息实现课堂上或者上班的考勤,简单方便。这个APP它具有注册信息,登录信息,检查签到,和请假的功能,APP通过HTTP协议与服务器通信,通过数据库管理我们的签到数据,老师端从而处理我们的签到信息,进行签到。这个APP还有老师端和学生端这两个功能,适时的切换信息和收集学生的请假信息,从而很快的去处理这些签到信息。1.1、本设计的目的、意义及应达到的技术要求本设计的目的是设计出一款APP软件对高校上课的学生或者企业上班考勤的员工进行智能手机蓝牙的精确识别,并且做出考勤的签到、统计、请假反馈给老师或者上司。这样的话我们就可以很方便的将考勤交给这个APP来实现,而不是浪费在老师点名上,节约老师在考勤方面的时间。应达到的技术是要求研究一种APP管理系统识别学生的蓝牙,分为学生端和老师端。利用Android系统提供给我们的蓝牙客户端bluetoothSocket和蓝牙服务端bluetoothServerSocket。通过查阅资料可以根据蓝牙有其地址的唯一性,首先提前将学生的信息放进数据库了,一旦我们扫描到了学生的蓝牙就可以进行作信息的整合比较。我们的老师就可以通过这款APP判断学生的上课考勤的情况,从而实现本次设计功能。mysql是服务端的数据库主要用来处理登录、注册、收发通知,而sqlite为本地数据库,主要用来存储蓝牙通讯的签到以及请假,收集这些数据进行整理反馈。基于以上课题需要研究的内容有以下方面:学生和教师的登录注册;蓝牙端的通信设置和蓝牙连接设置;学生端使用蓝牙签到和蓝牙请假;教师端查看考勤和查看请假;学生端调起QQ联系老师;教师端发布通知和学生端接收通知;关于系统和退出系统;分析考勤数据Mysql服务端的数据库和sqlite本地的数据库;程序的编写与调试;1.2、本设计在国内外的发展概况及存在的问题现在的高校学生逃课率非常严重,经过调查有20%的逃课率,有90%的学生在大学逃过课,而且不止一次,所以形势非常严峻,这让每个学校都十分苦恼,一直找不到好的办法来解决学生上课签到,落后的签到方式不仅耗费学生宝贵的上课时间而且容易造成管理失误。而且蓝牙考勤甚至没有多少大学去展开使用,大多数的高校还是停留在点名。一旦蓝牙考勤慢慢引进高校,对于高校上课考勤将会有很大的帮助。目前基于蓝牙设计存在的主要问题是蓝牙的稳定性和连接蓝牙时能否容纳一个班上的同学的蓝牙信息传输。进行1对1进行信息传输的时候,老师的服务端可以很好处理,但是在进行多个也就是N对1的情况下进行信息传输,需要一个排队的过程,还会出现某些同学的信息缺失,这也会浪费学生的上课时间和影响老师正常授课。1.3、本设计应解决的主要问题从系统的整体设计出发,急需解决的是蓝牙端的通信和蓝牙端的连接,能够保证大家的蓝牙都能被APP识别并且连接的上,学生客户端上要可以注册和登录并且填写我们的基本信息,并且还能使用蓝牙进行快速可靠的签到和发送请假信息,我们设计的时候学生端还多了一项可以利用调起QQ联系老师。而教师端可以准确无误的查看我们的考勤状况和请假信息,并且可以发布通知通知学生,学生也能收到信息。在Android界面上还有关于系统和退出系统的功能。利用mysql服务端的数据库主要用来处理登录、注册、收发通知,而sqlite作为本地数据库,主要用来存储蓝牙通讯的签到以及请假数据,使用Java编程语言在Android平台上实现对学生信息、课程信息和考勤信息的管理。这些都是我们需要解决的主要问题。二、基于蓝牙的考勤系统设计的整体设计方案2.1、基于蓝牙设计的考勤系统组成基于蓝牙的考勤系统是使用现在十分常见的Android系统平台,因为其操作方便快捷、界面友好、最主要的一点是其兼容性很好。使用里面的开发工具包,再加上手机自带的蓝牙模块。创建的APP分为学生端,学生端具有签到,注册,登录信息还有请假的功能,其中最关键的信息是每个学生对自己手机的蓝牙地址,这是这个APP进行考勤的关键依据。教师端也有注册,登录,检查签到,对已经进行签到的同学,记为“到课”,对没有到课堂上课的同学记为“旷课”,对请假的同学记为“请假”。在本系统中,考勤系统一共分为到课,迟到,请假,和旷课四种。若学生旷课太多就会以信息的方式进行提醒。基于这些的实现都是建立一个服务端数据库Mysql来处理这些大多数的信息。图2.1基于蓝牙设计的考勤系统的原理图2.2、系统需求分析本文设计的目的是基于蓝牙系统的考勤系统中的蓝牙通信模块,其中的学生业务设计模块、教室业务设计模块、后台业务设计模块、和用户设计界面使用模块这四个模块不会在本文讲解。要想了解这个蓝牙通信,就需要我们知道怎么去建立两个蓝牙之间的连接与通信。2.2.1蓝牙通信模块设计的功能需求分析·打开手机端的蓝牙·搜索可用的蓝牙设备(教师端和学生端都可以互相搜索)·创建蓝牙连接socket,包括短连接和与长连接。·利用数据库记录蓝牙的数据·利用蓝牙一键签到2.2.2蓝牙通信模块设计的非公能需求分析由于技术十分有限,对于mysql服务端的数据库和sqlite本地的数据库的理解有限,对于大量的数据进行分析时往往会出现错误,无法完成整个班级的考勤签到,即是蓝牙之间的连接无法做到教师端一个对N个学生的连接通信。界面的设计也不需要太复杂,做到简单明了,有蓝牙签到的指引提示。2.3、系统的设计对象选择及介绍基于蓝牙设计的签到系统是使用Android操作系统,手机的操作系统有许多种,之所以选择Android的操作系统,是因为它在很多方面都能够很好兼容匹配,没有排斥性。通过分析近几年手机的销量,发现Android系统的手机在全球的销量是最高的,占据着一半以上的市场份额,就可以知道Android系统是很受大众的欢迎的。由下图可以知道Android操作系统在手机方面应用是最广泛和最流行的。图2.2Android手机操作系统全球市场份额现在很多人都是用安卓系统的手机,Android系统对于我们每个人都不陌生,用了之后也发觉是很好用,他的形象也是根深蒂固在人们的脑海里。安卓系统是基于Linux内核的开放源代码的操作系统,是谷歌在2007年发布的一种操作系统。因为那时候数码相机很受欢迎,所以初衷就是探索一个怎样的操作系统能够很好地开发和创建一个相对先进的数码相机。然而,后来发现市场对数码相机操作系统的需求不够大,他们发现只有手机市场在快速增长,所以安卓转向了智能手机操作系统。该年的11月份,谷歌和其他84个创造者、开发者和电信运营商共同建立了开放手持设备联盟,共同开发和改进安卓系统。随后,谷歌以阿帕奇免费开放许可的形式发布了安卓源代码,允许许多制造商引入基于安卓的智慧。Android系统后来更逐渐使用在其他的开发上。应用程序Android是以Java为编程语言,这样能够使接口功能化,而且他的中间层主要使用Java语言实现。在优势方面,Android操作系统有其独特的地方。1、开放性一个系统的开放性就等于拥有了很多操作的可能性,当开放性很好时就会拥有很多的消费者。之所以Android系统这么受欢迎,就是因为其具备开放性。因为开放性,任何的移动终端和厂商都可以进行开发其想要的功能和使用。还可以利用其开放性进行优化系统,提高用户的体验。2、开放的源代码让用户可以利用其免费的核心代码,免费的话用的人就会多。还向开发者提供SDK,这样的话很多程序员就可以很简单的编写各种应用的软件。场强的网络功能Android使用的WebView组件和内层建造的浏览器是以WebKit为核心,所以里面的很多APP可以实现内嵌各种高端的网页功能。表现个性Android系统使用Widget来实现界面的个性化,很多厂家都可以完善当前的界面,并且还可以修改,设计属于我们自己喜欢的产品风格。多任务系统Android系统可以同时打开我们我们想要打开的应用,而且能做到不卡顿很舒畅,我们可以看着视频的同时在微信或者QQ发送消息,主要是因为Android系统具有很强的代码功能使其有消息处理机制。6、Google应用由于谷歌公司在近几年的不断发展,让现在互联网都与其紧密的联系,也让我们的生活和网络相互连接。谷歌还推出了很多的功能化服务,而作为其中的一份子,Android可以和这些服务进行调用还有结合,使得功能更加强大。2.4、系统设计语言的选择以及介绍Android应用程序有大部分是采用我们熟知的Java语言开发的,在做这个考勤系统时,本人一开始选用的是c和c++来实现蓝牙的通信,通过看协议时序图,但是后来查找关于c语言设计的Android资料少之又少,所以就放弃这个想法,因为实在是难以进行本次手机系统。因为我专业学习的是C语言,在做这个考勤系统之前要不断查找Java的资料,自学了Java语言,花费了很多时间,也让完成这个考勤系统的难度增加了不少。在传统的Java语言开发里,Java文件的源代码是一步步转化成可执行的二进制机器码的。由下图分析可得先是将源代码转化成.class文件,JVM可理解的Java字节,再通过JVM转化为二进制机器码。图2.3Java语言执行的过程Java是一种面向对象的、易理解易用的、动态的语言,它是跨平台、分布式的、阐释的、多线程的,具有较高的安全性及移植性,非常强大,并且结构是中立的,性能极佳。而C语言则是面向过程的语言。Java也对c及c++语言进行了学习,发现在风格方面,它与后二者非常相似,且它的诞生正是因为开发者对C语言的不甚满意。从本质上来看,java是一种半编译半解释的语言。它先把编译写好的源代码编,使其成为二进制字节码,接着再借助各平台上所装设的虚拟机来完成对字节码的解释执行,这使得仅需1次编译就可以到处执行的跨平台特性得以达成。作为通用的程序设计语言,Java的功能较为全面,可在要求高、可信的应用程序的开发中起到关键的作用。同c语言无异,Java语言也具有易学性。在对其语法有所了解后,就能够发现它和C、C++语言十分相似,基本上所有的程序工作者都对C语言有所掌握,而且基于此进行编程,所以于他们而言,Java语言的学习及运用难度都不大。在Java语言当中,没有多继承等c++语言里运用频率极低、理解难度大的特点。指针是C语言的学习当中最难理解的部分,而它在Java语言中是不需要的。另外,Java语言对内存中的自动的废料收集进行了提供,故而程序工作者无需考虑内存的负荷管理问题。以下就其特点展开详述:1.Java语言是强制面向对象的语言Java对继承、接口、类等语句加以供应,此即为Android对其这般运用的根本缘由。为使编程更易于完成,java对各个类彼此间的单继承、各接口彼此间的多继承、类和接口之间的达成机制都是支持的。它对动态绑定予以支持,但是C++语言的动态绑定则仅用于虚函数中。可见,Java语言是纯的且面向对象的。Java语言是强壮的因为设有异常处理、强类型机构以及自动收集垃圾等,所以有效地确保了Java语言开发的程序强壮性。放弃指针可谓是Java最聪明的一个决断。而安全检查机制则是使其强壮性得到提升的关键所在。安全可靠性能好的语言Java语言编程复杂度低,外部一般难以干扰到它,而且它还有着极强的表达力、执行力。为将外部代码的影响消除掉,它还对一个安全机制进行了设立。譬如分配字节、类的种类等均可被其保护。此外,它的安全特性也比较丰富,备受使用者的青睐。Java语言是分布式的一个大的系统通常为划分为多个子系统来完成,因分布式是Java语言的突出特点,故而能够借助计算机网络向诸多台主机上分布诸多的后端工作,让这些主机去完成具体的工作,以使效率大为提升。同时,还能够对HTTP与FTP等的TCP/IP协议进行较佳的处理,以远程调用为基础的、以消息方式为基础的系统间通信、网络通信技术在分布式应用中较为常用。除此以外,此类应用的开发还有一个关键的方式,即Java的RMl机制。Java语言是跨平台可移植的因为体系结构具有中立性,所以Java语言也就具有了可移植性。此外,该语言还对各种基本数据类型的长度设定了要求,而且有着较高的严格度。Java系统的可移植性极强,以Java语言达成Java编译器,几乎可以顺利工作于所有的硬件或软件平台上,从而避免了诸多烦恼。Java语言是原生支持多线程的线程是Java语言里一种比较的特殊对象,其管理是由Jvm来完成的,且其创建必须由该语言里的Thread类或者其子(孙)类来进行。Jvm是基于lwp(轻量级进程)来使得与操作系统的内核线程1:1的映射关系得以达成的,从而使Java内部的多线程得以变为现实,同时对详细的语法进行了供应,进而将具体的编码完成。简单而言,Java的多线程即可对内核线程加以调取运用从而进行执行的,故而其对于多线程的支持可谓是与生俱来的。在Java里,线程的设立可由两个途径达成:一是对型构为Thread(Runnable)的构造子加以运用,对1个实现了Runnable接口的对象进行包装,使其成为1个线程;二是将子类从Thread类派生出来且对run方法进行重写,线程就是基于该子类而设立的。Java语言是动态的在编译过程中,有需要我们分配空间的动态环境和静态环境,Java语言能够很好地适应一些无时无刻不在变化的动态环境。主要是操作类,动态地被载入到运行环境。并且SE能够很好地进行升级。在Java语言的健壮和可靠的优良特性下,就可以大大降低运营的维护成本。也可以缩短开发时间。三、编程环境搭建3.1、AndroidStudio的环境搭建AndroidStudio是Android应用设计软件常用的一种环境软件,用来编写Java代码。搭建这个软件的方法如下:首先打开网上下载好的AndroidStudio的安装包点击进行安装,一步步操作下去选择自己安装的程序路径,我把它放在D盘安装Androidstudio程序完毕后,对其进行配置,配置是非常重要的,一旦配置错误了,就会出现很多软件上的错误,按照如下图勾选图3.1然后选择自己喜欢的界面主题这里最重要的还是指定SDK的路径,路径错误,到时候编译也会出错,如果电脑下载好了SDK,即需指定其路径。点击finish就进入了Androidstudio的欢迎界面图3.2Androidstudio欢迎界面Androidstudio已经安装成功,就可以搭建自己的项目了图3.3项目中的工程目录结构图3.4Androidstudio的工作窗口3.2、MyEclipse的环境搭建MyEclipse,是在eclipse基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、JavaEE以及移动应用的开发。MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错。以下是其搭建方法:1.首先在官网下载好MyEclipse10安装包2.点击MyEclipse10图标进行安装3.然后选好工作路径,这里注意最好不好出现中文路径(代码放在的地方不能出现中文路径,否则编译的时候会出现错误)4.安装完毕就可以新建项目了图3.5MyEclipse的工作窗口蓝牙技术在Android开发中的应用4.1蓝牙的介绍蓝牙(Bluetooth)是一种能够使短距离(一般为10米之内)的两个设备之间在无线的情况下,完成他们之间的通信,这个通信是十分高效和安全的,所以在设备之间的通信时,很多人都会选择蓝牙进行。所以,蓝牙技术是短距离安全无线通信技术。特别是在WiFi还没有那么普遍的时候,上网由于网速和流量的限制,下载东西十分不方便,所以我们的一些视频、文档、图片还有音乐都是通过蓝牙进行资源共享。当我们距离比较远的时候,如果上其他外设的帮助,或者增加功率是可以让两个设备之间的通信距离变长。因为它不需要申请无线电波许可证,所以在使用蓝牙技术进行通信时,不用担心会受一些外界频率的干扰。通过查阅资料,可以知道要区分每个蓝牙设备,就要操作蓝牙的地址,因为每个蓝牙模块的地址都是独特唯一的,不一样的设备,蓝牙的地址是不同的。这样就很好的建立精确的通信。在Android平台中,他包含了蓝牙的框架,这样可以使一些其他的设备以无线传输的方式与蓝牙设备进行很稳定的数据交换。所以这也是我们考虑用Android平台去完成这次的蓝牙考勤系统。而不是选择做个硬件去实现。4.2、蓝牙技术协议的协议栈和协议栈体系结构我们都知道每个通信工具都有自己的一套协议,蓝牙也不例外。蓝牙技术拥有自己的一套协议,是串口通信并且符合spp协议。我们首先要了解他的蓝牙协议栈,有四个层次,分别为:物理层、逻辑层、L2CAPLayer和应用层。物理层,负责提供数据传输的物理通道。逻辑层,是在物理层的基础上,提供两个以上的设备进行逻辑传输。L2CAP层,负责逻辑层中的逻辑链路。基于该协议,不同的Applicaon可共享同一个逻辑链路,就好像类似于TCP/IP中的端口的概念。APP层,是在用于L2CAP提供的channel,在理解了蓝牙协议中的应用层后就可以实现各种各样的功能。当我们使用不同的平台和不同的设备的时候,Profile是蓝牙协议的一种特别的存在,能够实现在不同平台下的不同设备中的互相连接与通信。所以这个层里定义了各种Application规范,这些应用层规范称作蓝牙profile。图4.1蓝牙的协议栈蓝牙的协议栈的体系结构,根据各层协议在整个蓝牙协议中所处的位置,蓝牙协议又可以分为应用层协议、中间层协议和底层协议。4.2.1、蓝牙的底层协议它是实现蓝牙协议信息当中的多种数据流进行的传输链路,并且是该体系结构的根基,主要涵盖了以下几方面。(1)射频协议作为蓝牙协议栈里面最底层的协议,其主要是接收部分频段,安排通道等,用以对物理底层无线传输进行规范,使空中的数据收发得以达成。具有较佳的保密性、抗干扰性。这亦为蓝牙传输的一个突出特点。基带协议蓝牙协议层里射频层之上即为基带层,蓝牙最关键的物理层就是这两层组成的。基带层能够控制链路,譬如ACL链路等蓝牙里的很多链路都受其管理。除此以外,它还可以接入蓝牙设备、对数据包进行处理、对蓝牙数据进行传送等。(3)链路管理协议链路管理协议是一种数据结构式的链路层协议,主要执行一些设置蓝牙、认证蓝牙、配置蓝牙,说白就是规定设备与设备之间怎样建立连接和怎样去通信,其链路的安全在这层协议里也很好地体现,还可以发现一些远程蓝牙并通过链路管理协议进行通信。4.2.2、蓝牙的中间层协议蓝牙的中间层协议又可以分为主机控制器接口协议、逻辑链路控制与适配协议、串口仿真协议、TCP(电话通信协议)和SDP(服务发现协议)。这些协议之间的合作,可以很好地控制着蓝牙数据帧的重新组装和分解、服务质量、组提取等。主机控制器接口协议在主机控制层有着很多传输层时,它可以透明化,只需要它完成蓝牙数据间传输的任务,而且不需要清楚数据的格式。串口仿真协议运用于射频通信,它可以基于ETS10710串口仿真协议于L2CAP上对RS-232九针串口电线电缆接口进行仿真,蓝牙设备可以在无线传输期间借助PFCOMM来支持高层协议譬如PPP、TCP/IP、WAP等。逻辑链路控制与适配协议能够对服务质量及协议进行控制,还能够对数据进行拆开解析等,能够为中间层其他协议的实现创造其所需的基础性条件,它是蓝牙协议栈最为关键的根基。电话通信协议它是一个面向bit以IIU-T控制规范为基础的协议,能够对蓝牙设备间语音及数据的呼叫控制指令进行提供。相较于WLAN而言,蓝牙技术支持语音,这正是二者的不同所在。服务发现协议网络都有其特定的协议,服务发现协议提供一种方式发现这个协议的存在并解释其特征。4.2.3、蓝牙的应用层协议蓝牙的应用层协议有一些指定模型组成,在厂家生产蓝牙设备时候,都要遵循这种指定的模型,一旦遵循这种指定的模型,就可以简单的交换对象,从而有很好的平台独立性。有着无线应用协议(WAP)和音频协议(Audio)。图4.2蓝牙协议栈的体系结构4.3、Android系统中的Android.Bluetooth包要想完成蓝牙设备的通信和设备与设备之间的连接,我们就一定要会编写蓝牙模块和蓝牙设备之间数据通信的代码。完成设备双方之间的通信需要执行以下流程:开启学生手机端和教师手机端蓝牙设备并且设置为可搜索模式、进而搜索并进行匹配蓝牙、设备与设备之间的连接通信、最后一步就是实现设备之间的数据间的传输。实现这些我们就需要了解Android.Bluetooth包里的基本类:BluetoothAdapter类:这个类是Android提供的一个很重要的类,它可以通过调用创建的对象的静态方法getDefaultAdapter()。用法为:图4.3BluetoothAdapter类的用法蓝牙的开关状态可以简化为如下图:图4.4蓝牙开关状态上面的BluetoothAdapter只是获取蓝牙适配器的对象,Android还提供了该类的API函数,可以有更多的蓝牙控制权,如:enable()该方法用于打开我们的手机蓝牙。StartDiscovery()方法是用来发现周围打开的蓝牙设备的任务,相当于蓝牙设备的一个眼睛。若发现有蓝牙设备的存在,就会返回一个布尔值,我们就可以从这个设备中获取相关的信息和建立通信。isEnable()方法顾名思义就是检查蓝牙设备可以用或者不可以用,依靠其返回值来确定这个蓝牙设备是不是可以用。isDiscovery()方法和isEnable差不多,也是用其返回值来确定是否正在搜索周围可用的蓝牙设备。getName()方法就是获取蓝牙设备的名称。cancelDiscovery()就是取消蓝牙设备的发现,当调用该方法就是停止对周围蓝牙进行搜索。disable()就是关闭我们的蓝牙设备,蓝牙一旦关闭就会停止一切工作。BluetoothSocket类是表示socket蓝牙套的接口,是本地设备与其他设备的蓝牙模块进行通信的连接点。在服务端与客户端进行数据传输都要用到这个类。因为这个蓝牙签到,有服务端的学生端和客户端的教师端,所以这个类十分重要,使用如下图:图4.5获取对象也有以下API:close()关闭连接getOutputStream()获取输出流。getInputStream()获取输入流。connect()尝试连接。getRemoteDevice()获取远程设备,当BluetoothSocket处于连接中,会有特定的返回值来检测其有没有获取。BluetoothServerSocket类指代的是一个服务来监听对方的连接请求,连接成功后这个类就会返回一个BluetoothSocket。这个类也有以下API:accept()监听连接。accept(inttimeout)监听超时连接,这里一般会设定一个监听连接的时间。close()关闭端口,释放资源。BluetoothDevice类是指代一个蓝牙的设备,可以查询比如名称、物理地址、类和连接状态等相关信息。该类获取途径如下图:图4.6对象获取途径有以下API:getName()和上面一样。getBluetoothClass()获取蓝牙类,需要BLUETOOTH权限。getAddress()address中文是地址。顾名思义就是获取地址。BluetoothClass类是用来描述一个蓝牙设备的通用特性和功能,还可以提供音频或者电话服务。如果想要获取远端设备的属性,可以使用getBluetoothClass()方法。有以下API:BluetoothClass.Device是常量的定义。BluetoothClass.Service服务类的常量的定义。getDeviceClass()获取设备内部类。getMajorDeviceClass()获取设备主类。BooleanhasService(intservice)是否支持服务类。蓝牙通信模块设计的具体实现本文研究的是蓝牙通信模块的内容。5.1、设计思路(1)整个模块的设计思路1.利用Androidstudio建立APP端,同时在利用其中提供的蓝牙工具包对蓝牙进行调用还有蓝牙连接,使用组件来进行页面设计,实现界面布局及跳转。2.利用servlet轻量级框架还有MySQL数据库来进行服务端设计。3.利用Http请求和响应,完成数据的传输和交互。4.蓝牙是使用经典蓝牙的连接方式来建立蓝牙连接通道。(2)蓝牙模块设计思路1.理解本模块功能需求。2.了解蓝牙设备的通信协议和Android蓝牙的内部结构。3.选好开发语言选择Java。4.学习Android蓝牙内部的类,合理使用。5.编写蓝牙通信和蓝牙连接的代码。6.实现本模块的功能。5.2、建立蓝牙的连接以代码的形式:5.3、读取数据,发送消息和文件5.4、监听蓝牙设备总结和工作展望6.1、总结在本次的基于蓝牙设计的考勤系统中,主要是对蓝牙通信这个模块进行了介绍和说明,在这个整体的设计中,蓝牙模块是开头一棒,只有做好蓝牙的通信连接,还有学生端的蓝牙设备和教师端的蓝牙设备进行配对,才能让这个考勤开展起来。本文研究的考勤系统也就具有以下的特点:、能够快速的进行蓝牙设备的扫描,学生端设备和老师端的设备也可以进行连接,并且进行签到,请假等等功能,老师与学生还可以互相发消息。在这个时代里,手机是我们必不可少的通信工具,这样的话就很好的节约了上课的时间,保证上课的效率。、由于我们弄了MySQL的数据库,可以做一些信息的整理和利用。、操作界面简洁明了,操作更加一目了然6.2、工作展望本文设计的是基于蓝牙系统的考勤签到系统中的蓝牙通信模块的开发和设计。经过不断地查找Android蓝牙通信模块的资料,能够实现学生端和教师端的蓝牙连接,并且成功完成签到。但是由于我们小组对数据库理解能力有限,在数据的容量方面没有做的足够好,仅限老师端的蓝牙连接几个学生端的蓝牙,也没有办法进行云存储技术,也没有测试手机的兼容性,出现了一些不可避免的兼容性错误。为了更完善的利用这个签到系统,展望可以从以下几个方面着手:本次设计的APP仅支持Android系统,对于IOS系统是不兼容的,所以仅限于安卓系统的手机可以进行签到。不能进行一对N的连接,就是不能进行一个班级上的蓝牙考勤签到。功能也是比较简单单一,一个成熟的系统是需要多功能化的。由于小组成员开发的能力十分有限,界面也是比较简单,信息的提示也是不够直观。不能很好的保证用户体验效果。参考文献钱志鸿,杨帆,周求湛编著.
2006蓝牙技术原理、开发与应用[M].
北京航空航天大学出版社
2006
[2]李成思,刘欣宁.基于手机的高校课堂考勤系统的探索与实践[J].河南科技.
2017(13)
[3]张晶.基于Android平台下的高校学生考勤系统设计与实现[J].
科技展望.
2016(17)
[4]姚南野,王林平,郑世珏,陶立秋.基于蓝牙通信的高校课堂手机考勤管理系统[J].
计算机与数字工程.
2014(10)
[5]邰伟鹏,徐宏.高校选课制下蓝牙考勤管理系统的研究与实现[J].
安徽工业大学学报(社会科学版).
2012(04)
[7]谢晓.基于蓝牙无线局域网的文件传输系统的研究与设计[D].
北京邮电大学
2007张瑞,于潇榕.基于Android智能终端移动考勤系统的设计与实现[J].信息技术2015(4)谢振东,罗志来.蓝牙4.0应用研究[J].中国新产品新技术2015(17)[10]弓宁.计算机软件开发中JAVA编程语言的应用[J].计算机产品与流通.2020(01)[11]杨旭.JAVA编程语言在计算机软件开发中的应用[J].电子技术与软件工程.2018(07)致谢值此论文完成之际,大学四年尾站的钟声响起,这也意味着我在北京理工大学珠海学院的求学生涯进入尾声,这让我感慨万千。在这四年的大学时光里,看似漫长但时间过得很快,就仿佛刚踏入校门,实则是半只脚踏出门外。在大学这四年里,我认识了很多的朋友、同学、老师,在我遇到困难的时候都是他们陪伴在我身边,和我一起排忧解难,一起快乐玩耍。努力奋斗的时候有他们互帮互助,使我更能体会到团队的重要性,由衷地感谢能在北京理工大学珠海学院里认识到他们。当然,为期一学期的毕业设计使我记忆深刻,我首先要感谢易国荣老师严谨治学的态度,他不厌其烦的为我们排忧解难,在我遇到困难时悉心的指导我,还帮我们讲解论文的格式、逻辑和规范化。从他身上,我学习到的不仅仅是论文的撰写和项目的设计,还学会了怎么去更好的做一件事,这让我受益匪浅。同时也非常感谢我们组的小组成员,没有他们,我是完成不了这个基于蓝牙设计的签到系统,我也从中跟他们学习到Android和Java语言的应用,是他们带领我入门科研的深海,学习科技中的奥秘。还要感谢在这次毕设中帮助我解决困难的每个人,在我遇到蓝牙通信和蓝牙连接方面一头暮水时,是他们为我讲解蓝牙通信的原理,和客户端服务端的区分。在这次毕设中,我学到当我们在做一个项目时,一定要学会提出问题还有解决问题,在设计中要时常进行交流,才能使得我们这个APP能够更加完善,功能更加可靠,而且大量的资料也使得我们的视野更加广阔。感谢父母这么多年对我的支持和鼓励以及包容,同时为我能顺利完成毕业设计给了巨大的支持。在未来的日子里将继续学习和工作,不断提升自己,做更好的自己!附录附录1程序源代码1.蓝牙连接packagecom.app.bs.kqqd.bluetooth.api;importjava.io.IOException;importjava.util.concurrent.TimeoutException;publicinterfaceConnector{voidstartServer();voidstopServer();booleanisServerOK();voidconnect()throwsTimeoutException,IOException;booleanisConnected();voidsend(byte[]b)throwsIOException;intrecv(byte[]b)throwsIOException;intrecv(byte[]b,intoffset,intcount)throwsIOException;voiddisconnect();} 调用蓝牙进行匹配连接packagecom.app.bs.kqqd.bluetooth.api;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothServerSocket;importandroid.bluetooth.BluetoothSocket;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.Set;importjava.util.UUID;publicclassBluetoothConnectorimplementsConnector{publicfinalstaticStringMOS_UUID="6c12a327-0e0b-4344-8137-c41e2a79a50d";privateStringdeviceAddress;BluetoothServerSocketserverSocket;privatebooleanstopServerFlag;privateBluetoothSocketlocalSocket;privateBluetoothSocketremoteSocket;privateBluetoothSocketconnectedSocket;privateInputStreaminputStream;privateOutputStreamoutputStream;publicBluetoothConnector(){}publicBluetoothConnectorremoteDeviceAddress(StringdeviceAddress){this.deviceAddress=deviceAddress;returnthis;}publicvoidstartServer(){newThread(newRunnable(){@Overridepublicvoidrun(){BluetoothAdapterbluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(null==bluetoothAdapter){return;}try{serverSocket=bluetoothAdapter.listenUsingRfcommWithServiceRecord("MOS_SERVICE",UUID.fromString(MOS_UUID));}catch(IOExceptione){serverSocket=null;return;}stopServerFlag=false;while(!stopServerFlag){try{remoteSocket=serverSocket.accept();connectedSocket=remoteSocket;inputStream=connectedSocket.getInputStream();outputStream=connectedSocket.getOutputStream();}catch(IOExceptione){}}stopServer();}},"BluetoothServer").start();}publicvoidstopServer(){disconnect();stopServerFlag=true;if(null!=serverSocket){try{serverSocket.close();}catch(IOExceptione){e.printStackTrace();}serverSocket=null;}}@OverridepublicbooleanisServerOK(){if(null==serverSocket){returnfalse;}returntrue;}@Overridepublicvoidconnect()throwsIOException{BluetoothAdapterbluetoothAdapter=BluetoothAdapter.getDefaultAdapter();Set<BluetoothDevice>bondedDevices=bluetoothAdapter.getBondedDevices();booleandeviceFound=false;for(BluetoothDevicedevice:bondedDevices){if(device.getAddress().equals(deviceAddress)){deviceFound=true;localSocket=device.createRfcommSocketToServiceRecord(UUID.fromString(MOS_UUID));localSocket.connect();connectedSocket=localSocket;if(null!=connectedSocket){inputStream=connectedSocket.getInputStream();outputStream=connectedSocket.getOutputStream();}break;}}if(!deviceFound){thrownewIOException("bluetoothdevicenotfound");}}@OverridepublicbooleanisConnected(){if(null==connectedSocket){returnfalse;}returnconnectedSocket.isConnected();}@Overridepublicvoidsend(byte[]b)throwsIOException{if(null!=outputStream){outputStream.write(b);}}@Overridepublicintrecv(byte[]b)throwsIOException{returnrecv(b,0,b.length);}@Overridepublicintrecv(byte[]b,intoffset,intcount)throwsIOException{if(null!=inputStream){returninputStream.read(b,offset,count);}return0;}@Overridepublicvoiddisconnect(){if(null!=connectedSocket){try{inputStream=null;outputStream=null;connectedSocket.close();connectedSocket=null;}catch(IOExceptione){e.printStackTrace();}}}}3.//请求蓝牙连接packagecom.app.bs.kqqd.bluetooth.api.request;importorg.json.JSONException;importorg.json.JSONObject;publicclassRequestMessageextendscom.app.bs.kqqd.bluetooth.api.Request{publicRequestMessage(){super(REQ_MSG);}publicRequestMessage(intcmd,Stringmsg){super(REQ_MSG);this.cmdId=cmd;this.msg=msg;}@OverridepublicRequestMessagenewInstance(){returnnewRequestMessage();}@OverridepublicJSONObjecttoJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.put(CMD,cmdId);jsonObject.put(MSG,msg);returnjsonObject;}@OverridepublicvoidfromJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.getInt(CMD);jsonObject.getString(MSG);}}4.未知的信息请求packagecom.app.bs.kqqd.bluetooth.api.request;importcom.app.bs.kqqd.bluetooth.api.Request;publicclassUnknownReqextendsRequest{publicUnknownReq(){super(Request.REQ_UNKNOWN);}@OverridepublicUnknownReqnewInstance(){returnnewUnknownReq();}}对请求进行相应处理packagecom.app.bs.kqqd.bluetooth.api;importorg.json.JSONException;importorg.json.JSONObject;publicclassResponse{publicstaticfinalintSUCCESS_CODE=0;publicstaticfinalStringCMD="cmd";publicstaticfinalStringCODE="code";publicstaticfinalStringMSG="msg";publicintcmdId;publicintcode;publicStringmsg="";publicResponse(intcmdId){this.cmdId=cmdId;}publicintgetCmdId(){returncmdId;}publicbooleanisOK(){returncode==SUCCESS_CODE;}publicJSONObjecttoJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.put(CMD,cmdId);jsonObject.put(CODE,code);jsonObject.put(MSG,msg);returnjsonObject;}publicvoidfromJsonObject(JSONObjectjsonObject)throwsJSONException{jsonObject.getInt(CMD);jsonObject.getInt(CODE);jsonObject.getString(MSG);}publicResponsenewInstance(){returnnewResponse(cmdId);}}APP注册请求和响应packagecom.app.bs.kqqd.bluetooth.api;importcom.app.bs.kqqd.bluetooth.api.request.RequestMessage;importcom.app.bs.kqqd.bluetooth.api.request.ResponseMessage;importcom.app.bs.kqqd.bluetooth.api.request.UnknownReq;importjava.util.HashMap;importjava.util.Map;publicclassCmdFactory{privatestaticCmdFactoryinstance;privateMap<Integer,Request>requestMap=newHashMap<>();privateMap<Integer,Response>responseMap=newHashMap<>();privateCmdFactory(){register(newRequestMessage());register(newResponseMessage());}publicstaticCmdFactorygetInstance(){if(null==instance){synchronized(CmdFactory.class){if(null==instance){instance=newCmdFactory();}}}returninstance;}publicvoidregister(Requestreq){requestMap.put(req.getCmdId(),req);}publicvoidregister(Responsersp){responseMap.put(rsp.getCmdId(),rsp);}publicRequestcreateRequest(intcmd){Requestrequest=requestMap.get(cmd);if(null!=request){returnrequest.newInstance();}returnnewUnknownReq();}publicResponsecreateResponse(intcmd){Responseresponse=responseMap.get(cmd);if(null!=response){returnresponse.newInstance();}returnnewResponse(Request.REQ_UNKNOWN);}}7.//适配器packagecom.app.bs.kqqd.adapter;importandroid.content.Context;importandroid.view.ViewGroup;importcom.app.bs.kqqd.model.GanHuo;importcom.jude.easyrecyclerview.adapter.BaseViewHolder;importcom.jude.easyrecyclerview.adapter.RecyclerArrayAdapter;/****/publicclassGanHuoAdapterextendsRecyclerArrayAdapter<GanHuo.Result>{publicGanHuoAdapter(Contextcontext){super(context);}@OverridepublicBaseViewHolderOnCreateViewHolder(ViewGroupparent,intviewType){returnnewGanHuoViewHolder(parent);}}//packagecom.app.bs.kqqd.adapter;importandroid.graphics.drawable.Drawable;importandroid.view.ViewGroup;importandroid.widget.TextView;importcom.app.bs.kqqd.R;importcom.app.bs.kqqd.model.GanHuo;importcom.app.bs.kqqd.util.TimeUtil;importcom.jude.easyrecyclerview.adapter.BaseViewHolder;/****/publicclassGanHuoViewHolderextendsBaseViewHolder<GanHuo.Result>{privateTextViewtitle;privateTextViewtype;privateTextViewwho;privateTextViewtime;publicGanHuoViewHolder(ViewGroupparent){super(parent,R.layout.ganhuo_item);title=$(R.id.title);type=$(R.id.type);who=$(R.id.who);time=$(R.id.time);}@OverridepublicvoidsetData(GanHuo.Resultdata){super.setData(data);//标题title.setText(data.getDesc());//干货类型type.setText(data.getType());//根据干货类型动态替换干货图标if(data.getType().equals("Android")){setDrawableLeft(R.drawable.ic_android_black_24dp);}elseif(data.getType().equals("iOS")){setDrawableLeft(R.drawable.ic_whatshot_black_24dp);}else{setDrawableLeft(R.drawable.ic_play_circle_filled_black_24dp);}//干货贡献者who.setText(data.getWho());//干货提交时间time.setText(TimeUtil.getFormatTime(data.getPublishedAt()));}publicvoidsetDrawableLeft(intimageId){Drawabledrawable=getContext().getResources().getDrawable(imageId);drawable.setBounds(0,0,drawable.getMi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- XX小学2026年春季学期学生社会实践活动安全工作部署会副校长讲话
- 2026年志愿者服务规范化建设方案
- 新增客户服务热线开通公告(9篇)
- 办公会议纪要编写规范手册
- 体育教练员儿童体能训练方法手册
- 跨部门协作计划模板有效沟通与合作模式探讨
- 行业技术问题诊断与解决方案库
- 2026年理论武装方面存在的问题及整改措施
- 单位诚信经营案例交流声明书9篇
- 会议议程与参与确认函(7篇)范文
- 江西省重点中学协作体2026届高三下学期第一次联考英语试卷(不含音频及听力原文答案不全)
- 太原铁路局集团招聘笔试题库2026
- 企业信息安全事件应急响应与处理手册
- 行业招聘面试问题清单专业能力测试版
- 广西机场管理集团秋招试题及答案
- 上交所2026校招笔试题
- 2026江西省港口集团有限公司第一批次社会招聘17人笔试备考试题及答案解析
- 车间内部转运车管理制度
- 2025年高中创新能力大赛笔试题资格审查试题(附答案)
- 内蒙古环投集团笔试试题
- 四年级下册语文第二单元 快乐读书吧十万个为什么 导读一等奖创新教学设计
评论
0/150
提交评论