2015年11月3日 星期二

[Embedded] Arduino RFID 模組

前陣子到光華商場買了一個 RFID 模組,今晚比較有空,便來玩玩看,作個記錄。

測試設備
  • Arduino UNO 
  • RFID-RC522,一組$280,含兩個 RFID Card 和 RFID Reader

在 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/