# When coding to 2Byte charactor define first line.
#-*- coding: utf-8 -*-
# 윗줄은 한글 주석 사용시 반듯이 첫줄에 써준다
#Import 선언
import socket #socket
import RPi.GPIO as GPIO #gpio
import time # sleep용
#GPIO 모드 선언과 LED 포트 설정
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.OUT, initial=1)
#함수 선언
result=""
# 소켓 데이터 읽음
def read_sock(sockfd):
#결과물을 저장할 변수 선언
result = ""
while(1):
#데이터를 1byte씩 읽어들인다.
data = sockfd.recv(1)
#만약 데이터에 '.'이 포함되어 있으면 병합을 중지하고 결과값을 리턴한다.
if data != ".":
result = result + data
else:
return result
break
def blink_led(bk):
if int(bk) != 0:
for i in range(int(bk)):
GPIO.output(26, 1)
time.sleep(0.25)
GPIO.output(26, 0)
time.sleep(0.25)
else:
GPIO.output(26, 1)
time.sleep(0.5)
GPIO.output(26, 0)
time.sleep(0.1)
# 소켓 객체를 생성합니다.
# 주소 체계(address family)로 IPv4, 소켓 타입으로 TCP 사용합니다.
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 지정한 HOST와 PORT를 사용하여 서버에 접속합니다.
try:
client_socket.connect(("서버주소", 포트번호))
except:
print "서버가 준비되지 않았습니다."
client_socket.close()
quit()
# 서버 접속후 동기화 문자를 기다린다.
data = read_sock(client_socket)
if data == "READY":
# 첫 접속후 ID와 PW를 전송
client_socket.sendall('ID:ID'.encode())
client_socket.sendall('PW:PASSWORDs'.encode())
# 무한 데이터 수신을 위한 반복문으로 돌입
bf_art = 0
data = ""
client_socket.settimeout(1.0)
try:
while(1):
# 접속 허가 문자를 수신 합니다.
try:
data = read_sock(client_socket)
except socket.timeout:
pass
except KeyboardInterrupt:
client_socket.sendall('quit'.encode())
print ("중지가 되었습니다.")
client_socket.close()
GPIO.cleanup()
quit()
# 오류 수신시
if data == "FALSE":
print "ID와 PW를 확인해 주세요"
client_socket.close()
quit()
# 서버 종료 문자 수신시
if data == "END":
print "서버에서 종료를 선언했습니다."
client_socket.close()
quit()
# 경고문자 수신시 변수에 저장
if data[0:3] == "AT:":
alt_msg = data[3:]
# 반복적인 LED 깜빡임 설정
blink_led(alt_msg)
# 키보드 중지 문자가 들어올때 - 테스트중에 쓰임
except KeyboardInterrupt:
client_socket.sendall('quit'.encode())
print ("중지가 되었습니다.")
client_socket.close()
GPIO.cleanup()
quit()
# 소켓을 닫습니다.
client_socket.close()
GPIO.cleanup()
댓글 3
-
아빠
2020.06.15 16:36
-
아빠
2020.09.10 12:30
부팅시 자동으로 시작되게 하려면
/etc/rc.local을 수정 한다
# Run Alert Led Bliking
(sleep 20 && /usr/bin/python /etc/init.d/alt_msg_cli.py) &
-
아빠
2020.09.15 15:36
# When coding to 2Byte charactor define first line.
#-*- coding: utf-8 -*-
# 윗줄은 한글 주석 사용시 반듯이 첫줄에 써준다
#Import 선언
import socket #socket
import RPi.GPIO as GPIO #gpio
from time import sleep # sleep용
#GPIO 모드 선언과 LED 포트 설정
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.OUT, initial=1) # LED
GPIO.setup(19, GPIO.OUT) # Buzzer
# 음계 설정
scale = [ 523.25, 587.32, 659.25, 698.45, 783.99, 880, 987.76, 1046.5 ]
#도 레 미 파 솔 라 시 도
p = GPIO.PWM(19, 100)
list = [0,0,4,4,5,5,4,3,3,2,2,1,1,0] #작은별 노래
#함수 선언
result=""
# 소켓 데이터 읽음
def read_sock(sockfd):
#결과물을 저장할 변수 선언
result = ""
while(1):
#데이터를 1byte씩 읽어들인다.
data = sockfd.recv(1)
#만약 데이터에 '.'이 포함되어 있으면 병합을 중지하고 결과값을 리턴한다.
if data != ".":
result = result + data
else:
return result
break
# 경고 갯수에 맞춰 LED 깜빡임
def blink_led(bk):
if int(bk) != 0:
for i in range(int(bk)):
GPIO.output(26, 1)
sleep(0.25)
GPIO.output(26, 0)
sleep(0.25)
else:
GPIO.output(26, 1)
sleep(1)
GPIO.output(26, 0)
# 작은별 노래 연주
def play_buzzer():
p.start(100) # pwm 시작
p.ChangeDutyCycle(90) # dutycycle 변경
for i in range(len(list)): #len() => 길이 추출
p.ChangeFrequency(scale[list[i]]) #주파수 변경
if (i+1)%7 == 0: # 7번째 음 박자 변경
sleep(0.25)
else :
sleep(0.125)
p.stop() #pwm 종료
# 소켓 객체를 생성합니다.
# 주소 체계(address family)로 IPv4, 소켓 타입으로 TCP 사용합니다.
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 지정한 HOST와 PORT를 사용하여 서버에 접속합니다.
try:
client_socket.connect(("IP", PORT))
except:
print "서버가 준비되지 않았습니다."
client_socket.close()
quit()
# 서버 접속후 동기화 문자를 기다린다.
data = read_sock(client_socket)
if data == "READY":
# 첫 접속후 ID와 PW를 전송
client_socket.sendall('ID:ID'.encode())
client_socket.sendall('PW:PASSWRODS'.encode())
# 무한 데이터 수신을 위한 반복문으로 돌입
bf_art = 0
data = ""
client_socket.settimeout(1.0)
try:
while(1):
# 접속 허가 문자를 수신 합니다.
try:
data = read_sock(client_socket)
except socket.timeout:
pass
except KeyboardInterrupt:
client_socket.sendall('quit'.encode())
print ("중지가 되었습니다.")
client_socket.close()
GPIO.cleanup()
quit()
# 오류 수신시
if data == "FALSE":
print "ID와 PW를 확인해 주세요"
client_socket.close()
quit()
# 서버 종료 문자 수신시
if data == "END":
print "서버에서 종료를 선언했습니다."
client_socket.close()
quit()
# 경고문자 수신시 변수에 저장
if data[0:3] == "AT:":
alt_msg = data[3:]
# 멜로디가 경고 갯수 변경시에만 연주 하도록 설정
if bf_art < int(alt_msg):
play_buzzer()
bf_art = int(alt_msg)
# 현재 경고수가 이전 경고수 보다 작을경우 이전를 현재 경고수로 맞춘다.
if int(alt_msg) < bf_art:
bf_art = int(alt_msg)
# 반복적인 LED 깜빡임 설정
blink_led(alt_msg)
# 키보드 중지 문자가 들어올때 - 테스트중에 쓰임
except KeyboardInterrupt:
client_socket.sendall('quit'.encode())
print ("중지가 되었습니다.")
client_socket.close()
GPIO.cleanup()
quit()
# 소켓을 닫습니다.
client_socket.close()
GPIO.cleanup()
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
46 | 연합 수련회 | 아빠 | 2024.07.30 | 173 |
45 | 더뉴카니발 사이드미러 품번 | 아빠 | 2024.06.17 | 209 |
44 | 그대 아무 걱정 하지 말아요(캘리연습) | 아빠 | 2022.09.04 | 459 |
43 | raspberry pi zero를 이용한 Home Switch 프로그램 | 아빠 | 2022.01.05 | 876 |
42 | python2에서 python3으로 바뀌면서 pi relay board 코드 수정 | 아빠 | 2021.05.03 | 1277 |
41 | 봄이 지나 철쭉이 피지만 | 아빠 | 2021.04.22 | 1200 |
40 | 네트워크 기능이 없는 프린터 raspberry pi + cups + xinetd를 이용하여 9100 포트 생성하기 | 아빠 | 2021.04.22 | 20641 |
39 | 더뉴카니발 와이퍼 리필 고무 품번 | 아빠 | 2021.01.05 | 1406 |
38 | 서버 오류 수리 완료 | 아빠 | 2020.12.01 | 1340 |
37 | 삼식이가 하늘로 가다 | 아빠 | 2020.09.10 | 1298 |
36 | 카니발 주행거리 | 아빠 | 2020.07.06 | 1329 |
35 | 더뉴카니발 YP2020 트위터 케이블 [1] | 아빠 | 2020.07.06 | 1449 |
» | 라즈베리 파이를 이용한 경고등 켜지게 하는 프로그램 [3] | 아빠 | 2020.06.15 | 1430 |
33 | 전화(노트8) 통화 먹통 | 아빠 | 2020.05.08 | 1327 |
32 | 카봇퍼즐 | 아빠 | 2019.12.15 | 1464 |
31 | 서버 하드가 망가졌어요 | 아빠 | 2019.12.15 | 1436 |
30 | 세탁기 소스 | 아빠 | 2019.11.27 | 16806 |
29 | Adios! Amigo! Bonjour enchate! [1] | 아빠 | 2019.09.20 | 25179 |
28 | 싱크대 조명 | 아빠 | 2019.08.28 | 1636 |
27 | 약 3일동안의 미세먼지 | 아빠 | 2019.07.15 | 1628 |
--------------------------------------- 서버 프로그램 -------------------------------------
#-*-coding:utf-8-*-
#!/usr/bin/python
#모듈 선언
import socket, MySQLdb, time
#함수 선언
#로그인 함수
def login(sockfd):
sockfd.send("READY.")
data = sockfd.recv(512)
if data[0:3] == "ID:":
i_id = data[3:]
data = sockfd.recv(512)
if data[0:3] == "PW:":
i_pw = data[3:]
result, lid = log_query(i_id, i_pw)
if result == "OK":
#전역 변수 선언
global con_max
global con_ea
global con_id
global con_sockfd
if con_ea <= con_max-1:
for j in range(5):
if con_id[j] == "":
con_id[j] = lid
con_sockfd[j] = sockfd
con_addr[j] = addr
con_sockfd[j].send("AT:" + str(art_num)+".")
con_sockfd[j].setblocking(0)
con_ea += 1
break
else:
sockfd.send("FALSE.")
sockfd.close()
else:
sockfd.send("FALSE.")
sockfd.close()
#로그인 쿼리 함수
def log_query(i_id, i_pw):
cs.execute("SELECT * from `account` WHERE id = '" + i_id + "' AND password=PASSWORD('" + i_pw + "')")
row = cs.fetchone()
if cs.rowcount == 1:
return "OK", row[0]
else:
return "FALSE", 0
#클라이언트에서 입력 무자 확인
def read_cli(sockfd, i):
try:
data = sockfd.recv(512)
except:
data = ""
next
if data == "quit":
global con_ea
global con_sockfd
global con_addr
global con_id
con_sockfd[i].close
con_addr[i] = ""
con_id[i] = ""
con_ea -= 1
if data == "QUIT":
con_sockfd[i].send("END.")
return 10
#변수 선언(전역변수)
con_ea = 0
con_max = 5
con_addr = [""] * 5
con_sockfd = [""] * 5
con_id = [""] * 5
art_num = 0
bf_art_num = 0
# Mysql 연결
db = MySQLdb.connect("localhost","ID","PASSWORDs","DB" )
cs = db.cursor()
#Python Mysql 한글정의
db.query("set character_set_connection=utf8;")
db.query("set character_set_server=utf8;")
db.query("set character_set_client=utf8;")
db.query("set character_set_results=utf8;")
db.query("set character_set_database=utf8;")
#소켓 설정
try:
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.setblocking(0)
sk.bind(("0.0.0.0", 포트번호))
sk.listen(5)
except:
print("포트 점유중\n잠시후 다시 하세요")
quit()
#루프 시작
iend = 0
while iend <= 0:
#로그인 함수 호출
time.sleep(0.5)
iend = 0
try:
sockfd, addr = sk.accept()
login(sockfd)
except:
next
if con_ea > 0:
cs.execute("SELECT * FROM `dev_state` WHERE (`state` LIKE '%걸림%' OR `state` LIKE '%토너%' OR `state` LIKE '%오류%' OR `state` LIKE '%감지%' OR `state` LIKE '%덮개%' OR `state` LIKE '%서비스%' OR `state` LIKE '%잉크%') AND `check_msg` = 0 ORDER BY `no` ASC ")
row = cs.fetchall()
art_num = cs.rowcount
if bf_art_num != art_num:
for i in range(con_max-1):
if con_id[i] != "":
msg = "AT:" + str(art_num) + "."
try:
con_sockfd[i].send(msg)
except socket.error, e:
pass
iend = read_cli(con_sockfd[i], i)
time.sleep(0.5)
bf_art_num = art_num
for i in range(con_max-1):
iend = read_cli(con_sockfd[i], i)
#프로그램 종료시 db와 socket 닫음.
sk.close()
db.close()