이번 방학 프로젝트는 와이파이 bps,RSSI,ping 값을 측정해 와이파이에 생기는 문제를 관리자에게 알려주는 프로젝트이다.
나는 그중 와이파이 센서를 담당하게 되었다.
라즈베리파이 학습
- 컴퓨터와 연결
Raspberry Pi Imager을 활용해 라즈베리파이의 개발환경 구성을 한다. (pc에서 핫스팟을 틀어 라즈베리파이에 연결시켜 원격 데스크탑으로 라즈베리 조작) →Raspberry Pi imager은 제대로 연결이 안됨 왜인지 모르겠음 →PuTTY라는 프로그램 있다고 해서 그걸 사용하기로 함
(연결 링크)
https://delma7774.tistory.com/4
https://fourdeveloper.tistory.com/1
→ 안됨.. 뭔가 다른 문제가 있는듯 IoT/로봇 2조가 라즈베리 실습 했으니 그쪽 블로그 참고해야할듯 →경민님한테 질문 딱히 해결은 안됨
→하루종일 파이 만졌는데 네트워크 연결부터 안됨. 21일에 새로운 파이 가져와서 해봐야할듯 01이나 02가 best → 7/27 둘다 안됨 ㅋㅋ
결론:라즈베리파이 새로 구매 뭔가 문제가 있음
7/27 라즈베리파이 HDMI 케이플로 모니터 연결후 와이파이 설정
그냥 라즈베리파이 모델 하나를 구매했다. 구매후 설정하니 아이폰 핫스팟은 잘 연결 되었고 노트북 와이파이는 여전히 연결이 되지 않는것 같았다. 왜그런건지 잘 모르겠으나 학교 와이파이가 안되면 큰일일텐데….
유니온 김경민님한테 라즈베리파이 와이파이에 관한 질문을 했다.

굉장히 친절하게 답변을 해주셨고 학교 와이파이로 진행을 했었다는 희망적인 소식을 얻었다. 그 다음 실습에서는 안된다고 하셨지만…
2.라즈베리파이에서 코딩
2-1. 라즈베리파이 터미널에 값 띄우기
import subprocess
import json
# ✅ Ping 측정 (8.8.8.8 기준)
def get_ping(host="8.8.8.8"):
try:
output = subprocess.check_output(["ping", "-c", "1", host], universal_newlines=True)
for line in output.split("\n"):
if "time=" in line:
time_ms = float(line.split("time=")[1].split(" ")[0])
return round(time_ms, 2)
except Exception as e:
print(f"[Ping 오류] {e}")
return 0
# ✅ RSSI 측정 (와이파이 신호 세기)
def get_rssi():
try:
output = subprocess.check_output(["iwconfig"], universal_newlines=True)
for line in output.split("\n"):
if "Signal level=" in line:
signal = line.split("Signal level=")[1].split(" ")[0]
return int(signal)
except Exception as e:
print(f"[RSSI 오류] {e}")
return 0
# ✅ 정확한 Mbps 측정 (Ookla 공식 speedtest 사용 + 서버 ID 지정)
def get_speedtest_mbps():
try:
output = subprocess.check_output([
"/usr/bin/speedtest",
"--server-id", "18404", # 📌 사바 ID 변경
"--format=json"
], universal_newlines=True)
data = json.loads(output)
download_mbps = round(data["download"]["bandwidth"] * 8 / 1_000_000, 2)
return download_mbps
except Exception as e:
print(f"[Speedtest 오류] {e}")
return 0
# ✅ 실행 및 출력
print("📡 인터넷 상태 측정 중...\n")
ping = get_ping()
rssi = get_rssi()
mbps = get_speedtest_mbps()
print(f"📶 RSSI: {rssi} dBm")
print(f"⏱️ Ping: {ping} ms")
print(f"⚡ Download Speed: {mbps} Mbps")
변경점
- speedtest → speedtest Ookla 공식
개발 주체 커뮤니티 (비공식) Ookla (공식) 설치 방식 pip (pip install speedtest-cli) 패키지 설치 (예: .deb) 측정 정확도 낮음 (단일 연결 등) 높음 (멀티 스트림, 더 정밀한 측정) 서버 선택 자동 or 수동 자동 or --server-id로 지정 가능 최신 기능 지원 안됨 ✅ --format=json, 서버 지정, 다운로드/업로드 상세 측정 등 사용 위치 /usr/local/bin/speedtest /usr/bin/speedtest - 핑,강도 측정 도구
| Ping | ping -c 1 8.8.8.8 | 네트워크 지연 시간(ms)을 측정. 8.8.8.8에 패킷 보내고 응답 시간 계산 |
| RSSI | iwconfig | 현재 연결된 Wi-Fi의 신호 세기(RSSI)를 dBm 단위로 출력. 무선 인터페이스 상태 확인 가능 |
여기서 8.8.8.8은 구글 DNS서버 IP
문제점
- ping과 RSSI값은 노트북으로 측정한 기준과 유사값이 나오나 Mbps는 노트북 120Mbps, 라즈베리파이5 40Mbps로 큰 차이 존재
<해결방안>
- 라즈베리파이 와이파이 수신부의 성능 한계라 생각하고 와이파이 동글 구매후 재시도 → 구매하였고 7/28 도착 예정
- 아이폰 핫스팟에서 보이는 무의미한 차이일수도 있으니 학교 와이파이 연결 후 재시도 →7/28 등교후 재시도
2-2. 라즈베리파이 교내 와이파이에 연결
3. 라즈베리파이에서 연결하는 방법
GUI 환경 (라즈베리 OS Desktop) 기준:
- 우측 상단 Wi-Fi 클릭
- DGU-WIFI 선택
- 다음과 같이 입력:
| EAP 방법 | PEAP |
| 인증 | MSCHAPv2 |
| ID | 학생번호@dongguk.edu (uDrims) |
| 비밀번호 | uDrims 비밀번호 |
| CA 인증서 | 비워도 되거나 Don't validate 선택 가능 |
| 익명 ID | 생략 가능 |
2-3.라즈베리파이 측정값 서버로 전송
<라즈베리파이 → Flask>
import requests
data = {
"device_id": "rpi5-001",
"ping": 25.4,
"rssi": -65,
"mbps": 43.2
}
try:
response = requests.post("http://<FLASK_SERVER_IP>:5000/upload", json=data)
print(response.status_code, response.text)
except Exception as e:
print(f"[전송 실패] {e}")
<flask 서버 측>
from flask import Flask, request, jsonify
import pymysql
app = Flask(__name__)
# MySQL 연결 설정
db_config = {
"host": "localhost", # 또는 외부 DB IP
"user": "youruser",
"password": "yourpass",
"database": "yourdb"
}
@app.route('/upload', methods=['POST'])
def upload_data():
try:
content = request.get_json()
device_id = content.get("device_id")
ping = content.get("ping")
rssi = content.get("rssi")
mbps = content.get("mbps")
conn = pymysql.connect(**db_config)
cursor = conn.cursor()
sql = """
INSERT INTO wifi_data (device_id, ping, rssi, mbps, timestamp)
VALUES (%s, %s, %s, %s, NOW())
"""
cursor.execute(sql, (device_id, ping, rssi, mbps))
conn.commit()
conn.close()
return jsonify({"status": "success"}), 200
except Exception as e:
return jsonify({"status": "error", "message": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000) # 외부에서 접속 가능
<MYSQL>
CREATE TABLE wifi_data (
id INT AUTO_INCREMENT PRIMARY KEY,
device_id VARCHAR(50),
ping FLOAT,
rssi INT,
mbps FLOAT,
timestamp DATETIME
);
마무리하며.. 이번주차의 내용을 간단하게 쭉 정리해봤다.
크게 센서에 와이파이연결하는 과정(쉬운 과정이지만 학교 보드가 와이파이에 연결이 안되는 오류를 찾는데 꽤 애먹었다)
라즈베리파이 개발환경에 익숙해지는 과정
실제 값들을 측정해 문제있는 값을 개선하는 과정을 거쳤다.
다음 할 일로는 1. bps값 개선시키기 2. 값들 중앙서버로 보내기 이렇게 두가지를 하면 센서쪽의 일은 거의 끝난다.
'팜 시스템' 카테고리의 다른 글
| 실시간 주식시세 표시장치 만들기 (0) | 2025.06.18 |
|---|---|
| 기상청 날씨 표시장치 만들기 (0) | 2025.06.07 |
| 아두이노로 인터넷 표준시간 표시하기 (0) | 2025.05.31 |
| 기본적인 아두이노 실습2 (0) | 2025.05.23 |
| 기본적인 아두이노 실습 (0) | 2025.05.15 |