[Robotics Studio] Hello World Again! (DSS Service version) -- Day8
太混了, 第八天還在 Hello World !
事實是, 我們開始往更深入的技術邁進囉, 如果想要更深入了解 RDS (Microsoft Robotics Developer Studio) , 我們要開始了解 DSS (Decentralized Software Services) 以及 CCR (Concurrency And Coordination Runtime) , 雖然 DSS 以及 CCR 是隨著 RDS 而出現, 但其實它們可不需要限定於 RDS 才能使用歐, 雖然我目前沒有在 .NET Framework 4.0 當中發現他們的身影, 但是隨著多核心系統的進展, 軟體當然也是要能夠發揮多核心的長處, 隨之而來的平行處理問題, 當然是程式人員要面對的課題, 有了 CCR 以及 DSS 這樣的 Framework , 開發平行處理程式時將會採用不同的邏輯思考與概念.
如果你已經寫了很多年的程式, 相信對於之前的 VPL 覺得有些不太習慣, 現在我要弄點程式人員習慣的東西, 就是用 Visual Sutdio 2008 (or VS 2008 Express Edition) 來開發程式.
但是我還是不會脫離 VPL 這個介面.
為什麼我要貼著 VPL 這個介面呢, 因為 RDS 教學套件中有相當多關於 DSS 與 CCR 資訊, 但卻都是單純的 Visual Sutdio 操作, 鮮少提及如何跟 VPL 整合, 但我認為 VPL 才是適合初學者的良好介面, 所以對於初學者而言, 能夠與這個介面整合, 應該比較能夠提起寫 code 的興趣.
這就如同一開始如果教學採用 Unix Command Line 模式, 相信很多人都受不了. 但是如果一開始採用拖拉視覺操作系統方式, 相信很多人都比較容易有興趣, 等到有了興趣, 再介紹更強大的命令列模式, 就比較不會覺得排斥. 況且, 良好的視覺操作系統有時候比起命令列模式還棒, 這點只要你看過 VPL 開發的程式經過 Compile 轉成 C# 的程式後, 你會承認 VPL 有時候是比較好的 (當然不是所有狀況, 而是各有優缺點).
OK! 寫了很多廢話才開始寫程式, 這大概是年紀大了(愛碎碎念)才會這樣吧??
首先, 在你安裝完 RDS 以後, 如果你有 Visual Studio 2008 (or Express Edition) , 你應該可以在新增專案當中看到 Microsoft Robotics Express , 像這樣:
我們可以透過這個新增專案快速地開發一個 DSS Service, 而這個 DSS Service 就可以出現在我們安裝的 VPL 當中歐.
按下確定以後, 你會看到一個對話框:
這是對話框可以讓你輸入 DSS 的名稱, 日期 (用以跟其他同名的 DSS 區別), 還可以輸入 Partners (一起合作的 DSS Service) , Alternate Contracts (替代協定)
我們可以都用預設的, 因為我們現在只要寫 Hello World 嘛...
不過在開始撰寫 DSS Service 之前, 我想要先講解 DSS Service 的大體架構: (這張圖來自 RDS 官方文件)
首先, 一個 DSS Service 需要有兩個名稱用來以供辨識, 一個是 Service Identifier ,
表示它存在的實體 URL 位置.
所以每一個 DSS 實體 (Instance) 都會有一個唯一的 Service Identifier, 你可以看成是變數名稱 (Variable Name) , 不要跟 Contract Identifier 搞混了, Contract Identifier 的格式會是像這樣 : http://schemas.tempuri.org/[year]/[month]/[name].html (這樣你知道剛剛對話框要你填日期以及 Organization Domain 是要幹啥用了吧),
它才是這個 DSS Service 的功能名稱, 你可以看成是類別名稱 (Class Name).
每個 DSS 都會有一個狀態 (State), 也會有一堆程式碼 (Service Handlers) 負責對外溝通 (Main Port) ,還可以有通知 (Notifications) , 然後可以有協同運作的 Service (Partners) 這幾大塊.
完成以後你會看到 Visual Studio 幫你生了一個專案像是這樣:
其中 DSSService_HelloWorldType.cs 放的是宣告的程式碼, DSSService_HelloWorld.cs 則是主體程式碼 (當然事後你可以亂改..)
為了完成 Hello World, 我們來把這個 DSS 的 State 加上一個字串的資料成員 (Data Member) 吧, 你可以在 DSSService_HelloWorldTypes.cs 當中找到下面這段程式碼:
/// <summary>
/// DSSService_HelloWorld state
/// </summary>
[DataContract]
public class DSSService_HelloWorldState
{
}
我們加上一個字串成員的宣告如下:
/// <summary>
/// DSSService_HelloWorld state
/// </summary>
[DataContract]
public class DSSService_HelloWorldState
{
[DataMember]
public string StrData { get; set; }
}
每個 DSS Service 在啟動的時候, 會呼叫 Start() 這個函式, 所以你在 DSSService_HelloWorld.cs 當中可以找到它:
/// <summary>
/// Service start
/// </summary>
protected override void Start()
{
//
// Add service specific initialization here
//
base.Start();
}
現在我們加上 _state.StrData = "Hello World"; 如下:
/// <summary>
/// Service start
/// </summary>
protected override void Start()
{
//
// Add service specific initialization here
//
base.Start();
_state.StrData = "Hello World";
}
Ok, 現在我們完成一個 DSS Service, 這個 Service 的狀態有一個 StrData , 而啟動以後會放入 "Hello World", 透過 VS 2008 建置以後, 它自動會放在你的 VPL bin 目錄下面, 像是這樣:
所以你打開 VPL , 就可以看到 Services 多了一個 DSSService_HelloWorld, 把它拖來到 Diagram 當中,
連上 SimpleDialog, 你會從 DSSService_HelloWorld 看到 Get-Success 連線 (這表示你想要取得該 DSS Service 的狀態 (state)), 連接設定如下:
現在你的 VPL 程式如下:
好啦, 一周後我們又回到了 Hello World ...