[CS193P] 第十七堂課摘要及心得筆記

本系列課程即將邁入最後的尾聲,而在這倒數第三堂課中,我們將學習到如何使用Apple的Bonjour來傳遞網路服務,以及透過NSStream來在網路上進行資料傳輸,此外還有iPhone OS 3.0中所新加入的GameKit套件,就讓我們一起來看看吧!
評論
評論

本系列課程即將邁入最後的尾聲,而在這倒數第三堂課中,我們將學習到如何使用 Apple 的 Bonjour 來傳遞網路服務,以及透過 NSStream 來在網路上進行資料傳輸,此外還有 iPhone OS 3.0 中所新加入的 GameKit 套件,就讓我們一起來看看吧!

Bonjour

Bonjour 是 Apple 在 2002 年所推出的一種網路服務搜索的協定,除了 Mac 和 iPhone 有支援以外,許多網路設備,像是支援網路列印的印表機也都使用 Bonjour 協定。

為了能夠讓讀者了解 Bonjour 的概念,我們做一個簡單的舉例:假設我們想傳送要列印的資料給網路上的印表機,首先必須得先設定印表機的 IP 地址以及其使用的 Port 等等資料,我們的電腦才能將資料傳遞過去。然而,透過支援 Bonjour 服務的印表機,我們就不需要自己手動設定這些 IP 地址等資訊,因為當印表機連上網路的同時,便會自動通知網路上其他支援 Bonjour 的設備,並且傳遞相關的設定資料。

很容易搞混的一點是,Bonjour 只有負責網路服務的尋找,並不負責底層的功能實做,這點需要注意。

在 Bonjour 協定下,每一個裝置都會有自己的代號,這個代號最後的 Domain 通常是以.local. 代表本地的網路,像是 iPhone3GS.local.。而裝置所提供的服務,也有不同的表示方式,如下圖所示:

實際的運用上,NSStream 會透過呼叫 delegate 方法來表示他目前的狀態,但要注意的是,讀取跟寫入仍然是同步執行的,也就是必須另外建立執行緒,否則程式就會卡在網路的傳遞上。

而誠如剛剛所提到的,在我們解析完 NSNetService 之後,可以直接呼叫以下方法取得輸入跟輸出的 NSStream:

NSInputStream *inputStream = nil; NSOutputStream *outputStream = nil; [netService getInputStream:&inputStream outputStream:&outputStream];

在取得 NSStream 之後,我們必須先開啟它,才能進行讀取或寫入,而使用完畢之後,也必須關閉,程式碼如下:

// 開啟 [stream setDelegate:self]; [stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [stream open];  // 關閉 [stream close]; [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; [stream setDelegate:nil];

這邊可能大家有發現到,有個 NSRunLoop 的物件出現在呼叫方法中,什麼是 Run Loop 呢?在我們啟動 iPhone 應用程式之後,便會一直在 Run Loop 裡面等待事件的發生,像是觸控事件或是硬體開關的切換等等。而為了能夠讓我們傳輸網路資料,我們必須將 NSStream 物件加入到 Run Loop 上才行。

而如前面所提及的,我們可以透過 NSStream 的 delegate 方法來確定狀況,如下:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

而對於已經開啟過的 NSOutputStream 我們就可以呼叫 - (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)length 來進行資料的傳遞,該方法會回傳成功傳送出的資料長度,如下列範例:

const char *buff	= “Hello World!”; NSUInteger buffLen = strlen(buff); NSInteger writtenLength = [outputStream write:(const uint8_t *)buff maxLength:strlen(buff)]; if (writtenLength != buffLen) {     [NSException raise:@”WriteFailure” format:@””]; }

讀取 NSInputStream 的方法也很類似,透過呼叫 - (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)length:

unit8_t buff[1024]; bzero(buff, sizeof(buff)); NSInteger readLength = [inputStream read:buff maxLength:sizeof(buff) - 1]; buff[readLength] = ‘\0’; NSLog(@”Read: %s”, (char *)buff);

GameKit

而在 iPhone OS 3.0 之後便加入了 GameKit 這個 framework,而這個 framework 可以幫助我們透過 Wi-Fi 或是藍牙讓使用者進行配對、建立連線,此外,也有提供音訊聊天的功能。在 GameKit 中提供了以下的類別:

  • GKPeerPickerController -- 呈現使用者配對介面並建立 GKSession
  • GKSession -- 傳遞資訊給單一的使用者或是所有的玩家
  • GKVoiceChatService -- 管理音訊聊天的功能

GKSession 物件是整個 GameKit 的操作核心,我們可以用下列方法建立 GKSession 物件:

- (id)initWithSessionID:(NSString *)sessionID displayName:(NSString *)name sessionMode:(GKSessionMode)mode

而 GKSession 物件則包含了以下屬性:

  • displayName -- 玩家的顯示名稱
  • peerID -- 玩家的 ID,每台 iPhone 均不會重複
  • sessionID -- 你的程式 ID,用來避免不同的應用程式會互相干擾

然而,單純建立好 GKSession 並沒有幫我們完成使用者之間的配對,必須另外透過 GKPeerPickerController,GKPeerPickerController 而提供了兩種方法讓使用者配對,分別是"nearby" 和"online",前者透過藍牙進行配對,iPhone OS 會玩成大部份的工作,後者則是要讓開發者自行建立網路主機,讓使用者可以線上與全球使用者進行配對。

而使用上就如同其他 PickerController 一樣,設定好 delegate 並將 view 加入到畫面上後,物件就會接手處理,並且透過 delegate 方法建立 GKSession:

// 基本設定 GKPeerPickerController *peerPicker; peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = self;  // 選擇連線模式 peerPicker.connectionMask = GKPeerPickerConnectionTypeOnline | GKPeerPickerConnectionTypeNearby;  // 顯示 alert [peerPicker show];

而當我們取得建立、配對完成的 GKSession 後,就可以簡單的透過以下方法傳送、讀取資料了:

// 傳送資料給特定對象 - (BOOL)sendData:(NSData *)data toPeers:(NSArray *)peers withDataMode:(GKSendDataMode)mode error:(NSError **)error; // 傳送資料給全部人 - (BOOL)sendDataToAllPeers:(NSData *)data withDataMode: (GKSendDataMode)mode error:(NSError **)error; // delegate 方法,接收資料 - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context;

若有不清楚的地方,可以參考課堂影片中的範例教學,裡面有詳細的操作示範以及範例程式。

結論

這一次的課程中,我們學到如何讓使用者之間能夠進行網路連線的互動,並且使用 GameKit 來簡化整個操作流程。在下一次的課程中,我們將看到如何在 iPhone 上進行 Unit Testing 以及如何建立多國語系支援的應用程式,敬請期待!

參考資源


【社會數位轉型】連假出門不塞車、推動漁港再生,經濟部打造永續交通生態圈

智慧運輸時代來臨,全球競相投入無人載具與數位交通研發,希望在未來行動力的佈局搶得先機。從陸地、海洋到空中,無人機以整合 AI、5G 技術為核心,應用場域超乎想像,不僅能帶動產業升級與經濟成長,在解決社會問題上也有許多可能性。
評論
Photo Credit:Pexels
評論

聯合國預估,2030 年全球將出現 43 個人口超過千萬的巨型城市,而 2050 年將有 7 成人口居住於都市。城市人口密度持續增加,為交通帶來更大考驗,需要用更有效率的方式來管理。而在臺灣常見因車流量過大造成塞車、事故頻傳,以及偏鄉交通不便、公共運輸使用吸引不足、燃油車輛帶來環境污染等問題,也可望透過發展智慧交通迎刃而解。雖然短時間內還無法真正落地、普及,但種種想像已顯現出智慧運輸系統(Intelligent Transport System,ITS)的重要性。

智慧運輸科技是一門跨領域的技術,包括 7 大關鍵新興科技 iABCDEF 中的i(IoT,物聯網)、A(AI,人工智慧)、D(數據科技,DataTech)、E(邊緣運算,Edge Computing),並涵蓋資通訊、能源與電子等產業。面對接踵而來的挑戰,經濟部技術處與工業局合作,配合交通部、科技部、工研院、資策會等跨部會單位,關注企業與民眾的需求缺口,擴大各項交通科技創新服務的實驗場域。希望加速資通訊及智慧交通應用落地,推動產業轉型與數位經濟發展,更處理公共議題,建立更好的居住環境。

交通車載設備一站式整合 為國內實現物物相聯

未來在 5G 環境下,物聯網能讓各種設備、軟體、網路服務等更快速的相互連結,透過虛實整合應用與民眾進行深度互動,達成高速運算、低延遲通訊、萬物聯網的目標,這也是目前持續發展如智慧交通、自駕車所必備的條件。

當交通與運輸更加智慧化,將為國內業者帶來新商機,相關產業鏈例如雲端軟體服務、影像辨識與人工智慧分析、路側設備業、道路安全警示以及周邊的系統整合、工程顧問、二輪車安全聯網等,都是發展智慧交通智慧系統重要的環節,而智慧交通控制服務也是相當重要的一環,當交通號誌的紅綠燈控制做最有效的安排時,將可使路網中的車流運行更加順暢,也能減少更多的廢氣與碳排放的產生。

資策會智慧系統研究所(系統所)組長黃暉慈指出,發展一站式整合的關鍵之一在於道路上的路側設備(Roadside Unit,RSU)與安裝在車內的車載裝置(On Board Unit,OBU)兩者間的跨設備溝通,過去常因各家技術及介面規格不一、各類型設備分屬不同廠商維護、跨部門協調等原因難以整合,若要產生對民眾更具價值的應用相對是一大難題。

以建立永續智慧交通環境為目標,經濟部技術處匯集各法人能量,致力於運輸資源、資訊的整合共享,提升協作效能。

「比方說像各縣市智慧公車站牌就都長得不一樣,以及路側設備分屬不同部門管理:如交通局的號誌、工務局路燈管理處的路燈、警察局的 CCTV 等等,設備跟服務多為各單位獨立運作,資源無法進行有效的整合」黃暉慈表示。因此,為提升協作效率最佳化,經濟部技術處與資策會系統所合作,發展多元資訊的智慧交通作業系統,以建立共通平台之概念,打破廠商之間的資訊串接藩籬並能協同合作,減少資料使用者、管理者必須面對不同格式資料的困擾,以達成資訊交流的通透性與共享目的。

黃暉慈說明,智慧交通作業系統(Transport OS,TOS)是一套能整合各項遠端設備的管理平台,透過 TOS 函式庫讓程式介接、遠端佈署與應用開發都變得更簡單。「我們希望藉由一套共通的標準格式進行資料的收集,協助業者在設備管理、資料管理、資料分析上都能更加簡易有效率。」經由系統的整合,能自動化遠端監控路側設備的運行狀態,偵測錯誤並通知管理者,並以AI感測蒐集車輛、事故等應用數據。「省下開發系統和串接的功夫,業者能專注在設備功能的強化。」經濟部計畫透過整合性資訊服務,改善當今運輸走廊壅塞問題,未來國內車廠在技術發展上也能突破國外母廠的限制,打造出門無縫、用路安全、交通順暢的智慧運輸系統。

黃暉慈舉例,假如 CCTV 的監控影像出現雜訊、模糊、被遮蔽或鏡頭偏移,或工業電腦網路斷線等異常發生,系統都能即時發現問題,發出警示,「本系統具備彈性擴充功能,可協助業者介接提供更多加值應用,例如接入 RTSP 串流影像也能做到如智慧化判斷車輛是否違停的科技執法應用。」此外,TOS 的另一特色就是會將蒐集到的數據生成可視化圖表,有效地傳遞資訊,以利使用者能迅速評估狀況、做出因應。

Photo Credit:資策會

提升船舶監測效率 給予閒置港岸新生命

除了陸地的交通,海洋也是智慧運輸科技的發展重點。資策會系統所蔡政鴻組長分析,臺灣四面環海、海岸線長達 1,000 多公里,每年海洋經濟產值高達近 6 千億,「物流、漁業之外,還有觀光娛樂,光是用漁船載客出海磯釣每年就可賺超過百億,把安全性做好會很有市場。」

資策會系統所在經濟部技術處科技專案的支持下,採納百家以上產官學研機構與專家的建議,以海港數位轉型需求的高可靠邊霧協作物聯網技術為主,規劃「近岸船舶監測系統」,與相關業者、海巡隊合作,加強港岸船舶的管理效率。

蔡政鴻說,過去在智慧漁港常常做的是智慧照明,當然智慧照明在節能與管理上有很多好處,但除了漁港好像放在其他地方也很好,對於漁港的特色比較沒有凸顯出來。現在漁港面臨的問題是利用度不高,漁港資產閒置,最主要原因是來自過度捕撈,導致海裡無魚可抓,因此產生閒置問題,海洋資源的永續是主要的解決方法,除了生態保育,另一個是漁業漁港的轉型,從過去過度捕撈的抓來吃,轉型到生態體驗的旅遊價值,傳統漁業要轉型到娛樂漁業,發揮觀光旅遊的價值,從中帶來收入,魚就不用補那麼多,海洋資源才可永續。美國的漁業統計,休閒釣魚的經濟效益是商業捕魚的九倍,因此休閒釣魚的發展,其實是可以取代商業捕魚的部分經濟能量,進而減少捕撈。

以基隆市政府為例,2017 年便率先制定娛樂漁業島礁磯釣自治條例,管理認證核發與收費標準,並陸續導入科技管理工具,以船舶自動識別系統(Automatic Identification System,AIS)對磯釣船舶實施監測,採用邊霧運算技術,藉由與鄰近船舶、衛星等設備交換資料,當磯釣船訊號消失或離岸太遠,就會發出警示,建立數位治理機制,確保磯釣活動的安全戒護工作落實,保障業者與釣客的活動安全。另外磯釣證申辦,過去都要上班時間臨櫃申辦,造成不便。現在將磯釣證上網申辦,結合磯釣船出船單,送到漁港的海巡安檢流程,到磯釣船舶的海上航跡訊號勾稽,完成一套完整的服務鏈路,讓安全與方便形成基隆磯釣發展的重要後盾。使過去出海捕魚轉變成載客釣魚,減少捕撈,生態得以生息,漁民也有生計,還帶動釣具產業的發展。

其實智慧交通早已悄悄融入在日常生活,我們對數位票證的依賴度不斷增加,新零售時代的物流配送越來越快速。然而各種進步將可能衝擊原有的就業市場,該如何引導人才轉型也是重要的社會課題。

且讓我們試著想像,在交通的流動中,有出門運動、買菜的銀髮族,有通勤的白領上班族,有趕著上學的學生與接送孩子的父母,每個人的移動需求都能被滿足。經濟部技術處期望從技術專業角度,協助打造更人性化、友善的交通環境;同時,企業也能從競爭轉為合作,共同為產業創新轉型與減少污染的社會企業責任努力,創造更多就業機會;政府也能減少治理、管理的成本,持續優化交通運輸系統,形成社會美好的循環。