馮益斌


摘 要: 近年來(lái)搭載Android系統(tǒng)的智能可穿戴設(shè)備發(fā)展迅速,藍(lán)牙通信技術(shù)廣泛地應(yīng)用在智能可穿戴設(shè)備中,使其能與手機(jī)之間相互通信,實(shí)現(xiàn)圖片、視頻、文件等數(shù)據(jù)傳送功能。研究基于Android系統(tǒng)的藍(lán)牙遠(yuǎn)程控制功能,通過(guò)建立的藍(lán)牙連接,實(shí)現(xiàn)智能手表與手機(jī)之間的數(shù)據(jù)傳送,為了保障數(shù)據(jù)的安全性,對(duì)傳送的數(shù)據(jù)進(jìn)行了混合加密。應(yīng)用程序運(yùn)行在搭載Android系統(tǒng)的GEAR智能手表和手機(jī)上,實(shí)現(xiàn)了通過(guò)GEAR手表實(shí)時(shí)預(yù)覽手機(jī)攝像頭采集到的圖像,并且遠(yuǎn)程控制手機(jī)拍攝照片的功能。
關(guān)鍵詞: 遠(yuǎn)程控制; 藍(lán)牙; Android; 混合加密
中圖分類號(hào): TN92?34; TM417 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)05?0089?04
0 引 言
基于藍(lán)牙的遠(yuǎn)程控制功能能夠使智能可穿戴設(shè)備更好地與手機(jī)相互配合起來(lái)。本文實(shí)現(xiàn)的遠(yuǎn)程控制功能應(yīng)用于搭載Android系統(tǒng)的三星Gear智能手表與手機(jī)之間,通過(guò)發(fā)送自定義的藍(lán)牙數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了對(duì)控制信息和數(shù)據(jù)信息的區(qū)分,能夠識(shí)別控制信息的類型,應(yīng)用于Gear手表與手機(jī)之間,通過(guò)相互連接之后,Gear手表能夠?qū)崟r(shí)預(yù)覽手機(jī)攝像頭獲取的數(shù)據(jù),并且能夠控制手機(jī)進(jìn)行拍照。
然而考慮到安全性問(wèn)題,藍(lán)牙數(shù)據(jù)在傳送的過(guò)程中容易被竊取[1],這將對(duì)用戶的隱私造成極大的威脅。因此,對(duì)藍(lán)牙數(shù)據(jù)進(jìn)行加密也是尤為重要的。通過(guò)對(duì)加密算法的分析與研究,本文采用了混合加密算法。對(duì)于智能可穿戴設(shè)備這一類運(yùn)算能力不是很強(qiáng)的設(shè)備,加密速度尤為重要,RC4加密算法在流加密上的優(yōu)勢(shì),能夠滿足應(yīng)用的需求,然而其安全性并不是最好,通過(guò)截獲的數(shù)據(jù)容易分析出加密的秘鑰。因此采用RSA非對(duì)稱加密算法對(duì)RC4秘鑰進(jìn)行再一次的加密,由于秘鑰信息比較短,加密算法的復(fù)雜度對(duì)加密速度的影響比較小,采用RSA安全度高的算法來(lái)保證RC4秘鑰信息不被直接讀取到更加重要[2]。
1 功能模塊劃分
Android應(yīng)用程序由四大基本組件Activity,Service 服務(wù),Content Provider內(nèi)容提供者和BroadcastReceiver 廣播接收器組成。四大組件通過(guò)相互之間的配合、數(shù)據(jù)傳送,實(shí)現(xiàn)了應(yīng)用程序的功能,完成了用戶與系統(tǒng)之間的交互,滿足了用戶的實(shí)際需求[3]。
基于藍(lán)牙的遠(yuǎn)程控制功能研究是為了使搭載Android系統(tǒng)的智能可穿戴設(shè)備與手機(jī)之間實(shí)現(xiàn)遠(yuǎn)程控制的功能。本研究要求創(chuàng)建Android應(yīng)用程序,實(shí)現(xiàn)智能手表遠(yuǎn)程控制手機(jī)拍攝照片的功能。深入分析了基于藍(lán)牙的遠(yuǎn)程控制功能的主要內(nèi)容,將研究的內(nèi)容劃分為以下3大模塊[4]:
(1) 藍(lán)牙通信模塊:通過(guò)對(duì)Android系統(tǒng)藍(lán)牙模塊的分析,調(diào)用AndroidSDK中的接口函數(shù),實(shí)現(xiàn)了設(shè)備之間通過(guò)藍(lán)牙協(xié)議來(lái)建立數(shù)據(jù)的連接,并且實(shí)現(xiàn)數(shù)據(jù)傳送的功能[5]。
(2) 遠(yuǎn)程控制模塊:此模塊通過(guò)定義的數(shù)據(jù)包頭來(lái)區(qū)分發(fā)送數(shù)據(jù)的類型是數(shù)據(jù)信息還是控制信息,使得Android設(shè)備之間可以通過(guò)傳送數(shù)據(jù)信息和控制信息兩種信息類型,從而實(shí)現(xiàn)了基于藍(lán)牙的遠(yuǎn)程控制功能。
(3) 數(shù)據(jù)加密模塊:此模塊實(shí)現(xiàn)了RC4加密算法與RSA加密算法相結(jié)合的混合加密算法,應(yīng)用于基于藍(lán)牙的遠(yuǎn)程控制功能,保護(hù)了數(shù)據(jù)傳送的安全性。在3大模塊的基礎(chǔ)上,最終設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)運(yùn)行在Android系統(tǒng)上的應(yīng)用程序。應(yīng)用程序運(yùn)行在GEAR手表和Android手機(jī)上,實(shí)現(xiàn)了手表與手機(jī)之間藍(lán)牙連接的建立,完成了通過(guò)遠(yuǎn)程控制來(lái)拍攝照片的功能。
2 藍(lán)牙通信模塊設(shè)計(jì)與實(shí)現(xiàn)
2.1 藍(lán)牙協(xié)議數(shù)據(jù)傳輸
完整的藍(lán)牙協(xié)議棧根據(jù)各協(xié)議所處的位置可分三大類,分別是底層協(xié)議、中間層協(xié)議和高層協(xié)議。
藍(lán)牙底層協(xié)議實(shí)現(xiàn)了傳輸鏈路的建立,用于傳送藍(lán)牙信息數(shù)據(jù)流,是藍(lán)牙協(xié)議體系的基礎(chǔ)。藍(lán)牙底層協(xié)議包括藍(lán)牙射頻協(xié)議(RadioFrequencyProtocol)、鏈路管理協(xié)議(LinkManagerProtocol,LMP)、藍(lán)牙基帶協(xié)議(BaseBandProtocol)和主機(jī)控制器接口協(xié)議(HostControllerInterfaceProtocol,HCI)。藍(lán)牙射頻協(xié)議決定了藍(lán)牙通信的技術(shù)特點(diǎn),使藍(lán)牙工作在免許可的2.4 GHz ISM頻段。藍(lán)牙基帶協(xié)議在藍(lán)牙協(xié)議棧中位于藍(lán)牙射頻層之上,是設(shè)備之間通過(guò)藍(lán)牙協(xié)議通信的關(guān)鍵程序,定義了微微網(wǎng)的創(chuàng)建過(guò)程以及如何通過(guò)藍(lán)牙相連接。
藍(lán)牙中間層協(xié)議的主要功能是數(shù)據(jù)幀的分解與重組、組提取、服務(wù)質(zhì)量控制等。中間層協(xié)議為上層應(yīng)用程序提供服務(wù),提供底層協(xié)議的接口。
藍(lán)牙高層協(xié)議包括對(duì)象交換協(xié)議(ObjectExchangeProtocol,OBEX)和無(wú)線應(yīng)用協(xié)議(WirelessApplicationProtocol,WAP)。對(duì)象交換協(xié)議屬于會(huì)話層協(xié)議,由紅外數(shù)據(jù)協(xié)會(huì)制定,主要用于紅外數(shù)據(jù)鏈路中數(shù)據(jù)對(duì)象的交換。使得基于紅外鏈路的應(yīng)用程序能夠方便地移植到藍(lán)牙協(xié)議上。
2.2 藍(lán)牙功能接口概述
通過(guò)調(diào)用藍(lán)牙協(xié)議棧接口,編寫(xiě)應(yīng)用程序,從而實(shí)現(xiàn)藍(lán)牙通信功能,使得應(yīng)用程序能夠?qū)崿F(xiàn)藍(lán)牙設(shè)備的搜索、請(qǐng)求藍(lán)牙配對(duì)、建立RFCOMM通道、與其他設(shè)備相連接的功能。調(diào)用AndroidSDK提供的應(yīng)用編程接口,可以實(shí)現(xiàn)藍(lán)牙通信的基本功能,功能主要分為以下6大類:搜索藍(lán)牙設(shè)備;查詢本地藍(lán)牙適配器配對(duì)的藍(lán)牙設(shè)備;建立RFCOMM通道;通過(guò)服務(wù)發(fā)現(xiàn)并連接到其他設(shè)備;與其他設(shè)備之間傳輸數(shù)據(jù);管理多個(gè)連接[6]。
2.3 藍(lán)牙通信模塊的實(shí)現(xiàn)
通過(guò)對(duì)藍(lán)牙協(xié)議棧的分析,掌握了藍(lán)牙協(xié)議棧中各協(xié)議的主要功能,掌握了數(shù)據(jù)在藍(lán)牙通信過(guò)程中的傳送過(guò)程以及設(shè)備之間建立藍(lán)牙連接的完整步驟。通過(guò)對(duì)Android系統(tǒng)SDK提供的藍(lán)牙協(xié)議棧接口的學(xué)習(xí),掌握了基于Android系統(tǒng)開(kāi)發(fā)藍(lán)牙通信模塊的基本步驟和實(shí)現(xiàn)方法。Android系統(tǒng)中藍(lán)牙通信模塊的實(shí)現(xiàn)主要包括4大部分:本機(jī)藍(lán)牙模塊的配置、藍(lán)牙設(shè)備的搜索、藍(lán)牙設(shè)備連接的建立和藍(lán)牙設(shè)備通信的實(shí)現(xiàn)。
2.3.1 本機(jī)藍(lán)牙模塊的配置
AndroidSDK提供了一個(gè)核心類BluetoothAdapter,通過(guò)創(chuàng)建BluetoothAdapter實(shí)例對(duì)象來(lái)配置本機(jī)藍(lán)牙模塊的相關(guān)屬性,在程序中的實(shí)現(xiàn)如下:
//實(shí)例化系統(tǒng) BluetoothAdapter 對(duì)象
BluetoothAdapter mAdapter = Bluetooth Adapter. get DefaultAdapter();
//直接打開(kāi)系統(tǒng)的藍(lán)牙設(shè)置面板
Intent intent = new Intent (BluetoothAdapter.ACTION _REQUEST_ENABLE);
startActivityForResult(intent, 0x1);
2.3.2 藍(lán)牙設(shè)備的搜索
配置了本地的藍(lán)牙屬性,開(kāi)啟藍(lán)牙功能之后,接下來(lái)調(diào)用 BluetoothAdapter. startDiscovery()實(shí)現(xiàn)搜索附近設(shè)備功能。
startDiscovery()方法是一個(gè)異步方法,調(diào)用后會(huì)立即返回。該方法對(duì)附近可見(jiàn)的藍(lán)牙設(shè)備進(jìn)行搜索,該過(guò)程會(huì)持續(xù)12 s。當(dāng)該方法被調(diào)用后,搜索過(guò)程在一個(gè) System Service中完成,當(dāng)搜索到需要連接的藍(lán)牙設(shè)備可以通過(guò)調(diào)用cancelDiscovery()方法來(lái)停止搜索。調(diào)用startDiscovery()方法后,系統(tǒng)開(kāi)始搜索藍(lán)牙設(shè)備,此時(shí)系統(tǒng)會(huì)發(fā)送以下3個(gè)廣播命令:
ACTION_DISCOVERY_START表示開(kāi)始搜索;ACTION_DISCOVERY_FINISHED表示搜索結(jié)束;ACTION_FOUND表示找到設(shè)備。應(yīng)用程序?qū)⑺阉鞯降乃{(lán)牙設(shè)備以列表的形式展示給用戶,供用戶選擇。
2.3.3 藍(lán)牙設(shè)備連接的建立
藍(lán)牙設(shè)備連接的建立,是以服務(wù)器端與客戶端的機(jī)制來(lái)實(shí)現(xiàn)的。兩個(gè)藍(lán)牙設(shè)備在同一個(gè)RFCOMMchannel下分別獲得一個(gè)連接的BluetoothSocket,便可建立藍(lán)牙設(shè)備的通信連接。客戶端向?qū)嵗膁evice發(fā)出建立連接的請(qǐng)求,即通過(guò)createRfcommSocketTo ServiceRecord()方法來(lái)請(qǐng)求建立一個(gè)連接,當(dāng)連接創(chuàng)建成功后,返回一個(gè)BluetoothSocket類型數(shù)據(jù):
BluetoothSocket mSocket = device. createRfcommSocketTo ServiceRecord(MY_UUID_SECURE);
服務(wù)器端通過(guò)UUID創(chuàng)建BluetoothServerSocket來(lái)接收來(lái)自其他設(shè)備的連接請(qǐng)求:
BluetoothServerSocket mServerSocket=mAdapter.listen UsingWithServiceRecord(NAME_SECURE, UUIDE);
當(dāng)接收到藍(lán)牙設(shè)備的連接請(qǐng)求時(shí),調(diào)用mServerSocket的accept()方法,實(shí)現(xiàn)服務(wù)器端BluetoothSocket的初始化。
2.3.4 藍(lán)牙設(shè)備通信的實(shí)現(xiàn)
已經(jīng)建立了藍(lán)牙連接的Android設(shè)備通過(guò)調(diào)用BluetoothSocket的getInputStream()方法來(lái)獲得輸入流,調(diào)用getOutputStream()方法獲得輸出流。輸入流用于接收已連接的藍(lán)牙設(shè)備發(fā)送過(guò)來(lái)的數(shù)據(jù),從輸入流中讀取數(shù)據(jù),即可實(shí)現(xiàn)數(shù)據(jù)的接收。輸出流用來(lái)發(fā)送數(shù)據(jù)到已連接的藍(lán)牙設(shè)備上,向輸出流寫(xiě)數(shù)據(jù),即可實(shí)現(xiàn)數(shù)據(jù)的發(fā)送。數(shù)據(jù)的發(fā)送和接收過(guò)程如圖1所示。
3 遠(yuǎn)程控制模塊的研究與實(shí)現(xiàn)
3.1 遠(yuǎn)程控制功能研究
Android系統(tǒng)中,藍(lán)牙協(xié)議棧在AndroidSDK中實(shí)現(xiàn),藍(lán)牙數(shù)據(jù)底層解析的過(guò)程是應(yīng)用程序不可見(jiàn)的。對(duì)于兩個(gè)通過(guò)藍(lán)牙協(xié)議連接的智能設(shè)備,運(yùn)行在手表端和手機(jī)端的應(yīng)用程序,僅能夠?qū)斎肓骱洼敵隽鬟M(jìn)行操作,向輸出流寫(xiě)數(shù)據(jù)便能夠?qū)崿F(xiàn)數(shù)據(jù)的發(fā)送,從輸入流中讀數(shù)據(jù)便能夠?qū)崿F(xiàn)數(shù)據(jù)的接收。
3.2 數(shù)據(jù)結(jié)構(gòu)定義
通過(guò)分析設(shè)定包頭的大小為1 B,包頭的數(shù)值范圍為0~255,最多能夠表示256種不同的數(shù)據(jù)類型,此應(yīng)用程序的數(shù)據(jù)類型有兩種,即數(shù)據(jù)信息和控制信息,因此可以選取0和1分別表示。其余的數(shù)值表示,可用于程序的擴(kuò)展,當(dāng)所要區(qū)分的數(shù)據(jù)類型增多后,可使用保留的數(shù)值來(lái)表示。對(duì)于本應(yīng)用程序用數(shù)值0來(lái)表示普通數(shù)據(jù)信息,數(shù)值1表示控制信息。
確定了數(shù)據(jù)包頭的數(shù)據(jù)大小,以及各數(shù)據(jù)類型的表示后,定義一個(gè)發(fā)送數(shù)據(jù)的結(jié)構(gòu),管理發(fā)送和接收的數(shù)據(jù),定義的數(shù)據(jù)結(jié)構(gòu)如下:
class SendData
{ //定義字節(jié)類型的control包頭 public byte control;
//數(shù)據(jù)部分為字節(jié)數(shù)組 public byte[]; data; }
3.3 遠(yuǎn)程控制功能實(shí)現(xiàn)
設(shè)計(jì)的應(yīng)用程序?qū)⒒贏ndroid的遠(yuǎn)程控制功能應(yīng)用于手機(jī)與智能手表之間,實(shí)現(xiàn)手表控制手機(jī)拍攝照片。在Android應(yīng)用程序中實(shí)現(xiàn)遠(yuǎn)程控制的功能,首先要對(duì)包頭信息進(jìn)行定義。根據(jù)遠(yuǎn)程控制功能的分析以及數(shù)據(jù)結(jié)構(gòu)的定義可知此應(yīng)用程序中發(fā)送信息分為兩類,一類發(fā)送的是圖像的數(shù)據(jù)信息,在Android程序中定義靜態(tài)變量:
Private static final byte DATA=(byte)0;
發(fā)送圖像信息時(shí),用來(lái)對(duì)發(fā)送數(shù)據(jù)結(jié)構(gòu)的包頭進(jìn)行賦值,標(biāo)明發(fā)送的數(shù)據(jù)圖像信息。另一類是拍攝照片的控制信息,在Android程序中定義靜態(tài)變量:
Private static final byte TAKE_PHOTO=(byte)1;
發(fā)送拍攝照片的控制信息時(shí),對(duì)發(fā)送數(shù)據(jù)結(jié)構(gòu)的包頭進(jìn)行賦值,標(biāo)明發(fā)送的數(shù)據(jù)為拍攝照片控制指令。
應(yīng)用程序中,已經(jīng)建立藍(lán)牙連接的兩個(gè)藍(lán)牙設(shè)備,一個(gè)充當(dāng)主控端,另一個(gè)充當(dāng)被控端。被控端發(fā)送的數(shù)據(jù)為攝像頭采集到的圖像信息。
4 數(shù)據(jù)加密解密模塊研究與實(shí)現(xiàn)
4.1 加密解密算法的選擇
本功能模塊采用了混合加密的加密算法,通過(guò)RC4對(duì)原始數(shù)據(jù)進(jìn)行第一次加密,由于RC4加密算法相對(duì)簡(jiǎn)單,安全性上存在著一定的風(fēng)險(xiǎn),而且在傳輸過(guò)程中要傳輸加密數(shù)據(jù)的秘鑰,這將極大地威脅到通信的安全。為了把這種風(fēng)險(xiǎn)降低,采用RSA加密算法進(jìn)行第二次加密,第二次加密的數(shù)據(jù)僅僅是第一次加密算法RC4的秘鑰信息。整個(gè)的加密過(guò)程如圖2所示。
4.2 RC4算法實(shí)現(xiàn)
Android應(yīng)用程序編寫(xiě)使用的是Java語(yǔ)言的軟件開(kāi)發(fā)工具包,即JDK。JDK中提供了對(duì)于加密算法的支持,因此在本應(yīng)用中可以直接調(diào)用JDK提供的RC4加密算法的接口,實(shí)現(xiàn)對(duì)數(shù)據(jù)的加密解密過(guò)程。首先生成秘鑰程序?yàn)椋?/p>
public static Key getKey()
{ Key key = null;
KeyGenerator kg = KeyGenerator.getInstance("RC4");
kg.init(128); //產(chǎn)生秘鑰
key = kg.generateKey(); return key; }
首先通過(guò)KeyGenerator定義秘鑰產(chǎn)生變量kg,通過(guò)getInstance方法構(gòu)造出RC4加密算法的秘鑰產(chǎn)生器。然后初始化秘鑰的大小,init(intkeysize)方法中參數(shù)的數(shù)值指定了秘鑰的長(zhǎng)度。
圖2 加密過(guò)程
4.3 混合加密算法實(shí)現(xiàn)
在程序中,通過(guò)返回字節(jié)數(shù)組的length數(shù)值得到數(shù)據(jù)信息的長(zhǎng)度,長(zhǎng)度信息為int類型的數(shù)值。int類型數(shù)據(jù)占用4 B空間,int轉(zhuǎn)換byte類型的函數(shù)為:
public static byte[] intToBytes(int n)
{ byte[] b = new byte[4];
for(int i = 0;i < 4;i++)
{ b[i] = (byte)(n >> (24- i * 8)); } return b; }
程序中RC4與RSA混合加密過(guò)程的主要程序:
public synchronized void write(byte[] buffer)
{??
byte[] encr= RC4.encrypt(buffer,key_send);
byte[] encodedData=RSAUtils.encryptByPublic Key(key_ send, publicKey);
int sum = intToBytes(encr.length);
byte[] send=new byte[4+encodedData.length+encr.length];
System.arraycopy(sum, 0, send, 0, 4);
System.arraycopy(encodedData, 0, send, 4, 128);
System.arraycopy(encr, 0, send, 132, encr.length);
?? }
首先使用RC4加密算法來(lái)加密數(shù)據(jù)buffer,秘鑰為key_send。然后使用RSA加密算法加密RC4的秘鑰信息key_send。接著,計(jì)算出buffer經(jīng)過(guò)RC4加密后的數(shù)據(jù)長(zhǎng)度。將上述的三部分信息按著定義的結(jié)構(gòu)依次寫(xiě)入欲發(fā)送的字節(jié)數(shù)組send中。最后,將字節(jié)數(shù)組send寫(xiě)入到通過(guò)BluetoothSocket獲得的輸出流中,即可實(shí)現(xiàn)藍(lán)牙數(shù)據(jù)的發(fā)送。
5 藍(lán)牙遠(yuǎn)程控制拍照實(shí)現(xiàn)
藍(lán)牙遠(yuǎn)程控制的相機(jī)拍照程序是基于Android系統(tǒng)的藍(lán)牙遠(yuǎn)程控制研究的一個(gè)實(shí)際應(yīng)用程序。通過(guò)藍(lán)牙通信模塊的實(shí)現(xiàn)、遠(yuǎn)程控制功能模塊的實(shí)現(xiàn)、混合加密算法的實(shí)現(xiàn),將三部分結(jié)合起來(lái),應(yīng)用于遠(yuǎn)程控制照片的拍攝上,實(shí)現(xiàn)了通過(guò)GEAR手表來(lái)控制手機(jī)進(jìn)行照片的拍攝。
6 結(jié) 論
通過(guò)分析國(guó)內(nèi)外基于藍(lán)牙的遠(yuǎn)程通信研究現(xiàn)狀以及發(fā)展趨勢(shì)。對(duì)比多種對(duì)稱加密算法和非對(duì)稱加密算法的優(yōu)勢(shì)和劣勢(shì),最后選擇通過(guò)混合加密算法對(duì)發(fā)送的數(shù)據(jù)進(jìn)行加密和解密。本文完成了藍(lán)牙遠(yuǎn)程控制功能的研究,采用混合加密的方式對(duì)數(shù)據(jù)進(jìn)行加密解密。將藍(lán)牙遠(yuǎn)程控制功能的研究應(yīng)用在拍照程序上,實(shí)現(xiàn)了通過(guò)智能手表遠(yuǎn)程控制手機(jī)拍攝照片的功能。
參考文獻(xiàn)
[1] 趙姍姍,楊臻,徐奉,等.基于Android平臺(tái)的高可靠遠(yuǎn)程控制系統(tǒng)[J].網(wǎng)絡(luò)新媒體技術(shù),2013(7):12?14.
[2] 李忠慧,李秀梅.Android系統(tǒng)的安全分析及策略[J].福建電腦,2013(1):112?113.
[3] 蓋索林,王世江.Google Android開(kāi)發(fā)入門(mén)指南[M].北京:人民郵電出版社,2009:43?55.
[4] 陸繼翔,李映.Android應(yīng)用程序的性能優(yōu)化分析與研究[J].機(jī)械設(shè)計(jì)與制造工程,2013(3):82?85.
[5] 蔡羅成.Android后臺(tái)監(jiān)聽(tīng)實(shí)現(xiàn)機(jī)制淺析[J].信息安全與通信保密,2010(6):39?41.
[6] 浩明.基于安卓系統(tǒng)的手機(jī)防盜設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2014,37(14):36?39.