1. 程式人生 > >linux裝置上的Onvif 實現4:成功編譯gsoap 2.8.15

linux裝置上的Onvif 實現4:成功編譯gsoap 2.8.15

前言
    本說明示例是gsoap 2.8.15
    gsoap工具包中支援的平臺是:linux386、macosx、win32,沒有提供嵌入式arm平臺,本文將指導完成交叉工具編譯生成嵌入式平臺工具。
工作目錄:\\192.168.0.234\work\gaoht\gsoap
  \gsoap-2.8\   解壓後的目錄
  \target\      編譯後的安裝目錄

交叉編譯工具:TI平臺的:/work/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc

嵌入式作業系統:linux2.6.18

linux伺服器使用Ubantu,核心 linux 2.6.32,IP是192.168.0.234。我的程式碼都是在伺服器上編譯的。


在伺服器上編譯linux386平臺工具過程非常簡單,不費吹灰之力:
  ./configure  --enable-samples
  make


第一部分 編譯arm平臺gsoap工具

1 設定配置引數,同步編譯sample目錄
make distclean
./configure --host=arm-linux --prefix=/work/gaoht/gsoap/target --enable-samples

2 上述configure執行後會自動生成配置檔案gsoap-2.8\config.h,該檔案有錯誤,必須手動修改:
#define malloc rpl_malloc --> //#define malloc rpl_malloc
3  修改下列檔案,目的是新增標頭檔案#include <malloc.h>,避免編譯出錯。
 gsoap-2.8\gsoap\dom_cpp.cpp
 gsoap-2.8\gsoap\stdsoap2_cpp.cpp
 gsoap-2.8\gsoap\stdsoap2_ck_cpp.cpp
 gsoap-2.8\gsoap\stdsoap2_ssl_cpp.cpp
 gsoap-2.8\gsoap\wsdl\types.h
   
4 修改gsoap\src\Makefile,遮蔽這兩行,目的是不生成arm平臺的soapcpp2可執行檔案。

#@rm -f soapcpp2$(EXEEXT)
#$(soapcpp2_LINK) $(soapcpp2_OBJECTS) $(soapcpp2_LDADD) $(LIBS)
5 修改gsoap\wsdl\Makefile,遮蔽這兩行,目的是不生成arm平臺的wsdl2h可執行檔案。
#@rm -f wsdl2h$(EXEEXT) 
#$(wsdl2h_LINK) $(wsdl2h_OBJECTS) $(wsdl2h_LDADD) $(LIBS)
6 完整的make過程需要在linux伺服器上執行soapcpp2,因此必須把將soapcpp2複製到gsoap\src\,
同理將wsdl2h複製到gsoap\wsdl。
cp gsoap/bin/linux386/soapcpp2   gsoap/src
cp gsoap/bin/linux386/wsdl2h   gsoap/wsdl

7 執行 make,完成編譯全過程。
make


8 make install
安裝後在\\192.168.0.234\work\gaoht\gsoap\target\生成以下目錄:
\bin
\include
\lib
\share


第二次全部清空編譯時可以省略第3步。
完整的步驟:
make distclean
./configure --host=arm-linux --prefix=/work/gaoht/gsoap/target --enable-samples
cp config--right.h  config.h
cp gsoap/src/Makefile--right  gsoap/src/Makefile
cp gsoap/wsdl/Makefile--right  gsoap/wsdl/Makefile
cp gsoap/bin/linux386/soapcpp2   gsoap/src
cp gsoap/bin/linux386/wsdl2h   gsoap/wsdl
make
make install

---------------------------------------------------------
第二部分 編譯過程錯誤說明

1 不修改gsoap-2.8\config.h,編譯會提示: 
stdsoap2_cpp.cpp:2093: 錯誤:‘malloc’在此作用域中尚未宣告
連結時提示未找到rpl_malloc。

2 不新增標頭檔案#include <malloc.h>,會提示: 
stdsoap2_cpp.cpp:2093: 錯誤:‘malloc’在此作用域中尚未宣告

3 未修改gsoap\wsdl\Makefile、gsoap\src\Makefile,未拷貝soapcpp2、wsdl2h,編譯會提示:
../../gsoap/src/soapcpp2: ../../gsoap/src/soapcpp2:無法執行二進位制檔案

---------------------------------------------------------

第三部分 gsoap工具使用說明

1 建立工作目錄target,將工具wsdl2h、soapcpp2、*.wsdl檔案存放在此目錄中
2 執行wsdl2h:
執行一般的web service,只要使用/gsoap-2.8/gsoap/ WS-typemap.dat即可。
./wsdl2h -s -c -o remotediscovery.h  remotediscovery.wsdl -t WS-typemap.dat
執行WSDL功能,必須使用/gsoap-2.8/gsoap/WS/ WS-typemap.dat,否則就要手動新增WSDL相關內容。
./wsdl2h -s -c -o remotediscovery.h  remotediscovery.wsdl -t WS-typemap.dat

Gsoap 2.8.15版本下的WS-typemap.dat是完整的,支援WS-Discovery

Gsoap 2.8.3下的gsoap/typemap.dat需要手工新增命令空間。這個檔案不同導致生成的RemoteDiscoveryBinding.nsmap字首是不同的。

3 執行soapcpp2,用到了/gsoap-2.8/gsoap/import 中的標頭檔案,必須指定import路徑。
./soapcpp2 -c -L -x -I../gsoap-2.8/gsoap/import remotediscovery.h

生成的檔案是:

RemoteDiscoveryBinding.nsmapwsdd.nsmap   這兩者是相同的

soapC.c

soapH.h

soapClient.c

soapServer.c

soapStub.h

-----------------------------------
---------------------------------------------------------------------

第六部分 add計算服務 示例執行成功

參考資料 http://blog.csdn.net/myfwf1988/article/details/8899144
1 建立測試目錄/work/gaoht/gsoap/gsoap-2.8/gsoap/samples/add,
2 成功編譯,
3 在連線0.234的一個終端上執行addserver,繫結埠1234。
  ./addserver 1234
4 在連線0.234的另一個終端上執行addclient,指定伺服器及埠:
  ./addclient 192.168.0.234:1234 10 20
5 觀察到伺服器端提示
Socket connection successful: master socket = 3
Socket connection successful: slave socket = 4
客戶端提示:
server is 192.168.0.234:1234, num1 is 10, num2 is 20/n--stdsoap2.c: 5027 
10 + 20 = 30

相關推薦

linux裝置Onvif 實現4成功編譯gsoap 2.8.15

前言     本說明示例是gsoap 2.8.15     gsoap工具包中支援的平臺是:linux386、macosx、win32,沒有提供嵌入式arm平臺,本文將指導完成交叉工具編譯生成嵌入式平臺工具。 工作目錄:\\192.168.0.234\work\gaoht\

linux裝置Onvif 實現9檢查是否支援該裝置

前文獲取了攝像頭的2個通道的視訊解析度、幀率、位元速率、編碼格式等資訊,目的是為了判斷我的linux裝置能否支援該視訊解碼顯示。 如果能夠支援那麼就大吉大利,一切OK!如果兩個通道都不支援,那麼就需要更麻煩的自動修改配置引數過程了,詳細修改過程見後文說明。 2 我的判斷函式 我的判斷標準是: #define

Linux裝置Onvif實現17實現RTSP摘要認證

1 RTSP協議中定義了兩種認證方法,基本認證(basic authentication),摘要認證(digest authentication)。基本認證是http1.0提出的認證方案,其密碼傳輸的加密演算法(base64)是可逆演算法,很容易被截獲破解。摘要認證是htt

linux裝置Onvif 實現11: 修改媒體配置資料的流程

前文已經說明了獲取攝像頭RTSP地址的完整方法,本文將要更進一步說明當發現攝像頭的配置資訊不支援的時候如何進行修改。完整的修改流程如下: 1 讀取媒體配置資訊 2 讀取子通道的配置資料範圍。 一般2通道,第1是主通道,第2是子通道。 3 根據資料範圍修改子通道的配置資料

Linux裝置Onvif實現18: ONVIF視訊監視功能開發問題總結

ONVIF視訊監視功能開發問題總結        我從去年8月份開始學習ONVIF,經歷了各種困難,有時簡直要暴走發狂,終於能夠達成計劃目標,實現了預訂功能。痛苦已經過去,現在是寫個問題總結的時候了,希望能記錄遇到的問題,以便將來遺忘時參考。 測試的攝像頭有2種品牌3種型

linux裝置驅動第三篇如何實現簡單的字元裝置驅動

在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下

LinuxLinux裝置驅動開發詳解基於最新的Linux 4.0核心

1 Linux裝置驅動概述及開發環境構建 1.1 裝置驅動的作用 驅使硬體裝置行動 1.2 無作業系統時的裝置驅動 典型架構:一個無限迴圈中夾雜著對裝置中斷的檢測或者對裝置的輪詢 1.3 有作業系統時的裝置驅動 併發 、記

Linux裝置驅動開發詳解基於最新的Linux 4.0核心》一刷勘誤

這是第一次印刷的勘誤,大部分應該買的都是5刷了,這些錯誤基本已經絕跡。還是有部分童鞋買的書老書,

Linux裝置驅動之3.4.2核心下的I2C驅動

框架 1.1 硬體協議簡介 1.2 驅動框架 1.3 bus-drv-dev模型及寫程式 a. 裝置的4種構建方法 詳情參照:linux-3.4.2\Documentation\i2c:instantiating-devices: 以下摘取部分

linux裝置驅動第三篇寫一個簡單的字元裝置驅動

在linux裝置驅動第一篇:裝置驅動程式簡介中簡單介紹了字元驅動,本篇簡單介紹如何寫一個簡單的字元裝置驅動。本篇借鑑LDD中的原始碼,實現一個與硬體裝置無關的字元裝置驅動,僅僅操作從核心中分配的一些記憶體。 下面就開始學習如何寫一個簡單的字元裝置驅動。首先我們來分解一下字元

Linux核心TCP/IP 實現協議棧原始碼分析圖

一.linux核心網路棧程式碼的準備知識 1. linux核心ipv4網路部分分層結構: BSD socket層: 這一部分處理BSD socket相關操作,每個socket在核心中以struct socket結構體現。這一部分的檔案主要有: /net/

Linux裝置驅動第七篇高階字元驅動操作之阻塞IO

我們之前介紹過簡單的read,write操作,那麼會有一個問題:當驅動無法立即響應請求該怎麼辦?比如一個程序呼叫read讀取資料,當沒有資料可讀時該怎麼辦,是立即返回還是等到有資料的時候;另一種情況是程序呼叫write向裝置寫資料,如果緩衝區滿了或者裝置正忙的時候怎麼辦,

宋寶華《Linux裝置驅動開發詳解》——sysfs檔案系統與linux裝置模型(5.4.2

以下讀書筆記內容,摘自宋寶華《Linux裝置驅動開發詳解》一書。 1、sysfs檔案系統的簡介 (1)linux2.6以後的核心引進syfs檔案系統,是虛擬檔案系統; (2)產生一個包括所有系統硬體

linux裝置驅動第四篇從如何定位oops的程式碼行談驅動除錯方法

上一篇我們大概聊瞭如何寫一個簡單的字元裝置驅動,我們不是神,寫程式碼肯定會出現問題,我們需要在編寫程式碼的過程中不斷除錯。在普通的c應用程式中,我們經常使用printf來輸出資訊,或者使用gdb來除錯程式,那麼驅動程式如何除錯呢?我們知道在除錯程式時經常遇到的問題就是野指標

linux裝置驅動第五篇驅動中的併發與竟態

綜述 在上一篇介紹了linux驅動的除錯方法,這一篇介紹一下在驅動程式設計中會遇到的併發和竟態以及如何處理併發和競爭。 首先什麼是併發與竟態呢?併發(concurrency)指的是多個執行單元同時、並行被執行。而併發的執行單元對共享資源(硬體資源和軟體上的全域性、靜態變數)

Linux檔案傳及下載rz&sz

1、簡述 通常,利用SSH管理遠端Linux伺服器時,經常需要與本地互動檔案。當然,我們可以利用FTP方式,比如通過Filezilla客戶端軟體。不過直接使用SSH軟體(SecureCRT、Xshell)自帶的上傳和下載功能無疑使最方便快捷的。通常SSH軟

Redis 設計與實現 4字典

Redis 中,字典是基礎結構。Redis 資料庫資料、過期時間、雜湊型別都是把字典作為底層結構。 # 字典的結構 ## 雜湊表 雜湊表的實現程式碼在:`dict.h/dictht `,Redis 的字典用雜湊表的方式實現。 ```c typedef struct dictht { // 雜湊表陣列,俗稱

Linux裝置沒有空間之覆盤

某天前端在調介面的時候,發現登入頁面得驗證碼介面居然沒有響應資料,顯示的是500響應碼。於是我一路排查,首先排查驗證碼介面所屬的微服務是否正常,通過lsof -i:服務埠進行排查,發現該微服務程序存在,同時我在服務註冊中心的服務管理列表也發現該服務正常註冊。結合之前遇到的問題,驗證碼介面報500,沒有及時響應

【LeetCode & 劍指offer刷題】發散思維題464 求1+2+…+n

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 64 求1+2+...+n 題目描述 求1+2+3+...+n,要求 不能使用乘除法、 for、while、 if、else、switch、case等關鍵字及條件判斷

蛇形填數 描述 在n*n方陳裡填入1,2,...,n*n,要求填成蛇形。例如n=4時方陳為 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4

#include <stdio.h>int main() {int a[100][100];int m,n,M,N,x,y,i,j,t=0;scanf("%d",&M);N=M;for(x=0,y=M-1;N>0;N=N-2,x++,y--){for