范 高 杰
(深圳市華陽國際工程設計股份有限公司,廣東 深圳 518045)
RFID(Radio Frequency Identification)即無線射頻識別技術,通過無線射頻方式進行非接觸雙向數(shù)據(jù)通信,利用無線射頻方式對記錄媒體進行讀寫,從而實現(xiàn)識別目標和數(shù)據(jù)交換[1]。與日常生活中常見的二維碼相比,RFID標簽具有可寫的優(yōu)勢,即RFID標簽可以獨立儲存數(shù)據(jù)。RFID讀寫設備通常為手持式設備,國內(nèi)目前應用較多的是采用運行Android系統(tǒng)的手機集成RFID讀寫器的方式,實現(xiàn)對RFID標簽的讀寫。Autodesk Revit是建筑結(jié)構(gòu)設計中的常用設計軟件,Revit軟件具有強大的建筑、結(jié)構(gòu)、機電全專業(yè)設計功能,能夠精確地設計和建造高效的建筑、結(jié)構(gòu)、機電等各專業(yè)模型,并支持各專業(yè)間協(xié)同工作。同時Revit軟件提供了豐富的二次開發(fā)接口(RevitAPI),通過API接口,用戶可以對Revit軟件的功能進行擴充[2]。
本文實現(xiàn)的裝配式構(gòu)件管理系統(tǒng)開發(fā)分為兩個部分:PC端以C#作為開發(fā)語言,通過對Revit軟件進行二次開發(fā),實現(xiàn)了將Revit軟件作為管理系統(tǒng)的服務端的功能;RFID讀寫設備,以Java作為開發(fā)語言,通過RFID讀寫開發(fā)包,基于Android系統(tǒng)開發(fā)了移動端APP,完成RFID標簽的讀寫,并與Revit軟件服務器端進行數(shù)據(jù)交互,從而實現(xiàn)對Revit模型的遠程訪問。
移動端APP系統(tǒng)界面見圖1。系統(tǒng)流程圖見圖2。

Autode Revit軟件允許用戶通過應用程序編程接口(Application Programming Interface,API)對Revit中的模型進行信息讀寫,開發(fā)人員可通過任何與Microsoft.NET Framework兼容的語言完全訪問Revit API[3]。
具體到裝配式構(gòu)件管理系統(tǒng),需要解決2個主要問題:
1)將Revit軟件作為服務器端,客戶端能夠通過遠程訪問的方式,對Revit模型中數(shù)據(jù)進行讀寫;
2)Revit能夠根據(jù)客戶端的查詢指令,高亮顯示被查詢構(gòu)件,并展示被查詢構(gòu)件的屬性信息。
本文以C#為例,對上述問題的解決方案如下:
1)利用RevitAPI中的IExternalApplication接口中OnStartup函數(shù),在Revit軟件啟動過程中加載服務器端插件,再通過在插件中注冊自定義命令,在命令中實現(xiàn)基于Revit模型的服務啟動和終止[4]。注冊命令主要代碼如下:
PushButton pushButtonRead =
pannelReadWrite.AddItem(new
PushButtonData("pushButtonDataRead", "啟動服務", AddInPath,
"AddIn_RFIDSever.CmdRFIDSeverQuery")) as PushButton;
pushButtonRead.LargeImage = new
BitmapImage(new
Uri(Path.Combine(ButtonIconsFolder, "Query.png"), UriKind.Absolute));
pushButtonRead.ToolTip = "啟動服務";
啟動監(jiān)聽服務主要代碼如下:
public void Start(){
var socketThread = new Thread(() =>{
Socket socket = new
Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPAddress ip =
IPAddress.Parse("192.168.1.35");
IPEndPoint iep = new
IPEndPoint(IPAddress.Any, 8045);
socket.Bind(iep);
socket.Listen(6);
socket.BeginAccept(new
AsyncCallback(Accept), socket);});
socketThread.Start();
Console.WriteLine("服務器已就緒,
IP:192.168.1.35,端口號:8045 ");
}
2)Revit提供了注冊空閑事件的機制,服務端通過解析客戶端的指令,根據(jù)編號過濾出需要查詢的構(gòu)件Id,加入到Revit的選擇集,實現(xiàn)構(gòu)件的自動高亮選中,注冊空閑事件主要代碼如下:
void SubscribeToIdling(UIApplication uiapp){
if (m_hIdling == null){
m_hIdling = new
EventHandler
uiapp.Idling += m_hIdling;
}
}
加入選擇集主要代碼如下:
void addSelection(ElementId id){
Selection selection =
uiApp.ActiveUIDocument.Selection;
List
List
aryId.Add(id);
selection.SetElementIds(nullListId);
}
移動端開發(fā)主要分為三部分:APP界面開發(fā)、RFID標簽讀寫、網(wǎng)絡數(shù)據(jù)交互。APP交互界面利用Android系統(tǒng)SDK開發(fā)包完成。RFID標簽讀寫通過移動手持設備硬件服務商提供的二次開發(fā)包完成。與服務器的數(shù)據(jù)交互通過Json數(shù)據(jù)包完成。
1)交互主界面從Activity類派生,服務器設定、運輸日期設定、生產(chǎn)日期設定、查詢等子界面從AppCompatActivity派生,通過重載onCreate(Bundle savedInstanceState)實現(xiàn)界面布局、UI交互。
2)將硬件服務商提供的RFID標簽讀寫開發(fā)包導入到開發(fā)環(huán)境,通過開發(fā)包里的接口實現(xiàn)對RFID標簽的讀寫,設備初始化主要代碼如下:
public void InitUHF() {
android.hardware.uhf.magic.reader.init(C5U);
android.hardware.uhf.magic.reader.Open(C5U);
if
(reader.SetTransmissionPower(1950) != 0x11)
{
reader.SetTransmissionPower(1950);
}
DevBeep.init(App.this);
}
3)與服務器端數(shù)據(jù)交互中讀取Json數(shù)據(jù)主要代碼如下:
JSONObject getJsonData(){
JSONObject json = new JSONObject();
try{
json.put("Method", "SetInstallDate");
json.put("LabelId",editLabelId.getText().toString
());
json.put("InstallDate",editInstallDate.getText().to
String());
}
catch (JSONException e){
e.printStackTrace();
}
return json;
}
以某裝配式輕鋼住宅為例,系統(tǒng)的主要工作流程如下:


1)Revit中啟動服務端;2)移動端設置RFID標簽中的相關信息,并更新Revit中的模型信息,如圖3所示;3)移動端通過掃描RFID標簽,查詢關鍵信息,并在Revit中高亮顯示相關構(gòu)件及其屬性信息,如圖4所示。工程實例表明,系統(tǒng)能夠?qū)崿F(xiàn)對RFID標簽的讀寫操作,并且能夠根據(jù)移動端的查詢指令,和Revit模型進行數(shù)據(jù)交互。
本文采用RFID與Revit相結(jié)合的方式,詳細介紹了裝配式構(gòu)件管理系統(tǒng)的開發(fā)流程,通過該系統(tǒng)能夠?qū)崿F(xiàn)對裝配式建筑構(gòu)件全生命周期中的精細化管理,對同類型的工程項目具有借鑒意義。