MQTT(Message Queuing Telemetry Transport)
- IoT를 위한 저전력의 경량 메시징 프로토콜
- 무선으로 인터넷에 연결된 임베디드 기기들의 통신을 목적으로 만들어짐
- 리소스를 매우 적게 요구하기 때문에 사물인터넷에 최적화된 프로토콜
MQTT 통신 방법
- broker라고 불리는 server에 의해 중계된다.
- client들은 임의의 topic을 subscribe 하거나 topic에 메시지를 publish 하는 방식으로 통신이 이뤄짐

Mosquitto
- MQTT프로토콜 버전 3.1을 구현하는 오픈소스 메시지 브로커(MQTT server)
- 가벼우며 저전력으로 동작하는 임베디드 센서나 모바일 장치와 같은 IoT 기기에 적합

Mosquitto를 사용하려면 설치작업을 진행해야 한다.
$ sudo apt-get update
$ sudo apt-get install mosquitto
Mosquitto == Daemon환경이다.
설치와 동시에 시작된다.
또한 항상 실행 시 ==> background process에서 동작중이다.
daemon으로 동작하고 있는지 확인해보자.
$ sudo service mosquitto status
를 입력하면 상태확인을 진행할 수 있다.
여기서 "service"명령은 시스템 서비스 또는 데몬(daemon) 프로세스를 관리를 하는 명령어다.
"service" 명령으로 데몬을
1. 시작(start)
2. 정지(stop)
3. 재시작(restart)
4. 상태 확인(status) 하며 동작을 수행할 수 있다.
ex) "service nginx stop" 명령어를 실행하면 ==> Nginx 웹서버를 정지시킨다.
따라서 status를 확인해 보면

이렇게 "active" 상태여야지 정상적으로 실행되어 있는 상태이다.
이때 설치 시 중간에 끊긴 적이 있었는데, 이런 상황에 켜보니 error상태였었다.
그럴 때, pip uninstall을 진행하여 Mosquitto를 제거하고 다시 install하니 active상태로 되었었다.
그 후
mosquitto.conf 파일로 들어간다.
sudo bi /etc/mosquitto/mosquitto.conf
여기서 etc는 환경설정에 관련된 파일이 들어있는 곳이다.
또한 .conf 파일은 설정파일을 의미한다.
bind_address 0.0.0.0
allow_annoymous true
를 추가로 기입한다.
여기서 "0.0.0.0"은 특수한 값입니다.
이 주소를 사용하면 해당 응용프로그램에서 모든 네트워크 인터페이스에서 연결을 수신하게 됩니다.
이는 "all zero address"라고도 불리며 "wildcard address"로 알려진 특수한 IP주소 중 하나입니다.
대신 보안 측면에서 주의해서 사용해야 합니다.
모든 네트워크 인터페이스에서 수신된 연결을 모두 처리하므로, 취약성을 노출시킬 수 있습니다.
그리고 allow_annoymous true는
MQTT브로커에서 익명(annonymous)연결을 허용하는 설정을 의미합니다.
원래 MQTT프로토콜은 인증과 권한부여 기능을 제공하지만 익명사용자도 연결할 수 있는 기능을 제공합니다.
그래서 위와 같은 설정을 이용하여 익명의 이용자도 MQTT 브로커에 메시지를 발행하거나 구독권한을 부여합니다.
하지만 여기서도 당연히 보안면에서 주의해서 사용해야 합니다.
익명 연결을 허용하면, 모든 클라이언트가 동등한 권한을 갖게 되기 때문입니다.
이처럼 MQTT는 broadcast통신을 이용합니다.

따라서 목적지에 따른 정확한 식별자를 붙여서 packet을 보내는 것이 중요합니다.
이에 따라 ip프로토콜에서 이용하는 패킷모양을 모티브 하여 패킷을 정의하였습니다.


따라서 첫 번째 header파일을 열면 ip프로토콜과 같이 목적지가 먼저 나와 자신에게 온 메시지인지 확인하는 코드를 넣었습니다.
def start_mqtt_client_interrupt(): # 메시지 인터럽트오면 끝남
global time_interrupt
# 좌표받은 후 좌표는 전역변수 real_message="1024"에 저장
mqttc = mqtt.Client()
mqttc.connect('localhost', 1883, 60)
mqttc.subscribe("dsTopic")
mqttc.on_message = on_message
mqttc.loop_start()
start_time = time.time()
while True:
if time.time()-start_time >= time_interrupt:
break
time.sleep(1)
time_interrupt = 60
메시지를 받기 전에 mqtt를 받기 위한 receive모드를 먼저 켜야 합니다.
따라서 다음목적지에 도착하면 항상 receive모드 키게 되고, 코드는 위와 같습니다.
위 코드는 'dsTopic" == delivery service topic이라는 주제로 구독을 하겠다는 뜻입니다.
또한, 최대 60초에 타이머가 작동하며 이는 실제 라우터의 타이머를 모티브 한 것입니다.
원래는 타이머 시간 안에 ack가 들어오지 않으면 네트워크상태가 좋지 않은 것으로 판단하고, 재전송을 요청하거나 조치를 취해야 하지만, 저희 시스템은 아직 거기까지 생각만 하고 구현하지 못하였습니다.
그래서 타이머가 끝나기 전에 인터럽트(ack)가 오게 되면 인터럽트를 인지하여 리시브모드를 종료합니다.
import paho.mqtt.client as mqtt # paho-MQTT 패키지 불러오기
import subprocess
SERVER = 0
server_ip = "192.168.137.211"
def device_to_server_matrix(barcodeData): # 서버로 좌표 보내기
global ADDRESS
command = "mosquitto_pub -h {} -t dsTopic -m {}".format(server_ip, SERVER+ str(MY_CAR_NUM)+barcodeData[1]+barcodeData[3])
result = subprocess.run(command, shell=True, capture_output=True)
저희는 다중로봇 총 2개의 로봇을 가지고 시스템의 베타버전을 제작하였습니다.
그래서 해당하는 식별자를 번호로 구분하기로 하였습니다.
서버: 0 로봇1: 1 로봇2: 2 |
따라서 첫 번째 문자열을 열게 되면 수신자가 먼저 나옵니다.
elif real_message[0] == '0': # [running, waiting]상태의 로봇의 신호가 왔을 때
따라서 인지하는 코드는 다음과 같습니다.

로봇은 3가지 상태에 따른 tag변환을 통해, 자신의 할 일을 정의합니다.
packet교환방식에서 특정 tag를 pigibacking을 이용하여 패킷교환을 통해 상태를 변화합니다.
이는 로봇의 운영체제인 다음 post에서 이어하도록 하겠습니다.
'Project > Caston Design' 카테고리의 다른 글
[순서도] 시스템 동작 (0) | 2023.09.02 |
---|---|
[image processing] QR코드인식 (0) | 2023.09.01 |
[개발환경구축] SSH로 vscode와 연동하기 (0) | 2023.09.01 |
[초안설계] 졸업작품 system design (0) | 2023.09.01 |
MQTT(Message Queuing Telemetry Transport)
- IoT를 위한 저전력의 경량 메시징 프로토콜
- 무선으로 인터넷에 연결된 임베디드 기기들의 통신을 목적으로 만들어짐
- 리소스를 매우 적게 요구하기 때문에 사물인터넷에 최적화된 프로토콜
MQTT 통신 방법
- broker라고 불리는 server에 의해 중계된다.
- client들은 임의의 topic을 subscribe 하거나 topic에 메시지를 publish 하는 방식으로 통신이 이뤄짐

Mosquitto
- MQTT프로토콜 버전 3.1을 구현하는 오픈소스 메시지 브로커(MQTT server)
- 가벼우며 저전력으로 동작하는 임베디드 센서나 모바일 장치와 같은 IoT 기기에 적합

Mosquitto를 사용하려면 설치작업을 진행해야 한다.
$ sudo apt-get update
$ sudo apt-get install mosquitto
Mosquitto == Daemon환경이다.
설치와 동시에 시작된다.
또한 항상 실행 시 ==> background process에서 동작중이다.
daemon으로 동작하고 있는지 확인해보자.
$ sudo service mosquitto status
를 입력하면 상태확인을 진행할 수 있다.
여기서 "service"명령은 시스템 서비스 또는 데몬(daemon) 프로세스를 관리를 하는 명령어다.
"service" 명령으로 데몬을
1. 시작(start)
2. 정지(stop)
3. 재시작(restart)
4. 상태 확인(status) 하며 동작을 수행할 수 있다.
ex) "service nginx stop" 명령어를 실행하면 ==> Nginx 웹서버를 정지시킨다.
따라서 status를 확인해 보면

이렇게 "active" 상태여야지 정상적으로 실행되어 있는 상태이다.
이때 설치 시 중간에 끊긴 적이 있었는데, 이런 상황에 켜보니 error상태였었다.
그럴 때, pip uninstall을 진행하여 Mosquitto를 제거하고 다시 install하니 active상태로 되었었다.
그 후
mosquitto.conf 파일로 들어간다.
sudo bi /etc/mosquitto/mosquitto.conf
여기서 etc는 환경설정에 관련된 파일이 들어있는 곳이다.
또한 .conf 파일은 설정파일을 의미한다.
bind_address 0.0.0.0
allow_annoymous true
를 추가로 기입한다.
여기서 "0.0.0.0"은 특수한 값입니다.
이 주소를 사용하면 해당 응용프로그램에서 모든 네트워크 인터페이스에서 연결을 수신하게 됩니다.
이는 "all zero address"라고도 불리며 "wildcard address"로 알려진 특수한 IP주소 중 하나입니다.
대신 보안 측면에서 주의해서 사용해야 합니다.
모든 네트워크 인터페이스에서 수신된 연결을 모두 처리하므로, 취약성을 노출시킬 수 있습니다.
그리고 allow_annoymous true는
MQTT브로커에서 익명(annonymous)연결을 허용하는 설정을 의미합니다.
원래 MQTT프로토콜은 인증과 권한부여 기능을 제공하지만 익명사용자도 연결할 수 있는 기능을 제공합니다.
그래서 위와 같은 설정을 이용하여 익명의 이용자도 MQTT 브로커에 메시지를 발행하거나 구독권한을 부여합니다.
하지만 여기서도 당연히 보안면에서 주의해서 사용해야 합니다.
익명 연결을 허용하면, 모든 클라이언트가 동등한 권한을 갖게 되기 때문입니다.
이처럼 MQTT는 broadcast통신을 이용합니다.

따라서 목적지에 따른 정확한 식별자를 붙여서 packet을 보내는 것이 중요합니다.
이에 따라 ip프로토콜에서 이용하는 패킷모양을 모티브 하여 패킷을 정의하였습니다.


따라서 첫 번째 header파일을 열면 ip프로토콜과 같이 목적지가 먼저 나와 자신에게 온 메시지인지 확인하는 코드를 넣었습니다.
def start_mqtt_client_interrupt(): # 메시지 인터럽트오면 끝남
global time_interrupt
# 좌표받은 후 좌표는 전역변수 real_message="1024"에 저장
mqttc = mqtt.Client()
mqttc.connect('localhost', 1883, 60)
mqttc.subscribe("dsTopic")
mqttc.on_message = on_message
mqttc.loop_start()
start_time = time.time()
while True:
if time.time()-start_time >= time_interrupt:
break
time.sleep(1)
time_interrupt = 60
메시지를 받기 전에 mqtt를 받기 위한 receive모드를 먼저 켜야 합니다.
따라서 다음목적지에 도착하면 항상 receive모드 키게 되고, 코드는 위와 같습니다.
위 코드는 'dsTopic" == delivery service topic이라는 주제로 구독을 하겠다는 뜻입니다.
또한, 최대 60초에 타이머가 작동하며 이는 실제 라우터의 타이머를 모티브 한 것입니다.
원래는 타이머 시간 안에 ack가 들어오지 않으면 네트워크상태가 좋지 않은 것으로 판단하고, 재전송을 요청하거나 조치를 취해야 하지만, 저희 시스템은 아직 거기까지 생각만 하고 구현하지 못하였습니다.
그래서 타이머가 끝나기 전에 인터럽트(ack)가 오게 되면 인터럽트를 인지하여 리시브모드를 종료합니다.
import paho.mqtt.client as mqtt # paho-MQTT 패키지 불러오기
import subprocess
SERVER = 0
server_ip = "192.168.137.211"
def device_to_server_matrix(barcodeData): # 서버로 좌표 보내기
global ADDRESS
command = "mosquitto_pub -h {} -t dsTopic -m {}".format(server_ip, SERVER+ str(MY_CAR_NUM)+barcodeData[1]+barcodeData[3])
result = subprocess.run(command, shell=True, capture_output=True)
저희는 다중로봇 총 2개의 로봇을 가지고 시스템의 베타버전을 제작하였습니다.
그래서 해당하는 식별자를 번호로 구분하기로 하였습니다.
서버: 0 로봇1: 1 로봇2: 2 |
따라서 첫 번째 문자열을 열게 되면 수신자가 먼저 나옵니다.
elif real_message[0] == '0': # [running, waiting]상태의 로봇의 신호가 왔을 때
따라서 인지하는 코드는 다음과 같습니다.

로봇은 3가지 상태에 따른 tag변환을 통해, 자신의 할 일을 정의합니다.
packet교환방식에서 특정 tag를 pigibacking을 이용하여 패킷교환을 통해 상태를 변화합니다.
이는 로봇의 운영체제인 다음 post에서 이어하도록 하겠습니다.
'Project > Caston Design' 카테고리의 다른 글
[순서도] 시스템 동작 (0) | 2023.09.02 |
---|---|
[image processing] QR코드인식 (0) | 2023.09.01 |
[개발환경구축] SSH로 vscode와 연동하기 (0) | 2023.09.01 |
[초안설계] 졸업작품 system design (0) | 2023.09.01 |