• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      共享單車服務(wù)器及客戶端設(shè)計(jì)與實(shí)現(xiàn)

      2018-03-03 18:42:16王風(fēng)雷秦會(huì)斌崔佳冬
      物聯(lián)網(wǎng)技術(shù) 2018年2期
      關(guān)鍵詞:共享單車藍(lán)牙

      王風(fēng)雷+秦會(huì)斌+崔佳冬

      摘 要:為了改善共享單車機(jī)械鎖密碼不安全、電子鎖成本高的不足,設(shè)計(jì)并實(shí)現(xiàn)了基于藍(lán)牙控制的共享單車系統(tǒng)。單車車鎖采用藍(lán)牙與Android客戶端通信,客戶端App請(qǐng)求云服務(wù)器獲得對(duì)車鎖的開(kāi)關(guān)控制,將用戶信息、單車信息上傳至云服務(wù)器,云服務(wù)器將信息持久化到數(shù)據(jù)庫(kù)中。針對(duì)手機(jī)的高并發(fā)訪問(wèn)量,云服務(wù)器搭載Nginx,實(shí)現(xiàn)負(fù)載均衡和反向代理。測(cè)試結(jié)果表明,該共享單車系統(tǒng)成本低、安全性高,通過(guò)該系統(tǒng),用戶可以請(qǐng)求云服務(wù)器實(shí)現(xiàn)對(duì)單車車鎖的控制。

      關(guān)鍵詞:共享單車;云服務(wù)器;Android;藍(lán)牙

      中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2018)02-00-04

      0 引 言

      共享單車是中國(guó)互聯(lián)網(wǎng)創(chuàng)新的應(yīng)用實(shí)踐,解決了“最后一公里”的問(wèn)題,緩解了交通擁堵,真正實(shí)現(xiàn)了綠色出行,利國(guó)利民[1]。目前,共享單車機(jī)械車鎖的密碼由用戶通過(guò)App獲取,密碼不可改變,安全性低;電子車鎖需要連接云服務(wù)器,安全性高,但是硬件設(shè)計(jì)復(fù)雜、成本較高、耗電量高。針對(duì)以上問(wèn)題,本文提出了基于藍(lán)牙控制的共享單車系統(tǒng)設(shè)計(jì)方案。通過(guò)Android手機(jī)匹配單車藍(lán)牙車鎖,請(qǐng)求云服務(wù)器獲取“鑰匙”,實(shí)現(xiàn)對(duì)車鎖的開(kāi)關(guān)控制。同時(shí),云服務(wù)器將用戶和單車的信息持久化到數(shù)據(jù)庫(kù)中。

      1 系統(tǒng)總體設(shè)計(jì)

      系統(tǒng)由Android客戶端、網(wǎng)頁(yè)后臺(tái)管理中心、云服務(wù)器和藍(lán)牙單車車鎖組成。系統(tǒng)框架如圖1所示。

      云服務(wù)器是整個(gè)系統(tǒng)的調(diào)控計(jì)算平臺(tái)[2],為管理人員與手機(jī)App提供服務(wù),響應(yīng)用戶與管理人員的操作。手機(jī)App發(fā)送HTTP請(qǐng)求到云服務(wù)器,解析云服務(wù)器返回的JSON數(shù)據(jù),下發(fā)藍(lán)牙控制信息,經(jīng)車鎖藍(lán)牙MCU處理后,最終達(dá)到控制車鎖開(kāi)閉的功能。藍(lán)牙車鎖也可通過(guò)串口向藍(lán)牙模塊輸出藍(lán)牙信息,手機(jī)App響應(yīng)藍(lán)牙信息,最終實(shí)現(xiàn)手機(jī)App與硬件控制部分的雙向通信。

      用戶在注冊(cè)登錄成功后,進(jìn)入用車界面;打開(kāi)手機(jī)藍(lán)牙,匹配車鎖藍(lán)牙,App后臺(tái)將用戶信息和車鎖信息上傳到云端服務(wù)器;用戶點(diǎn)擊開(kāi)始用車,云服務(wù)器接收到請(qǐng)求后,記錄用戶信息和車鎖信息,并返回“鑰匙”給App,通過(guò)藍(lán)牙與車鎖通信打開(kāi)車鎖。當(dāng)車鎖關(guān)閉后,藍(lán)牙將已鎖狀態(tài)發(fā)送給App,App界面結(jié)束用車,若中途斷開(kāi)藍(lán)牙,則結(jié)束用車后用車界面無(wú)法進(jìn)行操作。手機(jī)端用車的業(yè)務(wù)流程如圖2所示。

      2 云服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

      2.1 云服務(wù)器架構(gòu)

      云服務(wù)器架構(gòu)圖如圖3所示。

      本文采用阿里云作為云計(jì)算中心,提供簡(jiǎn)單高效、處理能力可彈性伸縮的計(jì)算服務(wù)。阿里云上搭載Nginx、Tomcat、Redis和MySQL,Nginx 作為反向代理,將 App 端或者瀏覽器端的請(qǐng)求根據(jù)權(quán)重分配給兩臺(tái)Tomcat,Redis作為兩臺(tái)Tomcat的共享session數(shù)據(jù)服務(wù)器,緩存已驗(yàn)證的用戶信息。

      Tomcat1的IP地址為106.15.90.190,Tomcat2的IP地址為106.14.9.111,在106.15.90.190的云服務(wù)器上搭載Nginx,配置Nginx,具體的配置如下[3]:

      worker_processes 2;

      events {

      worker_connections 1024;}

      http {

      include mime.types;

      default_type application/octet-stream;

      sendfile on;

      keepalive_timeout 65;

      //配置被代理的服務(wù)器

      upstream live_node {

      server 106.15.90.190:8080;

      server 106.14.9.111:8080;}

      server {

      //配置訪問(wèn)域名及監(jiān)聽(tīng)80端口

      listen 80;

      server_name 106.15.90.190;

      //指定被代理目標(biāo)

      location / {

      proxy_pass http://live_node;}

      //配置錯(cuò)誤頁(yè)面

      error_page 500 502 503 504 /50x.html;

      location = /50x.html {

      root html;}

      }

      }

      當(dāng)有請(qǐng)求時(shí),通過(guò)Nginx將請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)[4],保證一個(gè)入口將所有請(qǐng)求轉(zhuǎn)發(fā)到Tomcat1或Tomcat2,同時(shí)減輕這兩臺(tái)Tomcat的負(fù)載壓力。將Tomcat1和Tomcat2的session緩存到Redis中[5],確保訪問(wèn)的是同一個(gè)session,配置Tomcat conf目錄下的context.xml。

      redissessins.RedisSessionHandlerValve” />

      host=“106.15.90.190”

      port=“6379”

      database=“0”

      maxInactiveInterval=“1800”/>

      <!--redis過(guò)期時(shí)間默認(rèn)是60 s,設(shè)置session過(guò)期時(shí)間為1 800 s-->

      Redis是鍵值對(duì)類型的內(nèi)存數(shù)據(jù)庫(kù)。同時(shí),用Redis作為MySQL的緩存數(shù)據(jù)庫(kù),能夠減小MySQL的壓力。服務(wù)器先查找Redis服務(wù)器中是否有登錄用戶的信息,有則取出使用,無(wú)則查詢數(shù)據(jù)庫(kù),查看是否可以驗(yàn)證,將驗(yàn)證后的用戶緩存到Redis服務(wù)器中,從而減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。實(shí)現(xiàn)的部分代碼如下:

      //先查詢緩存

      try {

      String json = jedisClient.hget(INDEX_USER, uid + “”);

      //查詢到結(jié)果,把json轉(zhuǎn)換成對(duì)象返回

      if (StringUtils.isNotBlank(json)) {

      User findUser = JsonUtils.

      jsonToPojo(json, User.class);

      return findUser;}

      } catch (Exception e) {

      e.printStackTrace();}

      //緩存中沒(méi)有,需要查詢數(shù)據(jù)庫(kù)

      User findUser = userService.login(telphone,password);

      //把結(jié)果添加到緩存

      try {

      jedisClient.hset(INDEX_“USER”, uid + “”,JsonUtils.objectToJson(findUser));}

      catch (Exception e) {

      e.printStackTrace();}

      return findUser;

      2.2 云服務(wù)器框架

      云服務(wù)器系統(tǒng)開(kāi)發(fā)框架采用Struts+Spring+Hibernate,該框架從職責(zé)上分為Web層、業(yè)務(wù)層、DAO層和持久層。其中,使用Struts作為系統(tǒng)的整體基礎(chǔ)架構(gòu),負(fù)責(zé)MVC的分離,在Struts框架的模型部分控制業(yè)務(wù)跳轉(zhuǎn)。利用Hibernate框架對(duì)持久層提供支持。Spring做管理,管理Struts和Hibernate。

      系統(tǒng)的基本業(yè)務(wù)流程為:在Web層中,通過(guò)JSP頁(yè)面實(shí)現(xiàn)交互界面,負(fù)責(zé)接收請(qǐng)求和傳送響應(yīng),然后Struts根據(jù)配置文件(struts-config.xml)將ActionServlet接收到的Request委派給相應(yīng)的Action處理;在業(yè)務(wù)層中,管理服務(wù)組件的Spring IoC容器負(fù)責(zé)向Action提供業(yè)務(wù)模型(Model)組件和該組件的協(xié)作對(duì)象數(shù)據(jù)處理(DAO)組件完成業(yè)務(wù)邏輯,并提供事務(wù)處理、緩沖池等容器組件以提升系統(tǒng)性能和保證數(shù)據(jù)的完整性;而在持久層中則依賴于Hibernate的對(duì)象化映射和數(shù)據(jù)庫(kù)交互,處理DAO組件請(qǐng)求的數(shù)據(jù),并返回處理結(jié)果[6]。

      該開(kāi)發(fā)模型不僅實(shí)現(xiàn)了視圖、控制器與模型的徹底分離,而且可以實(shí)現(xiàn)業(yè)務(wù)邏輯層與持久層的分離。不同層之間耦合度小,大大提高了開(kāi)發(fā)效率。

      2.3 云服務(wù)器功能的實(shí)現(xiàn)

      云服務(wù)器系統(tǒng)主要分為網(wǎng)頁(yè)后臺(tái)服務(wù)和用戶App服務(wù),管理人員通過(guò)瀏覽器訪問(wèn),查看用戶及藍(lán)牙車鎖的信息。App服務(wù)為Android客戶端提供接口,根據(jù)App提供的信息對(duì)用戶和藍(lán)牙車鎖信息進(jìn)行記錄,并持久化到MySQL中。系統(tǒng)服務(wù)圖如圖4所示。

      App與云服務(wù)器的通信主要通過(guò)發(fā)送HTTP請(qǐng)求,使用輕量級(jí)的JSON數(shù)據(jù)交換格式實(shí)現(xiàn)。云服務(wù)器為App提供5個(gè)接口:用戶注冊(cè)、用戶登錄、打開(kāi)車鎖、獲取用戶當(dāng)前是否打開(kāi)車鎖、關(guān)閉車鎖。

      網(wǎng)頁(yè)的后臺(tái)服務(wù)中,為防止非登錄認(rèn)證的管理員直接訪問(wèn)某些頁(yè)面、功能菜單項(xiàng)或action名,使用Struts自定義攔截器,繼承Method Filter Interceptor類,并在Struts的配置文件中放行登錄方法,登錄后將所驗(yàn)證的登錄名和密碼放到Redis服務(wù)器中。若攔截器查詢到Redis服務(wù)器中有驗(yàn)證過(guò)的登錄名,則放行;否則,跳轉(zhuǎn)到登錄頁(yè)面。根據(jù)Ajax的請(qǐng)求查詢數(shù)據(jù)庫(kù),將前臺(tái)頁(yè)面不需要的數(shù)據(jù)排除在外,再將數(shù)據(jù)以JSON格式返回,前臺(tái)Ajax的回調(diào)函數(shù)解析數(shù)據(jù)并進(jìn)行地圖上的顯示。

      3 客戶端的設(shè)計(jì)與實(shí)現(xiàn)

      3.1 客戶端功能說(shuō)明

      客戶端各功能模塊如圖5所示。

      (1) 登錄模塊:注冊(cè)時(shí),本地校驗(yàn)是否為正確的手機(jī)號(hào),并向云服務(wù)器驗(yàn)證是否已經(jīng)注冊(cè)過(guò),經(jīng)過(guò)驗(yàn)證后,向手機(jī)號(hào)發(fā)送驗(yàn)證碼,填寫驗(yàn)證碼進(jìn)行注冊(cè)。一經(jīng)登錄,下次使用時(shí)App會(huì)自動(dòng)登錄。

      (2) 用戶使用模塊:在車輛使用方面,采用手機(jī)應(yīng)用和藍(lán)牙模塊建立雙向通信達(dá)到控制車鎖的目的。需要用車時(shí),使用手機(jī)藍(lán)牙適配器[7]連接藍(lán)牙模塊建立Socket通信通道。只要藍(lán)牙不關(guān)閉或者不超過(guò)最大通信距離,該通道將會(huì)保持,直到手動(dòng)關(guān)閉。通信建立后,手機(jī)端通過(guò)Socket攜帶控制命令到藍(lán)牙模塊,也可以控制單片機(jī)通過(guò)串口發(fā)送數(shù)據(jù)到藍(lán)牙模塊與手機(jī)通信。對(duì)于車輛行程監(jiān)控,需要用戶開(kāi)啟后才能進(jìn)入工作,該功能集成的是百度地圖API,調(diào)用百度地圖的定位功能,通過(guò)實(shí)時(shí)監(jiān)聽(tīng)手機(jī)位置定位車輛。在用戶結(jié)束用車后會(huì)將車輛最后的坐標(biāo)位置通過(guò)手機(jī)App上傳到云服務(wù)器。在車輛使用過(guò)程中,若用戶開(kāi)啟了路徑監(jiān)控模式,則可以描繪出運(yùn)行軌跡,同時(shí)計(jì)算車輛的行駛速度、路程和騎行時(shí)間;若用戶未開(kāi)啟該模式,則不會(huì)進(jìn)入路徑監(jiān)聽(tīng)模式,百度地圖只進(jìn)行定位。

      (3)藍(lán)牙車鎖控制模塊:手機(jī)藍(lán)牙與車鎖藍(lán)牙通信后,向云服務(wù)器發(fā)送HTTP請(qǐng)求,通過(guò)解析返回的JSON數(shù)據(jù),拿到“鑰匙”,從而對(duì)車鎖進(jìn)行開(kāi)關(guān)控制。同時(shí),藍(lán)牙車鎖端監(jiān)測(cè)到車鎖關(guān)閉后,向手機(jī)發(fā)送當(dāng)前狀態(tài),App監(jiān)聽(tīng)到狀態(tài)改變,向云服務(wù)器請(qǐng)求結(jié)束計(jì)費(fèi),App可以結(jié)束用車。

      3.2 客戶端框架endprint

      在Android Studio開(kāi)發(fā)環(huán)境下,采用MVC開(kāi)發(fā)架構(gòu)。視圖層接收輸入和顯示結(jié)果,生成App界面;控制層用來(lái)處理用戶交互的部分,接收到用戶的輸入后向模型發(fā)送數(shù)據(jù);模型層調(diào)用程序的數(shù)據(jù)邏輯部分,定義了HTTP通信模塊、藍(lán)牙通信模塊、數(shù)據(jù)解析模塊等[8,9]。

      手機(jī)App與車鎖藍(lán)牙建立Socket通信,開(kāi)啟一個(gè)子線程不斷輪詢,通過(guò)套接字Socket獲取字節(jié)輸入流,解析并獲取數(shù)據(jù)流,將數(shù)據(jù)使用廣播發(fā)送給主線程處理。接收藍(lán)牙信息的代碼如下:

      class ServiceReceiveThread extends Thread{

      @Override

      public void run(){

      byte[] buf=new byte[10];

      while (btSocket != null){

      BufferedInputStream bis=new BufferedInputStream( btSocket.getInputStream());

      int read = bis.read(buf);//接收藍(lán)牙發(fā)送的數(shù)據(jù)

      int r=(int)buf[0];

      if(r==21){

      //發(fā)送數(shù)據(jù)到主線程

      handler.sendEmptyMessage(1);

      sendBroadcast(newIntent

      (“SERVICE_DISCONNECT”));}

      sleep(2000);}}

      客戶端與云服務(wù)器通信采用http連接,使用Apache異步網(wǎng)絡(luò)請(qǐng)求框架AsyncHttpClient,首先在父類Activity中新建該類的實(shí)例,子類Activity使用該類向云服務(wù)器發(fā)送post請(qǐng)求,云服務(wù)器返回JSON數(shù)據(jù)至App[10]。

      protected 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(){

      @Override

      public void onSuccess(final String content){

      if(content.equals(“1”)){

      //車輛可以使用

      handler.sendEmptyMessage(CAN_USE_BIKE);}

      else if(content.equals(“0”)){

      //已經(jīng)在使用

      handler.sendEmptyMessage(CANNOT_USE_BIKE)} });}

      @Override

      public void onFailure(Throwable error, String content){...}//網(wǎng)絡(luò)連接失敗處理

      });}

      onSuccess()和onFailure()方法接收請(qǐng)求成功或失敗的消息,onSuccess()方法的參數(shù)content為云服務(wù)器返回的JSON數(shù)據(jù)。

      4 藍(lán)牙車鎖

      藍(lán)牙車鎖控制器使用MSP430單片機(jī),內(nèi)置2.4 G無(wú)線發(fā)射天線的HC-06藍(lán)牙模塊。該藍(lán)牙模塊支持兩種模式:一種是上電后只能接受命令的從機(jī)模式;另一種是主從機(jī)一體模式。該系統(tǒng)在主從機(jī)一體模式下,通過(guò)串口調(diào)試工具,利用AT指令修改默認(rèn)屬性。當(dāng)手機(jī)端應(yīng)用成功連接藍(lán)牙后,即可建立通信。同時(shí),手機(jī)端通過(guò)套接字向模塊寫入數(shù)據(jù)。另外,控制單元也可通過(guò)串口發(fā)送數(shù)據(jù)到手機(jī)應(yīng)用端,實(shí)現(xiàn)雙向通信。

      5 客戶端和后臺(tái)中心界面展示

      Android客戶端以精簡(jiǎn)、靈活為前提,主要為用戶注冊(cè)登錄、匹配車鎖、開(kāi)始/結(jié)束用車、行程記錄和個(gè)人信息界面,Android客戶端部分界面如圖6所示。

      后臺(tái)管理中心主要包括登錄界面、用戶信息、車鎖信息和車鎖地圖顯示界面。其中,用戶信息界面和車鎖信息界面可以進(jìn)行搜索。車鎖地圖顯示界面如圖7所示。

      6 結(jié) 語(yǔ)

      本文介紹了基于藍(lán)牙控制的共享單車系統(tǒng)設(shè)計(jì)和技術(shù),該系統(tǒng)結(jié)合云平臺(tái)、Android平臺(tái)和藍(lán)牙技術(shù),基于Android手機(jī)獲取經(jīng)緯度,并持久化到云服務(wù)器中,便于對(duì)單車進(jìn)行維護(hù),為共享單車市場(chǎng)提供一種安全、易實(shí)施的設(shè)計(jì)參考。

      參考文獻(xiàn)

      [1]徐鑫垚.共享單車App后臺(tái)管理系統(tǒng)的優(yōu)化[J]. 電子技術(shù)與軟件工程,2017(4):80-81.

      [2]王偉,章民融.基于云架構(gòu)的智能警務(wù)協(xié)同指揮系統(tǒng)研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2014, 31(8):67-70.

      [3]徐鸝,王耀,王偉聰,等.Moodle系統(tǒng)的集群方案與案例分析[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(1):224-229.

      [4]杜星.輕量級(jí)Web服務(wù)器Nginx的理論與技術(shù)研究[D]. 南京:南京郵電大學(xué),2016.

      [5]曾泉?jiǎng)?基于Redis的分布式消息服務(wù)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 北京:北京郵電大學(xué), 2014.

      [6]高蓓蕾.基于ISO管理體系的設(shè)備管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D]. 南京:南京郵電大學(xué), 2014.

      [7]葛會(huì)會(huì).基于Android 藍(lán)牙考勤系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].撫州:東華理工大學(xué),2016.

      [8]陳鈺琨,馬忠梅,曾禮.Android系統(tǒng)的藍(lán)牙遠(yuǎn)程控制研究[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2015, 15(1):16-19.

      [9]郭健儐,蔡雪松.基于Android平臺(tái)的公交信息發(fā)布終端軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2014,31(9):322-324.

      [10]陳瑋,秦會(huì)斌,曹曙光,等.基于Android平臺(tái)的智能家居系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2014, 41(10):158-160.endprint

      猜你喜歡
      共享單車藍(lán)牙
      藍(lán)牙音箱的直線之美
      簡(jiǎn)單、易用,可玩性強(qiáng)Q AcousticsBT3藍(lán)牙音箱
      適合自己的才是最好的 德生(TECSUN) BT-50藍(lán)牙耳機(jī)放大器
      緊急:藍(lán)牙指尖陀螺自燃!安全隱患頻出
      玩具世界(2017年8期)2017-02-06 03:01:38
      “共享單車”是一門好生意嗎
      華聲(2016年20期)2016-11-19 21:14:52
      太仓市| 五指山市| 潼南县| 黔西| 永安市| 曲靖市| 潜江市| 都昌县| 甘泉县| 民乐县| 赫章县| 伽师县| 湖南省| 平顶山市| 濉溪县| 建水县| 姜堰市| 岳池县| 墨竹工卡县| 康定县| 无为县| 喀什市| 龙南县| 略阳县| 章丘市| 丘北县| 定襄县| 民县| 永川市| 疏附县| 昭觉县| 夏河县| 额敏县| 朝阳区| 乌兰察布市| 永定县| 监利县| 得荣县| 闸北区| 唐山市| 中西区|