웹캠 원격 스트리밍과 원격 마이크로 컨트롤러 제어 시 문제가 발생합니다

zkalffntm의 이미지

안녕하십니까, 작은 회사에서 인턴 실습을 하고 있는 대학생입니다.

계속 눈팅만 하다가 처음 올리는 글이 질문글이 되네요.


 현재 Java 로 원격 스트리밍과 제어를 동시에 하는 시스템을 개발 중입니다.

 자세히 말하자면 PC에 연결된 웹캠의 영상을 PC에 접속한 스마트폰으로 실시간으로 스트리밍 해 주면서,

동시에 스마트폰으로부터 온 메시지를 같은 로컬 네트워크(공유기)에 물려 있는 시리얼 허브에 전송해서

그 시리얼 허브에 연결된 마이크로 컨트롤러를 제어하는 시스템입니다.


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

 웹캡 - PC -┐
                │
            공유기 - 인터넷 - 스마트폰
                │
마이크로 - 시리얼
컨트롤러    허브

* 영상 전송 플로우 : 웹캡 - PC - 공유기 - 인터넷 - 스마트폰

* 메시지 전송 플로우 : 스마트폰 - 인터넷 - 공유기 - PC(인증) - 공유기 - 시리얼 허브 - 마이크로 컨트롤러
(PC를 거치는 이유는 접근 허가 사용자와 미허가 사용자를 구분하기 위함입니다)

* 시리얼 허브의 기능 : 이더넷 통신을 통해 메시지를 받고 그 메시지를 허브에 연결된 마이크로 컨트롤러에 전달

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


 현재 발생하는 문제가... 하나의 스마트폰에라도 스트리밍을 하고 있는 상태에서 마이크로 컨트롤러 제어를

요청하면 시리얼 허브가 먹통이 되면서 접속이 되지 않습니다.

(new Socket(ip, port) 가 blocking 돼 있다가 Exception 을 뱉습니다)

혹시나 해서 메시지 전송 플로우에서 PC를 거치지 않고 바로 시리얼 허브로 메시지를 보내도록 고쳐 봐도,

똑같은 증상이 발생합니다. 스트리밍을 하지 않고 그냥 제어를 요청하면 잘 돌아가는데, 한 번이라도 스트리밍 중인

상태에서 제어를 시도하면 시리얼 허브가 먹통이 되면서 스트리밍을 멈추고 제어를 해도 안 먹히더군요.

그 상태에서 시리얼 허브를 리셋하면 다시 잘 돌아갑니다.


 현재 스트리밍은.... UDP가 아니라 TCP로 돌리고 있고, 전송량의 문제 때문에 png로 압축해서 전송하고 있습니다.

그리고 각 프레임이 캡쳐될 때마다 전송하는 것이 아니라, 각 클라이언트 소켓 쓰레드는 매 루프마다 한 프레임을

전송하고 sleep 합니다. 그리고 웹캠에서 이미지를 캡쳐하는 쓰레드에서 각 클라이언트 소켓 쓰레드에 인터럽트를

걸어 '프레임이 넘어감', '앞 프레임의 전송이 완료됨'의 조건이 충족될 때에만 새 프레임을 가져와 전송하도록 하는

방식으로 프레임 밀림을 방지하고 시간 동기화를 하고 있습니다. (포트는 50000을 쓰고 있습니다)


 PC와 스마트폰 간의 컨트롤 요청은 5432번 포트를 쓰고 있습니다만, 하나 찝찝한 게 시리얼 허브가 80번 포트를

쓰고 있습니다. 80번 포트가 http라 시리얼 허브를 설계하신 분께 시리얼 허브 포트를 다른 걸로 바꿔야 하지

않겠느냐 여쭤 봐도 이 쪽 문제 아닐 거라고 말씀하셔서, 일단은 다른 부분에서의 가능성을 하나 둘 씩 줄여 가는

중인데 도저히 막혀서 해결책이 보이질 않네요. ㅠㅠ


 혹시나 해서 마이크로 컨트롤러에 문제가 있는 건 아닌가 해서 마이크로 컨트롤러를 콘솔에서 디버그 해봐도,

시리얼 허브가 먹통이 되면 시리얼 허브에서 아예 메시지 자체를 보내질 않더라구요.


 아, 물론 현재 공유기 상에서 5432번, 50000번은 PC로, 80번은 시리얼 허브로 포트 포워딩이 되어 있습니다.

 

너무 답답해서... 제가 정말 바보 같은 질문을 하고 있는 거면 좋겠습니다. ㅠㅠ

zkalffntm의 이미지

공유기의 포트 포워딩을 사용하지 않고,
스트리밍과 제어 요청 둘 다 로컬 IP로 넣으면 동시에도 잘 작동하네요...
왜 외부 IP를 통해서 포트 포워딩으로 들어가면 먹통이 되는 걸까요...

포트 포워딩을 하면 소스 IP가 접속 모바일 기기가 아닌 192.168.0.1(공유기)로 뜨네요.
이것 때문일까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.