[訊息論壇]ICE
Messaging Forum 康聖欣
<實作篇> 利用
iPush® Server
實作一個簡單的 Internet 影像監控系統
在本實作中,我們使用 iPush® Java API 在 IE 瀏覽器上實作一個
Internet 影像監控系統,接收來自 Data Generator (via iPush® Server)
的即時影像,將即時影像顯示於 Java Applet 上。並利用 iPush® ActiveX
API 傳送影像控制指令給 Data Generator,命令其啟動/暫停/停止傳送即時影像訊息,達成雙向溝通的目的。
這個實作的架構如圖1. 所示,訊息流除了有來自 WebCam 和來自其他 Video Server 的即時影像之外,還有由顯示端 (IE
瀏覽器) 所下達的指令:

圖1. 實作架構圖
iPush® Server 的 Channel 規劃如下:
| Channel |
Description |
Message
Producer |
Message
Consumer |
| ch06 |
即時影像 |
Data
Generator |
影像監控系統 |
| ch07 |
即時影像 |
Data
Generator |
影像監控系統 |
| ch08 |
即時影像 |
Data
Generator |
影像監控系統 |
| ch09 |
即時影像 |
Data
Generator |
影像監控系統 |
| ch96 |
影像控制指令 |
影像監控系統 |
Data
Generator |
| ch97 |
影像控制指令 |
影像監控系統 |
Data
Generator |
| ch98 |
影像控制指令 |
影像監控系統 |
Data
Generator |
| ch99 |
影像控制指令 |
影像監控系統 |
Data
Generator |
| 設備名稱 |
數量 |
| PC
with Windows 2000 Family |
一台 |
| ICE
iPush® Communication Server installed |
一套 |
| Java
Development Kit (JDK) |
一套 |
| Data
Generator |
一套 |
| PC
Web Cam |
一支(optional) |
| Java
Multimedia Framework (JMF) |
一套 (要抓取本機的Web Cam 需要的軟體) |
本實作的所有相關程式碼,可於此處下載壓縮檔,解壓縮後放在c:\lab\lab4位置裡即可。
STEP 01:安裝 iPush® Server
如果已經安裝,或有現成的 iPush® Server 主機,則可跳過此步驟。
STEP 02:新增 Service 與 User 帳號,並測試是否運作正常
使用 iPush® Server 的 BackOffice 管理介面,新增以下 Service
與 User 帳號:
Service:
User1 - 訊息接收者:
- Group:lab
- Product:lab4
- User ID:image_monitor
- Password:image_monitor
- Read Permission:ch06-ch09
- Write Permission:ch96-ch99
User2 - 訊息傳送者:
- Group:lab
- Product:lab4
- User ID:datagen
- Password:datagen
- Read Permission:ch96-ch99
- Write Permission:ch06-ch09
你可以開啟兩個由艾揚提供的 TestMsgAgent 測試程式,一個作為訊息傳送者,另一個作為訊息接收者,測試兩者是否可以正常送收訊息。
STEP 03:安裝 Java Development Kit (JDK)
在接下來的步驟中,我們會以 Data Generator 程式作為即時訊息的產生者。由於 Data Generator 是以 Java
撰寫,執行時必須要有 JRE 執行環境才行。若已經安裝則可以跳過;若尚未安裝,可至 http://java.sun.com/j2se/1.4.1/download.html下載
Windows ( all languages, including English) 版的 J2SE SDK v1.4.1_03,執行
j2sdk-1_4_1_03-windows-i586.exe 進行安裝 ,安裝後不需要重新開機。
STEP 04:設定與測試 Data Generator
打開 c:\lab\lab4\datagen\datagen.properties 檔案 (可以使用記事本開啟編輯之),對應在 STEP
02 新增的 Data Generator Service 與 User 帳號,更改與 iPush® Server
連線所需的資訊:
ipush,ServerAddress= 即您 iPush Server
的 IP 位址
ipush.ServerPort= 即 iPush Server 的 IP 服務埠號 (
for Windows 2000 版本預設為 8000)
ipush.Company (即 Group)= lab
ipush.Product= lab4
ipush.Username= datagen
ipush.Password= datagen
其餘選項不變 (使用者可以自行依需要進行變更)
接著,開啟一個 DOS 作業視窗 (命令提示字元),於其中執行 c:\lab\lab4\datagen\
datagen.bat,讓 Data Generator 可以根據設定,開始供給 (Publish) 資料到 iPush® Server。執行前請先確認先前安裝的
iPush® Server 正常運作中。

圖2. 執行 datagen.bat 的結果
STEP 05:實作 Image
Monitoring – 使用 Java Applet
步驟一: 按照接收訊息步驟加入程式碼:
1. 與 iPush® Server 連線/斷線
- 使用 Method netConnect() 進行連線
2. 判斷是否連線成功
- 使用 call back function onException() 接收 iPush® Server
的回應
- 判斷 Exception 的 return code,若為 1 則表示連線成功
3. 向 iPush® Server 訂閱/解除訂閱訊息頻道
- 使用 Method chSubscribe() 進行頻道訂閱
4. 接收並處理來自 iPush® Server
的訊息
完整的程式碼如下:
/*
* lab4demo.java
*
* Created on 2003年6月30日, 下午 4:54
*/
/**
*
* @author samkang
*/
/* 宣告使用 iPush Java API */
import com.icetech.ipush.*;
import java.awt.*;
public class lab4demo extends java.applet.Applet implements ipushmsg {
iPushLink iPush = new iPushLink();
Image frameImage;
String channel,ip,port,company,product,account,password;
boolean connectFlag=false;
/* 取得 Applet 的參數,包含 iPush Server 的 ip,port, 登入帳號, 欲定閱的頻道 */
public void init() {
ip = this.getParameter("ip");
port = this.getParameter("port");
channel = this.getParameter("channel");
company = this.getParameter("company");
product = this.getParameter("product");
account = this.getParameter("account");
password = this.getParameter("password");
/* 與 iPush Server 進行連線 */
try {
connectFlag = iPush.netConnect(this, ip, Integer.parseInt(port), company,product,account,password);
}
catch (Exception e) {
System.out.println(new StringBuffer("Error:").append(e).toString());
System.exit(1);
}
}
public void destroy() {
/* 結束與 iPush Server 的連線 */
iPush.netClose();
}
/* 接收來自 iPush Server 的即時影像訊息(Block Message),產生並顯示於 Java Applet 上*/
public void doBlockMessage(byte[] id, int idlen, String name, byte[] msg,
int len) {
String idstr = new String(id, 0, idlen);
System.out.println("receiving image ....") ;
frameImage = getToolkit().createImage(msg);
System.out.println(Integer.toString(len)+" Bytes Received") ;
repaint();
}
/* 接收來自 iPush Server 的錯誤訊息並處理 */
public void doError(String buf) {
}
/* 接收來自 iPush Server 的即時訊息(Non-Block Message)並處理 */
public void doMessage(byte[] id, int idlen, byte[] msg, int msglen) {
}
/* 處理 iPush Server 的命令回應訊息 */
public void onException(ICEException e) {
System.err.println("onException");
if(e.code < 10)
System.err.println(e.getMessage());
else if(e.code < 20)
System.err.println(e.getMessage() + " " + e.param);
else
System.err.println(e.getMessage());
/* 當與 iPush Server 連線成功時,向 iPush Server 訂閱頻道 */
if(e.code==1) {
iPush.chSubscribe(channel);
}
}
/* Java 繪圖函式 */
public void update(Graphics g) {
paint(g);
};
/* Java 繪圖函式 */
public void paint(Graphics g) {
g.drawImage(frameImage, 0 , 0, 320, 240, this);
}
}
步驟二: 編譯 Java Applet 程式
1. 將完成後的程式存放於 c:\lab\lab4\source_code\lab4demo.java
2. 使用 JDK 進行編譯,編譯前請確認 iPush® 的 Java
API (iceipush.jar) 存放在與程式碼同一個目錄下 (c:\lab\lab4\source_code)
3. 將目錄切換至 c:\lab\lab4\source_code,使用以下指令進行編譯
- c:\j2sdk1.4.1\bin\javac -classpath
iceipush.jar lab4demo.java
4. 編譯成功後,檢查是否產生 Java Class 檔案 (lab4demo.class)

圖3. 檢查是否產生 Java Class
檔案 (lab4demo.class)
步驟三:編輯 HTML 網頁
1. 打開記事本程式,開新檔案,鍵入下列 HTML 原始碼 (您可以 Copy-Paste 複製之):
<HTML>
<HEAD>
<TITLE>iPush Image Monitor/Control</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=big5"></HEAD>
<BODY>
<p>
<applet code="lab4demo.class" width=320 height=240 align="middle" archive="iceipush.jar">
<param name="ip" value ="192.168.0.15">
<param name="port" value ="8000">
<param name="channel" value="ch06">
<param name="company" value="lab">
<param name="product" value="lab4">
<param name="account" value="image_monitor">
<param name="password" value="image_monitor">
</applet>
</p>
</BODY>
</HTML>
2.然後將此檔案存為 c:\lab\lab4\source_code\lab4demo.html,此網頁包含一個我們剛剛完成的
Java Applet Class,以及傳入此 Java Applet 的一些 iPush® Server
連線參數。
STEP 06:加入 Image Control 的功能 – 使用 IE + ActiveX
步驟一: 加入 iPush® ActiveX API component 與 VBScript
1.打開我們剛剛完成的 HTML file ,在檔案最後加入以下 VBScript:
<object classid="clsid:455A78EC-7EB0-4483-ABD9-2AAB10A1644B"
codebase="http://192.168.0.15/lab/iPushX.ocx" id=ipushx>
<param name="ipuship" value="192.168.0.15">
<param name="ipushport" value=8000>
<param name="company" value="lab">
<param name="product" value="lab4">
<param name="username" value="image_monitor">
<param name="password" value="image_monitor">
</object>
<SCRIPT LANGUAGE=VBScript>ipushx.ipushConnect</script>
上述 Script 做兩件事情:首先看 <object> </object> 之間的程式碼,此原始碼載入並註冊
Web 虛擬目錄 /lab 內之 iPushX.ocx 元件,將其命名為 ipushx,並將連接 iPush® Server
(範例位於 IP: 192.168.0.15,請依您實際的主機位址改變之) 所需的 Server 與 User 帳號參數傳遞給此
iPush® ActiveX API component。
其次是 ipushx.ipushConnect 的指令,指示 iPush® API
(在此命名為 ipushx) 與 iPush® Server 連線。
2. 將檔案存檔。
步驟二:加入啟動影像與停止影像的 HTML 原始碼
1. 打開我們剛剛完成的 HTML file,在 Applet 之後加入下列 HTML 原始碼 (您可以 Copy-Paste
複製之):
<a href="#" onClick= "eval('ipushx.ipushSend(\"ch96\",\"start\ ")')" >啟動</a> /
<a href="#" onClick="eval('ipushx.ipushSend(\"ch96\",\"stop\ ")')">停止</a>
當使用者 Click 「啟動」 link 時,會呼叫 Script「ipushx.
ipushSend("ch96","start")」,也就是使用 iPush® API
透過頻道 「ch96」 傳送訊息「start」到 iPush® Server,由於
Data Generator 訂閱了控制頻道「ch96」,收到「start」的命令訊息後,會開始送相關的影像到頻道 「ch06」。同理,當使用者
Click「停止」link 時,會呼叫 Script 「ipushx.ipushSend( "ch96" ,"stop")」,也就是使用
iPush® API 透過頻道 「ch96」傳送訊息「stop」到 iPush® Server,由於
Data Generator 訂閱了控制頻道「ch96」,收到「stop」 的命令訊息後,會停止傳送相關的影像到頻道 「ch06」。
2. 將此檔案存為 c:\lab\lab4\source_code\lab4demo.html
完整的 HTML 原始碼如下:
<HTML>
<HEAD>
<TITLE>iPush Image Monitor/Control</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
</HEAD>
<BODY>
<p>
<applet code="lab4demo.class" width=320 height=240 align="middle" archive="iceipush.jar">
<param name="ip" value ="192.168.0.15">
<param name="port" value ="8000">
<param name="channel" value="ch06">
<param name="company" value="lab">
<param name="product" value="lab4">
<param name="account" value="image_monitor">
<param name="password" value="image_monitor">
</applet>
</p>
<p> <a href="#" onClick="eval('ipushx.ipushSend(\"ch96\",\"start\")')">啟動</a> /
<a href="#" onClick="eval('ipushx.ipushSend(\"ch96\",\"stop\")')">停止</a></p>
</BODY>
</HTML>
<object classid="clsid:455A78EC-7EB0-4483-ABD9-2AAB10A1644B"
codebase="http://192.168.0.15/ipushdemo/iPushX.ocx"
id=ipushx>
<param name="ipuship" value="192.168.0.15">
<param name="ipushport" value=8000>
<param name="company" value="lab">
<param name="product" value="lab4">
<param name="username" value="image_monitor">
<param name="password" value="image_monitor">
</object>
<SCRIPT LANGUAGE=VBScript>
ipushx.ipushConnect
</script>
STEP 07:執行與觀測結果
到目前為止,所有的步驟均已完成,我們來執行看看是否可以正常運作。在執行之前,請記得下列動作是否完成:
- iPush® Server 已經啟動
- Data Generator 執行中
- IE 瀏覽器中的 Internet 安全層級設定必須能夠提示或啟動下載 ActiveX 控制項。為確認設定正常,請依序點選 IE
瀏覽器中的 [工具] 功能表 -> [Internet 選項]
-> <安全性> 標籤 -> 設定 "Internet" 區域 (預設即是)
-> [自訂層級] 按鈕 -> 逐項檢查 "ActiveX
控制項與 plug-ins" 中的設定,應該為啟動或提示。
由於 Applet 的安全性限制,我們必須利用 Web Server 來存放/執行我們剛完成的網頁。因此接下來將 c:\lab 作
Web 分享如下:

圖4. Web 分享設定
接下來開始執行與觀測結果。
先執行影像訊息來源程式 Data Generator,位於 c:\lab\lab4\datagen\datagen.bat。然後使用
IE 瀏覽器,開啟以下網頁:http://xxx.xxx.xxx.xxx/lab/lab4/source_code/
lab4demo.html (其中 xxx.xxx.xxx.xxx 為 Web Server 的 IP 位址,也不要忘了要建立Web
虛擬目錄 /lab),結果如下:

圖5. 實驗結果
使用者可以點選啟動或停止的 link 來觀察影像是否受到控制,同時可以觀察 Data Generator 是否收到來自此網頁的控制指令「start」和「stop」。

圖6. 指令下達
此 Lab 混合使用了 iPush® Java API 以及 iPush® ActiveX
API。除了展示 iPush® API 的使用方式外,也展示了 iPush® API
的多樣性與彈性。實務上的應用可以選擇熟悉的單一 API (ActiveX
或 Java) 開發即可,重點應該為 iPush® Server 頻道 (channel)
的規劃,以及訊息供應者 (Message Producer) 與消費者 (Message Consumer) 的對應關係。相同的架構可以應用在其他的監控領域,如工廠監控,防災監控,環境監控等等。
本 Lab 後續還可以擴充為同時多個影像來源監控,只要將完成的 HTML 原始碼複製並更改頻道參數即可。您可以參考艾揚的網站看看最後的成果:http://www.icetech.com.tw/icedc/workshop/automation/demo/applet3/index.html。

圖7. 艾揚科技 iPush
虛擬工廠 - 影像監控
|