팜 시스템

방학 프로젝트 시작

user1016 2025. 7. 27. 23:41

이번 방학 프로젝트는 와이파이 bps,RSSI,ping 값을 측정해 와이파이에 생기는 문제를 관리자에게 알려주는 프로젝트이다.

나는 그중 와이파이 센서를 담당하게 되었다.

 

라즈베리파이 학습

  1. 컴퓨터와 연결

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")

 

변경점

  1. speedtest → speedtest Ookla 공식

    개발 주체 커뮤니티 (비공식) Ookla (공식)
    설치 방식 pip (pip install speedtest-cli) 패키지 설치 (예: .deb)
    측정 정확도 낮음 (단일 연결 등) 높음 (멀티 스트림, 더 정밀한 측정)
    서버 선택 자동 or 수동 자동 or --server-id로 지정 가능
    최신 기능 지원 안됨 ✅ --format=json, 서버 지정, 다운로드/업로드 상세 측정 등
    사용 위치 /usr/local/bin/speedtest /usr/bin/speedtest

  2. 핑,강도 측정 도구
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

 

문제점

  1. ping과 RSSI값은 노트북으로 측정한 기준과 유사값이 나오나 Mbps는 노트북 120Mbps, 라즈베리파이5 40Mbps로 큰 차이 존재

<해결방안>

  1. 라즈베리파이 와이파이 수신부의 성능 한계라 생각하고 와이파이 동글 구매후 재시도 → 구매하였고 7/28 도착 예정
  2. 아이폰 핫스팟에서 보이는 무의미한 차이일수도 있으니 학교 와이파이 연결 후 재시도 →7/28 등교후 재시도

2-2. 라즈베리파이 교내 와이파이에 연결

 3. 라즈베리파이에서 연결하는 방법

 GUI 환경 (라즈베리 OS Desktop) 기준:

  1. 우측 상단 Wi-Fi 클릭
  2. DGU-WIFI 선택
  3. 다음과 같이 입력:
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. 값들 중앙서버로 보내기 이렇게 두가지를 하면 센서쪽의 일은 거의 끝난다.