라즈베리 파이를 AP Access Point로 만들기
무선 액세스 포인트(wireless access point, WAP)는 컴퓨터 네트워크에서 와이파이를 이용한 관련 표준을 이용하여 무선 장치들을 유선 장치에 연결할 수 있게 하는 장치를 가리킨다. WAP는 일반적으로 유선망을 거치는 라우터에 연결되며 컴퓨터, 프린터와 같은 무선 장치와 네트워크 상의 유선 장치 간 데이터를 중계할 수 있다. 그리고 무선 장비 연결중 블루투스 를 이용할때는 일반적으로 1:1로 연결을 하게 되므로 이때는 무선 액서스 포인트라고 하기보다는, 1:1 근거리 무선 통신 장비라고 한다. 이유는 일반적인 무선 액서스 포인트의 용도는 1:다수가 접속을 하는데 사용하기 때문이다. ( 위키백과 https://ko.wikipedia.org/wiki/%EB%AC%B4%EC%84%A0_%EC%95%A1%EC%84%B8%EC%8A%A4_%ED%8F%AC%EC%9D%B8%ED%8A%B8 )
그냥 쉽게 인터넷 기기들이 접속할 수 있는 무선/유선 포인트라고 생각하면 된다. 집에 있는 무선 공유기, 라우터, 아니면 스마트 폰 핫 스팟 기능이라고 이해하길 바란다.
이렇게 설정하는 게 왜 좋은가? 왜 필요한가? 이것을 이해하면 아래는 할 필요가 없다.
바로 독립적인 무선 기기로 만들 수가 있다. 인터넷이 되든 안되는 상관없이 말이다. 실내에 있는 라즈베리 파이에 무선으로 접속할 수 있다는 말이 된다. 즉, AP 모드로 설정한 라즈베리 파이는 부팅을 하게 되면 AP 장치가 된다. 그래서 스마트 폰이든 노트북에서 접속이 가능하다. 파일을 실행 시킬 수 있고, 로봇으로 동작시킬 수 있고, 몰래 카메라 같은 기능을 실행하게 할 수 있다는 말이다. 무엇보다 네트워크 환경에서 해야 하는 개발이나 테스트가 아주 쉽게 할 수 있다는 말이다.
라즈베리파이3 보드에 내장된 BCM43438 칩이 AP Mode 를 진원합니다. AP 란 Access Point 로 라우터나 공유기 같은 기능을 지원한다는 말입니다.
SSH로 접속하고 로그인 하는 과정은 생략하도록 하겠습니다.
1. 업데이트 & 업그레이드
1
2
3
4
|
$sudo apt-get update
$sudo apt-get upgrade -y
|
cs |
2. 패키지 설치
1
2
3
4
|
$sudo apt-get install hostapd -y
$sudo apt-get install dnsmasq -y
|
cs |
여기서 hostapd는 wifi ap mode로 설정할 때 사용하며
dnsmasq 는 DHCP나 DNS를 설정할 때 사용합니다.
3. 자동실행 설정
1
2
3
4
|
$sudo systemctl disable hostapd
$sudo systemctl disable dnsmasq
|
cs |
여기서 바로 넘어가면 설정이 되지 않은채로 실행되므로 이를 정지시켜 줍니다.
4. hostapd 설정
나노 에디터를 열어 아래 내용을 추가해 주시면 됩니다. 편집을 마치고 빠져 나올때는 ctrl-x 누르시고 저장할거냐 ? 물어오니 Y 누르시고 엔터 누르시면 빠져 나옵니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$sudo nano /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=RPI3wifi
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
|
cs |
편집을 마치고 빠져 나올때는 ctrl-x 누르시고 저장할거냐 ? 물어오니 Y 누르시고 엔터 누르시면 빠져 나옵니다.
대충 보자면 wlan0을 설정하고 ssid를 설정하고 뭐라뭐라 되있는데 솔직히 2개만 신경썼습니다.
ssid랑 wpa_passphrase
ssid는 우리가 와이파이를 켰을 때 보이는 이름이며
wpa_passphrase는 비밀번호입니다.
다른건 드라이버나 채널 암호화 방식등등 입니다.
완료되었다면 저장 후 종료를 해줍니다.
nano 에디터 기준으로 Ctrl + x, y, enter 를 하면 저장 후 종료하게 됩니다.
다음 파일을 열어서
$sudo nano /etc/default/hostapd
#demon_conf=""
부분을
demon_conf="/etc/hostapd/hostapd.conf"
로 바꾸어 줍니다.
5. dnsmasq 설정
아패 파일을 열어서 아래 방향키를 사용하여 맨 아래로 이동하여 그대로 입력합니다.
1
2
3
4
5
6
7
8
9
10
11
|
$sudo nano /etc/dnsmasq.conf
#Pi3Hotspot Config
#stop DNSmasq from using resolv.conf
no-resolv
#Interface to use
interface=wlan0
bind-interfaces
dhcp-range=10.0.0.3,10.0.0.20,12h
|
cs |
저장-종료를 해줍니다. ctrl-x 누르고 y 누르고 엔터쳐서 빠져나옵니다.
6. network 설정
1
2
3
4
5
6
7
8
|
$sudo nano /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
|
cs |
3번째 줄에 #을 추가하여 아래와 같이 바꿔줍니다.
1
2
3
4
5
6
|
allow-hotplug wlan0
iface wlan0 inet manual
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
|
cs |
이제 스크립트를 수정해 주어야 합니다.
왜 수정하느냐?
라즈베리파이를 켰을 때 일일이 연결해서(이더넷같은 방법으로) ap mode 켜주고 할 순 없으니까요
7. rc.local 설정
rc.local은 라즈베리파이가 부팅할 때 실행되는 프로그램이나 커맨드에 관한 부분입니다. 자세한 내용은 아래 링크를 참조해 주시기 바랍니다.
https://www.raspberrypi.org/documentation/linux/usage/rc-local.md
#sudo nano /etc/rc.local
명령으로 파일을 엽니다.
#!/bin/sh -e
위와같이 되어있는 맨 윗줄을
#!/bin/bash -e
로 바꾸어 줍니다.
그리고 fi (printf ~~ 바로 아래) 와 exit 0 사이에 아래 스크립트를 추가해 줍니다.
에러가 나면 그대로 입력되어 있나 확인해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#Wifi config - if no prefered Wifi generate a hotspot
#RPi Network Conf Bootstrapper
createAdHocNetwork()
{
echo "Creating RPI Hotspot network"
ifconfig wlan0 down
ifconfig wlan0 10.0.0.5 netmask 255.255.255.0 up
service dnsmasq start
service hostapd start
echo " "
echo "Hotspot network created"
echo " "
}
echo "================================="
echo "RPi Network Conf Bootstrapper"
echo "================================="
echo "Scanning for known WiFi networks"
ssids=( 'mySSID1','mySSID2' )
connected=false
for ssid in "${ssids[@]}"
do
echo " "
echo "checking if ssid available:" $ssid
echo " "
if iwlist wlan0 scan | grep $ssid > /dev/null
then
echo "First WiFi in range has SSID:" $ssid
echo "Starting supplicant for WPA/WPA2"
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf > /dev/null 2>&1
echo "Obtaining IP from DHCP"
if dhclient -1 wlan0
then
echo "Connected to WiFi"
connected=true
break
else
echo "DHCP server did not respond with an IP lease (DHCPOFFER)"
wpa_cli terminate
break
fi
else
echo "Not in range, WiFi with SSID:" $ssid
fi
done
if ! $connected; then
createAdHocNetwork
fi
|
cs |
제일 처음 고쳤던 sh를 bash로 바꾸는 부분을 잘 몰라서 검색을 해보았습니다.
키워드 : sh vs bash
얻은 링크 : http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash
다음으로 스크립트에 관한 내용입니다.
여기서 신경쓸 부분은
ssids=( ‘ssid1’, ‘ssid2’ )
부분입니다.
이 부분은 주변에 와이파이를 스캔해본 뒤 일치하는 ssid가 있으면 wpa_supplicant.conf 에 설정되어 있는데로 연결을 시도하며 그게 아니라면 ap mode로 진입합니다.
위처럼 ‘,’ 를 이용하여 여러개를 넣을 수 있으며 1개만 넣어주어도 됩니다.
일치하는 ssid가 있으면 ap mode로 바뀌지 않으므로 일부러 틀린 ssid를 넣어 와이파이가 공유기에 접속하지 못하게 하였습니다.
저장-종료 후 재부팅을 해줍니다.
$sudo reboot
이까지 되었다면 라즈베리파이를 ap mode로 사용할 수 있습니다.
wifi
8. 추가사항(필수)
이대로 진행해보니 에러가 하나 발생하였습니다.
pip를 설치하려는데 에러가 나길레
$ping google.com
을 해보니 알 수 없는 주소라는 에러가 출력되었습니다.
그런데
$ping 8.8.8.8 은 잘됩니다.
dns 문제인가 싶어 dnsmasq를 먼저 수정해 보았습니다.
하지만 뭘 수정해야 할지 모르므로 구글링
키워드 : dnsmasq raspberry pi
얻은 링크 : https://www.raspberrypi.org/forums/viewtopic.php?t=46154
중간에 server=8.8.8.8 이라는 부분이 보였습니다.
이를 dnsmasq.conf에 추가해 줍니다.
$sudo nano /etc/dnsmasq.conf
server=8.8.8.8
를 맨 마지막에 추가해 주었습니다.
저장-종료 후 재부팅을 해줍니다.
$sudo reboot
설정이 잘 되었는지 확인하기 위해 ifconfig 명령을 사용해 wlan0 가 셋팅되어 있음을 확인한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
pi@raspberrypi:~ $ ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:7f:d0:79
inet addr:192.168.1.239 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::b9ce:c93b:7972:2869/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:408 errors:0 dropped:2 overruns:0 frame:0
TX packets:155 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:34505 (33.6 KiB) TX bytes:24505 (23.9 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:358 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:26825 (26.1 KiB) TX bytes:26825 (26.1 KiB)
wlan0 Link encap:Ethernet HWaddr b8:27:eb:2a:85:2c
inet addr:10.0.0.5 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::4b59:6b44:6e1b:a9a5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:369 errors:0 dropped:369 overruns:0 frame:0
TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:69521 (67.8 KiB) TX bytes:20521 (20.0 KiB)
pi@raspberrypi:~ $
|
cs |
위 화면은 이더넷 케이블로 IP 주소를 받고, AP 모드로 설정된 상태이다. 즉 무선 AP 로 설정된 상태다. SSID는 RPI3wifi 이고 주소는 10.0.0.5 임을 알 수 있다.
$ping google.com
여기까지 했는데 막히는 곳이 하나 있다. 바로 /etc/rc.local 파일이 실행되지 않는 것이다. 아래처럼 해결한다.
pi@raspberrypi:~ $ systemctl status rc-local.service
● rc-local.service - /etc/rc.local Compatibility
Loaded: loaded (/lib/systemd/system/rc-local.service; enabled; vendor preset: enabled)
Drop-In: /usr/lib/systemd/system/rc-local.service.d
└─debian.conf
/etc/systemd/system/rc-local.service.d
└─ttyoutput.conf
Active: failed (Result: exit-code) since Mon 2021-07-26 19:12:49 KST; 2min 16s ago
Docs: man:systemd-rc-local-generator(8)
Process: 1248 ExecStart=/etc/rc.local start (code=exited, status=1/FAILURE)
7월 26 19:12:40 raspberrypi systemd[1]: Starting /etc/rc.local Compatibility...
7월 26 19:12:49 raspberrypi rc.local[1248]: Failed to start hostapd.service: Unit hostapd.service is masked.
7월 26 19:12:49 raspberrypi systemd[1]: rc-local.service: Control process exited, code=exited, status=1/FAILURE
7월 26 19:12:49 raspberrypi systemd[1]: rc-local.service: Failed with result 'exit-code'.
7월 26 19:12:49 raspberrypi systemd[1]: Failed to start /etc/rc.local Compatibility.
pi@raspberrypi:~ $ ^C
pi@raspberrypi:~ $ sudo systemctl enable rc-local.service
pi@raspberrypi:~ $ systemctl list-unit-files | grep rc.local
rc-local.service enabled
rc.local.service enabled
pi@raspberrypi:~ $
pi@raspberrypi:~ $
pi@raspberrypi:~ $ sudo systemctl unmask hostapd
Removed /etc/systemd/system/hostapd.service.
pi@raspberrypi:~ $ sudo systemctl enable hostapd
Synchronizing state of hostapd.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable hostapd
pi@raspberrypi:~ $ sudo systemctl start hostapd
pi@raspberrypi:~ $ sudo systemctl enable rc-local.service
pi@raspberrypi:~ $
참고자료 목록
http://www.raspberryconnect.com/network/item/315-rpi3-auto-wifi-hotspot-if-no-internet http://elinux.org/RPi_Setting_up_a_static_IP_in_Debian https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/
내용 참고 : https://blog.psangwoo.com/rpi/2016/08/20/rpi-connect_wifi.html
If you are always trying to be normal you will never know how amazing you can be.
'개발자 > Raspberry Pi3' 카테고리의 다른 글
Sunfounder Car for Raspberry Pi 라즈베리 카 조립 시험 착수 (0) | 2017.10.17 |
---|---|
라즈베리 파이3 부팅이 끝나면 자동으로 실행하게 하는 방법 bash_completion.sh (19) | 2017.09.19 |
라즈베리파이3 에 Q4OS 설치하고 오피스 설치해서 사용하기 (0) | 2017.09.11 |
라즈베리 파이의 이름을 변경하는 방법 (0) | 2017.09.05 |
RHT-05 온도 습도센서를 사용해 Raspberry pi3 에서 데이터 획득하기 (2) | 2017.06.08 |
라즈베리 파이3 에 APM(Apache + PHP + MySQL)을 설치 (5) | 2017.06.06 |
raspberry pi 3 에서 mcp3208 adc 안될때 spi 통신 이상 (0) | 2017.04.04 |
apache2 리스타트 에러 - Job for apache2.service failed. (0) | 2017.03.27 |
더욱 좋은 정보를 제공하겠습니다.~ ^^