佘咸寧 許錦標
(廣東工業大學自動化學院,廣東廣州 510006)
智能照明系統應用在智能建筑中,不僅能營造出舒適的生活工作環境,引入現代化的管理方式,而且還能夠節約能源。傳統的智能家居系統,大多采用PC做控制終端,并基于 Internet的遠程控制,受到Internet地域的限制,使用不是很方便。網絡技術的迅猛發展為智能家居提供了強大動力,智能手機作為控制終端已成必然趨勢。本文設計一種將Android操作系統的智能手機作為控制終端的DALI智能照明系統。
數字可尋址照明接口 (DALI,Digital Addressing Lighting Interface)協議是目前照明領域的國際標準協議,也是國際電工委員會的標準(IEC60929)。DALI系統采用主從式結構,系統最多可以連接64個從控模塊,每個從控模塊都擁有一個特定的地址,該地址在系統初始化時設定,使用過程中根據需求可修改從控模塊的地址。從控模塊最多可分為16組 (以組地址區分),每個模塊可以設定16個場景,組地址和場景都可以根據需要設定。主控模塊與從控模塊之間使用兩條信號線通信,數據采集用曼徹斯特編碼方式編碼,信號上升沿表示“1”,下降沿表示“0”,通信速率為1200baud/s。通信的過程中主控模塊使用兩種不同的數據幀格式:發送幀 (主機發送從機)和接收幀 (從機發送到主機)。主控模塊發送信息包括一個起始位,16個數據位 (8位地址和8位指令)以及2個停止位;從控模塊的返回幀包括一個起始位8個數據位以及兩個停止位。
本文設計了一種客戶端/服務器 (C/S)架構的照明控制系統。手機客戶端軟件是在目前比較流行的Android操作系統下開發的。服務器端軟件是Windows系統下的VB6.0開發的。客戶端和服務器端是通過套接字 (Socket)來建立連接。Android系統下應用程序的編程語言是Java,而Java提供了Socket以及 ServerSocket 來實現 Socket[3]通信。Windows系統也提供了Winsock控件[4]來支持Socket通信。同時,VB6.0提供MSComm控件來開發串口通信程序。
整個系統的的設計簡圖如圖1所示。服務器端接收到客戶端發過來控制命令后解析這些命令并調用相應處理程序,然后將控制命令從串口發送出去。RS232-DALI網關接收到從服務器串口發送過來的控制命令后,就會響應從控模塊,整個過程完成了電平的轉換以及控制命令的解析。

圖1 系統整體設計簡圖Fig.1 The overall design of system diagram
客戶端軟件的開發環境是實時最新版本的Eclipse,JDK以及Android SDK也都是實時最新的版本。軟件設計了六個主要控制界面 (如圖2所示)以及一些其他與軟件相關的界面。主界面 (圖2(a))對應一個主Activity,其他五個界面分別對應四個Activity分別實現從控模塊查詢與控制、場景控制與設置、組地址設置、直接命令等功能。這四個Activity都繼承自主Activity。數據的發送和接收函數繼承自主Activity。
主Activity是軟件的主界面如圖2(a)所示,兩個滑動條分別完成直接功率調光和淡光時間設置,滑動條的每一次滑動將觸發一次數據發送的命令,服務器端監聽到控制命令后對發送過來的控制命令進行解析,完成對應地址的從控模塊直接功率調光以及淡光時間的設置。兩個地址選擇框用來設置地址的模式,某個選擇框的選中代表選擇相應地址模式,兩者均未選中表示地址為短地址。地址的選定是通過從文本框手動輸入,最后兩個按鈕實現開燈和關燈的功能。
主界面是進入其他界面的門戶,Android提供專門的菜單鍵,進行菜單設計。軟件設計了兩層菜單,第一層包括軟件設置、工具、高級、幫助四個菜單。設置菜單包含軟件設置、從控模塊設置、退出三個子菜單;工具菜單包含燈光亮度、場景、組;高級只包含直接命令一個子菜單;幫助部分包含軟件的相關信息。Android提供OnCreateOptionMenu進行菜單設計,同時提供了OnOptionItemSelected處理菜單事件。整個軟件的流程如圖3所示。
客戶端與服務器端是通過Socket建立連接,既有數據從客戶端發送到服務器端,也有數據從服務器端返回至客戶端,即DALI協議中的發送幀與接收幀。前面已經提到過Android應用程序采用的編程語言是Java。Java提供了許多關于Socket通信的類和函數,文中客戶端使用了客戶端類Socket以及BufferedWriter和DataInputStream輸入輸出類實現Socket通信。客戶端設計了兩個函數,SendCmd(String cmd)和SendRead(String cmd)。SendCmd的發送單向數據沒有返回幀,SendRead既發送數據同時接收服務器端返回的數據。分別設計兩個函數的原因是因為DataInputStream的readLine方法在沒有數據返回時會造成Socket阻塞。
Java的數據類型與Vb的數據類型存在一定的差異,數據類型的轉換比較復雜。本文統一使用字符串實現客戶端與服務器端的數據交換。將各種發送數據通過特定的符號組合成字符串,經客戶端發送給服務器端,服務器端軟件通個分隔函數將字符串分隔成組合前的信息。因此,數據發送和接收函數不需要因為數據類型的不同而采取不同的函數,同時也省去Java與Vb數據類型不一致的處理過程。

圖2 客戶端軟件界面Fig.2 The interface of client software

圖3 客戶端軟件流程圖Fig.3 The flow chart of client software
實現各模塊的類都是主Activity的子類,它們都使用了主Activity的數據發送和接收函數。各功能模塊的設計簡介如下:
1)從控單元設置 (圖2(b))該模塊能完成從控模塊的最大亮度、最小亮度、故障亮度、上電亮度、淡光時間、淡光速率的設置和查詢。完成版本號、設備類型、最小功率以及當前亮度的查詢。
2)組控制 (圖2(f))該模塊設計了16個選擇框 (Checkbox),分別代表十六個組。通過選擇框的選擇以及設置和查詢,能夠實現組地址的統一設置和查詢。
3)場景控制 (圖2(c)、(d))該模塊包括場景的選擇、設置、查詢功能。場景的設置和查詢部分設計了一個對話框,這樣設計的原因是可以在一個Activity內完成所有的功能。
4)直接命令 (圖2(e))這個模塊主要為了方便調試而設計的。可以通過對應的文本框發送自定義的命令,同時可以回顯從服務器端返回的數據,它發送的命令非常直觀,可以用來調試RS232-DALI網關以及從控模塊。
服務器端軟件是使用VB6.0開發的,軟件使用了Windows提供的Winsock和MSComm控件。Winsock控件提供了訪問TCP和UDP網絡服務的方便途徑。編寫客戶或服務器應用程序,不必了解TCP的細節或調用低級的Winsock API。通過設置控件的屬性并調用其方法就可輕易連接到一臺遠程機器上去,并且還可雙向交換數據。MSComm控件通過串行端口傳輸和接收數據,為應用程序提供串行通訊功能。服務器端支持多個客戶端,基本服務器只能接受一個連接請求。通過創建Winsock控件數組,使用一個控件也可以同時接受多個連接請求。利用這種方法,不需要關閉連接,而只需創建新的控件實例 (通過設置其索引屬性),然后在新的實例上調用Accept方法。軟件啟動后開始監聽來自客戶端的Socket請求。當監聽到從客戶端發送過來的數據以后,然后判斷發送過來的數據,再調用相應的數據處理函數。在軟件啟動的同時也開啟了定時器,循環檢測標志位,檢測到以后進入對應的命令處理函數。軟件的流程如圖4所示。
當服務器端接收到從客戶端傳過來的字符串時,使用Split函數將字符串分隔成數組。根據數組的長度判斷命令的種類。基本控制命令長度為3、組的長度判斷命令的種類。基本控制命令長度為3、組控制命令長度為4、從控模塊控制命令長度為9、場景控制命令長度為19。VB6.0提供了一個Timer控件,通過定時器來實現控制命令的循環監聽和處理。程序定義了一個標志位來判斷控制命令類型,當接收到客戶端數據并進行分隔,賦值等操作以后相對應的標志位被致位,定時器循環檢測標志位,當檢測對應標志位被置“1”時便進入對應的命令處理程序,處理完以后標志位被置零。

圖4 服務器端流程圖Fig.4 The flow chart of server software
DALI自動分配地址簡介,首先給需要重新分配地址的單元分配一個24位二進制隨機地址,然后通過尋找隨機地址最小的單元并分配短地址,然后重復尋找直到所有需要設置短地址的單元都設置完。因為24位二進制數比較大,按常規方法尋找的話,花費的時間比較長。從上面地址分配的原理可以看到,在整個地址分配的過程中,最主要是主機24位數據和DALI設備24隨機數比較的問題。如何才能找到最小的隨機數的設備,這是解決這個問題是關鍵。比較兩個數據的大小方法很多,這里采用是2分算法。實現步驟如下:
1)主機發送FFFFFF與DALI設備比較,因為DALI設備產生的隨機肯定比FFFFFF要小的,如果總線后,采用2分算法比較主機數據上存在沒有分配地址的設備,則肯定回答YES。否則NO。
2)在上一步中得知總線上有沒有分配地址的設備和隨機數。2分法基數為8、4、2、1,三字節的數據按半字節劃分為6個半字節數,從最高的半字節,假設開始時值Y=8,如果有DALI設備回答YES,則將現值減去2分法基數的下一個數,修改為Y=Y-4,如有DALI設備回答NO,則將現值加上2分法基數的下一個數,修改Y=Y+4,直到2分法基數的值小于1為止。
3)找到最小的隨機數的設備后,使用PROGRAM SHORT ADDRESS命令給這個設備分配一個地址。
4)完成地址分配后,使用WITHDRAW退出命令,使已分配地址的設備退出比較命令。
5)重復以上步驟,比較找到其他的DALI設備。直至到發送FFFFFF都沒有設備回答YES為止。
隨著智能手機行業的發展,智能手機在生活當中充當的角色也越來越重要。把它設計成智能照明控制終端是一種趨勢,是豐富智能手機功能的一個設計。本文在Android系統上面開發客戶端軟件,界面設計符合人們的操作習慣,簡單直觀。同時開發了服務器端軟件,并與DALI網絡連接調試通過。實現了文中所述功能。
總之,這樣一個設計符合人們對智能家居生活的要求,與此同時將智能手機引入到智能照明系統當中豐富了智能照明系統的控制終端。
[1]況莉莉,李振,衡友躍.基于Android智能家居的探討[J].淮北職業技術學院學報,2012,11(3):85~86.
[2]李凌宇,許錦標.紅外遙控器在DALI系統中的應用設計 [J].現代建筑電氣,2010,1(1):19~23.
[3]倪凱等.一種移動終端遠程數據訪問控制方法.計算機應用與軟件,2012(6).
[4]武軍,康忠良.Windows套接字在VB,VC,Delphi中的實現.計算機應用研究,2001,18(5):117~119.