Category: Python

  • bytes 결과를 좀 편하게 보자

    시리얼 통신으로 자료를 주고 받는 것은 bytes를 보통 이용한다. 주피터랩의 문제인지 이 결과가 바뀌다 만 16진법으로 표현되는데 이러면 도대체 이게 무슨 결과인지 확인하는 것이 어렵다. 그래서 찾아보았다.

    우선 \x10 과 같은 형식으로 자료가 오는 것을 int 값으로 변환시킨다. 이 장비는 다행스럽게도 빅 엔디안 형식을 취하고 있다.

    int.from_bytes(i, byteorder="big")

    이렇게 하면 이제 그나마 직관적인 정수 형태로 결과를 볼 수 있다. 이제 이 것을 0x10의 형태로 바꾸어 본다. ‘#04x’ 에 어떤 것을 입력하느냐에 따라 형식이 바뀐다고 한다. 내가 필요한 형식에 맞추어서 설정해 두었다.

    format(value, '#04x')

    통상적으로 한 줄에 16개의 자료를 출력한다. 대세의 흐름에 맞추어 나도 그렇게 해본다. 이 통신에서 EOF 문자는 0xc1 이기 때문에. 중간에 EOF가 나타나면 줄 바꿈을 넣는다. 함수로 다음과 같이 설정해 보았다.

    def msg_print(line):
        i = 0
        for value in line:
            print(format(value, '#04x'), end=' ')
            if i % 16 == 15: 
                print()
            i += 1
            if value == 0xc1: 
                print()
                i = 0
  • 파이썬 시리얼 통신

    사람마다 시리얼 통신을 하는 이유는 다를테니 문제 해결 방법도 다를 것이다. 일단 내가 연결하고자 하는 장비는 가끔씩 결과를 수신 받을 수 있다. 그래서 이게 동작을 하는 중인지 문제가 있는 건지 알 수가 없었다.

    timeout = 1 옵션을 주니까 몇 분 후에 결과가 나오기 시작했다. 그래서 timeout=0 을 해봤는데, CPU 점유율이 매우 높아지기 시작했다. 이러면 장비가 버티지 못할테니 다시 timeout=1로 바꾸어 보았다. timeout 설정을 검색을 통해서 좀 살펴 보았는데, 와닿지가 않는다. 책을 좀 살펴봐야 하나 싶다.

    왠지 모르지만 프로그램 실행 이후 첫 번째 결과가 제대로 읽어지지 않는다. 이것은 해결해야 할 문제이다. 제대로 동작하기 시작하면 끄지 않을 장비이기 때문에 상관은 없을 것이다. 하지만, 이런 문제가 쌓이고 쌓이면 잘못된 결과를 유발할 수도 있을 것 같다.

  • HTTPS로 전송하기

    postgREST가 HTTPS를 지원하지 않고, 리버스 프록시를 이용하라고 하고 있으므로, 그대로 따라해 보았다.

    NGINX를 설치하는 과정에서 생성되는 /etc/nginx/nginx.conf 파일을 보면 다음과 같은 내용이 있다. 즉, conf.d 폴더 내부의 설정 파일을 반영한다는 것이다.

    {... 
       include /etc/nginx/conf.d/*.conf;
    }

    HTTPS를 이용하려면 인증서, 인증키가 필요하다. 테스트 목적이기 때문에 openssl 명령어를 이용해서 만들어 주었다. 나중에 클라이언트에서 접속하기 위해서 공개키를 만들어야 한다. 인터넷에 있는 수 많은 방법 중에서 다음의 방법이 가장 쉬웠다.

    $ openssl req -new -newkey rsa:2048 -nodes -keyout test.key -out test.csr
    $ openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
    $ openssl rsa -in test.key -out public.key -pubout

    초보자라서 conf.d 폴더에 있는 default.conf 파일을 수정하는 방법을 이용하였다. 다음과 관련된 내용을 추가해 준다.

    • HTTP로 접속되면 HTTPS로 변환하도록 하는 부분
    • HTTPS 설정과 관련된 부분
    • postgREST 포트인 3000으로 연결해 주는 부분
    
    server {
            listen 443;
            server_name SERVERNAME;
            ssl on;
            ssl_certificate test.crt;
            ssl_certificate_key test.key;
    
            location / {
                    proxy_pass http://127.0.0.1:3000;
            }
    }
    server {
            listen       80;
            server_name  SERVERNAME;
            return 301 https://SERVERNAME;
    }

    이렇게 하면 requests.post에서 https로 자료를 전송할 수 있다. 원래는 생성된 공개키로 문제없이 되어야 하는데, 뭐가 문제인지 connection과 관련된 오류 메세지가 발생한다. 일다 verifty=False로 해당 부분은 넘어가는 걸로 해결하고 있다.

  • MAC ADDRESS 알아내기

    장비마다 가지는 고유한 속성값은 여러개가 있을 수 있다. 이 중에서 손쉽게 구할 수 있고, 비교적 고유한 것으로 추정해도 큰 문제가 없는 것으로 이더넷의 MAC ADDRESS가 있다. 파이썬에서 이 값을 얻는 방법 중 UUID 모듈의 getnode를 이용하는 것이 가장 손쉽다. 16진법으로 변경한 다음 3번째 글자부터 이용하면 된다.

    ### import uuid
    ### hex(uuid.getnode())
    '0x180373e258a0'