레이블이 Raspberry Pi인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Raspberry Pi인 게시물을 표시합니다. 모든 게시물 표시

2019년 4월 14일 일요일

라즈베리파이로 WOL 해서 PC 켜기(Turn on PC using WOL in Raspberry Pi) , sending magic packet for WOL through eth0


WOL로 PC를 켜는것은 공통적인 부분입니다. 여기서 시도한것은 LAN의 cross cable(공유기를 거치지 않고  PC-PC를 LAN케이블을 연결) 을 이용한 WOL 입니다.
결론는 가능하다 입니다.

1. PC의 WOL 설정 확인하기

1.1 PC BIOS 설정 확인하기
1.2 Windows 설정 확인하기
1.2.1 LAN Card 드라이버 업데이트하기
랜카드를 드라이버를 업그레이드 하지 않으면 WOL 옵션이 나타나지 않습니다.
1.2.2 LAN 설정 변경하기
LAN 카드 고급 설정 확인 할 것
1.2.3 절전 모드 확인하기
동작안되면 절전 관련 off할 것
설정->전원 및 절전->추가 전원 설정->덮개를 닫으면 수행되는 작업 선택->전원 단추 정의 및 암호 보호 설정->현재 사용할 수 없는 설정 변경->빠른 시작 켜기 check 해제해야함
설정은 인터넷 검색시 많이 나오므로 여기에서는 생략 하였습니다.

2. 공유기에서 WOL 해보기

일반적인 공유기들은 WOL 이 지원하므로 PC설정이 제대로 동작되었는지 공유기로 확인 합니다.

3. Raspberry Pi 유선 랜에서 WOL 하기

etherwake 설치하기
sudo aptiude install etherwake

아래와 같은 형식으로  00:00:00:00:00:00 =>값은 깨우고자 하는 LAN카드의 MAC address 입니다.
sudo etherwake 00:00:00:00:00:00

4. Raspberry Pi 와 PC Cross cable에서 WOL 하기

케이블만 Cross로 연결하여 etherwake를 호출 합니다.
sudo etherwake 00:00:00:00:00:00

5. eth0 장치로 매직패킷 보내기 (sending magic packet for WOL through eth0)

깨우고자 하는 PC의 환경이 라즈베리파이와 유선LAN으로 연결되어 있고 라즈베리파이의 무선WIFI로 인터넷이 연결되어 있다면  WOL시도할때 일반적인 코드로는 깨워지지 않습니다. 사유가 대부분의 구현된 코드가 인터넷 연결된 망으로 매직 패킷을 보내기 때문입니다. 무선랜 연결시에는 무선랜으로 매직패킷이 보내지게 됩니다.
리눅스에서 eth장치가 유선랜이므로 eth로 매직 패킷을 보내야 합니다.

source code
# wol
import socket
import fcntl
import struct

BROADCAST_IP = '255.255.255.255'
DEFAULT_PORT = 9

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

def create_magic_packet(macaddress):
    if len(macaddress) == 12:
        pass
    elif len(macaddress) == 17:
        sep = macaddress[2]
        macaddress = macaddress.replace(sep, '')
    else:
        raise ValueError('Incorrect MAC address format')

    # Pad the synchronization stream
    data = b'FFFFFFFFFFFF' + (macaddress * 16).encode()
    send_data = b''

    # Split up the hex values in pack
    for i in range(0, len(data), 2):
        send_data += struct.pack(b'B', int(data[i: i + 2], 16))
    return send_data


def send_magic_packet(mac,ifname):
 packets = []
 ip = BROADCAST_IP
 port = DEFAULT_PORT

 packet = create_magic_packet(mac)
 packets.append(packet)

 if ifname != None:
  myip = get_ip_address("eth0".encode())
 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 if ifname != None:
  sock.bind((myip,port))
 sock.connect((ip, port))
 for packet in packets:
  sock.send(packet)
 sock.close()

def wol(mac):
 send_magic_packet(mac,"eth0")

6. 소스 코드 설명

get_ip_address 함수는 LAN interface 장치로 부터 ip를 구합니다. 위 소스에서는 eth0 장치를 사용하였습니다. LAN카드가 여러개인경우 eth1장치가 될 수 도 있습니다.
구해진 ip를 통해서 매직 패킷으로 보낼때 특정 ip로 소켓 바인드를 합니다. sock.bind((myip,port)) , 그러면 특정 장치로 magic packet이 나가게 됩니다.




2019년 4월 7일 일요일

라즈베리파이 텔레그램 챗봇 사용하기 (봇 생성 과 통신) Raspberry Pi creating telegram bot


Telegram Desktop
다운로드
https://desktop.telegram.org/


1. 일단 가입

가입을 위해서는 SMS 되는 단말 필요 SMS인증함
이미 가입 하여 사용중이라면 추가 해당 내용 필요 없습니다. 다음 내용은 모바일로 진행해도 무방합니다.

2. 검색 목록에서 @botfather 입력



3. /start -> /newbot -> name생성 -> username생성(중복이 안되어야함)



4. access token 정보는 저장해야 두어야 하며, 다른 사람과 공유하지 않도록 해야합니다.



5. 라즈베리파이에서 설치


sudo pip3 install telepot
아래와 같은 에러 발생시 재시도
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'


6. get id 봇 검색 (내 계정으로 메시지를 보낼때 사용)



start 하면 id 알려줌
Your Chat ID = XXXXXXXXXX
범용적인 챗봇에서는 사용하지 않고, 특정 사용자에게 보낼때만 필요합니다.

7. 특정 사용자에게 메신저 보내기

test.py
import telepot
 
my_token = '123456789:........................' # bot 의 token 입력
bot = telepot.Bot(my_token) #봇을 생성해줍니다.

msg = 'message test'
telegram_id = '123412345' # 수신처 아이디 입력

bot.sendMessage(chat_id = telegram_id, text = msg) #메시지를 보냅니다.


다음과 같은 오류가 날때
raise exception.TelegramError(description, error_code, data)
telepot.exception.TelegramError: ('Bad Request: chat not found', 400, {'ok': False, 'error_code': 400, 'description': 'Bad Request: chat not found'})

위에서 만든 chat bot과 대화가 start가 되어있는지 확인 필요, 없다면 대화 시작된 상태에서만 메신저가 갑니다.

8. 응답 챗봇

이번에는 좀 더 복잡한 예제입니다. 메신저가 들어온 사용자에게 답변을 하는 예제입니다.

#-*- coding: utf-8 -*-

import time
import telepot
from telepot.loop import MessageLoop
 
def handle(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
 
    if content_type == 'text':
        if msg['text'].upper() == 'hello':
            bot.sendMessage(chat_id, 'good morning')
        elif msg['text'] == '/start':
            pass
        else:
            bot.sendMessage(chat_id, '지원하지 않는 기능입니다')
 
 
TOKEN = '1234567:................_....'  # 텔레그램으로부터 받은 Bot 토큰

bot = telepot.Bot(TOKEN)
MessageLoop(bot, handle).run_as_thread()

print ('Listening ...')
while True:
    time.sleep(1000)

실행 예제


9. 몇가지 기능 추가

9.1. 사용자 관리 (/start 들어올때마다 saving.dat 파일에 사용자 추가함)
9.2. 더 많은 명령어 (cpu 정보와, disk정보보기 명령 추가)
9.3. wakup noti 기능 추가 (시스템 시작될때마다 메세지 보냄)
9.4. DiskFull 일때 알림 기능

#-*- coding: utf-8 -*-

import time
import telepot
from telepot.loop import MessageLoop
import os
import sys
import psutil
datafile = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'saving.dat')
all_users = []


def load_users(file):
 try:
  f = open(file,"r")
  datas = f.readlines()
  f.close()
  users = []
  for data in datas :
   if len(data.strip())>0 :
    users.append(data.strip())
  return list(set(users))
 except:
  return []

def save_users(file,users):
 f = open(file,"w")
 for user in users :
  f.write(str(user).strip()+"\n")
 f.close()
 os.chmod(file, 0o777)

def handle(msg):
 try:
  content_type, chat_type, chat_id = telepot.glance(msg)
  #print(content_type, chat_type, chat_id)
  find = False
  if content_type == 'text':
   for command in commands_list:
    if msg['text'].lower().strip() == command[0]:
     ret, data = command[1](content_type, chat_type, chat_id)
     if ret == True :
      bot.sendMessage(chat_id, data)
     find = True
  if find == False:
   bot.sendMessage(chat_id, 'not supported command')
 except:
  pass

def meminfo(content_type, chat_type, chat_id):
 memory_usage = os.popen("cat /proc/meminfo").read()
 return True, memory_usage

def diskusage(content_type, chat_type, chat_id):
 obj_Disk = psutil.disk_usage('/')
 str = "Disk Total %5fGB\nDisk used %5fGB\nDisk Free %5fGB\nusage %4f%%"%((obj_Disk.total / (1024.0 ** 3)) , (obj_Disk.used / (1024.0 ** 3)) , (obj_Disk.free / (1024.0 ** 3)) , (obj_Disk.percent))
 return True, str

def start_chat(content_type, chat_type, chat_id):
 global all_users
 all_users.append(chat_id)
 all_users = list(set(all_users))
 save_users(datafile,all_users)
 return True, "system started"

def cpuinfo(content_type, chat_type, chat_id):
 text1 = psutil.sensors_temperatures()
 text2 = psutil.cpu_stats()
 text3 = os.popen("uptime").read()
 return True, str(text1)+"\n"+str(text2) + "\n"+str(text3)

def check_system_info(bot):
 obj_Disk = psutil.disk_usage('/')
 if obj_Disk.percent > 70 :
  # Warning
  for user in all_users:
   try:
    bot.sendMessage(user, 'Storage full:%f%%'%(obj_Disk.percent))
   except:
    pass

# Wakeup notification
def wakeup_noti(bot):
 global all_users
 users=[]
 exception = False
 for user in all_users:
  try:
   bot.sendMessage(user, 'system restarted')
   users.append(user)
   
  except telepot.exception.BotWasBlockedError:
   exception = True
  except:
   time.sleep(5)
   pass
 if exception == True :
  all_users = list(set(users))
  save_users(datafile,all_users)

commands_list=[('meminfo',meminfo),('/start',start_chat),('diskusage',diskusage),('cpuinfo',cpuinfo)]

# 시스템 network 될때까지 시간이 걸립니다.
time.sleep(20)

TOKEN = '12234567:tttttttttttttttttttttttttttttt'  # 텔레그램으로부터 받은 Bot 토큰
all_users = load_users(datafile)

# Bot Setup
bot = telepot.Bot(TOKEN)

wakeup_noti(bot)
MessageLoop(bot, handle).run_as_thread()

# Main Loop
print ('Listening ...')
while True:
 check_system_info(bot)
 time.sleep(60*60) # 1 hours

10. 켜질때마다 챗봇 서버 동작하기

https://swlock.blogspot.com/2019/03/python-auto-start-python-script-at.html



라즈베리파이 부팅시 python 스크립트 실행 (Auto start python script at Raspberry Pi booting)


검색해보면 /etc/profile.d/bash_completion.sh 여기에 추가하면 된다고 되었는 부분이 있는데 테스트해보면 아래 경로에 추가하면 계정이 login 될때 계속 실행되는 문제가 발생합니다. (따라서 비추천 합니다.)

/etc/rc.local 파일에 추가합니다. 필요한경우 python 스크립트에서 delay를 넣도록 합니다. time.delay(초) 함수를 이용합니다.

sudo vi /etc/rc.local

아래 문장 추가함 마지막에 '&' 표시는 스크립트가 완료될때까지 기다리지 않고 자식 프로세서로 실행시킨다는 의미입니다.
python3 home/pi/server_bot.py &

소스코드
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python3 /home/pi/server_bot.py &

exit 0


실행되었는지 확인 방법

ps -e | grep python3
ps -e 목록에 나타나지 않으면 실행이 안된것 입니다.


디버깅 방법

var/log/daemon.log 파일 확인

Mar 31 10:45:00 raspberrypi rc.local[379]: Traceback (most recent call last):
Mar 31 10:45:00 raspberrypi rc.local[379]:   File "/home/pi/work/rpi1_server_bot/server_bot.py", line 9, in <module>
Mar 31 10:45:00 raspberrypi rc.local[379]:     import psutil
Mar 31 10:45:00 raspberrypi rc.local[379]: ImportError: No module named 'psutil'

psutil 이 command line으로 직접 동작할때는 실행이 되었는데 부팅시점에는 모듈이 없다고 나오는 경우가 있습니다.
https://raspberrypi.stackexchange.com/questions/78141/python-script-fails-with-importerror-when-run-from-rc-local
psutil이 root권한으로 설치가 안되어 있던게 문제였네요 아래와 같이 재설치 하였습니다.
sudo pip3 install psutil

라즈베리파이 삼바(samba) 설치 및 설정하기 (install samba and configuration in raspberry pi)

1. 삼바 관련 패키지 설치

sudo apt-get install samba samba-common-bin


2. 삼바 사용자의 비밀번호를 등록한다.

sudo smbpasswd -a pi


3. /etc/samba/smb.conf 파일 수정하기

sudo vi /etc/samba/smb.conf
제일 아래 아래 내용 추가
[pi]
path = /home/pi
comment = SAMBA SERVER
valid user = pi
writable = yes
read only = no
browseable = yes
create mask = 0777
public = yes
guest ok = no

guest ok = no 역할이 윈도우의 guest login을 막는 역할을 한다. 접속시 로그인 확인하는 화면이 안나오고 삼바 폴더에 쓰기가 안된다면 추가하도록 합니다.

4. 삼바 서버 시작

설정을 변경했을 경우 항상 재시작을 하도록 합니다.
sudo service smbd restart
또는
sudo /etc/init.d/samba restart

5. 윈도우에서 접속하기

윈도우 탐색기 주소줄에 \\삼바 서버 ip 를 적어준다.


라즈베리파이 터미널 접속하기 putty 사용하기 (use putty in Raspberry Pi)


모니터를 사용 안하고 다른PC에서 라즈베리파이 접속하기

putty 다운 로드드 링크
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

putty.exe (the SSH and Telnet client itself)

설정창 진입

sudo raspi-config

SSH 활성화

5 Interfacing Options 선택

P2 SSH 선택


putty 접속

실행 후 라즈베리파이 IP 입력 SSH 선택하여 id, password 입력

2019년 4월 1일 월요일

라즈베리파이 유니코드 UnicodeEncodeError 오류 ( Raspberry Pi unicode error )


Python3 한글 출력시 아래와 같은 오류가 발생할때 조치 방법입니다.

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)

하루 동안 열심히 찾아봤지만 원인을 찾지 못했는데, locale 설정에 답이 있는것 같아서 시도해보니 동작합니다. 

기본적으로 한글관련 패키지들을 모두 설치합니다. 
sudo apt-get fonts-unfonts-core ibus ibus-hangul

아래 링크에 설명이 잘 되어 있습니다.
https://toytvstory.tistory.com/729

방법 아래와 같은 내용이 추가되어야 합니다.

export LC_ALL=ko_KR.UTF-8

/etc/profile 마지막에 위 내용을 추가하면 됩니다.
sudo vi /etc/profile



2019년 3월 30일 토요일

라즈베리파이 3B+ 소비 전력 (Raspberry Pi power consumption )


라즈베리파이 3B+ 모델을 24시간동안 한달 켜둘때 전력을 얼마나 소비하는지 점검 해 보았다.

조건 : WIFI 연결, Keyboard 연결 안함, Mouse 연결 안함, HDMI 연결 안함
측정장비 : 인스펙터2
평균 소비 전력 : 대략 2.75W

21시간 17분 켜놓고


소모 전력 0.054KWh

한 달 720시간 켜놓으면 대략 1.82KWh 가 됩니다.
시간 시간 한달시간
21 17 21.2833333333 720


0.054 kWh 1.826781 kWh

주택용 요금이 저압 고압이 있는데 비용이 비싼 저압 / 400kWh 초과 사용 저압으로 계산해보면 아래와 같습니다.
기본요금(원/호)전력량 요금(원/kWh)
200kWh 이하 사용
910
처음 200kWh 까지
93.3
201 ~ 400kWh 사용
1,600
다음 200kWh 까지
187.9
400kWh 초과 사용
7,300
400kWh 초과
280.6

1.826781 * 280.6 = 대략 512.59원 이 됩니다.



라즈베리파이(Raspberry Pi) 시작하기 운영체제 설치 하기 (Installing Raspberry Pi OS)


처음 받으면 빈 SD카드에 운영체제를 설치 해야합니다. (컴퓨터에 윈도우 설치하는것과 비슷합니다.)

라즈베리파이에게 필요한건 운영체제 그 중엔 라즈베리안이죠
본문은 3B+ 모델로 진행하였습니다.

라즈베리안 설치하기

1. 라즈베리안 이미지 다운로드 하기

https://www.raspberrypi.org/downloads/

다운로드 받을 수 있는것이 3가지가 있습니다.
용량이 클수록 기능이 많습니다. 첫번째 것으로 설치하였습니다.

- Raspbian Stretch with desktop and recommended software
LibreOffice, Scratch, SonicPi, Thonny, Mathematica 등 포함
- Raspbian Stretch with desktop
Chromium browser, VLC media player, Python 등 포함
- Raspbian Stretch Lite
DESKTOP GUI 없는 버전

2. 압축 풀기

다운로드 받은 파일은 zip파일로 되어있습니다. (2018-11-13-raspbian-stretch-full.zip:파일명은 다를 수 있습니다.) 압축을 해제해 줍니다. (z7 이용)
압축을 풀고 나니 5GB 정도 되는 img 파일이 생성 되었습니다.

3. IMG 파일 SD카드에 넣기

3.1 Etcher 설치

sd카드에 넣을려면 도구가 있어야 합니다. 그것이 Etcher 입니다.
아래 링크에서 다운로드 합니다.
  • Download Etcher and install it.
https://www.balena.io/etcher/


3.2 Eather로 이미지 넣기

img파일과 sd카드를 선택한 후 Flash 버튼을 누릅니다.
5G정도 되니 10분 정도 걸리는것 같습니다.



4. 부팅하기

쓰기(Flashing) 후 검사(Validating)가 이루어 지는데 모든 과정이 완료가 된 후 sd 카드를 라즈베리파이 연결, 키보드 마우스 연결, hdmi 케이블로 모니터 를 연결해서 전원을 연결해 줍니다.
전원 버튼이 없고 자동으로 부팅됩니다.
기본 암호 입니다. 첫 부팅시 창화면에서 pw 변경화면이 뜹니다.
id : pi
pw : raspberry

5. 부팅이 안된다면

전원 5V 2.5A 의심, SD 카드 호환성 의심이 필요합니다.
오동작시 /var/log 폴더의 로그들을 확인하세요

6. 주의 할 점

언어 설정은 기본 영어로 하세요. 한글을 사용하기위해서는 한글 패치 후 사용 바랍니다.
만약 korean 으로 선택했을 경우 wifi 동작이 제대로 안됩니다. 설정에서 UK로 재설정 하시기 바랍니다.




라즈베리 파이 3 B+ / B 차이 와 기본 사용 구매시 참고가이드(Buying guide for Raspberry Pi 3B+)

라즈베리파이에 관심이 있어서 구매를 하려고 봤더니 종류도 많고 뭘사야 할지도 몰라 정리하였습니다.

2019.3.27 현재 기준

링크 참고
https://namu.wiki/w/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%20%ED%8C%8C%EC%9D%B4(%EC%BB%B4%ED%93%A8%ED%84%B0)

1. 성능 비교

3B, 3B+ 모델 차이

- CPU 클럭 속도 1.2GHz vs 1.4GHz
- WIFI , BT 성능 차이

3A+, 3B+ 모델 차이

- RAM 차이 512MB vs 1GB
- LAN 3B+ 기가비트 이더넷 지원
- USB 포트 차이 1 개 vs 4 개

2. 결론

3 모델 B+ : 제일 성능 좋음

3. 구매 가이드

- 본체(필 구매)
참고로 기본으로 전달된 케이스는 비추천합니다. 스크류(볼트)가 잘들어가지 않습니다.

- SD카드(필요하나 이미 사용하던것이 있다면 구매 필요 없음)
급한 마음에 다이소에서 구매하였습니다.

5핀 충전기(휴대폰용과 호환 가능합니다. 단, 전류가 2.5A 이상 지원하면 좋습니다.)
충전기도 다이소에서 5핀 2.1A로 구매하였습니다.

나머지는 기존에 있는 것들입니다.
- 키보드와 마우스
- 모니터 및 HDMI 케이블
- 유무선 공유기