摘 要:伴隨信息家電概念的提出和Android手機使用日益普遍,利用Android手機操控傳統家電這一想法的提出與實現將具有十分重要的意義。本文給出了通過wifi無線網絡建立家電電腦控制網關、Android手機和紅外發射裝置的局域網絡,利用Socket編程傳輸指令信息,從而搭建起家電紅外控制網絡的實現方式,并對一些關鍵技術進行了闡述。
關鍵詞:Android;家電;wifi;socket編程;紅外
中圖分類號:TP273.5 文獻標識碼:A 文章編號:1674-7712 (2013) 18-0000-03
鑒于當前通信技術和網絡技術蓬勃發展,家用電器的集中控制和遠程調控的實現成為了可能。在這個追求高速、便捷的時代,人們迫切地想要有新的生活方式。信息家電(Information Appliance)新概念的提出更是將這種渴望推向極致,使得我們有了實質性的目標需求。一些如何將現代通信技術融入到傳統家用電器的設想和嘗試層出不窮。由于目前家電在制造和消費中存在著種種阻力,我們認為不改造現有的家電結構的新型控制方式更容易被接受,更市場前景。
另外,一場移動設備的革命也已悄然開啟。不同種類的移動智能終端相繼問世,Android、IOS、WP等平臺的移動手持已經深入到我們的生活中,移動手機的使用量讓個人電腦望塵莫及,人們已經離不開了手機。這樣一來,通過手機集中控制家用電器的方式就成了一個不錯的選擇。本文即將展開的是Android操作系統手機作為控制端的設計方式。
一、系統的總體設計
此系統的設計思路是,由個人計算機、無線路由器、Android操作系統手機、wifi紅外全向控制器(BULLET公司的產品)、家用電器進行雙層組網,在所組成的局域網中傳遞控制信息,進而驅使控制器發射紅外控制信號,形成有效的紅外控制網。
現在人們的生活水平不斷提高,家中遍布了各式各樣的家用電器。由于紅外線的波長較短,對障礙物的衍射能力差,適合應用在需要短距離無線通訊的場合進行點對點的直線數據傳輸。[1]此時對處在不同房間的空調、電視、風扇等家電的控制就不那么容易了。單個紅外發射點不能到達各個房間區域,因此我們需要在每個房間放置一個紅外控制器,這就使用到了控制器的STA工作站模式。
這種方式的建立需要利用無線路由器作為熱點,將wifi控制器、手機接入,構成了一個局域網。其IP、默認網關等參數由路由器設置決定,圖1只是給出了一個例子。家庭里的路由器一般是家庭為接入寬帶就配備的,所以家庭電腦也接入了這個局域網。現在我們可以在家庭電腦創建一個家電控制網關,用于手機接入控制網的權限鑒定和作為終端控制家電。這些功能的實現都基于SOCKET套接字的TCP連接。
圖1 系統設計示意圖
手機通過家庭控制網關的鑒定后,即可訪問控制點進行家電控制,控制信息不需經過電腦網關。比如,想控制空調1,手機發送密碼至電腦進行鑒權,取得權限后手機直接和WIFI紅外控制器交換信息,通過控制器的紅外信號操作空調1。這樣的處理方式的好處是:
(1)不需電腦網關對控制信息處理,節約電腦的資源;
(2)減少控制信息流向通道,提高控制信息送達率;
到這里,我們搭建起了一張家庭局域網和一個紅外線網絡,只要紅外控制器放置合理,就可以在家中的任何地方控制到任何帶紅外控制方式的家電。
手機或電腦通關局域網和控制器建立起Socket套接字TCP連接,實現控制信息的傳輸。控制器會對接收到的控制信息進行解析,判斷應發送何種信號。控制器配備紅外接收學習接口,可以直接從家用電器的遙控器中學習市面上大部分家用電器的紅外控制碼,特別是日本的空調超長碼,不需要我們去解析種類繁多的紅外標準。這使得控制器的紅外信號能像遙控器的一樣方便有效地控制相關家電。當然控制器也有自己的協議標準,這在下面軟件設計再作介紹。
二、電腦控制網關軟件設計
這里的網關就是一個運行在Windows系統上的程序,借助微軟系統強大的軟件接口和電腦硬件資源,完成我們所需的功能,使得開發更簡單快捷。
本方案中在VC6.0環境中采用C++語言MFC編程開發網關軟件,其關鍵技術為Socket套接字編程。此設計中我們采用了微軟的winsoc規范。微軟的Windows Socket(簡稱winsoc)規范是對Berkley的套接字規范進行擴展,利用標準的socket方法,可以同任何平臺上的Socket進行通訊;利用其擴展,可以更有效地實現在Windows平臺上計算機間的通信。[2]
網關軟件的一個示例操作界面,如圖2:
圖2 網關軟件界面
點擊“允許手機接入”按鈕,創建獨立線程,開啟socket服務器端程序,用于驗證手機發送來的密碼,返回控制信息,允許或拒絕手機接入控制網。部分代碼如下:
void CDeviceCtrlDlg::OnBtnMobileAcess(){ //創建手機密碼驗證程序線程
m_BtnMobileAcess.EnableWindow(FALSE);
CreateThread(NULL,0,AcessServer,NULL,0,NULL);}
網關密碼驗證Socket服務器端程序編寫步驟如下:
(1)WSADATA m_WSADATA;
WSAStartup(MAKEWORD(2,2),m_WSADATA);// 加載套接字庫,創建套接字
(2)bind(Listening,(SOCKADDR *)ServerAddr,sizeof(ServerAddr));// 綁定IP端口:
(3)listen(Listening,5)// 監聽連接請求
(4)accept(Listening,(SOCKADDR*)ClientAddr,ClientAddrLen);// 接收連接請求:
(5)和客戶端通信:
接收:recv(NewConnec,buf,MSG_LENGTH,0)
發送:send(NewConnec,buf1, static_cast
(6)返回,等待另一連接請求
(7)closesocket(Listening);
closesocket(NewConnec);
WSACleanup()//關閉套接字:
流程圖如圖3。
圖3 網關密碼驗證程序流程
設置wifi控制器IP,點擊“連接設備按鈕”,在電腦和控制器之間建立SOCKET套接字TCP連接,激活示例【電風扇控制器】欄的按鈕,點擊相關按鈕即可發送指令,使控制器發送紅外信號控制電風扇。這些指令需要符合控制器的協議,為6字節的16進制數,如表1:
表1 指令表
操作碼操作碼發送碼發送地址預留檢驗和(后三位異或和)
50fa01??00??
相對服務器端,客戶端的SOCKET編寫流程較為簡單,具體如下:
(1)WSADATA wsaData;
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP ); //加載套接字庫,創建套接字
(2)connect(m_sSocket, (LPSOCKADDR)server, sizeof(SOCKADDR));// 向服務器發起連接請求
(3)和服務器通信:
接收:recv(m_sSocket, buf, len, 0);
發送:send(m_sSocket, buf, len, 0);
(4)CloseServer();
WSACleanup();//關閉套接字,釋放資源
流程圖如圖4。
圖4 控制指令發送流程
三、Android手機平臺終端設計
(一)Android的體系框架
2007年11月,Google公司牽頭組建了開放手機聯盟(Open Handset Alliance),隨后發布Android這一款針對手機的全新開源軟件工具包,引領了一次手機大變革。Android的體系結構由應用層、應用框架層、系統運行庫層、Linux內核層4部分組成。
在開發Android應用程序時我們是通過應用程序框架來與Android底層進行交互。應用程序包含了4個重要組件,分別為:
(1)Acitivities:表示程序的顯示界面,每個Activities擁有自己的生命周期;
(2)Intent:用于多個應用程序之間的跳轉調用;
(3)Services:這個組件好比如一個沒有界面的Activities程序,在后臺運行;
(4)Content Provider:在不同程序之間的數據共享由它來協助完成。
(二)Android開發環境的搭建
Android應用程序以JAVA作為開發語言,Google提供了Android SDK開發平臺,跟JAVA的JDK很相似,為開發提供了極大的方便。同時我們可以在eclipse開發環境中進行開發,其中的好處在開發JAVA程序時能夠深刻體會到。下面介紹WINDOWS XP/WINDOWS 7下的開發環境搭建。
(1)下載安裝JDK和配置JAVA開發環境變量
Eclipse是基于JAVA語言編寫的,它的運行需要JRE支持,所以我們需要下載安裝適用于WINDOWS XP/WINDOWS 7的最新JDK。然后為了操作系統能正確找到JRE,必須進行JDK環境變量的配置;
(2)下載安裝Android SDK和配置環境變量
SDK軟件包可以從http://developer.android.com/index.html直接下載,下載來的SDK以壓縮包形式保存,用戶直接解壓到某個存儲區間即可。SDK是開發各種版本Android應用程序的基礎,跟JDK一樣,我們要在WINDOWS的PATH目錄下為SDK配置環境變量。
(3)安裝Eclipse、ADT插件
有了JRE運行時環境的支持,就可以www.eclipse.org上下載合適的eclipse版本,同樣直接將其一個文件夾即可。接下來啟動Eclipse,選擇工作區,選擇HelpInstall New Software,在出現的文本框輸入地址https://dl-ssl.google.com/android/eclipse/,選擇ADT插件進行下載,eclipse會自動安裝插件,完成之后重啟eclipse。最后選擇WindowsPreferencesAndroid命令,在打開的界面中選擇Android SDK所在主目錄完成最后配置。
經過以上3個步驟,Android開發環境的搭建就已經完成,可以在Eclipse新建Android project了。從Android1.5開始就引入了AVD(ANDROID VIRTUAL DEVICE)概念。[3]AVD是一個模擬器,可以配置模擬器的界面大小和Android版本。在調試運行Android應用程序時,eclipse會自動運行,使得用戶可以脫離真機環境進行開發調試應用程序。
(三)手機終端應用程序終端設計
下面以本設計的Android應用程序來說明應用程序開發的流程。
(1)新建Android Project新項目:FileNewProject菜單,選擇Android Project選項創建;
(2)填寫項目文件夾名稱、應用程序名稱、包名、Activities程序名稱、最低的SDK版本;
(3)點擊Finish按鈕,完成新建任務,eclipse自動生成代碼模板。
接下打開Android項目layout文件夾中的mian.xml文件進行應用界面設計,在這里我們使用是LinearLayout、FrameLayout兩個布局管理器進行界面排版,將圖片按鈕、文本顯示組件、編輯框等排版如圖5、圖6所示。這兩個界面對應著兩個**.xml文件。
圖5 密碼驗證界面
圖6 風扇控制界面
經過界面編輯器排版完成后,應該為按鈕設置監聽器,添加觸控事件,實現人機交互,這些工作要在Android的JAVA文件中實現。部分代碼如下:
public class FanActivity extends Activity {
private ImageButton kaiguan = 1;
…//變量聲明
Protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fan_main);
this.kaiguan = (ImageButton) super.findViewById(R.id.kaiguan);
….
this.kaiguan.setOnClickListener(new ClickEventImp());//設置監聽事件}
class ClickEventImp implements View.OnClickListener {
public void onClick(View v) {
…//事件處理}
在圖5顯示的界面是為手機和電腦網關進行密碼驗證而設計的,在編輯框輸入電腦IP和密碼,然后點擊確定按鈕就會向運行在電腦上的服務器端發起連接和發送數據進行驗證。圖6是為手機向wifi控制器發送控制指令而設計的,點擊其中的任意一個按鈕,都會向控制器發起連接,發送數據。兩者都是一個SOCKET編程的客戶端程序。
值得注意的是,Android應用程序用JAVA語言編寫,而電腦上運行的網關控制軟件是在C++環境中編寫的,兩者在進行通信時需要處理好以下四個問題:
(1)JAVA和C的數據類型存儲的字節數不同,如long型,JAVA以8字節存儲;C以4字節存儲,在通信前要進行數據類型轉換;
(2)Socket是按字節傳輸數據,JAVA中只有byte是一個字節,應將其他類型都轉換為byte數組存儲再用于通信傳送;
(3)雖然JAVA的byte類型和C的unsigned char都是一字節存儲,但C的unsigned char取值范圍是0--255,JAVA的byte類型取值為-128—127。處理C語言的字符串時,JAVA需要進行轉換來解讀C語言的unsigned char;
(4)對于超過一字節的類型數據,高低字節傳輸次序也是一個值得注意的問題。intel系列采用的是高字節在后傳輸,而motorola系列采用的是高字節在前傳輸。
解決好以上幾點才能保證通信過程中不出現亂碼,提高信息解析效率和正確率,所以必須在Android客戶端根據上述4點情況編寫一個數據轉換類來幫助解決問題。
四、結束語
本設計實現了Android手機系統、電腦網關和wifi紅外控制器之間通信連接,達到了利用wifi紅外控制器發射紅外信號控制家電的目的。該系統的創新點在于通過普通家庭就具備的wifi網絡,結合當前流行的Android手機,既不必改造傳統家電的設計,又能方便地控制日常家庭環境中不同區域的家用電器。該方案的實施費用不高,可以廣泛應用于智能家電的控制。另外也賦予了智能手機新的應用方向,為智能家居的發展提供了一條新穎的實現途徑。
參考文獻:
[1]劉驪,陳瑋.PDA遙控紅外家電設備初探[J].紅外技術(Infrared Technology),2004,26,2:P7.
[2]李現凡,高建榮.基于SOCKET編程接口的局域網即時通信系統的開發實現[J].常州輕工職業技術學院學報,2006,12(4):P14.
[3]楊豐盛.Android應用開發揭秘[M].北京:機械工業出版社,2010:P18.
[作者簡介]林銳文(1990.05-),男,廣東揭陽人,廣東工業大學,學生,學士,研究方向:樓宇智能化。