RSi 기상정보취득 컴포넌트

TITLE:RSi 날씨 정보 취득 컴퍼넌트

RSi 날씨 정보 취득 컴퍼넌트

날씨 정보 취득 컴퍼넌트는,로봇 서비스 이니시아티브(RSi) 가 제공하는 「날씨 정보 서비스」를, RT미들 웨어로부터 이용하기 위한 게이트웨이 컴퍼넌트입니다. RSi 서비스 서버와 통신하고 정보를 받아들이는 기능을 가지고 있어 다른 RT컴퍼넌트와 조합하는 것으로, 날씨 정보로 따라 기기를 제어하거나 요구에 응한 형식(문자, CG, 음성등)에서 정보를 제공할 수 있게 됩니다.

개발의 배경

일상생활을 지원하는 차세대의 로봇 시스템에서는, 유저의 다양한 요구에 응하기 위해, 여러가지 기기나 로봇 사이의 제휴, 네트워크를 개입시킨 서비스의 제공이 필요하게 됩니다.그 때문에, 여러가지 기업이나 단체에서 제휴를 위한 프로토콜이 정해져 오고 있습니다만, 향후의 로봇 산업의 확대를 위해서는 그러한 프로토콜간의 상호 접속성이 중요해집니다.
거기서 이번, 통신 네트워크를 활용한 로봇 서비스의 추진 조직인 RSi와 협력해, RT미들 웨어와 RSi 프로토콜 사양과의 상호 접속을 도모하는 것으로 했습니다. 날씨 정보 취득 컴퍼넌트는, 양프로토콜의 상호 접속의 실증예로서 개발한 것입니다.

RSi 날씨 정보 서비스

날씨 정보 서비스는, 재단법인 일본 기상 협회로부터 제공되고 있는 RSi의 응용 서비스의 하나로, 오늘 모레의 3일간의 일기 예보가 제공되고 있습니다.정보를 갖고 싶은 지역의 리퀘스트를 보내는 것으로, 이하의 날씨 정보를 XML 형식에서 받을 수 있습니다.
  • 기상 데이터 발표 일시
  • 최고·최저 기온
  • 강수 확률
  • 일기 예보문
  • 텔롭 번호(일기 예보 프로그램에서 날씨 마크등의 표시용으로 사용되는 번호)
  • 물결 예보
  • 바람 예보
  • 날씨 정보 서비스 오리지날 정보(세탁 지수, 화분 정보 등)

 <?xml version="1.0" encoding="shift_JIS" ?>
 <Weather_short_info>
 <announce_time>2007-07-11T17:00:00+09:00</announce_time>
 <max_temp>27</max_temp><min_temp>24</min_temp>
 <prob_precip1>40</prob_precip1>
 <prob_precip2>40</prob_precip2>
 <prob_precip3>50</prob_precip3>
 <prob_precip4>40</prob_precip4>
 <weather_text1>비오는 밤 흐림</weather_text1>
 <weather_text2>흐림아침 중에서 주전우</weather_text2>
 <weather_text3>흐림 가끔비</weather_text3>
 <telop_no1>313</telop_no1>
 ···
 ···
 </Weather_short_info>

RSi 서비스는, 기능이나 제공 서비스 마다 준비되는 복수의 프로파일군으로부터 구성되어 있습니다.유저는, 목적으로 하는 서비스에 필요한 복수의 프로파일과 통신하는 것에 의해서 일련의 서비스를 받을 수 있습니다.RSi 프로토콜에서는 SOAP-RPC 방식이 사용되고 있어 프로파일 마다 그 인터페이스가 WSDL에 의해서 정의되고 있습니다.


날씨 정보 서비스를 받기 위해서는,기본 프로파일 및날씨 정보 프로파일와의 통신이 필요합니다.기본 프로파일은, RSi 서비스와 유저 사이의 통신(회화 세션이라고 부릅니다)을 개시·종료하기 위한 기능을 제공하는 서비스로, RSi 서비스를 이용하기 위해서는 필수의 프로파일이 됩니다.

날씨 정보 서비스로부터 정보를 취득하기 위한 수속을 이하에 나타냅니다.

1. 회화 세션의 개시(기본 프로파일)
  유저명·패스워드에 의한 인증을 실시해, 회화 세션을 개시.회화 세션 ID(conv_id)를 취득.

 conv_id open(userid, password);
2. 날씨 정보의 리퀘스트·취득(날씨 정보 프로파일)
  정보가 갖고 싶은 지역·지점 코드(혹은 지역·지점명)를 건네주어 정보를 취득.Ret_value는 구조체로, 획득 날씨 정보(detail)와 처리 상태에 관한 정보(error)를 가진다.
 Ret_value get_weather_short(conv_id, flag, area, point);
3. 회화 세션의 종료(기본 프로파일)
  회화 세션 ID(conv_id)에 의한 세션의 종료.
 void close(conv_id);

날씨 정보 취득 컴퍼넌트의 작성

RSi 날씨 정보 서비스와 통신해 정보를 취득하는 게이트웨이 컴퍼넌트를 작성합니다.
우선, 각 프로파일의 WSDL로부터 클라이언트 프로그램을 작성해, 클라이언트 프로그램의 컴퍼넌트화를 실시합니다.

winfo_comp.png
날씨 정보 취득 컴퍼넌트


클라이언트 프로그램의 작성

이번은, 프리의 C/C++향해 범용 SOAP 라이브러리의gSOAP를 이용해 날씨 정보 서비스의 클라이언트 프로그램을 작성합니다.(gSOAP의 상세하게 관계해서는, gSOAP의 문서를 참조해 주세요.)

WSDL로부터 서비스 정의 헤더 파일의 생성

gSOAP의wsdl2h커멘드를 이용하고, WSDL로부터 중간 파일의 서비스 정의 헤더 파일을 생성합니다. (wsdl2h의 실행 파일은 gSOAP의 전개 폴더의 bin 폴더내에 있습니다.)

 > wsdl2h -o RSiWeather.h Basic_profile.wsdl Weather_profile.wsdl

날씨 정보 서비스에서는, 기본 프로파일과 날씨 정보 서비스 프로파일이 필요해서, 2개의 WSDL 파일을 인수로 취해, 복수의 서비스 정의를 1개의 헤더 파일에 통합합니다.[-o <name>]옵션에서는, 출력 파일명을 지정해 있습니다.
변수 정의등의 관계로, 인수의 차례가기본 프로파일-->날씨 정보 프로파일가 아니면 헤더 파일이 제대로 생성되지 않기 때문에 주의해 주세요. WSDL 파일 대신에 WSDL의 URL를 지정할 수도 있습니다. 실행시에 typemap.dat(서비스가 정의되는 이름 공간과 변수 정의를 기술하는 파일)가 요구됩니다만, 없는 경우는 디폴트치가 됩니다.이번은 디폴트인 채로 괜찮습니다.

서비스 정의 헤더 파일로부터 그루터기의 생성

gSOAP의soapcpp2커멘드를 사용하고, 서비스 정의 헤더 파일로부터 그루터기를 생성합니다.
최초로, 서비스 정의 헤더 파일로 정의되고 있는 서비스명이 길면 생성되는 파일의 이름이 길어지므로 RSiWeather.h의 //gsoap ns1 service name: ******의 부분을 수정해 둡니다.

 //gsoap ns1 service name: ******************************
     --> //gsoap ns1 service name: RSiWeather

RSiWeather.h로부터 soapcpp2 커멘드를 사용해 그루터기를 생성합니다(soapcpp2의 실행 파일도 bin 폴더내에 있습니다).

 > soapcpp2 -C -x -L -I<gSOAP_HOME>/import RSiWeather.h 

[-C]로 쿠라이안트사이드파일만 생성,[-x]로 각 서비스의 샘플 XML 파일의 비생성,[-L]로 라이브러리 작성용 파일

Lib.cpp의 비생성,[-I <path>]로 인클루드 패스의 설정, 을 지정해 있습니다.~


이하의 파일이 생성됩니다.
  • soapH.h: 메인 해더 파일(클라이언트, 서버 양쪽 모두의 소스에 인클루드 된다)
  • soapStub.h: 서비스 정의 헤더 파일로부터 생성되는 헤더 파일(서비스를 정의)
  • soapC.cpp: SOAP/C++의 serializer, 데시리아라이자
  • soapClient.cpp: 그루터기의 원시 파일(서비스를 실장)
  • RSiWeather.nsmap: 서비스를 정의하는 이름 공간을 설정하는 파일

클라이언트 프로그램의 작성

soapStub.h, soapClient.cpp로의 서비스의 정의를 참고에, 날씨 정보 서비스의 클라이언트 프로그램을 실장합니다.

 :략
 #include "soapH.h"             // 그루터기용 헤더 파일
 #include "RSiWeather.nsmap"    // 이름 공간 설정 파일
 
 int main()
 {
   struct soap ws_soap;
   LONG64 conv_id;
   struct ns1__closeResponse closeRes;
   struct ns1__get_USCOREweather_USCOREshortResponse weatherRes;
   const char* ep_basic = "http: //***";        // 기본 프로파일의 URL
   const char* ep_weather = "http://***";       // 날씨 정보 프로파일의 URL
    
   std::string report;
   std::string userid, password, area, point;
    
   std::cout << "please input userID: ";        // 유저 ID등의 입력
   std::cin >> userid;
   :략
    
   // SOAP 실행 환경을 초기화
   soap_init2(&ws_soap, SOAP_C_UTFSTRING, SOAP_C_UTFSTRING);
 
   // 회화 세션의 개시
   ws_soap.userid = (char*) userid.c_str(); ws_soap.passwd = (char*) password.c_str();
   soap_call_ns1__open(&ws_soap, ep_basic, NULL, userid, password, conv_id);
    
   // 날씨 정보의 취득·표시
   ws_soap.userid = (char*) userid.c_str(); ws_soap.passwd = (char*) password.c_str();
   soap_call_ns1__get_USCOREweather_USCOREshort(&ws_soap, ep_weather, NULL, conv_id, true, area, point, weatherRes);
   report = *weatherRes._get_USCOREweather_USCOREshortReturn->detail;
   std::cout << "Weather Report: " << report << std::endl;
 
   // 회화 세션의 종료
   ws_soap.userid = (char*) userid.c_str(); ws_soap.passwd = (char*) password.c_str();
   soap_call_ns1__close(&ws_soap, ep_basic, NULL, conv_id, closeRes);
  
   return 0;
 }

여기서 가고 있는 것은,
  1. 그루터기용 헤더 파일, 이름 공간 설정 파일의 읽기
  2. SOAP 통신용의 변수의 설정
  3. 유저 ID등의 입력
  4. SOAP 실행 환경의 초기화
  5. 날씨 정보 취득을 위한 수속
    회화 세션의 개시 --> 날씨 정보의 취득 --> 회화 세션의 종료

입니다.날씨 정보는 일본어를 포함해 UTF-8 형식의 문자열로 제공됩니다.그것을 처리하기 위해서, SOAP 실행 환경의 초기화 시에는, 입출력 형식을 지정하는SOAP_C_UTFSTRING라고 하는 인수를 취합니다.또, 통신마다 SOAP 실행 환경의 userid, password가 해방되기 위해, 수속마다 userid, password를 설정할 필요가 있습니다.


  • 클라이언트 프로그램(WeatherMain.cpp)
    원시 코드중의 URL는***으로 기술되어 있습니다.이용할 때 수정해 주세요.

컴파일

gSOAP의 전개 폴더내에, SOAP 런타임용의 라이브러리 원시 파일stdsoap2.h,stdsoap2.cpp가 있으므로 카피해, 이하와 같이 소스를 컴파일 합니다.

 > g++ -o WeatherMain WeatherMain.cpp stdsoap2.cpp soapC.cpp soapClient.cpp

RT컴퍼넌트화

작성한 클라이언트 프로그램을 컴퍼넌트화합니다.
날씨 정보와 같은 서비스는, 연속적으로 제공되는 것이 아니고, 유저가 필요한 때에 필요한 정보를 취득할 수 있도록 할 필요가 있습니다. RT컴퍼넌트에서는 출력으로서

  • 데이터포트(Outport):데이터 통신을 서포트
  • 서비스 포토:메소드 호출을 서포트

하지만 준비되어 있으므로, 날씨 정보 취득 컴퍼넌트에서는, 서비스 포토를 이용하는 것으로 해, 그 메소드로서 날씨 정보 취득의 수속을 실장하기로 하겠습니다.

서비스 IDL 파일 작성

우선, 서비스 포토의 인터페이스를 정의하는 IDL 파일을 작성합니다. IDL(Interface Definition Language)는, CORBA에 있어서의 인터페이스 기술 언어입니다.


날씨 정보 취득 컴퍼넌트의 서비스 포토는, 유저 ID, 패스워드, 지역 코드/지역명, 지점 코드/지점명을 입력으로서 날씨 정보 취득을 위한 3개의 수속(회화 세션 개시, 날씨 정보 취득, 회화 세션 종료)을 실행해, 획득한 날씨 정보를 돌려주는 메소드를 1개가지는 것으로서 IDL 파일을 이하와 같이 작성합니다(WeatherInfoService.idl).

 interface WeatherInfoService
 {
   string get_weather_report(in string userid, in string password, in string area, in string point);
 };

IDL에서는, 문자열은string로 나타내져 C++의char*에 매핑 됩니다.

rtc-template에 의한 컴퍼넌트 양식 파일의 생성

서비스 IDL 파일을 작성했더니,rtc-template를 이용해 날씨 정보 취득 컴퍼넌트의 양식을 생성합니다.
우선, 이하와 같은 셸 스크립트(gen.sh)를 준비합니다.

 #!/bin/sh
 
 rtc-template -bcxx    --module-name=WeatherInfoProvider    --module-desc='RSi Weather Information Service Provider Component'    --module-version=1.0 --module-vendor='MyName'    --module-category=Generic    --module-comp-type=DataFlowComponent --module-act-type=SPORADIC    --module-max-inst=10    --service=wiService:wiService0:WeatherInfoService    --service-idl=WeatherInfoService.idl

하2행의,[--service=포토명:서비스 프로바이더명:서비스명]과[--service-idl=IDL 파일명]으로 서비스 프로바이더 포토를 정의합니다.서비스 포토는<m_포토명Port>, 서비스 프로바이더는<m_서비스 프로바이더명>이라고 하는 멤버명으로, 컴퍼넌트 클래스안에서 정의됩니다.


실행하면, 날씨 정보 취득 컴퍼넌트의 양식의 원시 파일이 생성됩니다.

 > sh gen.sh
   File "WeatherInfoServiceSVC_impl.h" was generated.
   File "WeatherInfoServiceSVC_impl.cpp" was generated.
   File "WeatherInfoProvider.h" was generated.
   File "WeatherInfoProvider.cpp" was generated.
   File "WeatherInfoProviderComp.cpp" was generated.
   File "Makefile.WeatherInfoProvider" was generated.
   File "README.WeatherInfoProvider" was generated.

WeatherInfoServiceSVC_impl.h/cpp가 서비스

ダウンロード

最新バージョン : 2.1.0-RELESE

統計

Webサイト統計
ユーザ数:3399
プロジェクト統計
RTコンポーネント309
RTミドルウエア35
ツール25
文書・仕様書2

OpenRTM@Github

OpenRTM-aist GitHubサイト

ROS

Robot Operating System

Choreonoid

モーションエディタ/シミュレータ

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク

産総研が提供するRTC集

東京オープンソースロボティクス協会