2011年4月14日 星期四

4) 撰寫可以跟 WinLIRC TCP Server 溝通的程式

這篇是給 WinLIRC 進階使用者或開發者看的。

WinLIRC TCP Server

WinLIRC 內部有一個 TCP Server,跑在 port 8765 上,最多同時可以有 16 個 clients 跟它連線。每當成功解出遙控器一個按鈕的紅外線編碼的時候,TCP Server 就會送出一行 ASCII 字串給所有的 clients,字串裏描述被按下的按鈕為何。每行字串以換行字元 ('\n’) 作結尾。例如,client 可能會看到像這樣的字串:

00000000000cc03f 00 play BenQ.cfg

這行表示遙控器被按下按鈕 (play 鈕)。如果遙控器被按下一段時間(連發),client 可能會看到這樣的東西:

00000000000cc03f 01 play BenQ.cfg
00000000000cc03f 02 play BenQ.cfg
00000000000cc03f 03 play BenQ.cfg
00000000000cc03f 04 play BenQ.cfg
00000000000cc03f 05 play BenQ.cfg
00000000000cc03f 06 play BenQ.cfg

資料格式說明如下:

  • 第 1 欄 (00000000000cc03f ): 按鈕的紅外線編碼 (Infrared key code)
  • 第 2 欄 (00): 重覆的次數。當遙控器按鈕持續被按下的時候,數字會一直遞增。
  • 第 3 欄 (play): 按鈕名稱。
  • 第 4 欄 (BenQ.cfg): 遙控器名稱,來自 Config 檔。

如果你會寫 socket 程式,也可以動手寫程式來跟 WinLIRC TCP Server 連線。

VB 跟 Delphi 的範例程式

Martin Kubik 提供了一個用來跟 WinLIRC 連線的 Visual Basic 的範例程式。Dominik Bruhn 提供了一個 Delphi 的範例程式,這支 Delphi 範例程式的執行畫面如下:

image  
▲ 這支程式可以跟 WinLIRC 建立連線,並將收到的紅外線資料顯示在畫面上

跟 WinLIRC 連線的程式非常的簡單,底下提供幾個簡單的 Tcl 範例程式,教你寫程式跟 WinLRC TCP Server 溝通,做一些簡單的電腦自動化的應用。我假設你對 Tcl 有一定程度的了解。

與 WinLIRC TCP Server 連線的 Tcl  範例程式

第一支程式(winlirc.tcl)很簡單,只是跟 WinLIRC TCP Server 建立 socket 連線,然後把來自 WinLIRC TCP Server 端的資料印出來而已:

程式執行結果如下:

image
▲ 按下遙控器 up, left, down, right 鈕後 winlirc.tcl 收到的資料

模擬鍵盤的敲擊動作

第二個範例程式(winlirc_sendkeys.tcl)是模擬鍵盤的敲擊動作,程式把遙控器 left 鈕對應到鍵盤左鍵,而 right 鈕對應到鍵盤右鍵,因為建立 socket 的 irc::client 副程式是一樣的,所以底下只列出 irc::handleRead 副程式的內容:

這支程式利用 twapi 套件來送出鍵盤的敲擊動作,所以在程式開頭有一行載入 twapi 套件的指令:

載入這支程式後,把 Tcl 的視窗縮小到工作列,然後切換到其它應用程式,例如看圖程式或是 Powerpoint 簡報,然後拿起遙控器來測試,順利的話,應該就可以遙控看圖程式(上一張和下一張的功能)和 Powerpint 簡報(上一頁和下一頁的功能)。當然,因為模擬的是鍵的敲擊動作,這支程式的遙控功能並不限於看圖程式或 Powerpoint 簡報。

在遙控應用程式的時候(如看圖程式或 Powerpoint 簡報),Tcl 的視窗也會同步顯示遙控器被按下的按鈕,如下:

image

遙控 Winamp

最後是一個遙控 Winamp 的範例程式(winlirc_winamp.tcl),這次在收到遙控器按鈕的事件的時候,會間接送 Windows 訊息給 winamp,叫 winamp 切換上一首或下一首歌。一樣,底下只列出 irc::handleRead 副程式的內容:

hWnd_Winamp, WM_COMMAND, WC_PREVIOUS_TRACK, WC_NEXT_TRACK 變數的定義為:

主程式會判斷 winamp 是否有打開:

好了,現在你可以打開 winamp,然後用遙控器來遙控 winamp 了,很酷吧!?

當你在遙控 winamp 的時候,Tcl 的視窗也會同步顯示遙控器被按下的按鈕:

image

因為只是示範,所以我只實作了切換上一首(Previous Track)和下一首(Next Track)兩個功能,其它不足的部份就留給你當功課囉。

動動腦
  1. 用你熟悉的程式語言重新翻寫本文提供的範例程式。
  2. 練習寫一支可以用遙控器叫電腦關機的程式。
  3. 參考 JETKTV,自己寫個電腦卡拉 OK 點唱系統
延伸閱讀