bbqmsg 님의 블로그
[IoT] AWS IoT사용법 및 코드 분석 본문
디바이스 연결하기
1. 아마존에 로그인한다.
2. 콘솔에서 IoT Core로 들어간다.
3. 디바이스 연결을 눌른다.
4. 설명에 있는데로 하고 ping 명령어로 응답이 오는지 확인한다.
5. 사물을 만들고 플랫폼을 선택한 다음 연결 키트를 다운로드 하고 압축을 푼다.
메세지 확인하기
위 그림의 왼쪽 리스트에서 MQTT 테스트 클라이언트을 클릭한다.
필터에 # 구독 (#은 모든 topic을 말함)
그러고 압축을 풀었던 폴더에 들어가서
chmod +x ./start.sh
위 명령어로 실행파일에 실행권환을 주고
./start.sh
위 명령어를 통해 실행한다. 그러면 서버에
Hello World! [n]라고 메세지를 보낼것이다.
그러면 서버에서 메세지를 확인할수 있다.
AWS IoT 후기
디바이스 연결하는 것은 생각보다 간단했다. 연결키트를 다운로드 받고 나면 끝이었다.
AWS IoT는 MQTT방식으로 통신을 한다. 따라서 서버에서 구독을 한 후 메세지를 받을수 있다.(MQTT 설명은 내 블로그에 있음)
통신의 속도도 빠른거 같다. 그리고 서버에 메세지를 보내는 Python코드를 연결키트에 담아서 그대로 공유해버렸다.
코드 분석해보기
내 수준안에서 최대한으로 분석해보겠다.
첫번째로 ./start.sh 실행한다. 그러면 실행파일 안에 있는 코드가 실행된다.
#start.sh
#!/usr/bin/env bash
# stop script on error
set -e
#python3가 깔려있는지 확인 안깔려 있다면 에러 후 코드 종료
if ! python3 --version &> /dev/null; then
printf "\nERROR: python3 must be installed.\n"
exit 1
fi
# 인증서가 있는지 확인 없으면 다운로드
if [ ! -f ./root-CA.crt ]; then
printf "\nDownloading AWS IoT Root CA certificate from AWS...\n"
curl https://www.amazontrust.com/repository/AmazonRootCA1.pem > root-CA.crt
fi
# 얘네들이 sdk을 python으로 구현을 해놈 그걸 없으면 다운로드 시킴(git)
if [ ! -d ./aws-iot-device-sdk-python-v2 ]; then
printf "\nCloning the AWS SDK...\n"
git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git --recursive
fi
# sdk가 이미 설치되어 있는지 확인 없으면 설치
if ! python3 -c "import awsiot" &> /dev/null; then
printf "\nInstalling AWS SDK...\n"
python3 -m pip install ./aws-iot-device-sdk-python-v2
result=$?
if [ $result -ne 0 ]; then
printf "\nERROR: Failed to install SDK.\n"
exit $result
fi
fi
#pubsub.py 샘플을 실행
printf "\nRunning pub/sub sample application...\n"
python3 aws-iot-device-sdk-python-v2/samples/pubsub.py --endpoint ai0r0hfdl279r-ats.iot.us-east-1.amazonaws.com --ca_file root-CA.crt --cert bbq.cert.pem --key bbq.private.key --client_id basicPubSub --topic sdk/test/python --count 0
그러고 pubsub.py에는 메인만 요약해서
#main of pubsub.py
#앞에서 실행할때 같이 적었던 arg를 가져옴(다른 값들도 가져오긴함).
cmdData = CommandLineUtils.parse_sample_input_pubsub()
if __name__ == '__main__':
#프록시 설정
proxy_options = None
if cmdData.input_proxy_host is not None and cmdData.input_proxy_port != 0:
proxy_options = http.HttpProxyOptions(
host_name=cmdData.input_proxy_host,
port=cmdData.input_proxy_port)
# mqtt로 연결하기전 세팅을 한다.
mqtt_connection = mqtt_connection_builder.mtls_from_path(
endpoint=cmdData.input_endpoint,#서버
port=cmdData.input_port,#포트
cert_filepath=cmdData.input_cert, #(?)
pri_key_filepath=cmdData.input_key,#private 키
ca_filepath=cmdData.input_ca,#인증서 (키와 인증서에 관해서는 내 블로그에 있음)
on_connection_interrupted=on_connection_interrupted, #(?)
on_connection_resumed=on_connection_resumed, #(?)
client_id=cmdData.input_clientId, #클라이언트 id
clean_session=False, #(?)
keep_alive_secs=30, #(?)
http_proxy_options=proxy_options, #앞에서 설정했던 프록시
on_connection_success=on_connection_success,
on_connection_failure=on_connection_failure,
on_connection_closed=on_connection_closed)
if not cmdData.input_is_ci:
print(f"Connecting to {cmdData.input_endpoint} with client ID '{cmdData.input_clientId}'...")
else:
print("Connecting to endpoint with client ID")
connect_future = mqtt_connection.connect() #mqtt 연결
# Future.result() waits until a result is available
connect_future.result() #mqtt 연결 결과를 화면에 출력
print("Connected!")
message_count = cmdData.input_count #message_count가 0이면 무한, 1이상이면 그 수 만큼 메세지를 보냈겠다는 거임
message_topic = cmdData.input_topic #topic 설명은 내 블로그
message_string = cmdData.input_message #서버에 보낼 메세지
# Subscribe
print("Subscribing to topic '{}'...".format(message_topic))
subscribe_future, packet_id = mqtt_connection.subscribe(
topic=message_topic,
qos=mqtt.QoS.AT_LEAST_ONCE,#Qos도 내 블로그, AT_LEAST_ONCE는 0
callback=on_message_received)#서버에 구독하기
subscribe_result = subscribe_future.result()#서버에 구독에 대해 결과를 출력
print("Subscribed with {}".format(str(subscribe_result['qos'])))
# Publish message to server desired number of times.
# This step is skipped if message is blank.
# This step loops forever if count was set to 0.
if message_string:
if message_count == 0:
print("Sending messages until program killed")
else:
print("Sending {} message(s)".format(message_count))
publish_count = 1 #발행 갯수 누적 값
while (publish_count <= message_count) or (message_count == 0):
message = "{} [{}]".format(message_string, publish_count) #메세지 형태를 만듬
print("Publishing message to topic '{}': {}".format(message_topic, message))
message_json = json.dumps(message)#json형태로 변환
mqtt_connection.publish(
topic=message_topic,
payload=message_json,
qos=mqtt.QoS.AT_LEAST_ONCE)#발행
time.sleep(1)
publish_count += 1# 누적 +1
# Wait for all messages to be received.
# This waits forever if count was set to 0.
if message_count != 0 and not received_all_event.is_set():
print("Waiting for all messages to be received...")
received_all_event.wait()
print("{} message(s) received.".format(received_count))
# Disconnect
print("Disconnecting...")
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()
print("Disconnected!")
분석을 해보니 통신하는데 MQTT방식으로 하고 qos을 0으로 해서 보내고 json형태로 메세지를 보낸다는 것을 알 수 있었다.
'IoT' 카테고리의 다른 글
[AIoT] AWS IoT의 소개 및 AIoT, IoT의 시장 현황 (2) | 2024.10.21 |
---|