[C++,QT/Qml]38.Qt 프로세스간의 통신(IPC) 구현하기7(commonapi some/ip 두개의 디바이스간 통신 구현)
안녕하세요 고급 개발자가 꿈인 코린이 입니다.
오늘은 프로세스간 통신 방법중에 commonapi someip를 이용한 두개의 다비아스간 통신을 구현해 보도록 하겠습니다.(device to device)
음 오늘은 따로 구현했다기 보다는 기본 제공 소스를 이용해서 두개의 디바이스에 같이 넣어주고
하나는 서비스 하나는 클라이언트로 설정해준 후 서로간의 통신하는 내용을 다루어 보겠습니다.
(두개의 디바이스간 통신을 뚫는데 너무 오래 걸렸네요 주말에만 작업을 하기도하고 출장기간도 있어서 ㅠㅠ 포스팅이 많이 늦었습니다. ㅠ)
기본적이 환경 세팅부터 하겠습니다.
노트북 한대는 ubuntu16.04를 설치 한후 와이파이에 연결된 상태고 다른 노트북 한대는 윈도우에 버츄얼 박스를
이용해서 ubuntu16.04를 설치 한후 공유기와 유선으로 연결된 상태 입니다.
프로세스간 통신을 위해서는 서로 연결된 통신망을 사용해야겠지요?? 그래서 공유기를 이용해서 하나는 와이파이
하나는 유선연결을 해주었습니다.
그 다음 서로간의 통신을 확인하기 위해서 ping명령어로 네트워크가 서로 잘 연결이 되어있는지를 확인하였습니다.
ping 명령어는 ping [확인하고 싶은 ip주소] 이런식으로 확인해 주시면 됩니다.
양쪽 컴퓨터에서 ping명령어를 통해서 네트워크가 연결이 잘 된것을 확인했다면 기본적인 some/ip 통신을 위한
환경설정은 끝났습니다.
이제 부터는 앱을 실행할때의 json파일의 설정에 따라 통신이 되는지 안되는지를 결정할수가 있습니다.
아래 json 파일을 보겠습니다. (json파일은 주석이 없기 때문에 실제로 실행 하실때는 주석을 모두 제거해 주세요)
vsomeip_server.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | { "unicast" : "현재 자신의 ip 주소",//서비스 앱을 실행 시키는 디바이스의 ip주소 "logging" : { "level" : "debug", "console" : "true", "file" : { "enable" : "false" }, "dlt" : "false" }, "applications" : [ { "name" : "service-sample",//자신이 만든 앱의 앱이름 설정 "id" : "0x1277" } ], "services" : [ { "service" : "0x1234",//4660 fdepl 의 서비스 ID "instance" : "0x5678",//22136 fdepl 의 someip instance ID "unreliable" : "30490"//protocol이 udp일때는 unreliable 설정 } ], "routing" : "service-sample", // 라우팅 매니저는 디바이스당 하나만 가지고 있습니다. // 그렇기 때문에 현재는 자신의 앱이름을 사용하지만 하나의 디바이스에 여러개의 vsomeip통신을 해야한다면 // 하나의 앱만 등록해서 설정해주시면 됩니다. 다른것을 잡아줘도 자동으로 잡아주는 것 같지만 // 정확히 테스트는 안해봐서 추후에 테스트 해보겠습니다. "service-discovery" : { "enable" : "true",//내부 통신망을 사용하려면 true로 설정 "multicast" : "224.244.224.245",//멀티 캐스트 주소 설정(내부 통신망 사용시 꼭 설정해야하는 내용) "port" : "30490",// 포트 설정 client와 맞춰줘야함 "protocol" : "udp"//내부 통신망일때는 udp } } http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter |
HelloWorld.fdepl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import "platform:/plugin/org.genivi.commonapi.someip/deployment/CommonAPI-SOMEIP_deployment_spec.fdepl" import "HelloWorld.fidl" define org.genivi.commonapi.someip.deployment for interface commonapi.HelloWorld { SomeIpServiceID = 4660 //위의 json에서 이 서비스 아이디를 맞춰줘야함 method sayHello { SomeIpMethodID = 32000 } } define org.genivi.commonapi.someip.deployment for provider MyService { instance commonapi.HelloWorld { InstanceId = "test" SomeIpInstanceID = 22136 // 위의 json에서 instance 아이디를 맞춰줘야함 } } http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter |
이렇게 설정하시면 service쪽 json 설정은 모두 완료가 되었습니다.
가장 중요한 점은 unicast에 어떤 아이피를 넣어야하는지였는데 저는 상대방 ip를 넣어줘야한다고 생각했으나
자신의 ip주소를 넣는 곳이었습니다.
그리고 routing은 vsomeip라이브러리를 사용한다면 그 라이브러리를 사용하는 앱 자체가 routing manager가 되는데요
이 매니저는 여러개가 있을 필요가 없고 하나만 있으면 됩니다. 그래서 제일 대표가 되는 앱의 앱이름을 사용하시면
됩니다.
그렇기 때문에 하나의 디바이스에서 someip 통신을 할때는 서비스와 클라이언트의 json에 서비스 앱의 이름만 넣어줍니다.
그렇지 않으면 실제로 통신이 잘 안되는 현상이 있었습니다. 참고해주세요 ^^
service-discovery는 예제코드의 json에 있는 값을 그대로 가져온후 true로 설정한 값인데요
이 값을 솔직하게 어떤 의미를 갖고있는지는 잘모르겠지만 false로 했을때는 통신이 안돼서 true로 설정해야
내부 통신이 가능하고 서비스 검색 사용이 가능하다는 것을 알수 있었습니다.
자세한 내용은 아래의 url에서 참고해 주시면 됩니다. 아래 주소는 vsomeip json에 관한 설명 내용입니다.
https://docs.projects.genivi.org/vSomeIP/2.0.1/html/README.html
그리고 서비스 앱에서 서비스를 등록하기 위해서 services를 설정 해주어야 합니다.
만약 fdepl 이 여러개여서 서비스가 여러개라면 여러개의 서비스를 service.json파일에 위에 services처럼 등록을
해주어야 합니다.
등록하는 방법은 위의 예제 처럼 fdepl에서 설정한 service ID 와 Instance ID를 설정해 주어야 합니다.
위의 서비스들을 등록 안해주면 클라이언트 쪽에서는 서비스를 못찾겠죠?? 그렇기 때문에 서비스를 추가하게 되면
반드시 설정을 해주시기 바랍니다.
여기 까지 따라오셨다면 서비스 쪽 json파일 설정은 모두 끝입니다.
이번에는 클라이언트쪽 json 파일을 보겠습니다.
vsomeip_client.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | { "unicast" : "현재 자신의 ip 주소 ",//클라이언트 앱을 실행 시키는 디바이스의 ip주소 "logging" : { "level" : "debug", "console" : "true", "file" : { "enable" : "false" }, "dlt" : "false" }, "applications" : [ { "name" : "client-sample", "id" : "0x1343" } ], "routing" : "client-sample", //서로 다른 디바이스에서의 통신이기 때문의 자신의 앱 이름로 설정 "service-discovery" : { "enable" : "true", "multicast" : "224.244.224.245", "port" : "30490", "protocol" : "udp" } } http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter |
클라이언트 쪽 설정은 위와 보시는것과 같이 크게 설정할 내용이 없습니다.
그렇지만 ip주소는 꼭 실행하는 디바이스의 ip주소를 적어주시면 됩니다.
그리고 service-descovery를 서비스에서 등록해준 내용과 같이 설정을 해줍니다.
여기 까지 클라이언트쪽 json파일을 설정해 주었습니다.
여기 까지 설정해주셨다면 이제는 다시 pc환경 설정을 해주어야 합니다.
위의 json파일에서 multicast를 등록해주었는데 이 등록한 주소를 이용해서 각 디바이스에서 route 명령어를 이용해서
route 테이블을 등록해 줍니다.
route 명령어는 아래와 같이 설정해 주시면 됩니다.
sudo route add -nv 224.244.224.245 [자신의 이더넷 장치 이름]
224.244.224.245는 위의 json파일에서 설정한 값 그대로 설정한 내용입니다.
이렇게 설정을 해주면 route -n 명령어를 통해서 등록된 route 테이블을 확인할수가 있습니다.
이렇게 하신후 아래 명령어를 통해서 실행을 해주시면 서로간의 통신이 됩니다.
service앱 실행 명령어
VSOMEIP_CONFIGURATION=../json/vsomeip_server.json VSOMEIP_APPLICATION_NAME=service-sample ./HelloWorldService
client 앱 실행 명령어
VSOMEIP_CONFIGURATION=../json/vsomeip_client.json VSOMEIP_APPLICATION_NAME=client-sample ./HelloWorldClient
위의 실행 명령어는 VSOMEIP_CONFIGURATION 에는 어떠한 json파일을 파싱할지를 설정정해주는 값으로
클라이언트는 클라이언트 json을 설정해주고 서비스는 서비스 json파일을 파싱해준다고 설정하시면 됩니다.
VSOMEIP_APPLICATION_NAME에는 json파일에서 서비스 앱 이름과 클라이언트 앱 이름을 각각 설정해
주었는데요 이 값을 설정해 주시면 됩니다.
마지막으로 ./HelloWorldService 이것은 실행 파일을 실행시키는 명령어로 위의 설정과 동시에 각 서비스나
클라이언트 앱을 실행 한다는 내용 입니다. 현재 실행 파일이 현재 디렉토리에 있기 때문에 ./값을 사용한 것이고
json 파일은 이전 디렉토리의 json폴더에 있기 때문에 ../json/vsomeip_server.json으로 설정한 내용입니다.
참고해주세요 ^^
이렇게 실행해 주시면 아래와 같이 두개의 디바이스에서 통신하는 내용을 볼수가 있습니다.
핸드폰 카메라를 사용해서 찍은 내용으로 화직이 조금 않좋지만 서로간에 통신이 된다는 것을 확인할수 있습니다.
화면상의 왼쪽 노트북이 클라이언트 앱실행 내용이고 오른쪽 노트북이 서비스쪽 앱 실행 내용 입니다.
여기까지 디바이스간 vsomeip 통신내용을 다루어 보았습니다.
다음 포스팅에서는 vsomeip 통신의 함수 호출이나 브로트 캐스트 시그널등의 api들 호출 방법 및 받는 방법 등을
포스팅 하겠습니다.
여기 까지 읽어주셔서 감사합니다.
'QT and QML' 카테고리의 다른 글
[C++,QT/Qml]40.Qml프로그래밍 cpp qml 연동4(c++에서 qml 함수 호출하기) (0) | 2020.05.17 |
---|---|
[C++,QT/Qml]39.Qt 프로세스간의 통신(IPC) 구현하기8(broadcast,attribute 이벤트) (2) | 2020.04.12 |
[C++,QT/Qml]37.Qt 프로세스간의 통신(IPC) 구현하기6(commonapi some/ip) (0) | 2020.01.21 |
[C++,QT/Qml]36.Qt 프로세스간의 통신(IPC) 구현하기5(나의 qt프로젝트가 클라이언트인 ui앱 만들기) (6) | 2019.12.30 |
[C++,QT/Qml]35.Qt 프로세스간의 통신(IPC) 구현하기4(나의 qt프로젝트에 commonapi 라이브러리 포팅하기) (0) | 2019.12.29 |