2009-06-08 5 views
0

나는 무선 센서 네트워크를위한 리눅스 테스트 베드를 작성 중이다. 핵심 목적은 두 노드 사이의 데이터 전송을 테스트하는 것입니다. 네트워크는 트리 토폴로지를 사용하여 실행됩니다. 네트워크의 한 노드가 "드라이버"입니다. 이 노드는 리눅스 PC에 시리얼 포트를 사용하여 연결됩니다. 내가 쓰려고하는 것은이 리눅스 PC의 소프트웨어로 네트워크에서 데이터 전송을 유도한다.리눅스 무선 네트워크 테스트 베드

Linux PC에서 실행되는 소프트웨어에서 명령을받는 "드라이버"노드는 데이터 요청 메시지를 보낸 사람 노드로 보냅니다. 보낸 사람 노드는 데이터 요청 메시지를 구문 분석하고 "드라이버"로 데이터 전송을 시작합니다. 여러 개의 보낸 사람이 존재할 수 있습니다. 모든 데이터 전송은 전송자에서 "드라이버"노드로 전송됩니다. "드라이버"노드는 수신 한 모든 데이터를 Linux 응용 프로그램에 전달합니다. 리눅스 응용 프로그램은 얼마나 많은 패킷이 다른 발송인으로부터 수신되었는지 추적합니다.

다음은 요구 사항입니다.

  1. 네트워크의 모든 노드는 드라이버 (대상) 일 수 있으며 모든 노드는 보낸 사람 일 수 있습니다.
  2. "전송"노드에 데이터를 보내는 모든 송신자가있을 수 있습니다.
  3. 직렬 포트에서 수신되고 Linux 응용 프로그램에서 직렬 포트로 보낸 데이터는 파일에 기록됩니다.
  4. 리눅스 응용 프로그램은 파일에서 데이터 요청 메시지를 읽고 지정된 시간에 보내야합니다.
  5. 이 Linux 응용 프로그램의 GUI입니다. "드라이버"조각난 데이터되는 보낸 사람의 데이터 다음 GUI의 선택은 C.

하나와 최종 트위스트 좋은 배치해야합니다, 그래서 모든 코드는 C에 있어야로. 보낸 사람 측에서 조각화는 장치 자체에서 처리됩니다. "드라이버"쪽 분열은 리눅스 응용 프로그램에서 처리됩니다. 따라서 리눅스 애플리케이션은 여러 개의 보낸 사람과 함께 진행되는 각 데이터 전송에 대해 조각화 창을 추적하고 조각 ACK를 전송하고 각 보낸 사람으로부터 지금까지받은 패킷 수를 추적해야합니다.

그래서 리눅스 응용 프로그램에서 여러 스레드가있는 방법 - 각 보낸 사람에 대해 하나의 스레드? 동시에 여러 개의 스레드가 하나의 직렬 포트로 잘 작동합니까?

모든 요구 사항에 대한 조언을 부탁드립니다. 기본적인 아이디어는 데이터 전송, 특히 데이터 수집 (여러 노드가 하나의 노드로 데이터를 보내는)을 테스트하는 것입니다. 위에 설명 된 것과 다른 접근법이 제안된다면 나는 그것들을 듣기를 더 이상 환영합니다.

감사 무리

제임스

+0

센서 네트워크에 대한 읽기/쓰기 인터페이스를 설명하면 도움이 될 수 있습니다. 소켓 기반인가, 아니면 dev 파일과 ioctl 호출이있는 일종의 장치 드라이버입니까? – bmdhacks

답변

0

이 전체 소프트웨어 패키지에 대한 질문 덜하고 불완전한 사양의 더 많은 것이다. 그러나, 나는 당신을 여기에서 돕기 위해 최선을 다 할 것이다.

단일 스레드 대 다중 스레드 :이 스레드는 단일 스레드로 작성할 수 있습니다. 이 접근법에서는 데이터 구조에 프래그먼트 상태를 유지하고 poll()을 사용하여 모든 센서 및 직렬 포트에서 읽을 수 있습니다. 다중 스레드 접근법을 사용했다면, 아마도 pthread를 사용하여 뮤텍스에 직렬 포트 액세스 (및 다른 공유 리소스)를 래핑하고 싶을 것입니다.

네가 여기에서 묻고있는 다른 질문이 보이지 않는다. 정확히 무엇을 찾고 있습니까?

+0

감사합니다. 멀티 스레딩은 불필요하다고 생각합니다. 전체 소프트웨어를 하나의 프로세스로 유지하거나 읽기 쓰기를 위해 직렬 포트와 통신하는 하나의 프로세스로 직렬 읽기 쓰기를 작성하고 동일한 프로세스와 다른 프로세스에 대한 버퍼/큐를 유지하여 조각화와 데이터를 처리하는 것이 좋습니다 받았습니다. 또한 조각 상태를 저장하기위한 데이터 구조가 있습니다. 여러 개의 보낸 사람이 있다고 생각합니다. 그 데이터 구조의 배열을 사용할 수 있습니다. –

+0

약간 다른 요구 사항을 생각하고 있습니다. 한 대의 PC에서 모든 노드를 실행하고 싶습니다. 소프트웨어는 전체 네트워크를 운전해야합니다. 네트워크에는 여러 드라이버와 발신자가 있습니다. 노드는 동시에 드라이버와 발신자가 될 수 없습니다. 보낸 사람은 한 번에 하나의 드라이버와 만 대화합니다. 모든 직렬 포트에서 데이터를 읽는 하나의 프로세스가 필요하다고 생각하고 있습니다. 나는 select()를 사용하여 I/O를 블로킹하지 않고 여러 직렬 포트에서 /에 읽고 쓸 수 있다고 생각한다. 이제 각 드라이버를 어떻게 실행합니까? 각 드라이버를 프로세스 또는 스레드로 갖는 것이 더 좋습니까? 다른 모든 아키텍처를 염두에두고 있습니까? –

1

그래서 리눅스 응용 프로그램에서 여러 스레드가있는 방법 - 각 보낸 사람에 대해 하나의 스레드?
여러 개의 스레드가 하나의 직렬 포트로 동시에 보내고받을 수 있습니까?

직렬 포트에서 읽기/쓰기를 한 번만하고 싶습니다. 출력시 응용 프로그램 이 차단되면 포트에서 논 블로킹 I/O가 필요하므로 수신 된 문자에 응답하고 UI 요청을 처리 할 수 ​​있습니다. 또한 독서에서 완벽한 패킷으로 데이터의 전체 세트를 조합해야합니다. 전체 '패킷'을 얻을 때까지 여러 번 읽을 수 있습니다.

GUI가 X 인 경우 XtAppAddInput()을 사용하여 직렬 포트를 읽고 쓰는 이벤트 처리기를 추가 할 수 있습니다.

+0

감사합니다. 비 차단 입출력의 경우 select()를 읽고 쓰는 것을 처리하는 것이 좋은 선택일까요? –

+0

약간 다른 요구 사항을 생각하고 있습니다. 한 대의 PC에서 모든 노드를 실행하고 싶습니다. 소프트웨어는 전체 네트워크를 운전해야합니다. 네트워크에는 여러 드라이버와 발신자가 있습니다. 노드는 동시에 드라이버와 발신자가 될 수 없습니다. 보낸 사람은 한 번에 하나의 드라이버와 만 대화합니다. 모든 직렬 포트에서 데이터를 읽는 하나의 프로세스가 있다고 생각합니다. 나는 select()를 사용하여 I/O를 블로킹하지 않고 여러 직렬 포트에서 /에 읽고 쓸 수 있다고 생각한다. 이제 각 드라이버를 어떻게 실행합니까? 각 드라이버를 프로세스 또는 스레드로 갖는 것이 더 좋습니까? 다른 모든 아키텍처를 염두에두고 있으십니까? –

+0

둘 이상의 파일 디스크립터를 관리하는 프로세스의 경우 select() 또는 poll()을 사용하여 처리 할 파일 디스크립터를 찾으십시오. 어떤 시스템이 생겼는지는 잘 모르겠지만 필요에 따라 시작/중지하는 프로세스로 드라이버를 관리하는 것이 더 간단 할 수 있습니다. – codeDr

관련 문제