,,,
(華中科技大學 機械科學與工程學院,武漢 430074)
基于iOS的手機虛擬儀器瀏覽器的設計
吳玉葉,何嶺松,韋文姬,高志強
(華中科技大學機械科學與工程學院,武漢430074)
為了動態調整手機端虛擬儀器的功能,提出了一種基于iOS平臺的手機虛擬儀器瀏覽器的設計方法;其主要原理是通過往瀏覽器中加載不同的虛擬儀器腳本,將瀏覽器變成不同的虛擬儀器;虛擬儀器的基本組成模塊是擁有多個輸入和輸出接口的控件,控件之間采用KVO模式進行組裝和通訊,并采用腳本描述組裝。所有控件類都繼承自UIView類,需要調用和重寫UIView的部分函數;信號發生顯示器的例子證明了虛擬儀器瀏覽器的可行性。
iOS平臺; 虛擬儀器瀏覽器; 控件; KVO模式
虛擬儀器技術是指利用高性能的模塊化硬件,結合高效靈活的軟件來完成各種測試[1]。過去,虛擬儀器軟件僅存在于PC機上,例如NI公司開發的LabView和LabWindows/CVI[2]等。近些年來,智能手機的發展異常迅速,它的處理器性能越來越高端,根據2017年第一季度智能手機處理器性能排行榜,排名第一的是驍龍835處理器[3],主頻為1.9 GHz+2.45 GHz,并采用八核設計,不弱于一般的PC機處理器。并且,智能手機與外部進行通訊的方式也更加多樣化,既能通過有線方式例如USB、OTG等,也有藍牙、WiFi等無線方式,因此將虛擬儀器技術應用于手機端已具備了很好的硬件基礎。
在手機各大應用市場上,可以找到一些虛擬儀器軟件,比如Heart Rate這款心率測試軟件。它的硬件模塊是手機閃光燈,用手指遮住閃光燈,通過感知手指透光率的變化來間接測量心率,軟件的作用是根據透光率值計算心率并顯示給用戶。然而,這些虛擬儀器軟件都只擁有一種或者幾種特定的測量功能,如果想實現不同功能,只能再次安裝新的App,這既繁瑣也占用了更多的存儲空間,使手機運行速度減慢。為了改善這種狀況,本文在手機端設計了一個可以動態改變測量功能的虛擬儀器瀏覽器,借鑒了網頁瀏覽器的模式,以腳本的形式描述儀器,只要往瀏覽器中加載不同的虛擬儀器腳本,經瀏覽器解析后就能生成不同的虛擬儀器。對于虛擬儀器用戶,只需安裝一個軟件就能實現各種測量功能;對于虛擬儀器開發者,也不用再遵循編碼、編譯等復雜的軟件開發流程,只要編寫簡單的腳本就能開發出虛擬儀器。
目前,智能手機的主流操作系統有Android和iOS兩種,據相關調查顯示,2017年第一季度智能手機全球市場占有率,安卓和iOS的比例分別為86.1%和13.7%,這兩者幾乎霸占了智能手機操作系統的全部江山[4]。與Android相比,iOS的優點主要體現在兩方面:流暢性和安全性。流暢性而言,iOS的軟件與硬件的整合度非常高,使其分化大大降低,而Android則不是這樣,導致Android的碎片化很嚴重,手機經常卡頓甚至死機。安全性而言,iOS用戶只能通過App Store才能下載和安裝軟件,App Store的審核機制非常嚴格,許多惡意軟件都被拒之門外,Android用戶的軟件下載途徑則五花八門,安全性非常低[5]。基于以上優點,本文選擇在iOS系統上開發手機虛擬儀器瀏覽器。
虛擬儀器瀏覽器的工作原理如圖1所示。瀏覽器加載來自網絡、本地或者下位機的虛擬儀器腳本并對其解析后生成對應的虛擬儀器,三種腳本的具體加載方式如下所述。

圖1 虛擬儀器瀏覽器工作原理
1)網絡腳本:網絡腳本存儲在云端,例如百度云盤、阿里云服務器等,如果腳本的權限設置為允許其他用戶訪問,瀏覽器就可以通過網絡直接向腳本的存儲地址發送請求獲取腳本數據。
2)本地腳本:本地腳本存儲在虛擬儀器瀏覽器的應用文件夾中。iOS的應用文件夾稱為沙盒,所有非代碼文件都存儲在沙盒中,每個應用只能對自己的沙盒進行訪問。默認情況下,每個沙盒含有3個文件夾:Documents、Library和tmp,Documents一般存儲程序中建立的或在程序中瀏覽到的文件,iTunes備份和恢復時會包括此目錄,本地腳本就存儲在Documents文件夾中[6]。將瀏覽器的info.plist文件的“Application supports iTunes file sharing”屬性值設為YES,用戶就能通過iTunus直接對本應用的Documents文件夾進行操作,例如往Documents文件夾中添加腳本。
3)下位機腳本:下位機腳本存儲在硬件模塊例如sd卡中,正式測量開始前,硬件模塊的微控制器可以通過藍牙、WiFi等方式將腳本發送給虛擬儀器瀏覽器。
虛擬儀器的基本組成模塊是控件,控件是具有某種功能的獨立模塊,把多個控件按照一定的邏輯順序組裝好后,就能形成一個完整的虛擬儀器。下文將圍繞控件介紹虛擬儀器瀏覽器的實現方法。
控件之間的通訊基于觀察者模式,觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀態上發生變化時,會通知所有觀察者,使它們能夠更新自己或者做出相應的一些動作[7]。iOS的觀察者模式實現方式有Notification(通知)和KVO(Key-Value Observing,鍵值觀察)兩種,Notification發送的通知僅以名字標識,因此不同對象的對外通知必須取不同名字,KVO的通知則通過發送者和屬性共同標識,不必給每個通知取特定名字,為了簡化取名步驟,本文采用了KVO機制[8]。KVO的工作原理是:對象B觀察對象A的屬性N,當屬性N由值1變為值2時,A會發送通知給B,告訴它屬性N的新值。KVO有兩種通知觸發方法,分別是自動通知和手動通知,自動通知由系統自動觸發,手動通知則需要手動書寫代碼發出通知,但手動通知更加靈活,可以自由決定發送通知的時間和方式,瀏覽器的控件關系并沒有特別復雜,因此可采用自動通知的方法。本文所有控件類都間接繼承自iOS的根類NSObject,NSObject已經實現了KVO機制,控件類只需要調用KVO的相關函數,就能使用它。使用KVO分三個步驟:(1)被觀察者注冊觀察關系;(2)觀察者實現通知送達自身時的回調方法;(3)被觀察者移除觀察關系。
2.2.1 支持KVO的多輸入多輸出控件模型
KVO機制的觀察粒度是屬性,一個對象能夠觀察多個對象的多個屬性,它的屬性也能被多個對象觀察。因此,每個控件可以擁有多個輸入接口和多個輸出接口,每個輸入接口對應一個觀察的屬性,每個輸出接口對應一個自身對外屬性。控件觀察的所有屬性中的任何一個屬性值發生變化,都會收到擁有此屬性的對象發送的通知,同樣,它的任何一個對外屬性值變化時,也會給觀察此屬性的所有控件發送通知。
2.2.2 虛擬儀器控件裝配原理
利用輸入輸出接口可以實現控件之間的裝配,每個輸出接口都對應一個自身對外屬性,將被觀察控件的輸出接口與觀察者控件的接收此屬性的輸入接口連接就能實現裝配。由于KVO是一種一對多關系,因此一個輸出接口可能會連接多個輸入接口,但每個輸入接口只能連接它所觀察屬性的輸出接口。假設控件B、C都觀察控件A的屬性a,那么A的屬性a輸出接口與B、C的接收屬性a的輸入接口相連。如上文所述,使用KVO有三步,第一步是注冊觀察關系,實質就是連接輸入輸出接口,KVO注冊函數是-(void)addObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath options:(NSKeyValue-ObservingOptions)options context:(nullable void*)context,此函數由被觀察控件調用,其中observer是觀察控件,keyPath是被觀察屬性,被觀察控件調用一次此函數,相當于連接了一個輸入和一個輸出接口。
虛擬儀器瀏覽器采用腳本作為描述控件裝配的工具,腳本語言選擇XML(Extensible Markup Language,可擴展標記語言)。XML文件由文檔說明和根元素組成,根元素只有一個,但根元素里面可以包含若干子元素,子元素間相互獨立[9],每個子元素描述一個控件,若干控件子元素集結在一起就組裝成一個完整的虛擬儀器腳本,每個控件的通用描述格式如下所示。
…
ControlName代表控件類名,ID和Rect是每個控件必須具備的屬性,ID用于區別不同控件,Rect表示控件在虛擬儀器界面中的布局位置和高寬,Input是輸入屬性,Output是輸出屬性,在某些虛擬儀器中,有的控件可能不受其他控件狀態影響,可以省略其輸入屬性,有的控件可能沒被其他控件觀察,可以省略其輸出屬性,其它屬性根據控件種類不同變化,下面一段腳本描述了一個麥克風控件。
Input的內容包括被觀察控件ID、被觀察屬性和本控件對應屬性,Output僅包含本控件的對外屬性。假設控件A的屬性a被控件B觀察,且B的屬性b與之相關,則A的Output中對外屬性為屬性a,B的Input中被觀察控件ID為A的ID,被觀察屬性為屬性a,本控件對應屬性為屬性b。根據麥克風控件的Input屬性,它有五個輸入接口,分別對應自身的switch(啟停)、fs(采樣頻率)、bit(采樣位數)、gain(音頻信號增益)以及length(音頻信號輸出長度)屬性;根據Output屬性,它只有一個輸出接口,對應自身的audiodata(音頻數據)屬性。
iOS的開發平臺Xcode已經為開發者提供了一些常用的控件,例如標簽、按鈕等,但它們相互獨立,而虛擬儀器瀏覽器的所有控件必須遵循相同的接口原則,這樣才能相互通信。為了統一控件的開發方法,提高開發效率,本文所有控件類都繼承自基礎視圖類UIView,不會在Xcode已有控件類的基礎上開發。UIView表示屏幕上的一塊矩形區域,它負責渲染這片區域的內容并且響應該區域內發生的觸摸事件。每個控件都包括控件ID、位置坐標、高寬度、被觀察控件對象數組(observedControls)、被觀察屬性數組(observedProperties)和自身對應屬性數組(correspondingProperties)這些通用屬性,還包括一些專有屬性。每個控件還要定義一個賦值函數,其作用是根據控件腳本中的屬性值給實際對應的屬性賦值,除了自定義函數外,控件類還需要重寫和調用UIView的部分函數,如表1所示。

表1 控件類重寫和調用函數
對于滑動條控件,用戶可以拖動滑塊位置調節滑動條的輸出值,它也能根據外部傳進來的值設定滑塊位置,因此滑動條控件的輸入接口和輸出接口都需要實現。除了通用屬性外,滑動條控件還包括minValue (輸出下限值,滑塊位于最左端)、maxValue(輸出上限值,滑塊位于最右端)、value(輸出值)和position(滑塊位置,取值范圍0到1)四個專有屬性。滑動條控件只有一個輸入接口,對應的自身屬性是position,這個輸入接口的實現如下所示。
-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)object change:(NSDictionary
@synchronized(self){//給本控件上鎖,防止線程沖突
NSString* property;//本控件對應屬性
for(inti=0;i<[observedControls count];i++){
if(object==[observedControlsobjectAtIndex:i]&&keyPath==[observedPropertiesobjectAtIndex:i]){
property==[correspondingProperties objectAtIndex:i];break;
}
}
id newValue=[change objectForKey:@”new”]//被觀察屬性的新值
if([property isEqualToString:@”position”]){//對應position屬性的輸入接口
position=[newValuedoubleValue];
...//根據position計算滑塊坐標,重新繪制外形
}
}
}
在用戶開始對滑塊進行拖動時,系統會自動進入-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event函數中,需要重寫這個函數。
先根據用戶觸摸點坐標計算value的值,再調用-(void)setValue:(id)value forKeyPath:(NSString*)keyPath函數對value屬性賦值,這樣系統就會感知到value的變化,自動給所有觀察value屬性的控件發送通知,實現value屬性的輸出接口,輸出接口實現如下所示。
-(void)touchesBegan:(NSSet*)touches withEvevt:(UIEvent*)event{
UITouch* touch=[touches anyObject];
CGPoint point=[touch locationInView:self];
value=minValue+(maxValue-minValue)*point.x/width;//通過觸摸點坐標計算滑塊輸出值
[self setValue:[NSNumbernumberWithDouble:value]forKeyPath:@”value”];//實現value的輸出接口
…
}
虛擬儀器瀏覽器是基于iOS系統開發的,目前只有iPhone系列手機使用iOS操作系統,本文以iPhone5s作為試驗手機。打開應用后,首先進入瀏覽器主界面,如圖2(a)所示,主界面分為六個欄目,依次是瀏覽器介紹、藍牙通訊、WiFi通訊、網絡虛擬儀器庫、本地虛擬儀器庫以及下位機虛擬儀器庫,其中,點擊藍牙通訊和WiFi通訊會進入藍牙和WiFi的設置界面;點擊網絡虛擬儀器庫,將彈出網絡腳本網址輸入框;點擊本地虛擬儀器庫,會彈出列表顯示沙盒中所有腳本文件;點擊下位機虛擬儀器庫,瀏覽器向已連接的下位機請求腳本數據。以加載本地腳本為例,選擇本地虛擬儀器庫,如圖2(b)所示,選擇其中一個儀器腳本,然后選擇對腳本的操作,如圖2(c)所示,點擊生成儀器,就能對腳本進行解析生成虛擬儀器界面。以信號發生顯示器為例,驗證虛擬儀器瀏覽器的可行性。

圖2 虛擬儀器瀏覽器界面
工程實驗中常用到信號發生器和示波器,信號發生器可以產生多種類型的信號,示波器則負責顯示輸入的信號波形,本文將這兩種裝置結合在一起,設計了一個信號發生顯示器。它由8個控件組成:按鈕控件1、多聯按鈕控件2、數字調節鈕控件3、標簽控件4和6、滑動條控件5、信號發生器控件7以及示波器控件8。工作原理是:用戶點擊按鈕,按鈕狀態改變,會發送通知給信號發生器,啟動或停止發生器的工作,發生器工作時,每隔固定時間就生成一定幅值、頻率、相移的信號數據,用戶通過點擊多聯按鈕可以改變產生的信號類型,點擊數字調節鈕改變信號幅值,拖動滑動條的滑塊改變信號頻率,兩個標簽則負責顯示滑動條的上下限值,不參與儀器運行,信號波形由示波器的通道1顯示,當發生器的信號數據改變時,會發送通知給示波器,使之更新顯示的波形。下面是信號發生顯示器的簡化腳本,圖3是它的運行界面。
…
…
…
…
…
…

圖3 信號發生顯示器運行界面
本文分析了當前智能手機的發展狀況以及虛擬儀器技術在手機端的應用現狀,在比較了iOS和Android的優缺點之后,提出了一種基于iOS的手機虛擬儀器瀏覽器的設計方法。虛擬儀器瀏覽器以腳本為儀器載體,大大降低了虛擬儀器開發者在手機端開發虛擬儀器的難度,同時也提高了虛擬儀器用戶的使用體驗。
[1] 伍星華,王旭.國內虛擬儀器技術的應用研究現狀及展望[J].現代科學儀器,2011(4):112-116.
[2] 崔紅梅,麻碩士,裴喜春,等.虛擬儀器及其軟件開發平臺LabVIEW與LabWindows/CVI[J].內蒙古農業大學學報(自然科學版),2004,25(1):87-90.
[3] 白沛然.魯大師公布第一季度處理器TOP20:驍龍835奪冠[EB/OL].http://www.pcpop.com/doc/3/3966/3966133.shtml,2017.
[4] 王彥恩.2017Q1蘋果iOS系統份額降1.1%安卓漲2%[EB/OL].http://mobile.zol.com.cn/640/6407752.html, 2017.
[5] 孫曉文.iOS與Android操作系統的優缺點比較[J].無線互聯科技,2013(12):51.
[6] 趙 力.細數iOS上的那些安全防護[J].計算機與網絡,2016,42(17):50-51.
[7] 單丹丹,韓 冬.Android源碼中觀察者模式的運用[J].電腦知識與技術,2017(2):68-69.
[8] 關東升.iOS開發指南:從零基礎到App Store上架(第3版)[M].北京:人民郵電出版社,2015.
[9] 賈福林,王國仁,于 戈.基于DOM的XML數據庫的索引技術研究[J].計算機研究與發展,2004,41(1):175-186.
DesignofMobileVirtualInstrumentBrowserbasedoniOS
Wu Yuye, He Lingsong,Wei Wenji,Gao Zhiqiang
(Huazhong University of Science and Tecnology School of Mechanical Science &Engineering , Wuhan 430074, China)
In order to adjust functions of mobile virtual instruments dynamically,amobile virtual instrument browser based on iOSplatformhas been proposed. The principle is to turn thebrowser into differentvirtual instruments by loading different virtual instrument scriptsintoit.Avirtual instrument consists of several controls with many input and output interfaces.The assembly and communication of controls are based on KVO,and scripts are used to describe the assembly. All control classes inherit from UIView class and need to call and override a part of UIViewfunctions.The feasibility of the virtual instrument browser has been demonstrated by a signal generating-and-displaying instrument.
iOS platform; virtual instrument browser;control;KVO model
2017-07-14;
2017-09-14。
國家科技重大專項“高檔數控系統關鍵共性技術創新能力平臺(二期)”(2015ZX04005007)。
吳玉葉(1993-),女,湖南岳陽人,碩士研究生,主要從事手機虛擬儀器領域的研究。
何嶺松(1962-),男,四川成都人,教授,博導,主要從事工業測量控制、虛擬儀器技術領域的研究。
1671-4598(2017)11-0234-05
10.16526/j.cnki.11-4762/tp.2017.11.060
TP311.52
A