周進波,張 磊,張 敏,袁欽鵬
(上海理工大學 光電信息與計算機工程學院,上海 200093)
Android是Google開發的一款基于Linux的開源手機系統,由于其完全開放的特點,Android開發群體和用戶越來越多,逐漸成為市場份額最大的智能手機操作系統。除了在移動通信方面,Android系統已經應用到其它電子領域,如平板電腦、手持設備等。設備間的數據傳輸方式主要包括USB 傳輸、紅外傳輸、藍牙傳輸,USB 傳輸速度快、即插即用、便于擴展,Android 系統從SDK3.1 平臺開始引入ADK(accessory development kit),使不支持USB Host功能的Android設備可以與其它USB設備通信。紅外傳輸是一種無線通信技術,因為傳輸距離較短、易受干擾,現在更多使用藍牙作為無線傳輸[1],藍牙傳輸方便穩定。Android系統同時支持藍牙通信,通過對Android系統的藍牙開發研究,對藍牙、單片機編程,以實現與單片機通信。
Android系統控制單片機步進電機系統結構圖如圖1所示。首先由Android系統提供的藍牙API接口,編寫應用程序,實現藍牙設備的基本操作,設備連接正常后,通過Bluetoothsocket實現數據的輸入、輸出。單片機藍牙模塊接到數據命令后,調用單片機控制程序,控制步進電機的加速、減速、轉向。

圖1 系統結構框圖Fig.1 Block diagram of system structure
Android系統從2.0開始支持藍牙,使用了BlueZ協議棧,BlueZ通過DBUS來通信交互的。BlueZ是Linux內核的官方藍牙協議棧,目前在較高Linux內核版本中已有支持,也是目前應用最廣泛的藍牙協議棧,幾乎支持所有已通過認證的藍牙設備。該協議棧由多個相對獨立的模塊組成,內核空間主要包括設備驅動層(藍牙的設備驅動一般是指電源的開關驅動以及通信接口的驅動,如串口、USB 等)、L2CAP層與SCO 音頻層、RFCOMM、藍牙核心及HCI層、BNEP、CMTP層與HIDP層、通用藍牙SDP庫和后臺服務及面向所有層的標準套接字接口。Android提供Bluetooth通信的API是BlueZ的RFCOMM 的封裝,RFCOMM 層支持標準的套接口,并提供了串行仿真TTY 接口,這使串行端口應用程序和協議可以不加更改地運行在藍牙設備上[2-4]。藍牙應用程序設計主要包括:藍牙打開、藍牙查找、藍牙連接、數據通信等四個模塊[5-6],流程圖如圖2所示。Android系統為藍牙開發提供了API,其中最主要的幾個類包括:
BluetoothDevice:藍牙設備類,包括藍牙設備的名稱、MAC地址等信息。
Bluetoothsocket:藍牙套接字的接口類,藍牙設備間數據輸入輸出的連接點。
BluetoothAdapter:藍牙適配器類,所有藍牙設備交互的接口,包括查找、綁定、監聽其它設備。通過調用上面幾個基本類中的方法可以實現藍牙設備的基本操作。

圖2 藍牙通信流程圖Fig.2 Flowchart of bluetooth communication process
首先獲取藍牙適配器,通過方法GetDefaultAdapter(),返回本地BluetoothAdpter,通過該對象就可以操作藍牙設備了,如果返回為空,則啟動藍牙失敗,需要檢測設備藍牙模塊是否正常工作。然后判斷藍牙是否打開,如果藍牙處于disable狀態,則需要封裝ACTION_REQUEST_ENABLED 到intent對象,通過startActivityForResult()方法調用intent對象打開藍牙。
獲得藍牙設備包括新掃描的設備和已經綁定的設備,程序先要注冊一個ACTION_FOUND 動作的廣播,調用startDiscovery()方法,每次發現一個設備,系統就廣播一次,將設備的信息包括設備名、設備mac加入設備列表;調用getBondedDevices()方法得到已綁定的設備數量,依次加入到設備列表。因為在整個掃描過程要持續12s左右,占用一定系統資源,在設備連接之前,程序要調用cancelDiscovery()方法取消設備查找,減少資源浪費。
藍牙支持點對點、點對多點的連接方式。作為主設備,Android 系統中,一個從設備擁有一個RFECOMM 信道,只有當主從設備同時在一個信道上,調用 Bluetoothdevice 類中的createRfcommSocketToServiceRecord(UUID)方法(UUID 為識別碼),獲取Bluetoothsocket后才能建立連接。連接多個設備時,應用程序需要建立一個服務器端口Bluetoothserversocket,調用accept()方法監聽其它設備請求,當有請求發出后,將已經連接的Bluetoothsocket分配給設備。
設備連接成功后,主從設備擁有同一個Bluetoothsocket,通 過 getInputStream ()、getOutputStream()方法得到數據流,然后調用write()、read()方法寫入或者讀出數據,對于復雜的數據傳送可能出現堵塞情況,需要單獨建立一個線程實現。
至此整個應用程序設計完成,圖3為應用程序運行界面、測試結果圖。
步進電機是一種將電脈沖轉化為角位移的執行機構。當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數來控制角位移量,達到準確定位的目的;可以通過調整每相通電順序,改變電機轉動方向;可以通過控制脈沖頻率來控制電機轉動的速度,達到調速的目的[7]。設計采用AT89C52單片機作為控制器芯片,ULN2003芯片作為脈沖驅動芯片,藍牙串口模塊采用HC-06,步進電機采用M35SP-9四相電機,具有調速、調向的功能,數據接收、發送采用查詢的方式[8],程序流程如圖4所示。應用程序發送控制命令,單片機接收后調用對應的命令子程序,最后返回當前運行狀態給應用程序。

圖3 應用程序運行效果圖Fig.3 Running effect of application program

圖4 程序流程圖Fig.4 Program flowchart
Android系統的應用越來越廣泛,其中藍牙是一種主要的數據傳輸方式,通過對Android系統藍牙編程,完成了應用程序界面編寫及單片機步進電機驅動程序設計,實現了Android系統與單片機之間的藍牙通信。實踐表明,該通信方式數據傳輸穩定、控制精度高,對Android系統的應用具有積極的指導意義。
[1] 鄔正義,范 瑜,徐惠鋼.現代無線通信技術[M].北京:高等教育出版社,2006:342-343.
[2] 郭宏志.Android應用開發詳解[M].北京:電子工業出版社,2010:173-175.
[3] 楊文志.Google Android程序設計指南[M].北京:電子工業出版社,2009:210-212.
[4] 李黎國,張 輝,程 號.基于Android健康服務終端藍牙傳輸軟件的設計[J].電子科技,2012,25(5):115-118.
[5] MILIER B A.藍牙核心技術[M].北京:機械工業出版社,2001:180-182.
[6] 朱 剛,談振輝,周賢偉.藍牙技術原理與協議[M].北京:北方交通大學出版社,2002:200-201.
[7] 胡虔生,胡敏強.電機學[M].北京:中國電力出版社,2009:145-146.
[8] 陳貴銀.單片機原理及接口技術[M].北京:電子工業出版社,2011:98-100.