白云偉, 李麗萍
(上海第二工業(yè)大學(xué) 計算機與信息工程學(xué)院, 上海 201209)
汽車行業(yè)飛速發(fā)展, 生活越來越便利, 用戶對汽車服務(wù)的要求越來越高, 近幾年隨著新能源車步入市場,新能源車系列也受到越來越多人的青睞.物聯(lián)網(wǎng)時代,本著萬物互聯(lián)的暢想, 手機和車機互聯(lián)也隨之而生, 能夠運用手機APP 來遠程控制車輛成為用戶的迫切需求.
遠程控制APP 利用實時通信技術(shù), 以頁面圖標呈現(xiàn)的方式供用戶實時查看車輛狀態(tài)參數(shù), 并且用戶可以根據(jù)需要進行遠程開關(guān)空調(diào), 遠程開關(guān)車門, 遠程定位車輛, 個性化設(shè)置, 以及遠程召喚車輛和車外自動泊車等操作.
遠程控制APP 用Android Studio 3.0 作為開發(fā)平臺, 服務(wù)器采用XMPP 通信協(xié)議實時通信和MySQL數(shù)據(jù)庫進行數(shù)據(jù)操作.
Android Studio 是Google 推出的一個Android 集成開發(fā)工具, 基于IntelliJ IDEA, 類似Eclipse ADT,Android Studio 提供了集成的Android 開發(fā)工具用于開發(fā)和調(diào)試.開發(fā)者可以在編寫程序的同時看到自己的應(yīng)用在不同尺寸屏幕中的樣子.Android 是一種基于Linux 的自由及開放源代碼的操作系統(tǒng), 主要使用于移動設(shè)備, 如智能手機和平板電腦.Android 操作系統(tǒng)有4 層架構(gòu), 從高層到低層分別是應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運行層和Linux 內(nèi)核層[1].Android 有4 大組件: Activity, Service, BroadcastReceiver 和ContentProvider.
可擴展消息處理現(xiàn)場協(xié)議XMPP (eXtensible Messaging and Presence Protocol)是一種基于可擴展標記語言(eXtensible Markup Language, XML)的近端串流式即時通信協(xié)議.XMPP 中定義了3 個角色, 客戶端, 服務(wù)器, 網(wǎng)關(guān).通信能夠在這三者的任意兩個之間雙向發(fā)生.服務(wù)器同時承擔(dān)了客戶端信息記錄, 連接管理和信息的路由功能.網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時通信系統(tǒng)的互聯(lián)互通, 異構(gòu)系統(tǒng)可以包括SMS (短信), MSN, ICQ 等.基本的網(wǎng)絡(luò)形式是單客戶端通過TCP/IP 連接到單服務(wù)器, 然后在之上傳輸XML.XMPP 協(xié)議的優(yōu)點: 分布式, 安全, 可擴展, 彈性佳, 多樣性, 分布式的網(wǎng)絡(luò)架構(gòu)[2].
數(shù)據(jù)庫系統(tǒng)MySQL 所使用的SQL 語言是用于訪問數(shù)據(jù)庫的最常用標準化語言.MySQL 軟件采用了雙授權(quán)政策, 分為社區(qū)版和商業(yè)版, 由于其體積小、速度快、總體擁有成本低, 尤其是開放源碼這一特點, 一般中小型網(wǎng)站的開發(fā)都選擇MySQL 作為網(wǎng)站數(shù)據(jù)庫[3].
在該APP 中, 采用JSON 格式的數(shù)據(jù)封裝到XMPP 協(xié)議里進行通信, 并用高德地圖提供聯(lián)想搜索和導(dǎo)航功能, 采用GPS 技術(shù)獲取車輛位置, 便于查找和遠程召喚車輛, 并利用Android 的Service 功能保持APP 后臺運行, 然后采用極光推送平臺進行消息推送.
JSON (Java Script Object Notation)是一種輕量級的數(shù)據(jù)交換格式.它是基于ECMAScript (歐洲計算機協(xié)會制定的js 規(guī)范)的一個子集[4], 采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù).簡潔和清晰的層次結(jié)構(gòu)使得JSON 成為理想的數(shù)據(jù)交換語言.易于人閱讀和編寫, 同時也易于機器解析和生成, 并有效地提升網(wǎng)絡(luò)傳輸效率.
高德地圖開放平臺為Android 系統(tǒng)所提供的服務(wù)包含地圖、定位、導(dǎo)航、搜索、路徑規(guī)劃、室內(nèi)地圖[5]等.該APP 通過加載高德地圖SDK 主要用到POI 聯(lián)想搜索和導(dǎo)航功能.
利用GPS 定位衛(wèi)星, 在全球范圍內(nèi)實時進行定位、導(dǎo)航的系統(tǒng), 稱為全球衛(wèi)星定位系統(tǒng), 簡稱GPS[6].遠程車輛定位功能調(diào)用手機的GPS 和車機的GPS, 來進行人與車的定位和導(dǎo)航.
極光推送, 英文簡稱JPush, 是一個面向普通開發(fā)者開放的, 免費的第三方消息推送服務(wù)[7].開發(fā)者只需在客戶端集成極光推送SDK, 即可輕松地添加Push 功能到他的APP 中.該APP 運用極光推送API 實現(xiàn)車輛實時情況的消息推送.
車輛遠程控制APP 的常規(guī)功能是注冊登錄功能,其他功能是根據(jù)一些場景一一對應(yīng)設(shè)計出來的.(1)用手機控制車輛, 首先要知道控制哪輛車, 對應(yīng)有綁定車輛功能; (2)用戶坐在自己家里想知道自己車的基本狀況, 如車內(nèi)溫度, 空調(diào)開關(guān)情況, 車門是否上鎖, 胎溫胎壓是否異常等等, 對應(yīng)有查看車輛狀態(tài)和故障報警功能; (3)用戶的車停在大型車庫, 要去取車時反復(fù)尋找但找不到自己的車, 這時用遠程找車功能, 可以快速找到愛車; (4)有些停車位比較難停, 對于新手司機停車是個大問題, 對應(yīng)用遠程自動泊車功能; (5)用戶有時有事情又急于用車, 這時候希望車能夠自行開到指定位置, 應(yīng)運而生遠程召喚功能; (6)用戶沒有打開APP,但此時車輛有故障或者電量過低, 手機會收到推送消息進行提示; (7)用戶有時忘帶車鑰匙, 但需要打開車門, 此時就需要遠程開車門功能; (8)夏天天氣炎熱, 車停在路邊導(dǎo)致車內(nèi)溫度過高, 為了方便用戶能夠隨時上車, 可以使用遠程開空調(diào)功能提前給車內(nèi)降溫.還有提供聯(lián)想搜索功能可以設(shè)置家庭和公司的地址, 提供導(dǎo)航功能等等.
與APP 對接的后臺監(jiān)測系統(tǒng)需要完成以下幾個任務(wù): (1)制定與APP 的接口; (2) APP 用戶注冊和登錄的賬號, 用戶名, 密碼管理; (3) APP 版本的升級; (4)管理車機ID, 找到對應(yīng)的車機系統(tǒng); (5)作為通信中轉(zhuǎn)站,轉(zhuǎn)發(fā)APP 與車機系統(tǒng)之間的通信數(shù)據(jù), 并保存這些數(shù)據(jù)到數(shù)據(jù)庫.
用戶通過Android 客戶端發(fā)送操控指令給后臺,后臺接收指令并將指令轉(zhuǎn)發(fā)給車機系統(tǒng), 并在后臺數(shù)據(jù)庫保存指令消息.車機系統(tǒng)做出相應(yīng)的處理并將處理結(jié)果通過后臺再傳給客戶端進行界面顯示或進行通知欄推送消息等.車機端安裝一個車機控制系統(tǒng), 該系統(tǒng)會接收來自服務(wù)器的消息, 然后解析出用戶給的指令, 通過CAN 總線發(fā)送信號給車的XCU 部件, 然后X C U 做出相應(yīng)的控制操作, 等待底層部件通過CAN 總線回復(fù)成功或失敗的信號后, 該車機系統(tǒng)再把該信號封裝成XMPP 協(xié)議的消息回復(fù)給服務(wù)器, 然后服務(wù)器解析出目的JID, 然后再把消息轉(zhuǎn)發(fā)給該DST JID.整體架構(gòu)如圖1 所示.
圖1 整體架構(gòu)圖
車輛遠程控制APP 采用MVC 的架構(gòu)設(shè)計模式,該模式可提高開發(fā)效率, 降低模塊間的耦合性.MVC 中的M (模型)是指獲取到的XMPP 協(xié)議所解析出來的JSON 數(shù)據(jù).視圖層是每個XML 的布局文件main_activity.xml 等, 包括自定義的view.控制層是指APP 開發(fā)中的各個Activity 和Fragment, 如MainActivity,ErrorActivity, ParkActivity, PositionSelectActivity,VehicleBindActivity, LoginActivity 等.APP 的主頁面采用多個Fragment 嵌套在一個Activity 中的方式實現(xiàn),使用Viewpager 來控制多個Fragment 的切換, 增加頁面切換靈活性.
車輛遠程控制APP 的主要功能有: APP 注冊和登錄, 車輛綁定, 車輛基本狀態(tài)顯示, 遠程開關(guān)車門, 遠程開關(guān)空調(diào), 遠程尋車, 車外自動泊車, 車輛定位, 車輛遠程召喚和OTA 升級等等.
APP 的主要功能結(jié)構(gòu)圖如圖2 所示.
圖2 車輛遠程控制APP 功能結(jié)構(gòu)圖
后臺監(jiān)測系統(tǒng)功能結(jié)構(gòu)圖如圖3 所示.
圖3 后臺監(jiān)測系統(tǒng)的功能結(jié)構(gòu)圖
用戶打開APP 點擊注冊按鈕, 進入注冊頁面, 進行用戶名, 手機號和密碼的輸入, 然后通過Okhttp[8]網(wǎng)絡(luò)框架進行服務(wù)器請求將數(shù)據(jù)上傳到后臺, 后臺系統(tǒng)判斷該賬號是否已經(jīng)被注冊過, 如果已經(jīng)注冊過給出已注冊提示, 如果未注冊過寫入服務(wù)器, 給出注冊成功提示, 然后頁面跳轉(zhuǎn)到登錄界面, 在登錄界面輸入賬號密碼進行登錄, 登錄數(shù)據(jù)也通過Okhttp 進行服務(wù)器請求, 將賬號和密碼與后臺數(shù)據(jù)庫已經(jīng)注冊的賬號密碼匹配, 如果存在并且密碼正確提示登錄成功, 如果不存在提示未注冊, 如果密碼不正確提示重新輸入, 登錄后進入車輛綁定界面.在登錄界面如果選中記住密碼, 則下次可以進入登錄界面可以直接點登錄, 不用再重新輸入.注冊和登錄流程圖如圖4 所示.
主頁面由底部導(dǎo)航欄和車輛基本狀態(tài)兩部分組成,底部導(dǎo)航欄有3 部分組成, 分別是輪胎狀態(tài)Fragment,車輛基本狀況Fragment, 遠程控制Fragment, 3 個Fragment 可以用手指滑動進行切換.車輛基本狀態(tài)頁面主要顯示車內(nèi)溫度, 剩余電量, 空調(diào)狀態(tài)和車門狀態(tài),頁面左上角是個人信息設(shè)置, 右上角是故障報警.空調(diào)和車門鎖是兩個按鈕事件, 監(jiān)聽按鈕點擊事件, 可以點擊這兩個按鈕通過XMPP 協(xié)議發(fā)送指令.XMPP 協(xié)議格式見表1.
輪胎狀態(tài)頁面顯示胎溫和胎壓的數(shù)據(jù)指標, 如有異常, 對應(yīng)的輪胎會亮紅.遠程控制頁面有6 個按鈕事件組成, 對應(yīng)著6 個功能, 下面會一一詳細介紹.主頁面效果圖如圖5 所示.
圖4 注冊和登錄流程圖
表1 XMPP 協(xié)議格式
點擊遠程控制頁面的遠程尋車按鈕, ButtonListener監(jiān)聽到該點擊事件, 即會通過XMPP 協(xié)議發(fā)送尋車指令給后臺, 后臺解析該消息頭, 找到車機JID, 然后把JSON 格式的MsgContents 繼續(xù)封裝進XMPP 消息, 發(fā)送給車機系統(tǒng), 車機系統(tǒng)收到消息后就會控制車輛進行閃燈和鳴笛, 方便用戶尋找.遠程開空調(diào)功能類似遠程尋車, 點擊遠程開空調(diào)按鈕, ButtonListener 監(jiān)聽到該點擊事件, 即會通過XMPP 協(xié)議發(fā)送開空調(diào)或關(guān)空調(diào)指令給后臺, 后臺解析該消息頭, 找到車機JID, 然后把JSON 格式的MsgContents 繼續(xù)封裝進XMPP 消息,發(fā)送給車機系統(tǒng), 車機系統(tǒng)收到消息后就會控制車輛進行開或關(guān)空調(diào), 并且將操作結(jié)果返回給手機端在頁面上呈現(xiàn).遠程開車門命令與遠程尋車和遠程開空調(diào)功能類似.
打開主頁面的車輛定位按鈕, 會進入地圖界面, 進入該界面同時, APP 會發(fā)送一條GPS 的請求給車機系統(tǒng), 等待獲取到返回的車輛GPS 信息后, 會顯示車輛的位置在地圖上, 并且會調(diào)用手機的GPS 顯示用戶的位置, 此時點擊導(dǎo)航到車, 會出現(xiàn)用戶和車的路線規(guī)劃,用戶可以選擇導(dǎo)航到車的位置, 即會開始實時導(dǎo)航, 導(dǎo)航到車的位置后自動結(jié)束導(dǎo)航.車輛定位界面如圖6所示.
打開主頁面的車外泊車按鈕, 進入車外泊車頁面,同時會向車機請求車位信息, 車機系統(tǒng)會把車位的4 個坐標點(x1, y1), (x2, y2), (x3, y3), (x4, y4)發(fā)過來,并且會有一個標記位記錄該車位是否為空, 手機端收到車位信息后要把數(shù)據(jù)解析出來, 然后通過標記位選出空車位, 并記錄下空車位的4 個坐標信息, 然后再根據(jù)車位與車的相對位置, 在界面上自己繪制view, 車在view 的正中間, 然后以車為中心, 首先將車位坐標系進行轉(zhuǎn)換, 轉(zhuǎn)換成為手機坐標系, 然后再將車位的坐標點轉(zhuǎn)化成像素, 然后與車的坐標進行比較, 車位的x 坐標小于車的x 坐標的位于車的左側(cè), 車位的x 坐標大于的車的x 坐標的位于車的右側(cè), 車位的y 坐標小于車的y 坐標的位于車的上側(cè), 車位的y 坐標大于車的y 坐標的位于車的下側(cè)(比如, 車的像素坐標是(540, 960), 那么車位轉(zhuǎn)換后的像素坐標為(480, 550),這個車位就位于車的左上側(cè))以此繪制車位圖, 繪制完成后空車位可供用戶隨意選擇, 用戶觸屏選擇要停進去的車位, 然后view 會監(jiān)聽該手指點擊事件, 獲取到選擇的空車位編號, 將該編號組成JSON 格式的數(shù)據(jù)封裝到XMPP 協(xié)議里面, 發(fā)送給車機, 車機系統(tǒng)收到車位選擇消息后, 開始控制車輛開始自動泊車.泊車成功后會推送成功的消息給手機端, 如果泊車失敗, 車上的360 攝像頭會拍攝一張場景圖發(fā)送給后臺, 然后后臺轉(zhuǎn)發(fā)給手機端, 手機端下載圖片后顯示給用戶.車外泊車效果圖如圖7 所示.
圖5 主頁面效果圖
圖6 車輛定位效果圖
點擊主頁的遠程召喚功能, 進入遠程召喚頁面, 如圖8 所示, 4 個位置的按鈕可以控制車輛前后左右移動, 點擊按鈕即發(fā)送移動指令, 后臺監(jiān)測系統(tǒng)收到前端APP 發(fā)來的指令后, 進行解析, 消息Head 部分解析出目的地JID 信息, 然后將Body 部分封裝成一個新的消息, 將該消息轉(zhuǎn)發(fā)給JID 對應(yīng)的車機系統(tǒng), 車機系統(tǒng)開始控制車輛移動, 用戶松開按鈕即發(fā)送停止命令, 然后經(jīng)過后臺系統(tǒng)轉(zhuǎn)發(fā)個車機系統(tǒng)控制車輛停止.
圖7 車外泊車效果圖
下拉主頁進行刷新, 此時會觸發(fā)APP 后臺會發(fā)送一條狀態(tài)查詢指令, 查詢的狀態(tài)包括車內(nèi)溫度, 空調(diào)開關(guān), 車門開關(guān), 車的剩余電量, 胎溫胎壓, 車輛是否有故障等.服務(wù)器端收到這條指令后進行MsgType 和MsgHeader 的解析, 然后解析出車機JID, 將該指令重新封裝成XMPP 消息發(fā)送給對應(yīng)的車機, 車機解析出指令, 然后通過CAN 把指令發(fā)給對應(yīng)的XCU, 通過對應(yīng)的XCU 收集到需要的狀態(tài), 然后把該狀態(tài)封裝成XMPP消息回復(fù)給對應(yīng)的服務(wù)器, 再有服務(wù)器轉(zhuǎn)發(fā)給對應(yīng)的手機JID, 然后手機端會根據(jù)返回的狀態(tài)在界面上進行顯示, 如圖5 所示, 如果車有故障, 在圖5 的“我的汽車”界面右上角的角標會亮紅色, 并且顯示故障的數(shù)量,然后點擊該紅色角標會顯示具體的故障信息.
圖8 車輛召喚功能實現(xiàn)頁面
本文設(shè)計和實現(xiàn)的車輛遠程控制APP, 方便用戶隨時隨地的查看自己車輛狀態(tài)信息.針對該APP 的功能進行場景需求分析, 主要講述Android 系統(tǒng)手機端APP 的設(shè)計以及各個功能的具體實現(xiàn).最后該APP 完成了真實的車輛控制原型系統(tǒng), 配合車機系統(tǒng)投入到實際的應(yīng)用當(dāng)中, 為用戶提供了方便, 提高新能源車的使用體驗.