오로라 - XBEE 모듈을 이용한 OFF GRID 네트워크 구축

MIE capstone
2013430003 (토론 | 기여)님의 2018년 6월 10일 (일) 09:08 판 (개발 프로세스)
이동: 둘러보기, 검색

프로젝트

O'LoRa - POrtable LOng RAnge Off Grid Mesh-Network Router

팀 소개

  • 서울시립대학교 **공학과 권**
  • 서울시립대학교 **공학과 김**
  • 서울시립대학교 **공학과 이**
  • 서울시립대학교 **공학과 이**

프로젝트 개요

"Everywhere, Everyone, We are the one."

프로젝트 요약

OloraFlowchart2.png

  • User 는 위 구성도에 보이는 바와 같이 RF 모듈 + 라즈베리파이 (Terminal device) 하나와 모바일 폰 하나를 쌍으로 갖고 있다. 모바일 폰은 Terminal device 와 블루투스 프로토콜을 이용하여 통신을 하기위해 안드로이드 플랫폼 어플리케이션이 구동된다.
  • 어플리케이션에는 기본적으로 안드로이드 api 를 이용해 라즈베리파이와 블루투스 연결을 하는 기능, 블루투스로 문자를 보낼 수 있는 기능 등이 탑재된다. 현재 연결가능한 User 를 확인할 수 있어야한다. 그리고 메시지를 받으면 푸시 알림을 주는 기능이 있다.
  • Terminal device 의 라즈베리파이 보드는 역시 모바일 폰과 블루투스 통신을 하기위해 python 블루투스 api 를 이용해 통신 프로그램을 작성한다. 또한 Terminal device 간 XBee 통신을 하기 위해 제공되는 XBee python 라이브러리를 이용해 프로그램을 작성할 것이다. 이 프로그램에는 XBee 신호를 직접 송수신하는 로직이 포함된다.

그리고 안정적인 네트워크를 유지하기 위한 로직인 aodv 라우팅 프로토콜을 이용하는 등의 로직이 포함된다.

  • Terminal device 는 우리 컨셉상 on/off 가 가능해야하고 on 하는 순간 이 프로그램들이 구동되게 설정할 것이다. 먼저 Terminal device 를 on 시키고 모바일 폰의 블루투스 앱으로 자신이 갖고 있는 Terminal device 와 연결한다. 그리고 모바일 폰으로 현재 연결되어있는 다른 User 를 확인하고 메시지를 보낸다. 대기하고 있는 User 의 단말기가 메시지를 받아 모바일 폰에 알림을 준다.

HW/SW구성도

  • H/W
    • 단말기
      • RF Module : Xbee Pro 900HP module (XBP9B-DMSTB002)
Digimesh 프로토콜을 따르는 RF 데이터를 송수신하는 저전력의 장거리 라디오모듈이다.
      • XBee Dongle : SparkFun XBee Explorer Dongle]
Xbee Module과 Raspberry Pi를 이어주는 보드로, XBee와는 Pin으로 연결되고, 컨트롤 치와는 USB타입으로 연결된다. Raspberry Pi와 Ardunio 계열에만 호환되는 XBee shield와는 달리 Universial하게 다른 장치와도 연결할 수 있다. 또한 Shield에 비해서 가격이 저렴하다.
      • RF Antenna : RPSMA RF antenna (ANT-916-CW-RAH)
900~928MHz 대역의 라디오전파를 위한 안테나이며 강한 고정을 위하여 RPSMA(나사선) 고정방식타입으로 선택하였다.
      • Raspberry Pi 3
Xbee 네트워크와 사용자를 이어주는 역할을 담당하며, 원활한 DigiMesh network를 구성하기 위한 서비스 작업을 제공하는 기반 하드웨어이다.
        • Bluetooth Module
    • 스마트폰
사용자와 Digimesh 네트워크를 이어주는 앱이 설치되는 단말기로써 사용자가 익숙한 스마트폰 환경을 통해 장치에 내장된 블루투스 칩을 이용하여 Terminal Device와 통신한다.
      • Bluetooth Module
  • S/W
    • 단말기
      • Bluetooth Process
(추가바람)스마트폰과 Bluetooth 연결을 담당하는 process
      • Control Unit Process
(추가바람)패킷에게 있어서 신호등 역할에 해주며 파일 흐름의 robust함을 보장해준다.
      • XBee Process
XBee RF 모듈에게 직접 명령을 내리고, 다른 XBee로부터 오는 메세지를 받아주는 프로세스이다.
    • 스마트폰
      • Bluetooth Process
(추가바람)스마트폰과 Bluetooth 연결을 담당하는 process
      • Android UI
(추가바람)사용자는 특정채널에 연결한 뒤 해당 망에서 public-chat(broadcast), private chat(unicast 1:1)을 할 수 있다.


프로젝트 배경

더 넓은 세계로 여행을 떠나는 여행가들에게 네트워크망이 닿지 않는 곳이라고 해서 결코 걸음을 멈출 수는 없을 것이다. 하지만 통신망으로부터 고립된 여행가에게 사고가 발생한다면? 외부와 연락할 방법이 없는 여행가는 우연히 구조대원이 주위를 지나치는 기적을 바랄 수밖에 없다.

이 단말기는 블루투스로 안드로이드로 폰과 연결되고 안드로이드 어플리케이션을 사용해 제어하며 단말기를 가진 다른 사용자와 텍스트로 정보교환을 할 수 있게 되어 각종 비상상황에서 주변의 구조원에게 자신의 상황을 알리고 도움을 청할 수 있다. 무전기처럼 사용법을 따로 숙지해야 하는 번거로움 없이 일반인에게도 친숙한 안드로이드 어플리케이션 인터페이스를 통해 처음 접한 누구라도 쉽게 off-grid에서 통신할 수 있는 장치를 개발하는 것이 목표이다.

프로젝트 목표

  • 목적계통도.jpg
  • 네트워크견고성
  • 데이터전송신뢰성
  • 송신거리
  • 사용자편의성
  • 휴대성
  • 전력소모량

프로젝트 기대효과

기존통신망 사각지대 보완

프로젝트 기간

2018.03.02 ~ 2018.06.14

개발 프로세스

전체 시스템 개요도

OloraFlowchart.png


Android UI

Bluetooth (Android)

Bluetooth Daemon (RPi)

  • 개요
  • 목적
블루투스 클라이언트로부터, 즉 사용자로부터 오로라 패킷을 받아들이며, RF모듈인 XBee에게 데이터를 송신하고, 통신모듈로부터 들어온 데이터를 사용자에게 안전하게 데이터를 전송한다.
  • 요약
개발 환경 Linux, Debian Stretch on PC (AMD64)
Linux, Ubuntu Mate 16.04.3 on Raspberry Pi3 Model B (ARMv7, Thumb)
개발 언어 GNU C
의 존 성 Pthread, BlueZ, OpenSSL
플랫폼 지원 C99이상의 C언어, Linux OS, 의존성을 만족하는 Devices
통신 프로토콜 RFCOMM
다중 접속 불가능 (1명의 클라이언트만 세션 생성 가능)
  • 전체 설계 구조
  • 오로라 전체 통신 구조

Olorapacketflow.png

패킷 해더에는 SRC/DST의 하드웨어 ADDRESS가 기입되며, SRC/DST에 의해 오로라 시스템은 패킷의 향방을 결정한다. HostA는 HostB로 보내기 위해서 Olora 프로토콜을 사용하는 디바이스 장치를 거쳐야 하며, SRC/DST 변환 과정은 위 그림과 같다. 우선 HostA에서 SRC에 자기자신의 블루투스 주소와, HostB의 XBee 어드레스를 DST에 기입한다. 패킷이 나가는 방향에서 Bluetooth Daemon과 Control Unit은 SRC/DST에 대해 어떤 조작도 하지 않으며, 오로라 장치의 XBee 프로세스에서 SRC를 디바이스의 XBee 주소로 변경한다. XBee의 RF채널을 통해 데이터가 전송되면, XBee에서 DST 주소를 확인하고 일치하면 Control Unit에 패킷을 전송한다. Bluetooth Daemon에서 HostB가 살아있는지 확인하고 살아있으면, DST를 HostB의 블루투스 주소로 변환하여 HostB에게 RFCOMM 프로토콜을 이용해 안전하게 패킷을 보낸다. 사용자는 이 메시지가 패킷의 SRC에서 HostA로부터 온 메세지 임을 알 수 있다.


  • Packet Stack 구조

Olora packet protocol stack


FIELD WHERE TO USE Size (Bytes) DESCRIPTION
SRC All 8 패킷 발원지 주소로 변경되지 않음
DST All 8 패킷 도착지 주소로 수신자의 XBee 어드레스이며, 수신자 기기에서 수신자의 블루투스 어드레스로 전환
CM XBee 8
HP XBee 1
ID XBee 2
OPT All 1 패킷의 플래그 정보 저장
SEQ App 2 Where to align SEQ? Debate "App VS XBee"
CMD BD, XBee 2
TS App, XBee 4
DATA All 988
  • Flags in option field
7 6 5 4 3 2 1 0
Urgent Error CMD Defined Area Internal Packet Order
  • Urgent Flags
Packet 중에서 우선적으로 처리해야하는 패킷이다.
  • Error Flags
어떤 CMD가 실패하거나 CMD에 대해 응답이 필요한 경우 Error Flags를 1로 셋하고, Data에 에러 사유를 명시한다.
  • CMD Defined Area
CMD에 의존하는 Flags으로 한 CMD에 최대 8개의 옵션을 줄 수 있다.
  • Internal Packet Order
XBee에서는 한번에 256Bytes를 전송하므로 1024Bytes의 패킷을 분할할 수 밖에 없으며, 패킷을 분할하고 재결합할 때 필요한 순서(0~4)번을 기록한다.


  • Bluetooth Daemon Desgin
  • Control Process
블루투스 데몬의 주 구성요소로써 Control Process는 3개의 Threads로 이루어져 있으며, Control Process는 데몬이 종료될 때까지 유지된다.
  • Input Gate
Session으로부터 들어온 패킷을 명령어을 분석하여 경로를 결정한다. 세션 내부에서 만든 패킷일 경우 Control Unit및 Control Process와 상호작용하며 나머지는 Gate Unit으로 내보낸다.
  • Output Gate
Gate Unit으로부터 들어온 패킷을 분석하고, 블루투스 내부에서 만든 패킷일 경우 일정한 명령을 수행한다. 만일 사용자 세션이 종료된 상태라면 Gate Unit으로 들어오는 데이터들은 Packet Container Unit으로 보낸다.
  • Spinner
Control Process의 Threads를 모니터링하며 상태를 주기적으로 업데이트하며, Spinner가 종료되면 블루투스 데몬이 종료한다.


  • Seession Process
Session Process는 4개의 Threads로 이루어져 있으며, 3개의 Threads는 클라이언트가 서버에 접속함에 따라 세션을 구성할 때 생성되고, 연결이 종료되거나 끊어지면 생성된 Threads는 동시에 종료하여 다음 클라이언트를 맞이할 준비를 한다.
  • Input Service Session
사용자 클라이언트로부터 데이터를 받아 패킷 해더를 분석하며, 세션에서 수행할 수 있는 작업을 수행한 뒤 Control Process의 Input Gate로 전송한다. 사용자 패킷이 Input Service Session에서 수행가능한 내부 기능은 아래 표와 같다. 만일 사용자가 명령에 대한 권한이 없는 경우 해당 패킷은 내부로 넘어가지 않고 드롭된다. 만일, 결과가 즉시 리턴되는 패킷이면 Message Service Session으로 결과 패킷을 전송한다.
Command Name Command Description
SERVICE RESET 블루투스 장치를 리셋한다. 장치를 리셋하므로 사용자 연결은 끊어진다.
SERVICE SCAN ENABLE 블루투스 장치를 스캔 가능한 상태로 만든다.
SERVICE SCAN DISABLE 블루투스 장치를 스캔 불가능한 상태로 만든다. 이미 연결된 세션일 경우 보안을 위해 SCAN을 DISABLE하는 것이 좋으며, 배터리를 절약할 수 있다.
SERVICE SHUTDOWN 오로라 Device를 안전하게 종료한다.
  • Output Service Session
Control Process의 Output Gate으로부터 RF모듈로부터 들어온 데이터를 받는다. 현재 세션 유저로 향하지 않으면 패킷은 드롭된다.
  • Message Service Session
Input Service Session과 Output Service Session으로부터 받은 데이터를 사용자에게 송신한다. 통신 장애가 발생하거나, 세션 유저의 연결이 갑작스럽게 끊어지게 되면, Message Queue에 있는 패킷은 Packet Container Unit으로 보낸다.
  • Spinner
Service Session를 모니터링하며 상태를 주기적으로 업데이트 한다. 각각 서비스에서 미쳐 끝내지 못한 작업을 마무리하고 세션을 안전하게 종료하고 자원을 반납한다. Spinner가 종료되면 블루투스 데몬은 다음 클라이언트를 위해 서비스를 준비를 한다.

Control Unit (RPi)

  • 개요
  • 목적
기기의 전반적인 요소를 제어하며, 비정상 상황이 예측될 때 가능하면 재부팅할 일이 없도록 시스템을 강건하게 유지한다.
  • 요약
개발 환경 Linux, Debian Stretch on PC (AMD64)
Linux, Ubuntu Mate 16.04.3 on Raspberry Pi3 Model B (ARMv7, Thumb)
개발 언어 Python3, Bash Shell Script
의 존 성 SQLite
플랫폼 지원 Python을 지원하는 Linux OS의 모든 Devices
  • Control Unit Desgin
  • Gate Unit
Olora 디바이스의 데이터 흐름을 제어한다. 디바이스 내부에서 통신으로 사용되는 파이프의 입출력 방향은 [BD <->XBee 서비스], [SVHU->BD,XBee 서비스], [PKCU->BD]으로 이루어져 있으며 파이프는 입출력 양단이 정해져 있고 오류를 방지하기 위해서, 파이프에 입출력을 할 때는 원자적(Atomic)이거나 잠금(Lock)을 걸어야한다. 여러 코드가 분산되어 있기 때문에 여러 입구를 두어 글로벌 락을 거는 것보다 입출구를 하나로 두고 그 앞에서 방향을 제어하는 것이 맞다고 판단했으며, 여러 입구를 두게 되면 데이터를 수신한 프로세스는 원하는 결과가 왔는지 체크를 해야하고 그렇지 않으면 반납을 하거나 맞는 프로세스에게 돌려주어야 하므로 다중 입출구로 구현하게 되면 큰 오버해드가 예상된다. 또한 프로세스가 비정상 종료되면 파이프의 양단에 비정상 데이터가 즉각적으로 오게되므로 중앙에서 흐름 제어를 하게되면 신속하고 종합적으로 대응할 수 있다.
  • Packet Container Unit
블루투스 데몬이 사용자에게 전달하지 못하고 반송된 패킷을 임시로 저장하며, 세션이 다시 시작되는 경우 데이터 베이스에 있는 패킷을 다시 클라이언트에게 재전송한다. 만일 현재 세션 유저가 재전송하려는 패킷 목적 주소가 다르면 패킷을 데이터베이스에 Push하여 Privacy를 유지한다. 내부 데이터베이스는 SQLite를 통해 다루어진다.
  • Service Homeostasis Unit
블루투스 데몬과 XBee 서비스 프로세스를 관리한다. 관리하는 프로세스가 비정상적으로 종료되는 경우에 프로세스를 재시작하며, 내부 오류로 인해 의미 없는 무한 루프에 걸린 프로세스를 감지하여 종료시키고 재실행한다. Service Homeostasis Unit은 다른 프로세스로부터 제어 패킷을 입력을 받을 때는 파이프가 아닌 TCP/IP로 통신하며 출력할 때는 Gate Unit을 통해 파이프로 각 프로세스로 전파한다. Service Homeostasis Unit의 데이터 전송도는 [BD<->XBee 서비스]나 [PKCU->BD]에 비해 현저하게 낮기 때문에 속도를 위해 공유 메모리나 PIPE로 구성할 필요가 없으며, 에러 보고나 내부 요청이 우선적이기 때문에 루프백을 사용하여 안정적인 TCP/IP 통신을 활용하였다.
  • Start Shell Script
Olora 시스템을 실행하기 위한 서비스 쉘 스크립트이다. Olora 시스템을 사용하려는 개발자는 이 쉘 스크립트를 통해 블루투스 Ping, Olora 시스템 빌드, 프로세스 제어를 수행할 수 있다.

XBee (RPi)

프로젝트 결과

Android UI

Bluetooth (Android)

Bluetooth Daemon (RPi)

Control Unit (RPi)

XBee (RPi)

종합

평가

  • 견고성
    • 중간노드삭제 테스트
    • 이동중 통신 테스트
    • 자체 강제종료 테스트
  • 전송신뢰성
    • 장문메세지 처리 테스트
    • 전송실패 처리 테스트
    • 송신거리 테스트
  • 에너지효율
    • (H/W)라즈베리파이zero를 추가적으로 구입할 경제력이 되지 못하여 더 이상의 H/W적인 에너지효율 개선은 불가했다.
    • (S/W)코드최적화를 통한 cpu자원절약 -> profiling(전/후)
  • 사용자편의
    • 사용자인터페이스가 충분히 직관적인가?
    • 사용자에게 불필요하게 많은 명령어를 요구하는가?

보완점

  • 에너지효율성
    • H/W : 라즈베리파이3 -> 라즈베리파이zero
    • S/W : Bluetooth packet stack을 재정의하여 가변적으로 packet을 보낼 수 있도록 한다. 즉, 패킷의 데이터 영역 내에 낭비되는 부분이 최대한 없도록 개선한다.
  • 다대다통신 : 채팅방 동기화 문제를 해결하는 알고리즘을 만들어 단체 private 채팅을 가능하도록 개선한다.
  • GPS : 야외에서 사용하는 만큼 본인의 위치를 타인에게 알려주고 싶을 때 스마트폰에 있는 GPS 정보를 가져와 data에 넣어 보내주도록 개선한다.
  • 대용량데이터(사진)전송 : 현재 XBee의 최대전송속도는 200KB/s이므로 원본사진을 그대로 보내기 어려우므로 압축과정을 거쳐 보낼 수 있도록 개선한다.
  • 보안
    • 사용자<->오로라 디바이스의 암호화 지원
    • 블루투스 장치 연결 암호 활성화

느낀점

  • HK :
  • MS :
  • MG :
  • MJ :

참조 문헌

O'LoRa GitHub

XBee Python API

OTTO

BLUEz

Android Bluetooth Sample Code