'Study'에 해당되는 글 6건

Study

Container / IoT Edge

기본적으로 Azure IoT Edge를 구동하기 위해서는 Docker나 moby 등 컨테이너 엔진이 필요하다.
만약 Azure IoT Edge로 MS의 Certification 을 받고 싶다면 moby 컨테이너를 사용해야 한다.

라즈베리파이를 기준으로, moby-engine 과 iot-edge를 단순 설치하기 위해서는 최소한 250MB의 저장공간이 필요하다.


기본 모듈

Azure IoT Edge에서 기본 예제로 제공하는 SimulatedTemperatureSensor를 IoT Edge에서 동작해본다.

https://azuremarketplace.microsoft.com/en-us/marketplace/apps/azure-iot.simulated-temperature-sensor

Overview에는 SimulatedTemperatureSensor 의 minumum hardware requirements에 대해 적혀 있다.

  • Linux or Windows Container
  • x64 or arm32
  • 150Mb disk space
  • 50Mb RAM


기본모듈이 사용하는 메모리

moby-engine과 iot-edge를 설치하고 Azure IoT Edge runtime이 실행할때의 메모리 사용량은 215MB 정도이다.



SimulatedTemperatureSensor를 1개 동작시킬 경우 260MB 정도로 늘어난 것을 확인할 수 있다.


SimulatedTemperatureSensor를 하나 더 추가하니 386MB로 100MB 이상이 추가로 사용되고 있었다.



총 3개의 SimulatedTemperatureSensor를 구동시키니 432MB 메모리를 사용한다.




Azure IoT Edge 최소 시스템 요구사항

Azure IoT Edge의 최소 요구사항을 살펴보면, 라즈베리파이3 정도의 디바이스에서 서버등급의 장비에서 동작하는 목표로 하는 솔루션이다.
그리고 최소 시스템 요구사항에 대해 모호한 표현으로 적혀있다.
직접 라즈베리파이에 Azure IoT Edge를 설치해보고 모듈을 올려보니 최소 요구사항이 애매한 이유를 알 수 있었다.

테스트에서는 기본 모듈인 SimulatedTemperatureSensor를 사용했지만, 실제 응용에서는 다양한 동작과 데이터 처리를 해야할 것이다.

단순 설치와 동작에는 기존의 OS와 250MB 정도의 설치 공간, 그리고 300MB 정도의 RAM이 사용되었다.

여기에 Azure에서는 Azure Function, Azure Stream Analytics, Azure SQL DB 등 서비스도 Edge runtime에서 구동할 수 있도록 지원하고 있는데, 이런 처리들을 하는데 더 많은 리소스를 사용하게 될 것이다.

'Study' 카테고리의 다른 글

라즈베리파이에 Azure IoT Edge 설치하기  (0) 2020.11.10
Study

구성

기본적으로 Azure IoT Edge는 Windows/Linux 운영체제에서 moby 컨테이너를 사용하여 동작하도록 배포하고 있다.

Windows OS에서 Linux 컨테이너를 사용하거나, Linux OS에서 Windows 컨테이너를 사용하는 것은 가능하지만, 실제 제품화를 위해서는 Windows OS + Windows 컨테이너나, Linux OS + Linux 컨테이너만을 지원하는 것 같다.

Container overview

OS

2020년 9월까지만 하더라도 Azure Certified Device certification에서 계층 1 OS만을 지원했던 것으로 보인다.

최근에(2020년 10월 22일) 업데이트 된 문서를 보면 계층 2 OS도 인증을 받을 수 있도록 추가된 것 같다.
https://github.com/Azure/azure-iot-device-ecosystem/blob/master/Azure_Certified_Device/Edge_Managed/docs/Azure_Certified_Device-Edge-Managed_Requirements-v1.0.md

계층 1 OS에는 Raspbian Stretch가 포함되어 있고, Raspbian Buster 는 계층 2 OS에 포함되어 있다.

https://en.wikipedia.org/wiki/Raspberry_Pi_OS

Raspbian Strech는 Debian 버전 9에 해당하며 라즈베리파이 3+ 까지 지원하는 OS이다.
Raspbian Buster는 Debian 버전 10에 해당하고 라즈베리파이 4까지 지원한다. Buster 버전은 2019년 6월부터 Release 되었다.

이번 설치에서는 Raspbian Buster 버전으로 진행했다. MS의 가이드 상에는 Buster로 진행할 경우 OpenSSL 버전을 추가로 설치하라고 되어있는데, 진행해보니 설치하지 않아도 동작은 하는 것 같다.

OpenSSL 패키지 추가 설치

sudo apt-get install libssl1.0.2

IoT Edge runtime 설치

  1. IoT Edge 패키지 리스트 설치
curl https://packages.microsoft.com/config/debian/stretch/multiarch/prod.list > ./microsoft-prod.list
sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
  • OS 종류에 따라 curl로 다운로드하는 리스트가 다름
  1. moby 컨테이너 설치

    sudo apt-get update
    sudo apt-get install moby-engine
    sudo apt-get install moby-cli
  2. IoT Edge runtime 설치

    sudo apt-get update
    sudo apt-get install iotedge

IoT Hub와 연결하기

  1. device_connection_string 입력하기
    IoT Hub에 IoT Edge Device를 생성한 후 Device의 Connection String을 라즈베리파이의 IoT Edge runtime의 configuration file에 입력한다.
    sudo nano /etc/iotedge/config.yaml
# Manual provisioning configuration provisioning:
    source: "manual"
    device_connection_string: "HostName=EdgeTestHub.azure-devices.net;DeviceId=rpi-edge;SharedAccessKey=123412341234"
# DPS TPM provisioning configuration
  1. IoT Edge runtime 실행하기
    sudo systemctl start iotedge

'Study' 카테고리의 다른 글

Azure IoT Edge에서 사용하는 리소스  (0) 2020.11.10
Study/Python

펌웨어 바이너리 파일 등 hexadecimal 값을 가독성이 좋은 형태로 변환해야 하는 경우가 있다.

 

예를들면

0x00 0x11 0x22 ...  => 001122 의 형태로

 

간단하게

import binascii

binascii.hexlify(), binascii.unhexlify()를 활용하면 된다.

 

 

의 결과 값은 아래와 같다.

 

 

character '1'의 hex 값은 0x31이다.

http://www.asciitable.com/

 

Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion

ASCII Table and Description ASCII stands for American Standard Code for Information Interchange. Computers can only understand numbers, so an ASCII code is the numerical representation of a character such as 'a' or '@' or an action of some sort. ASCII was

www.asciitable.com

 

 

만약 특정 바이너리 파일을 모두 컨버팅 하기 위해서는 아래와 같이 하면 된다.

결과.

 

'Study > Python' 카테고리의 다른 글

python 함수 주기적으로 실행하기  (0) 2017.01.25
python Queue 사용방법  (0) 2017.01.25
Study/etc

OpenSSL에 대한 설명


https://ko.wikipedia.org/wiki/OpenSSL


OpenSSL은 SSL/TLS를 오픈소스로 구현한 것이다.



<SSL/TLS, HTTPS에 대한 설명 영상>



OpenSSL 사용하기


구글에서 검색해보면 OpenSSL 라이브러리로 공개하는 것과, 실제로 OpenSSL을 사용할 수 있는 컴파일 된 파일로 된 것들이 있다.


소스코드 레벨로 공개된 것들은

https://www.openssl.org/source/


컴파일 방법은 아래 Youtube를 따라하면 될 것이다.

<How to Compile OpenSSL on Windows10 x64 for Static Library>

위 방법으로 컴파일 시 필요 툴

- Perl 

- VC++




컴파일 된 파일로 SSL 사용하기

OpenSSL을 이용해 SSL/TLS를 사용하기 위해서는 이미 컴파일 된 파일로 다운로드 받는게 더 편하다.

https://indy.fulgan.com/SSL/



위 사이트에서 openssl-x.x.x-XXXXX-winxx.zip 형태의 파일을 다운 받는다. OpenSSL의 버전과 사용 PC의 환경(ex, windows 32bit, 64bit)로 파일을 선택한다.




본 예제에서는 openssl-1.0.2k-x64_86-win64.zip으로 진행했다.




다운로드 받은 파일을 적당한 이름으로 원하는 곳에 압축을 해제한다.(openssl-1.0.2k-x64_86-win64 -> OpenSSL)



환경 변수에 추가하기

압축을 해제한 후에는 해당 폴더를 '시스템 환경 변수'에 추가해야 한다.

'시스템 환경 변수'는 윈도우 어디에서든지 '시스템 환경 변수'에 있는 파일을 실행시킬 수 있도록 해주는 역할을 한다.

본 예제에서는 폴더 안에 'openssl.exe' 파일을 시스템 어디에서든지 사용할 수 있도록 하기 위해서 '시스템 환경 변수'에 추가해준다.



'시작'을 눌러 '환경' 이라고 검색하면 '시스템 환경 변수 편집'이 나온다. 여기서 '환경 변수(N)' 을 누르면 아래와 같은 화면이 나온다






'시스템 변수(S)'에서 'Path'를 편집하게 되면 오른쪽 화면이 나오게 되고, '새로 만들기(N)'으로 환경 변수를 추가할 수 있다.

이때 경로는 OpenSSL을 압축 해제한 경로를 설정한다.





실행해보기

실행되면 아래와 같이 프롬프트가 바뀐다.환경 변수가 추가 되었으면 명령 프롬프트에서 'openssl'을 실행시킬 수 있다.


OpenSSL>




OpenSSL 테스트

이제 OpenSSL을 사용해서 SSL/TLS를 쓸 수 있다.

한가지 예제로 www.google.com 에 접속하는 HTTPS Client 예제는 아래와 같다.


OpenSSL> s_client -connect www.google.com:443





Study/Python

python에서 특정 함수를 일정 주기마다 실행하고 싶으면? threading.Timer를 사용해보자


기본 사용방법은 아래와 같다.


import threading

class AsyncTask:
def __init__(self):
pass

def TaskA(self):
print 'Process A'
threading.Timer(1,self.TaskA).start()

def TaskB(self):
print 'Process B'
threading.Timer(3, self.TaskB).start()

def main():
print 'Async Function'
at = AsyncTask()
at.TaskA()
at.TaskB()

if __name__ == '__main__':
main()

수행 결과, TaskA는 1초마다, TaskB는 3초마다 수행되고 있다.


Async Function

Process A

Process B

Process A

Process A

Process B

Process A

Process A

Process A

Process B


핵심은 아래 함수이다.

threading.Timer(1,self.TaskA).start()

함수의 의미는 1초 후에 TaskA를 start하라는 의미이다.

TaskA 함수안에서 threading.Timer를 사용한다면 TaskA는 정해진 시간마다 주기적으로 수행되는 함수가 될 것이다.



가장 중요한 점은, TaskA를 최초의 한번은 수행햐주어야 한다는 점이다.

def main():
print 'Async Function'
at = AsyncTask()
at.TaskA()
at.TaskB()




'Study > Python' 카테고리의 다른 글

python hex값을 hex string으로 변환하기, hexlify(), unhexlify()  (0) 2019.05.07
python Queue 사용방법  (0) 2017.01.25
Study/Python

Python에서 Queue의 기본적인 사용법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put(i)

while q.qsize():
print q.get()

print 'end queue'


put() 함수를 사용해서 q(queue)에  item1~item5 까지 put을 수행한다. get() 함수를 사용해서 q를 비운다.

위 코드를 수행하면 아래와 같은 결과가 나온다


item1

item2

item3

item4

item5

end queue


위 동작은 item1~item5 까지를 한번에 모두 Queue에 넣고 한꺼번에 get을 수행하기 때문에 전혀 문제가 없다.


그런데 여러 Thread 상에서 비동기적으로 Queue에 put과 get을 수행해야하는 상황이라면 문제가 생긴다.


put()과 get() 함수가 기본적으로 blocking 함수이기 때문이다.


흔히 발생할 수 있는 상황은, Queue에 데이터가 없는 상황에서 get() 함수를 수행한다면 데이터가 put() 될때까지 blocking 되기 때문에 해당 Thread에서 다른 동작을 수행할 수가 없다.


해결 방법은 get()과 put()을 non-blocking 함수로 바꿔야 하는데, 방법은 아래와 같다.


import Queue

q = Queue.Queue()

items=list()

items.append('item1')
items.append('item2')
items.append('item3')
items.append('item4')
items.append('item5')

print 'start queue'

for i in items:
q.put_nowait(i)

while q.qsize():
print q.get_nowait()

print 'end queue'



1
블로그 이미지

IoT 개발자 블로그이고 싶다.

1byte