共享单车服务器及客户端设计与实现_第1页
共享单车服务器及客户端设计与实现_第2页
共享单车服务器及客户端设计与实现_第3页
共享单车服务器及客户端设计与实现_第4页
共享单车服务器及客户端设计与实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

龙源期刊网 共享单车服务器及客户端设计与实现作者:王风雷 秦会斌 崔佳冬来源:物联网技术2018年第02期摘 要:为了改善共享单车机械锁密码不安全、电子锁成本高的不足,设计并实现了基于蓝牙控制的共享单车系统。单车车锁采用蓝牙与Android客户端通信,客户端App请求云服务器获得对车锁的开关控制,将用户信息、单车信息上传至云服务器,云服务器将信息持久化到数据库中。针对手机的高并发访问量,云服务器搭载Nginx,实现负载均衡和反向代理。测试结果表明,该共享单车系统成本低、安全性高,通过该系统,用户可以请求云服务器实现对单车车锁的控制。关键词:共享单车;云服务器;Android;蓝牙中图分类号:TP311 文献标识码:A 文章编号:2095-1302(2018)02-00-040 引 言共享单车是中国互联网创新的应用实践,解决了“最后一公里”的问题,缓解了交通拥堵,真正实现了绿色出行,利国利民1。目前,共享单车机械车锁的密码由用户通过App获取,密码不可改变,安全性低;电子车锁需要连接云服务器,安全性高,但是硬件设计复杂、成本较高、耗电量高。针对以上问题,本文提出了基于蓝牙控制的共享单车系统设计方案。通过Android手机匹配单车蓝牙车锁,请求云服务器获取“钥匙”,实现对车锁的开关控制。同时,云服务器将用户和单车的信息持久化到数据库中。1 系统总体设计系统由Android客户端、网页后台管理中心、云服务器和蓝牙单车车锁组成。系统框架如图1所示。云服务器是整个系统的调控计算平台2,为管理人员与手机App提供服务,响应用户与管理人员的操作。手机App发送HTTP请求到云服务器,解析云服务器返回的JSON数据,下发蓝牙控制信息,经车锁蓝牙MCU处理后,最终达到控制车锁开闭的功能。蓝牙车锁也可通过串口向蓝牙模块输出蓝牙信息,手机App响应蓝牙信息,最终实现手机App与硬件控制部分的双向通信。用户在注册登录成功后,进入用车界面;打开手机蓝牙,匹配车锁蓝牙,App后台将用户信息和车锁信息上传到云端服务器;用户点击开始用车,云服务器接收到请求后,记录用户信息和车锁信息,并返回“钥匙”给App,通过蓝牙与车锁通信打开车锁。当车锁关闭后,蓝牙将已锁状态发送给App,App界面结束用车,若中途断开蓝牙,则结束用车后用车界面无法进行操作。手机端用车的业务流程如图2所示。2 云服务器的设计与实现2.1 云服务器架构云服务器架构图如图3所示。本文采用阿里云作为云计算中心,提供简单高效、处理能力可弹性伸缩的计算服务。阿里云上搭载Nginx、Tomcat、Redis和MySQL,Nginx 作为反向代理,将 App 端或者浏览器端的请求根据权重分配给两台Tomcat,Redis作为两台Tomcat的共享session数据服务器,缓存已验证的用户信息。Tomcat1的IP地址为90,Tomcat2的IP地址为11,在90的云服务器上搭载Nginx,配置Nginx,具体的配置如下3:worker_processes 2;events worker_connections 1024;http include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;/配置被代理的服务器upstream live_node server 90:8080;server 11:8080;server /配置访问域名及监听80端口listen 80;server_name 90;/指定被代理目标location / proxy_pass http:/live_node;/配置错误页面error_page 500 502 503 504 /50x.html;location = /50x.html root html;当有请求时,通过Nginx将请求进行转发4,保证一个入口将所有请求转发到Tomcat1或Tomcat2,同时减轻这两台Tomcat的负载压力。将Tomcat1和Tomcat2的session缓存到Redis中5,确保访问的是同一个session,配置Tomcat conf目录下的context.xml。redissessins.RedisSessionHandlerValve” /host=“90”port=“6379”database=“0”maxInactiveInterval=“1800”/Redis是键值对类型的内存数据库。同时,用Redis作为MySQL的缓存数据库,能够减小MySQL的压力。服务器先查找Redis服务器中是否有登录用户的信息,有则取出使用,无则查询数据库,查看是否可以验证,将验证后的用户缓存到Redis服务器中,从而减少对数据库的访问。实现的部分代码如下:/先查询缓存try String json = jedisClient.hget(INDEX_USER, uid + “”);/查询到结果,把json转换成对象返回if (StringUtils.isNotBlank(json) User findUser = JsonUtils.jsonToPojo(json, User.class);return findUser; catch (Exception e) e.printStackTrace();/缓存中没有,需要查询数据库User findUser = userService.login(telphone,password);/把结果添加到缓存try jedisClient.hset(INDEX_“USER”, uid + “”,JsonUtils.objectToJson(findUser);catch (Exception e) e.printStackTrace();return findUser;2.2 云服务器框架云服务器系统开发框架采用Struts+Spring+Hibernate,该框架从职责上分为Web层、业务层、DAO层和持久层。其中,使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分控制业务跳转。利用Hibernate框架对持久层提供支持。Spring做管理,管理Struts和Hibernate。系统的基本业务流程为:在Web层中,通过JSP页面实现交互界面,负责接收请求和传送响应,然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理;在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性;而在持久层中则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果6。该开发模型不仅实现了视图、控制器与模型的彻底分离,而且可以实现业务逻辑层与持久层的分离。不同层之间耦合度小,大大提高了开发效率。2.3 云服务器功能的实现云服务器系统主要分为网页后台服务和用户App服务,管理人员通过浏览器访问,查看用户及蓝牙车锁的信息。App服务为Android客户端提供接口,根据App提供的信息对用户和蓝牙车锁信息进行记录,并持久化到MySQL中。系统服务图如图4所示。App与云服务器的通信主要通过发送HTTP请求,使用轻量级的JSON数据交换格式实现。云服务器为App提供5个接口:用户注册、用户登录、打开车锁、获取用户当前是否打开车锁、关闭车锁。网页的后台服务中,为防止非登录认证的管理员直接访问某些页面、功能菜单项或action名,使用Struts自定义拦截器,继承Method Filter Interceptor类,并在Struts的配置文件中放行登录方法,登录后将所验证的登录名和密码放到Redis服务器中。若拦截器查询到Redis服务器中有验证过的登录名,则放行;否则,跳转到登录页面。根据Ajax的请求查询数据库,将前台页面不需要的数据排除在外,再将数据以JSON格式返回,前台Ajax的回调函数解析数据并进行地图上的显示。3 客户端的设计与实现3.1 客户端功能说明客户端各功能模块如图5所示。(1) 登录模块:注册时,本地校验是否为正确的手机号,并向云服务器验证是否已经注册过,经过验证后,向手机号发送验证码,填写验证码进行注册。一经登录,下次使用时App会自动登录。(2) 用户使用模块:在车辆使用方面,采用手机应用和蓝牙模块建立双向通信达到控制车锁的目的。需要用车时,使用手机蓝牙适配器7连接蓝牙模块建立Socket通信通道。只要蓝牙不关闭或者不超过最大通信距离,该通道将会保持,直到手动关闭。通信建立后,手机端通过Socket携带控制命令到蓝牙模块,也可以控制单片机通过串口发送数据到蓝牙模块与手机通信。对于车辆行程监控,需要用户开启后才能进入工作,该功能集成的是百度地图API,调用百度地图的定位功能,通过实时监听手机位置定位车辆。在用户结束用车后会将车辆最后的坐标位置通过手机App上传到云服务器。在车辆使用过程中,若用户开启了路径监控模式,则可以描绘出运行轨迹,同时计算车辆的行驶速度、路程和骑行时间;若用户未开启该模式,则不会进入路径监听模式,百度地图只进行定位。(3)蓝牙车锁控制模块:手机蓝牙与车锁蓝牙通信后,向云服务器发送HTTP请求,通过解析返回的JSON数据,拿到“钥匙”,从而对车锁进行开关控制。同时,蓝牙车锁端监测到车锁关闭后,向手机发送当前状态,App监听到状态改变,向云服务器请求结束计费,App可以结束用车。3.2 客户端框架在Android Studio开发环境下,采用MVC开发架构。视图层接收输入和显示结果,生成App界面;控制层用来处理用户交互的部分,接收到用户的输入后向模型发送数据;模型层调用程序的数据逻辑部分,定义了HTTP通信模块、蓝牙通信模块、数据解析模块等8,9。手机App与车锁蓝牙建立Socket通信,开启一个子线程不断轮询,通过套接字Socket获取字节输入流,解析并获取数据流,将数据使用广播发送给主线程处理。接收蓝牙信息的代码如下:class ServiceReceiveThread extends ThreadOverridepublic void run()byte buf=new byte10;while (btSocket != null)BufferedInputStream bis=new BufferedInputStream( btSocket.getInputStream();int read = bis.read(buf);/接收蓝牙发送的数据int r=(int)buf0;if(r=21)/发送数据到主线程handler.sendEmptyMessage(1);sendBroadcast(newIntent(“SERVICE_DISCONNECT”);sleep(2000);客户端与云服务器通信采用http连接,使用Apache异步网络请求框架AsyncHttpClient,首先在父类Activity中新建该类的实例,子类Activity使用该类向云服务器发送post请求,云服务器返回JSON数据至Atected void SendMsgToServer()RequestParams params=new RequestParams();params.put(“telephone”, MyApplication.tel);params.put(“bluetoothId”,MyUtils.getStrValue(getContext(), “device_addr”);client.post(GloubleConst.MAIN+GloubleConst.START_CHARGE, params,new AsyncHttpResponseHandler()Overridepublic void onSuccess(final String content)if(content.equals(“1”)/车辆可以使用handler.sendEmptyMessage(CAN_USE_BIKE);else if(content.equals(“0”)/已经在使用handler.sendEmptyMessage(CANNOT_USE_BIKE) );Overridepublic void onFailure(Throwable error, String content)./网络连接失败处理);onSuccess()和onFailure()方法接收请求成功或失败的消息,onSuccess()方法的参数content为云服务器返回的JSON数据。4 蓝牙车锁蓝牙车锁控制器使用MSP430单片机,内置2.4 G无线发射天线的HC-06蓝牙模块。该蓝牙模块支持两种模式:一种是上电后只能接受命令的从机模式;另一种是主从机一体模式。该系统在主从机一体模式下,通过串口调试工具,利用AT指令修改默认属性。当手机端应用成功连接蓝牙后,即可建立通信。同时,手机端通过套接字向模块写入数据。另外,控制单元也可通过串口发送数据到手机应用端,实现双向通信。5 客户端和后台中心界面展示Android客户端以精简、灵活为前提,主要为用户注册登录、匹配车锁、开始/结束用车、行程记录和个人信息界面,Android客户端部分界面如图6所示。后台管理中心主要包括登录界面、用户信息、车锁信息和车锁地图显示界面。其中,用户信息界面和车锁信息界面可以进行搜索。车锁地图显示界面如图7所示。6 结 语本文介绍了

温馨提示

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

评论

0/150

提交评论