顯示具有 WS-Discovery 標籤的文章。 顯示所有文章
顯示具有 WS-Discovery 標籤的文章。 顯示所有文章

2015年11月3日 星期二

在 iOS 設備上使用 gSoap

本篇以 WSDiscovery 為例,說明如何在 iOS 上使用 gSOAP ,
使用的軟體版本為  gSOAP  2.8.19 與 XCODE  6.4

1. 取得軟體
gSOAP 可從 sourceforge 下載,  xcode 可從 Mac 內建的 AppStore取得。

2. 用 gSOAP 產生需要的程式碼,詳細作法可參考此篇文章


3. 可選擇使用 iOS plugin,或自行實作網路介面
iOS plugin 利用 iOS 的 NSURL 與 NSMutableURLRequest 來實作傳送與接收 HTTP 層的資料,使用範例如下: 
 #import "gsoapios.h"
struct soap *soap = soap_new();
soap_register(soap, soap_ios); // Register the iOS plugin
 ...
soap_end(soap);  // clean up allocated temporaries
soap_destroy(soap); // Free soap context 
iOS plugin 的方法簡介
  • 設定 Cache Policy
soap_ios_setchacepolicy(soap, NSURLRequestReturnCacheDataElseLoad); 
  • 設定timeout
soap_ios_settimeoutinterval(soap, 30.0); 
  • 設定帳號密碼
soap->userid = "someone";
soap->passwd = "somepass";
   
4. 以wsdiscovery 為例,實作方式摘錄如下
a.直接取得 wsdiscovery 程式碼
git clone https://github.com/alb423/wsdiscovery
b.開啟 xcode, 新增一個 project, 將 wsdiscovery 目錄內的檔案都新增至 Project (main.c除外) 
c. 新增 wsdiscovery_api.m,參考 main.c 進行小量修改 
d. 開始編譯。此時會出現幾種錯誤,主要其解決方式如下
d1. 找不到 NSString,在 gsoapios.h 加入include file 即可,如下:
#import <UIKit\UIKit.h>
d2. 找不到 DLog,在 gsoapios.h 自行定義即可,如下:
#ifdef DEBUG
#define DLog NSLog
#else
#define DLog(X, ...) ;;;
#endif         
d3. ARC (Automatic Reference Counting), 
可設定 gsoapios.m 不使用 ARC,設定方式為 Target -> Build Phases -> Compile Sources -> 選擇 gsoapios.m,輸入 -fno-objc-arc即可。如下圖

   
d4. "ARC forbids Objective-C objects in struct"
將 GSoapiOSURLData *url_data;
改為 __unsafe_unretained GSoapiOSURLData *url_data;
 
5. 本範例直接操作 socket,並不需要 HTTP,因此沒有用到 iOS plugin。接下來我將會在 iOS 上使用 gSOAP 與 ONVIF command 結合,並藉由這個範例來測試 iOS plugin。

註1: 範例程式碼可從 https://github.com/alb423/wsdiscovery 下載
註2: 針對 ARC 錯誤,也可以請 Xcode 自動將程式碼轉換成 ARC。作法是 Edit -> Convert -> Convert to Objective-C ARC...,可參考此篇文章 http://onevcat.com/2012/06/arc-hand-by-hand/

2013年9月18日 星期三

ONVIF -- WS-Discovery spec

WS-Discovery 全名為 Web Service Dynamic Discovery

本篇將針對 WS-Discovery spec 作一整理,並介紹 ONVIF 使用 WS-Discovery 時,需做的一些變更,另外此處也介紹該如何使用 gSOAP 來進行實作。

一、WS-Discovery 定義三個角色

  • Client
  • Target Service
  • Discovery Proxy

ONVIF -- WS-Discovery implementation

Here is a guide to teach you how to implement WS-Discovery by gSOAP. You can also find sample code here.

1. Xml Schema of WS-Discovery 

Use the typemap.dat file located in "\gsoap-2.8\gsoap\wsdl\".
WS-Discovery is already defined in typemap.dat.
 1 # WS-Discovery 1.1 and 1.0
 2 
 3 wsdd = <http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01>
 4 wsdd10 = <http://schemas.xmlsoap.org/ws/2005/04/discovery>
 5 
 6 wsdd10__HelloType  = | wsdd__HelloType
 7 wsdd10__ByeType   = | wsdd__ByeType
 8 wsdd10__ProbeType  = | wsdd__ProbeType
 9 wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType
10 wsdd10__ProbeMatchType  = | wsdd__ProbeMatchType
11 wsdd10__ResolveType  = | wsdd__ResolveType
12 wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType
13 wsdd10__ResolveMatchType = | wsdd__ResolveMatchType
14 wsdd10__ScopesType  = | wsdd__ScopesType
15 wsdd10__SecurityType  = | wsdd__SecurityType
16 wsdd10__SigType   = | wsdd__SigType
17 wsdd10__AppSequenceType  = | wsdd__AppSequenceType