python 소켓통신

1. socket-server.py

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

import socket

# 통신 정보 설정
IP = ''
PORT = 5050
SIZE = 1024
ADDR = (IP, PORT)

# 서버 소켓 설정
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
    server_socket.bind(ADDR)  # 주소 바인딩
    server_socket.listen()  # 클라이언트의 요청을 받을 준비

    # 무한루프 진입
    while True:
        client_socket, client_addr = server_socket.accept()  # 수신대기, 접속한 클라이언트 정보 (소켓, 주소) 반환
        msg = client_socket.recv(SIZE)  # 클라이언트가 보낸 메시지 반환
        print("[{}] message : {}".format(client_addr,msg))  # 클라이언트가 보낸 메시지 출력

        client_socket.sendall("welcome!".encode())  # 클라이언트에게 응답

        client_socket.close()  # 클라이언트 소켓 종료

 

2. socket-client.py

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

import socket

# 접속 정보 설정
SERVER_IP = '127.0.0.1'
SERVER_PORT = 5050
SIZE = 1024
SERVER_ADDR = (SERVER_IP, SERVER_PORT)

# 클라이언트 소켓 설정
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
    client_socket.connect(SERVER_ADDR)  # 서버에 접속
    client_socket.send('hi'.encode())  # 서버에 메시지 전송
    msg = client_socket.recv(SIZE)  # 서버로부터 응답받은 메시지 반환
    print("resp from server : {}".format(msg))  # 서버로부터 응답받은 메시지 출력

 

3. 결과 

- server (무한루프로 대기)

- client

'개발일지 > Python' 카테고리의 다른 글

[Python] 문자열에서 특정 문자 찾기  (0) 2020.08.04
python 버전 upgrade  (0) 2020.05.27
[Python] 리스트 초기화  (0) 2020.05.25
[Python] 파이썬 백그라운드 실행  (0) 2020.04.29
[Python] MQTT 사용  (0) 2020.04.07

다중 select box 사용 주소 검색

1. html

<select name="sido1" id="sido1"></select>
<select name="gugun1" id="gugun1"></select>

2. js

$('document').ready(function() {
 var area0 = ["시/도 선택","서울특별시","인천광역시","대전광역시","광주광역시","대구광역시","울산광역시","부산광역시","경기도","강원도","충청북도","충청남도","전라북도","전라남도","경상북도","경상남도","제주도"];
  var area1 = ["강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"];
   var area2 = ["계양구","남구","남동구","동구","부평구","서구","연수구","중구","강화군","옹진군"];
   var area3 = ["대덕구","동구","서구","유성구","중구"];
   var area4 = ["광산구","남구","동구",     "북구","서구"];
   var area5 = ["남구","달서구","동구","북구","서구","수성구","중구","달성군"];
   var area6 = ["남구","동구","북구","중구","울주군"];
   var area7 = ["강서구","금정구","남구","동구","동래구","부산진구","북구","사상구","사하구","서구","수영구","연제구","영도구","중구","해운대구","기장군"];
   var area8 = ["고양시","과천시","광명시","광주시","구리시","군포시","김포시","남양주시","동두천시","부천시","성남시","수원시","시흥시","안산시","안성시","안양시","양주시","오산시","용인시","의왕시","의정부시","이천시","파주시","평택시","포천시","하남시","화성시","가평군","양평군","여주군","연천군"];
   var area9 = ["강릉시","동해시","삼척시","속초시","원주시","춘천시","태백시","고성군","양구군","양양군","영월군","인제군","정선군","철원군","평창군","홍천군","화천군","횡성군"];
   var area10 = ["제천시","청주시","충주시","괴산군","단양군","보은군","영동군","옥천군","음성군","증평군","진천군","청원군"];
   var area11 = ["계룡시","공주시","논산시","보령시","서산시","아산시","천안시","금산군","당진군","부여군","서천군","연기군","예산군","청양군","태안군","홍성군"];
   var area12 = ["군산시","김제시","남원시","익산시","전주시","정읍시","고창군","무주군","부안군","순창군","완주군","임실군","장수군","진안군"];
   var area13 = ["광양시","나주시","목포시","순천시","여수시","강진군","고흥군","곡성군","구례군","담양군","무안군","보성군","신안군","영광군","영암군","완도군","장성군","장흥군","진도군","함평군","해남군","화순군"];
   var area14 = ["경산시","경주시","구미시","김천시","문경시","상주시","안동시","영주시","영천시","포항시","고령군","군위군","봉화군","성주군","영덕군","영양군","예천군","울릉군","울진군","의성군","청도군","청송군","칠곡군"];
   var area15 = ["거제시","김해시","마산시","밀양시","사천시","양산시","진주시","진해시","창원시","통영시","거창군","고성군","남해군","산청군","의령군","창녕군","하동군","함안군","함양군","합천군"];
   var area16 = ["서귀포시","제주시","남제주군","북제주군"];

 

 // 시/도 선택 박스 초기화

 $("select[name^=sido]").each(function() {
  $selsido = $(this);
  $.each(eval(area0), function() {
   $selsido.append("<option value='"+this+"'>"+this+"</option>");
  });
  $selsido.next().append("<option value=''>구/군 선택</option>");
 });

 

 // 시/도 선택시 구/군 설정

 $("select[name^=sido]").change(function() {
  var area = "area"+$("option",$(this)).index($("option:selected",$(this))); // 선택지역의 구군 Array
  var $gugun = $(this).next(); // 선택영역 군구 객체
  $("option",$gugun).remove(); // 구군 초기화

  if(area == "area0")
   $gugun.append("<option value=''>구/군 선택</option>");
  else {
   $.each(eval(area), function() {
    $gugun.append("<option value='"+this+"'>"+this+"</option>");
   });
  }
 });


});

3. 결과

 

(출처 : https://codepen.io/eond/pen/oMBRpG)

 

 

버튼 클릭 시 tab 추가

1. html

<div class="container">
    <div class="row">
        <div class="col-md-12">
            <p>
                <button id="btn-add-tab" type="button" class="btn btn-primary pull-right">Add Tab</button>
            </p>
            <!-- Nav tabs -->
            <ul id="tab-list" class="nav nav-tabs" role="tablist">
                <li class="active"><a href="#tab1" role="tab" data-toggle="tab"><span>Tab 1 </span><span class="glyphicon glyphicon-pencil text-muted edit"></span></a></li>
            </ul>

            <!-- Tab panes -->
            <div id="tab-content" class="tab-content">
                <div class="tab-pane fade in active" id="tab1">Tab 1 content</div>
            </div>
        </div>
    </div>
</div>

  • ul : tab list
  • li : tab list 각 요소
  • tab-content : tab의 내용

2. js

var button='<button class="close" type="button" title="Remove this page">×</button>';
var tabID = 1;
function resetTab(){
	var tabs=$("#tab-list li:not(:first)");
	var len=1
	$(tabs).each(function(k,v){
		len++;
		$(this).find('a').html('Tab ' + len + button);
	})
	tabID--;
}

$(document).ready(function() {
    $('#btn-add-tab').click(function() {
        tabID++;
        $('#tab-list').append($('<li><a href="#tab' + tabID + '" role="tab" data-toggle="tab"><span>Tab ' + tabID + '</span> <span class="glyphicon glyphicon-pencil text-muted edit"></span> <button class="close" type="button" title="Remove this page">×</button></a></li>'));
        $('#tab-content').append($('<div class="tab-pane fade" id="tab' + tabID + '">Tab ' + tabID + ' content</div>'));
        $(".edit").click(editHandler);
    });
    
    $('#tab-list').on('click', '.close', function() {
        var tabID = $(this).parents('a').attr('href');
        $(this).parents('li').remove();
        $(tabID).remove();

        //display first tab
        var tabFirst = $('#tab-list a:first');
        resetTab();
        tabFirst.tab('show');
    });

    var list = document.getElementById("tab-list");
});

var editHandler = function() {
  var t = $(this);
  t.css("visibility", "hidden");
  $(this).prev().attr("contenteditable", "true").focusout(function() {
    $(this).removeAttr("contenteditable").off("focusout");
    t.css("visibility", "visible");
  });
};

$(".edit").click(editHandler);
  • tab ID : 고유 id 값 부여
  • resetTab() : tab 삭제시 tab ID 값이 1씩 줄어듬
  • btn-add-tab click : 추가 버튼 클릭시 tab 생성 (tab 이름, edit 버튼, close 버튼)

 

(출처 : https://www.codeply.com/go/4yGNCaA8Xs/bootstrap-tabs-add-edit-remove)

 

  • 날짜칼럼을 기준으로 최신값만 조회 (마지막 날짜 데이터들을 가져오는 쿼리)

select
	*
from(
	select
		*
	from concent_data
	where (con_id, date) in (
		select con_id, max(date) as date
		from concent_data group by con_id
	)
	order by date desc
) t
group by t.con_id

 

먼저 뽑아낼 테이블을 max함수를 통해 마지막 날짜 조회 후 group by를 하고 해당하는 데이터를 조건문에 처리(where 조건문 in절부분)하여 최신 데이터 순으로 order by를 통해 다시 한번 정렬을 한다.

사실 여기까지만 처리해도 정상적으로 볼 수 있지만, 중복된 시:분:초로 들어온 경우 마지막 한개의 데이터가 보장이 되질 않아 마지막에 group by를 한번 더 처리하였다.

(출처 : https://myhappyman.tistory.com/76)

'개발일지 > MySQL' 카테고리의 다른 글

[MySQL] 이전 시간 데이터 조회  (0) 2020.03.27

python 백그라운드 실행

$ nohup python test.py &

  • 기본 출력은 실행파일과 같은 위치에 nohup.out 이라는 파일에 저장

$ nohup python test.py > print.log &

  • 출력 파일 변경은 일반적인 redirect 옵션을 사용
  • 출력 파일 내용이 실시간으로 생기지 않고 어느정도 내용이 쌓이면 저장

$ nohup python -u test.py > print.log &

  • -u 옵션 사용해서 바로 확인이 가능

$ nohup python test.py 1>/dev/null 2>&1  &

  • 로그 안남기기

'개발일지 > Python' 카테고리의 다른 글

[Python] 문자열에서 특정 문자 찾기  (0) 2020.08.04
python 버전 upgrade  (0) 2020.05.27
[Python] 리스트 초기화  (0) 2020.05.25
[Python] 소켓통신 (server, client)  (0) 2020.05.22
[Python] MQTT 사용  (0) 2020.04.07

 

1. mqtt 설치

pip install paho-mqtt

2. python (subscribe.py)

import paho.mqtt.client as mqtt

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.username_pw_set("user", "1234") # broker에 password가 설정되어 있다면 추가 없으면 생략
    client.subscribe("#") # Topic

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    msg.payload = msg.payload.decode("utf-8")
    print("topic: "+msg.topic+" value: "+msg.payload)



client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("localhost") # broker IP

client.loop_forever() #무한루프

 

 

'개발일지 > Python' 카테고리의 다른 글

[Python] 문자열에서 특정 문자 찾기  (0) 2020.08.04
python 버전 upgrade  (0) 2020.05.27
[Python] 리스트 초기화  (0) 2020.05.25
[Python] 소켓통신 (server, client)  (0) 2020.05.22
[Python] 파이썬 백그라운드 실행  (0) 2020.04.29

Javascript MQTT 웹소켓 통신

- 자바스크립트를 이용하여 MQTT 통신

1. js 다운로드 : 

 

mqttws31-min.js
0.03MB
mqttws31.js
0.08MB

 

2. javascript

- 예제 함수 

  • stratConnect() : 랜덤으로 client ID를 생성하여 MQTT Broker에 연결
  • onConnect() : 연결성공 후 topic 설정하여 subscribe 준비
  • onConnectionLost(responseObject) : 연결이 끊길경우 error message 출력
  • onMessageArrived(message) : subscribe message 출력
  • publish(element) : publish message 전송 / element는 HTML 버튼 선택자 (버튼 클릭시 ON/OFF 메시지 전송)
  • startDisconnect() : 연결 종료
// Called after form input is processed
function startConnect() {
    // random client ID 생성
    clientID = "clientID-" + parseInt(Math.random() * 100);

    // broker IP , broker websocket port
    host = "브로커아이피";
    port = "브로커웹소켓포트";

    console.log("Connecting to: "+host+"  on port: "+port+" / clinet value: "+clientID);

    // connection
    client = new Paho.MQTT.Client(host, Number(port), clientID);

    // callback
    client.onConnectionLost = onConnectionLost;

    // Connect the client, if successful, call onConnect function
    client.connect({ 
        onSuccess: onConnect
    });
}

function onConnect() {
    
    topic = "#"; //MQTT 토픽명 (#은 모든 토픽 허용)

    // Print output
    console.log("Subscriving to: "+topic);

    // Subscribe to the requested topic
    client.subscribe(topic);
    client.onMessageArrived = onMessageArrived;

}

// connection error
function onConnectionLost(responseObject) {
    document.getElementById("messages").innerHTML += '<span>ERROR: Connection lost</span><br/>';
    if (responseObject.errorCode !== 0) {
        document.getElementById("messages").innerHTML += '<span>ERROR: ' + + responseObject.errorMessage + '</span><br/>';
    }
}

// subsribe output
function onMessageArrived(message) {
    console.log("onMessageArrived: " + message.payloadString);
}

// send a message (publish)
function publish (element) {
	
	var topic = $(element).attr("id"); //버튼의 id를 topic으로 설정
	
	if(element.checked == true){
		var message = "ON";
	} else {
		var message = "OFF";
	}
	
    message = new Paho.MQTT.Message(message);
    message.destinationName = topic;
    message.qos = 2;

    client.send(message);
}


// disconnection
function startDisconnect() {
    client.disconnect();
    document.getElementById("messages").innerHTML += '<span>Disconnected</span><br/>';
}

 

 

 

MySQL 1분전, 하루전, 한시간전, 하루전, 한달전 데이터 조회 

 

// 1분전 데이터 조회
SELECT * FROM 테이블명 
where 시간칼럼명 >= DATE_ADD(NOW(), INTERVAL -1 MINUTE)

// 10분전 데이터 조회
SELECT * FROM 테이블명 
where 시간칼럼명 >= DATE_ADD(NOW(), INTERVAL -10 MINUTE);

// 한시간전 데이터 조회
SELECT * FROM 테이블명 
where 시간칼럼명 >= DATE_ADD(NOW(), INTERVAL -1 HOUR);

// 하루전 데이터 조회
SELECT * FROM 테이블명 
where 시간칼럼명 >= DATE_ADD(NOW(), INTERVAL -1 DAY);

// 한달전 데이터 조회
SELECT * FROM 테이블명 
where 시간칼럼명 >= DATE_ADD(NOW(), INTERVAL -1 MONTH);

- 시간 (-) 전 시간대

- 시간 (+) 이후 시간대

 

'개발일지 > MySQL' 카테고리의 다른 글

[MySQL] Group by한 데이터들의 최신값만 가져오기  (0) 2020.05.07

+ Recent posts