카카오톡과 LoRa 기술을 이용한 Pet Feeder

Posted by 카이젠8501 카이젠8501
2017.06.19 17:17 IT 개발/DIY 프로젝트

카카오톡과 LoRa 기술을 이용한 Pet Feeder

구현 아이디어 및 요약

최근 사물인터넷(Internet of Things, IoT)은 차세대 이동통신 서비스의 생태계 구축을 위해 가장 중요한 역할을 수행 할 것으로 예측되고 있으며, 사물인터넷을 위한 LPWAN(Low-Power Wide-Area Network)에 대한 관심이 증가하고 있다.
국내 통신사에서도 LPWAN 기술 및 IoT에 지속적으로 관심을 가지고 있으며, 국내 3사 통신사 중 SKT는 LoRa, LG와 KT는 NB-IoT를 주력 IoT 서비스로 내세우고 있다.

본 프로젝트에서는 SKT의 LoRa 서비스를 이용해 애완동물의 먹이를 원격에서 줄 수 있는 Pet Feeder를 구현 할 예정이며, Pet Feeder Service를 구성하는 컨트롤러 보드, LoRa 모니터링 서버, 스마트폰 구현 방법에 대해 설명한다.

프로젝트 목표

  • 카카오톡을 이용한 먹이 주기 명령 수행
  • 컨트롤러 보드에서 온/습도 정보를 측정해서 LoRa 모니터링 서버에서 모니터링 하기

프로젝트 구성도

프로젝트는 아래 그림과 같이 컨트롤러, SKT LoRa Network, LoRa 모니터링 서버, 카카오톡 서버로 구성된다.
컨트롤러에서 온/습도 데이터를 측정해서 LoRa로 데이터를 송신하면, SKT의 G/W(Gateway)와 N/W(Network)서버를 통해 ThingPlug에 데이터를 전달한다. ThingPlug는 전달 받은 데이터를 LoRa 모니터링 서버에게 다시 전달하고, LoRa 모니터링 서버는 수신한 데이터를 자신의 DB(Database)에 저장한다.

참고로, ThingPlug에 전달된 데이터는 ThingPlug에 DB에 임시적으로 저장되지만, 저장된 데이터는 2일 후에 삭제 된다. 때문에 본 프로젝트와 같이 사용자가 직접 구현한 서버에서 ThingPlug의 데이터를 가져 오는 작업을 해야 한다. ThingPlug에서 데이터를 가져오는 방법은 해당 링크를 참고 하기 바란다.http://docs.thingplug.apiary.io/#reference/data-management

추가로 카카오톡 서버에서는 발생하는 이벤트를 LoRa 모니터링 서버로 Redirection 해서, 사용자가 카카오톡을 이용하여 먹이 주기를 수행 할 수 있는 구조로 설계 하였다.

Contest1

컨트롤러

컨트롤러의 역할은 온/습도 정보를 측정하여 SKT LoRa Network로 전달하는 기능과 카카오톡으로 부터 먹이 주기 명령을 받으면 내부에 있는 스크류를 동작 시켜 애완동물의 먹이를 밖으로 배출한다.

컨트롤러의 구성요소는 아래와 같다.

  • T자형 PVC와 내부 스크류
  • Continuous Rotation Servo ( Parallax )
  • WizArduino Mega Wifi ( WIZnet )
  • LoRa Kit ( WIZnet )
  • LoRa 모듈 (TLT01CS1, 솔루엠)
  • 온습도 센서 ( DHT11 )

컨트롤러는 아래와 같은 단계로 제작 되었다.

  1. Thingiverse에서 해당 프로젝트에서 사용할 수 있는 3D 모델링 파일들을 검색하고, 이를 3D 프린터로 출력. (모델링 파일의 원본 주소: https://www.thingiverse.com/thing:34100 )
  2. 출력된 스크류와 서보 모터를 연결하고, 이를 50파이 짜리 T자형 PVC에 장착
  3. WizArduino MEGA WIFI와 Wiznet Lora Kit 연결 ( WizArduino와 LoRa Kit간에는 Software UART(RX:10,TX:11)를 사용 함 )
  4. WizArduino의 9번 핀을 이용하여 Servo Motor 제어

Contest4

본 프로젝트를 위해 SoluM 모듈을 Arduino 에서 사용 할 수 있도록 라이브러리 작업을 진행 하였으며, 해당 라이브러리는 아래 주소에서 다운 받을 수 있다.
https://github.com/kaizen8501/solum_lora_library

컨트롤러 역할을 하는 아두이노 보드의 코드는 아래와 같다.

#include "Arduino.h"
#include <SKT_LoRa.h>
#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial LoRaSerial(10, 11); // RX, TX
Servo servo;
int servoPin = 9;

void setup()
{
    servo.attach(servoPin);
    servo.write(90);

    Serial.begin(38400);
    LoRaSerial.begin(38400);
    LoRa.init(&LoRaSerial);
    LoRa.begin();
}

void loop()
{
    char str[100];
    if( LoRa.available() )
    {
        LoRa.read((uint8_t*)str,100);
        if( strcmp(str,"1000\r\n") == 0 )
        {
            Serial.println("Start Feed");
            servo.write(120);
            delay(5000);
            servo.write(90);
        }
    }
}

LoRa 모니터링 서버

로라 모니터링 서버는 Django 플랫폼을 이용하여 구현 하였으며, 컨트롤러와 같이 SKT LoRa Network에 연결되어 있는 디바이스들의 정보를 모니터링 하거나 제어 할 수 있는 기능을 가지고 있다. 또한 본 프로젝트를 위한 용도 이외에 SKT LoRa를 위한 범용 웹 서버로 사용 가능 하다.

Contest5

카카오톡 플러스 친구 설정 및 연동 방법

카카오톡 플러스 친구를 설정하기 위해서는 https://center-pf.kakao.com/에 접속하고 아래와 같은 절차를 수행 해야 한다.

새 플러스 친구 만들기 버튼 클릭 후 정보 기입

Contest6-0

Contest6-1

스마트 채팅 설정

아래 그림과 같이 스마트 채팅 탭을 클릭하고 API형에 대한 설정 버튼을 눌러 API에 대한 설정을 진행 한다.
자동응답형은 노출되는 버튼을 선택해서 제어 하는 방식으로 사용 할 수 있으며, 본 프로젝트는 대화형으로 제어 명령을 보내기 위해 API 형을 사용 하였다.

Contest6

API형 설정

API형 설정에서 가장 중요한 부분은 앱 URL 이다. 앱 URL에 기입 란에 LoRa 모니터링 서버의 URL 혹은 IP 주소를 입력하고 카카오톡을 위한 keyboard와 message가 구현되어 있는 URL 주소를 입력한다.
본 프로젝트는 아래와 같이 http://IP주소/thingplug/device/kakao 로 설정되어 있다.

urlpatterns = [
    url(r'^device/kakao/keyboard/', views.pet_feeder_kakao_keyboard),
    url(r'^device/kakao/message', views.pet_feeder_kakao_message),
    ]

Contest7

카카오톡 연동을 위한 설정이 정상적으로 완료 되었다면, API 테스트 버튼을 눌렀을 때 아래와 같이 keyboard OK 응답을 받아야 한다.

Contest8

카카오톡 연동을 위한 Python 코드는 아래와 같다.

def pet_feeder_kakao_keyboard(request):
    return JsonResponse({
            'type':'text',
            })


kakao_user = ''
kakao_device = ''

@csrf_exempt
def pet_feeder_kakao_message(request):
    global  kakao_user
    global  kakao_device

    json_str = ((request.body).decode('utf-8'))
    received_json_data = json.loads(json_str)
    command = received_json_data['content']

    user_obj = User.objects.all()
    user_info = ''

    if command.find('계정') != -1:
        for user in user_obj:
            user_info += '- ' + user.username + '\r\n'
        return JsonResponse({
            'message':{
                'text': '등록된 계정은 아래와 같습니다.\r\n' + user_info
            },
        })
    elif command.find('헬프') != -1 or command.find('help') != -1:
        return JsonResponse({
            'message': {
                'text': '명령어 리스트\r\n' +
                        '- 계정\r\n' +
                        '- 장치 리스트\r\n' +
                        '- 밥줘\r\n'
            },
        })
    elif command.find('재접속') != -1:
        pass

    elif command.find('장치리스트') != -1 or command.find('장치 리스트') != -1:
        command_list = command.split(' ')
        for command in command_list:
            for user in user_obj:
                if command.find(user.username) != -1:
                    kakao_user = user.username
                    #device_info = ''
                    device_list = []
                    tp_info_obj = ThingplugInfo.objects.get(user=user)
                    dev_obj = DeviceInfo.objects.filter(thingpluginfo=tp_info_obj)
                    for device in dev_obj:
                        #device_info += device.device_id + "\r\n"
                        device_list.append(device.device_id+' 장치 등록')

                    return JsonResponse({
                        'message':{
                            #'text': '등록된 장치는 아래와 같습니다.\r\n' + device_info
                            'text': '등록된 장치는 아래와 같습니다.'
                        },
                        'keyboard':{
                            'type': 'buttons',
                            'buttons':device_list
                        }
                    })
        return JsonResponse({
            'message':{
                'text': '계정 정보를 포함해서 질문 해 주세요.'
            }
        })

    elif command.find('장치 등록') != -1:
        try:
            user = User.objects.get(username=kakao_user)
        except User.DoesNotExist:
            return JsonResponse({
                'message': {
                    'text': '[장치 리스트]를 요청해 주세요.'
                }
            })
        try:
            tp_info_obj = ThingplugInfo.objects.get(user=user)
            dev_obj = DeviceInfo.objects.filter(thingpluginfo=tp_info_obj)
        except:
            return JsonResponse({
                'message': {
                    'text': 'ThingPlug 정보 확인 바람'
                }
            })

        command_list = command.split(' ')
        for command in command_list:
            for device in dev_obj:
                if command.find(device.device_id) != -1:
                    kakao_device = device.device_id
                    return JsonResponse({
                        'message': {
                            'text': kakao_device + ' 등록 완료'
                        }
                    })

        return JsonResponse({
            'message': {
                'text': '디바이스 정보가 없습니다.'
            }
        })

    elif command.find('밥') != -1:
        node_id = kakao_device
        mgmt_cmd = '1000'
        result, cmd_inst = g_thingplug.createMgmtInstance(node_id, "extDevMgmt", mgmt_cmd)
        time.sleep(3)
        result, exe_status, exe_result = g_thingplug.retrieveMgmtResult(node_id, "extDevMgmt", cmd_inst)
        if result == True:
            message = node_id + ' 동작 성공'
        else:
            message = node_id + ' 동작 실패'

        return JsonResponse({
            'message': {
                'text': message
            },
        })

    return JsonResponse({
        'message': {
            'text': '명령이 없습니다.'
        },
    })

카카오톡 데모

스마트폰에서 카카오톡 플러스 친구를 추가 하고, 아래 그림과 같이 명령을 수행하면 컨트롤러를 제어 할 수 있다.

Contest9

웹페이지 데모

LoRa 모니터링 서버에서는 웹 서버 기능도 지원하고 있으며, 아래와 같은 페이지를 이용하여 컨트롤러에게 제어를 내리거나 컨트롤러가 송신하는 데이터를 로그 및 차트 형태로 확인 할 수 있다.

Contest10

동작 데모


저작자 표시
신고
이 댓글을 비밀 댓글로

[PolarSSL+FreeRTOS]"bad message length" & "malloc failed" Error 해결 방법

Posted by 카이젠8501 카이젠8501
2016.12.01 12:57 IT 개발/기타

PolarSSL “bad message length” & “malloc failed” Error 해결 방법

Environment

  • SSL : PolarSSL-1.3.8
  • RTOS : FreeRTOS-8.1.2
  • Network Stack : Lwip-1.4.1
  • MCU : RealTek RTL8195a

문제

Wi-Fi 모듈에서 SKT ThingPlug에 SSL 연결을 위한 기능을 구현 하는 중, SSL 연결이 되지 않는 문제가 발생 하였다.

원인 분석

정확한 원인을 분석하기 위하여 Wi-Fi 모듈과 ThingPlug 간에 주고 받는 패킷을 캡쳐 하였다. 패킷 분석 결과, SSL 서버와 Hand Shake 과정이 정상적으로 완료 되지 않는 것을 확인 하였다.

20161201_103207

SKT ThingPlug Server와 정상적인 통신 패킷을 확인 해 보기 위해, PC에서 SSL 연결을 시도 해 보았다.
연결이 성공 하는 경우, 아래 그림과 같이 Client Hello -> Server Hello 이후 SSL 서버가 Certificate를 송신하는 과정을 볼 수 있다.

20161201_104837

Certificate 과정의 패킷을 보면, 4개의 인증서를 송신하는 것을 볼 수 있다. 인증서는 1개의 sktiot.com 인증서와 sktiot.com의 신뢰성을 보장해 주는 상위 기관 인증서 3개를 송신 한다.

20161201_110219

20161201_105209

위의 4개의 인증서를 수신하기 위해서는 5410bytes 이상의 메모리가 필요 할 것으로 보이며, 위에서 발생한 “bad message length” 에러도 Wi-Fi 모듈에서 SSL 인증서를 처리 하기 위한 메모리가 부족하거나 설정이 작은 값으로 되어 있는 것으로 판단 된다.

문제 해결

“bad message length” Error

Wi-Fi 모듈에서 에러를 출력하는 부분을 확인해 보면, 아래와 같이 수신된 ssl message length가 SSL_MAX_CONTENT_LEN 값 보다 크면 해당 에러를 출력하는 코드를 볼 수 있다. 현재 SSL_MAX_CONTENT_LEN 값이 4096으로 되어 있어서 그보다 더 큰 Contents를 수신하지 못 했던 것으로 판단 되며, 값을 6144( 6Kbytes )로 수정 하였다.

if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
{
    SSL_DEBUG_MSG( 1, ( "bad message length" ) );
    return( POLARSSL_ERR_SSL_INVALID_RECORD );
}

“malloc failed” Error

SSL_MAX_CONTENT_LEN 값을 수정 하고 테스트 해 보니, 이번에는 malloc failed 에러가 발생 하였다.

위는 Heap 메모리가 부족해서 출력된 에러로 판단 되며, FreeRTOSConfig.h의 configTOTAL_HEAP_SIZE의 값을 (70 1024) —> ( 80 1024 )로 수정 후 정상적으로 SKT ThingPlug에 SSL 연결이 되는 것을 확인 하였다.



저작자 표시
신고
이 댓글을 비밀 댓글로

Windows DHCP,Static IP 배치 파일 만드는 방법

Posted by 카이젠8501 카이젠8501
2016.11.24 14:07 IT 개발/개발환경

netsh를 이용한 다수의 IP를 한번에 세팅하기

netsh란 Windows 명령 프롬프트에서 실행가능한 명령어로, Network정보(IP,DNS등)를 수정및 확인가능한 명령어이다.

사용법은 아래와 같다.

C:\>netsh interface ip set address name="인터페이스이름" source= dhcp/static
사용법
[name=]<인터페이스이름>
[source=]dhcp
[source=] static addr="IP 주소" mask="서브넷 마스크" gateway="gateway 주소"/none gwmetric="정수"

DHCP 세팅을 위한 Batch 파일

netsh interface ip set address name="로컬 영역 연결" dhcp
netsh interface ip add dns name="로컬 영역 연결" dhcp
ipconfig
pause

Static IP 세팅을 위한 Batch 파일

netsh interface ip set address name="로컬 영역 연결" source=static addr=222.xxx.xxx.xxx mask=255.255.255.0 gateway=222.xxx.xxx.xxx 
netsh interface ip add address name="로컬 영역 연결" addr=192.168.77.202 mask=255.255.255.0 gateway=192.168.77.1 
netsh interface ip add address name="로컬 영역 연결" addr=192.168.88.202 mask=255.255.255.0 gateway=192.168.88.1 
netsh interface ip add address name="로컬 영역 연결" addr=192.168.0.202 mask=255.255.255.0 gateway=192.168.0.1 
netsh interface ip add address name="로컬 영역 연결" addr=192.168.1.202 mask=255.255.255.0 gateway=192.168.1.1 
netsh interface ip add dns name="로컬 영역 연결" 8.8.8.8
ipconfig
pause
저작자 표시
신고
이 댓글을 비밀 댓글로

ARM TechCon 2016 전시회 참관 후기

Posted by 카이젠8501 카이젠8501
2016.11.03 16:55 IT 개발/기타

ARM TechCon 2016 전시회 참관 후기

전시회장에는 크게 ARM 부스와 mbed 부스로 나누어져 있었고, 나머지 기업들의 부스는 작게 분포 되어 있었습니다. mbed 부스에는 WIZwiki-W7500ECO가 전시되어 있었습니다.
(가장 아랫줄 4번째에 위치해 있는 WIZwiki-W7500ECO 보드)

Techcon_01

전시회는 ARM과 협력하는 업체들로 구선되어 있었는데, 크게 SoC(Cadence, Synopsis 등), 소프트웨어 IDE(IAR 등), ARM 코어로 칩을 제작하는 회사(NXP, Renesas) 그리고 OS 및 클라우드(WIND River 등) 업체가 주를 이루었고 기타 대리점(Mouser)들이 있었습니다.

Multitech

우리가 중점적으로 주목한 곳은 mbed 부스였습니다. 먼저 커다란 화분 같이 생긴 부스가 눈에 띄었고 해당 부스로 발걸음을 옮겼습니다. 아래 그림에 있는 WaterBit이라는 이름의 제품은 Multitech라는 업체에서 mbed 플랫폼을 사용하여 만든 Prototype 제품이었습니다. 본 제품은 스마트 화분이고 Multitech에서 만든 게이트웨이와 클라우드 서비스를 이용하여 서비스를 제공합니다. 게이트웨이는 LoRa부터 Ethernet까지 각종 토신들을 원하는 대로 교체 장착 할 수 있게 되어 있었습니다.

Techcon_02

기타 mbed 부스

그리고 나서 옆에 mbed 부스들을 돌아보았는데, 전체적으로 우리가 지금까지 해왔던 펜타코드들과 크게 다르지 않았습니다. IoT 솔루션이라고 부르는 것들 모두 센서 그리고 클라우드 서비스로의 연결 범주를 벗어나지 않았습니다. 하지만 mbed에서 내세우고 강조하는 것은 mbed OS이며 이 OS 기반으로 모든 서비스와 어플리케이션이 가능하다는 점을 강조하는 것을 알수 있었습니다. 우리가 mbed 플랫폼을 제대로 이용하고 mbed Eco system과 융화 되기 위해서는, mbed OS는 선택이 아닌 필수가 될지도 모르겠다는 생각이 들었습니다. mbed 클라우드 또한 mbed OS 기반이었고 TLS 등의 Security 관련한 것들 또한 마찬가지였습니다.

다음은 mbed 전시회를 둘러보며 인상적이었던 것들을 소개 하겠습니다.

아래 그림의 Hexiwear는 NXP에서 나온 Smart Multimedia 개발 킷으로, 메인 제품에 도킹보드를 가지고 여러 가지 도킹 쉴드를 장착해 Wearable 기기들을 개발 할 수 있습니다. 초기에는 FreeRTOS와 Kinetics SDK로 개발환경이 구성되었지만 지금은 mbed Os 5로 변경되었다고 합니다.

Techcon_11

OpenAIS와 mbed-client, mbed OS를 이용하여 만든 원격으로 불을 On/Off 하는 Prototype과 스마트 팩토리 관련 Prototype 입니다.

Techcon_12

아래 그림은 작은 오락기( Tiny Arcade)이며, mbed 클라우드를 체험해 볼 수 있는 부스도 마련되어 있었습니다.

Techcon_13

저희 회사에 반가운 아두이노 부스도 볼 수 있었습니다. 아무래도 최근 아두이노 진영에서도 Cortex 계열 및 Linux를 위한 보드들이 많아 지면서 ARMTech Con에서 홍보를 하는게 아닌가라는 생각을 하였습니다. 오른쪽 사진은 Snap4Arduino라는 프로그램으로, 저희가 아는 스크래치 프로그램과 유사한 프로그램으로 소프트웨어 뿐 아니라 하드웨어 컨트롤이 가능하도록 개발된 프로그램입니다. Snap 쥬얼 프로그래밍 언어를 사용하여 쉽게 아두이노 보드를 컨트롤 할 수 있도록 개발된 것으로, 거의 모든 아두이노 보드를 지원하며 자동 환경 구성을 제공합니다. ( 참고로 무료이며, 한국어 지원이 가능합니다. )

Techcon_14

WindRiver

전시회장을 둘러보고 마지막으로 WindRiver 부스에 방문하였습니다. 아래 글은 WindRiver 기업을 소개하기 위한 페이지에 있는 글입니다. 글에 따르면 인텔의 자회사로 네트워크, 디지털 가전, 산업 및 자동화, 항공우주 및 방위산업, 모바일, 자동차 관련 부분 등 임베디드 관련 분야를 사업영역으로 하며 RTOS와 임베디드 리눅스 분야에서 인정 받고 있는 기업이라고 합니다.

임베디드 및 모바일 소프트웨어 분야에서 세계 시장을 선도하고 있는 윈드리버는 인텔의 자회사로 네트워크, 디지털 가전, 산업 및 자동화, 항공우주 및 방위산업, 모바일, 자동차 관련 부분 등 임베디드 기술이 필요한 거의 모든 분야를 사업 영역으로 하고 있습니다. 1981년부터 지난 30년간 임베디드 장비 내부의 컴퓨팅 환경 개선을 위해 노력해 왔으며 그 기술은 5억 개 이상의 제품에 적용되어 왔습니다.
 임베디드 소프트웨어 중에서도 OS분야에 있어서 강한 두각을 나타내고 있는 윈드리버는 글로벌 시장 조사 기관인 VDC 리서치 그룹이 발표한 2012년 “임베디드/실시간 운영 시스템”보고서에서 시장을 주도해 온 리더 기업으로 선정된 바 있습니다. 이 보고서에 따르면 윈드리버는 실시간 운영 시스템, RTOS 분야에 있어서 ‘VxWORKS’관련 제품 및 서비스를 통해 전세계 시장 매출의 40%이라는 기록적인 점유율을 달성했으며, 리눅스 플랫폼 및 관련 솔루션으로 전체 시장 매출액의 50 % 이상을 차지하면서 임베디드 리눅스 시장에서도 연속 4년째 리더 기업으로 인정받아 왔습니다. 윈드리버의 이와 같은 경이로운 시장 점유율은 2위 기업의 2배에 달하는 것으로 나타나 독보력인 리더십을 증명했다고 할 수 있습니다. 
또한 최근 주목 받고 있는 안드로이드 분야에서도 매우 활발한 활동을 벌이고 있는데, 윈드리버는 구글의 OHA(Open Handset Alliance) 창립 멤버로서 고객들이 실제적으로 시장에 영향력있는 모바일 제품을 출시할 수 있도록 강력한 안드로이드 서비스 비즈니스를 성공적으로 구축해 왔습니다. 뿐만 아니라 영향력 있는 다양한 오픈 소스 프로젝트 참여를 비롯해 모바일 기술 발전에도 많은 공헌을 하고 있습니다. 
아울러 윈드리버는 GENIVI 연합의 창립멤버로 GENIVI 플랫폼과 안드로이드 등 다양한 리눅스 기반의 자동차 플랫폼 분야에서도 영향력을 발휘하고 있습니다.

ARM TechCon 부스에서는 VxWORKS라는 RTOS와 HELIX라는 클라우드 시스템을 소개 하고 있었습니다. VxWORKS는 Cortex A, M, R에서 동작 할 수 있다고 설명 되었으나, CortexM0/M0+급의 MCU에서는 WindRiver Rocket이라는 RTOS를 사용하라고 권유 받았습니다. 현재 WindRiver Rocket은 Zephyr라는 새로운 이름의 프로젝트로 서비스 하고 있습니다.

Techcon_15

WindRiver의 서비스들을 이용하기 위한 SDK를 제공하고 있었으며, 아래 그림과 같이 특정 플랫폼에 대한 템플릿 예제와 온라인 컴파일러들을 제공함으로써 마치 ARM mbed와 같은 생태계를 만들려고 하는 것 처럼 보였습니다. 현재 SDK List에는 대부분 리눅스급의 퍼포먼스를 요구하는 디바이스들이 등록되어 있고, Cortex계열은 Freescale Freedom K64F 가 유일합니다. 하지만 이 보드 역시 Cortex M4 급으로 우리 칩 W7500/W7500P이 해당 SDK 리스트에 등록 가능한지는 조금 더 검토가 필요 할 것 같습니다.

Techcon_16

현재는 WindRiver 담당자에게 연락처를 남겨 놓은 상태이고, 해당 담당자를 통해 저희 보드가 WindRiver SDK 리스트에 등록하기 위해서는 어떤 절차가 필요한지 문의 해 놓은 상태 입니다


저작자 표시
신고
이 댓글을 비밀 댓글로

mbed connect 2016 참관 후기

Posted by 카이젠8501 카이젠8501
2016.11.03 16:42 IT 개발/기타

mbed connect

mbed connect 일정동안 keynote 발표를 들으면서, ARM이 강조하고 싶은 2 Keyword는 mbed os, Security 라는 생각이 들었습니다.

특히 아래 그림에서 볼 수 있듯이, ARM에서는 TrustZone 기능이 추가/보완 된 ARM-v8M 아키텍쳐 기반의 H/W를 사용하고 그 위에 mbed os 를 S/W로 사용하면 보안에 강력한 임베디드 디바이스를 구성 할 수 있다고 설명하고 있습니다.

01_mbedconnect

Security

현재 보안이 매우 중요해지고 있음에도 불구하고, 소형 임베디드 디바이스는 제한적인 보호 상태이거나, 개발자에게 높은 전문 기술 지식을 요구하는 소프트웨어 관리 보안 시스템에만 의존하고 있는 상황이라고 합니다. 이에 마이크 뮬러(Mike Muller) ARM 최고기술책임자(CTO)는 ARMv8-M에 구현된 하드웨어 아키텍처 보안을 적용시킴으로써 훨씬 더 쉽게 보안을 구축하고 효율적으로 실행할 수 있도록 도울 수 있다고 설명하였습니다.

ARMv6-M & ARMv7-M 대비 ARMv8-M의 특징은 아래와 같습니다. 아직까지는 ARMv8-M 아키텍처 기반의 Core(예, Cortex-M0,M0+ ….)는 존재하지 않으나, Cortex-M0,M0+와 대응되는 제품군을 ARMv8-M baseline으로 Cortex-M3,M4,M7과 대응되는 제품군을 ARMv8-M mainline으로 전환 할 것으로 보입니다.

02_mbedconnect

기존 아키텍처(ARMv6-M,ARMv7-M)와 가장 큰 특징적인 차이는 ARM TrustZone 기능의 추가 이며, TrustZone은 여러 방식으로 변이되는 소프트웨어 공격 및 일반 하드웨어 공격을 막아 낼 수 있는 향상된 기술을 저렴한 비용으로 구현하기 위해 개발 되었다고 합니다.
TrustZone은 아래 그림과 같이 Non-secure state(RTOS와 Application)와 암호화 및 Key 매지니먼트, 무결성 검사와 같은 민감한 작업을 처리하는 Secure state 사이에 독립성을 제공합니다.

03_mbedconnect

이 아키텍처의 가장 큰 핵심은 별도의 보안 구역(trusted)을 만들어 이 안에서 작업을 한 후 정보를 박스에 넣고 열쇠를 채워 비신뢰 보드로 넘기게 되는데, 이 비신뢰 모드에서는 이 박스가 어떻게 생겼고 열쇠가 어떻게 잠겼으며 그 안에 어떤 내용이 채워져 있는지 볼 수 없게 하는 방식 입니다.

간단하게 정리하면, ARM은 ARMv8-M 아키텍처를 사용하여 SoC 레벨에서 Security를 위한 기능을 제공하고 있으며 기존 Software 레벨에서 제공하는 보안 기술(ex, SSL/TLS)와 같이 사용하여 보다 더 강화된 보안을 보다 더 쉽게 사용 할 수 있다고 강조 하고 있습니다.

하지만 아직 ARMv8-M 아키텍처를 이용한 Core가 시중에 나와 있지 않은 관계로, 위즈네트에서는 조금 더 시간을 가지고 ARMv8-M 아키텍처를 사용한 Core들의 동향을 지켜 봐야 할 것 같습니다.

mbed OS

이전 mbed OS 2(“Classic”), mbed OS 3 (“Eventing OS”)와 비교하여 가장 큰 차이점은, mbed OS 5에는 RTOS, connectivity, security component가 maintenance core로 포함되었다는 것입니다. 이전에는 분리 되어 있던 Network Stack과 mbed cloud client가 포함되고, 보안을 위한 mbed TLS, Security APIs(mbed uVisor)가 추가 된 것을 볼 수 있습니다.
Network Stack에는 Ethernet, BLE, Wi-Fi, 6LoWPAN, Thread 등이 있습니다.

05_mbedconnect

mbed OS 또한 Security를 강조하고 있으며, 이를 반영하기 위해 mbed OS의 구조를 조금씩 업그레이드 하고 있음을 확인 하였습니다. 앞에서 설명한 내용은 Hardware(SoC) 측면에서 보안 기술을 적용하는 반면, mbed OS는 mbed TLS, mbed uVisor를 이용하여 Software 측면에서 보안 기술을 개발하고 적용하였습니다.

04_mbedconnect

mbed OS에서는 Security code compartment, Communication security, Lifecycle security로 나누어서 IoT 단말의 보안을 관리 합니다.

06_mbedconnect

Security code compartment ( uVisor )

먼저 Security code compartment를 위해서는 uVisor라는 기술을 사용하는데, mbed uVisor는 OS에서 가장 하위 계층에 위치하며, MPU(Memory Protection Unit)을 통해 Cortex-M3, M4, M7 Core 상에 ‘boxes’라고 명 명하는 격리된 보안 영역(예, 샌드박스)을 생성하는 일종의 하이퍼바이저 로써 기기 자체 보호 기능 입니다.

uVisor의 주요 기능은 ACLs(Access Control Lists)이며, 아래 그림을 보면 ACLs의 개념을 쉽게 이해 할 수 있습니다. User는 uVisor를 통해 Application 혹은 Task를 Box로 묶어서 관리 할 수 있고, 해당 Box만 접근 할 수 있는 MCU의 Peripheral 들을 지정 할 수 있습니다. 예를 들어 User가 Box1이라고 지정한 Application에서는 Timer와 UART만 사용할 수 있도록 설정해 놓았는데, Flash나 I2C와 같은 Peripheral을 사용하려면 Memory Fault와 같은 Error를 발생시켜 OS 내에 악성코드나 외부의 공격 코드로부터 훼손된 시스템 컴퍼넌트, 드라이버로 부터 Box를 보호 할 수 있다는 개념입니다.

08_mbedconnect

Communication Security

SSL은 안전하지 않은 데이터를 암호화 하여 안전하게 전달하기 위해 사용 합니다. SSL 버전 1은 실제로 발표 되지 않았었고, SSL 버전 2가 공개 적으로 발표되었는데 많은 보안 취약점이 있었다고 합니다. 그래서 그것을 보완한 버전이 SSL 버전 3이며 공식적으로 표준화 한 이름이 TLS 입니다. 이를 같이 묶어서 SSL/TLS라고 부릅니다.
mbed에서는 mbedTLS를 지원 함으로써 데이터를 암호화 하여 송/수신 할 수 있는 기능을 제공하고 있습니다.

Lifecycle Security

mbed cloud client에서는 Key Value, Device ID 및 특정 설정 값들을 이용하여 Device의 상태를 관리 하거나 제어 할 수 있는 기능을 제공합니다. 또한 Device의 Firmware도 원격에서 Upgrade 및 Downgrade 하는 기능도 제공합니다.

Conculution

mbed OS를 사용하여 mbed에서 추구하는 보안 기능을 사용하기에는 W7500, W7500P의 한계를 확인 할 수 있었습니다. 우선 Cortex M0/M0+에서는 MPU(Memory Protected Unit)을 지원하지 않기 때문에 Secure code를 보장하기 위한 uVisor 기능을 사용할 수 없습니다.
또한 W7500, W7500P는 RAM size가 부족하여 mbed TLS와 같은 Communication Security의 사용도 어려운 것으로 판단 됩니다.

IoT 서비스가 활성화 되면서 경량 기기에 대한 다양한 기능적 요구가 증가함에 따라 OS 운영이 불가피하게 되었고, 인터넷 연결 특성으로 인한 보안 위협에 대한 대비도 강조되고 있습니다. 이에 위즈네트는 mbed OS와 mbed Security 및 mbed 이외의 다른 RTOS 및 Security를 사용할 수 있을 만큼의 퍼포먼스를 가진 MCU 라인업을 구축 하기 위한 방안을 장기적으로 고려 해 봐야 될 것 같습니다.

그래도 Connectivity 쪽으로 접근하면 희망적으로 WIZnet과 ARM mbed가 공생할 수 있는 포인트들이 있다고 생각합니다. 예를 들어, ST, Freescale 등 다른 회사의 MCU에 mbed OS를 사용하고 Wi-Fi 및 Ethernet Interface를 사용하고 싶은 경우 WizFi250/WizFi310 및 WIznet의 Ethernet Module들을 활용 할 수 있도록 가이드 할 수 있습니다.

단, 위의 모듈들이 mbed OS를 활용하는 고객들을 만족시키기 위해서는, WIZnet 모듈에 대한 mbed OS 라이브러리 지원 및 유지 보수 작업에 지금 보다 더 많은 시간을 투자 해야 한다고 생각합니다.
( *참고 : 이미 WizFi250과 Ethernet Module을 mbed platform 에서 사용할 수 있도록 라이브러리나 드라이버가 준비되어 있지만, 이는 상위 버전(ex, mbed OS5)과 호환이 안됨. 즉, mbed OS5를 위한 갱신된 라이브리 필요. )


참고자료 

- http://aqwerf.tistory.com/12

- http://www.insightsemicon.com/news/article.html?no=128289

- http://m.autoelectronics.co.kr/article/articleView.asp?idx=1904

- https://gigglehd.com/zbxe/newsreport/13542447

- http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Idbt&articleno=7593753&categoryId=404972&regdt=20151005145502




저작자 표시
신고
이 댓글을 비밀 댓글로

공공데이터를 이용한 날씨 예보

Posted by 카이젠8501 카이젠8501
2016.11.03 15:46 IT 개발/Arduino

공공데이터를 이용한 날씨 예보

공공데이터 포털이란?

공공데이터포털(Data Portal)은 한국정보화진흥원에서 운영하는 공공데이터 통합제공 시스템이다. 대한민국 정부가 보유한 다양한 공공데이터를 개방하여 누구나 편리하고 손쉽게 활용할 수 있게 하는 것을 목적으로 한다. 행정자치부 공공정보정책과에서 관련 정책을 추진하고 있다.

2015년 8월 기준, 14,416개의 공공데이터가 공개되어 있다. 정부부처 및 산하기관에서 발행하는 백서, 주제별 전문가가 선정한 최신 이슈와 관련된 지식, 지역/분류체계/제공기관/활용방법 별 공공데이터 개방현황 등이 제공된다. 파일 다운로드 또는 Open API를 통해 이용할 수 있다.

참고 : 위키백과

동네 예보정보 조회 서비스 신청

동네예보정보조회서비스 신청 링크를 이용하시면, OpenAPI를 활용 신청 할 수 있다. 신청이 완료 되면, 일정 시간 후 가입 승인 메일을 받을 수 있다.

20161103_145553

동네 예보정보 조회 동작

동네 예보정보 조회 서비스는 크게 4가지 방식으로 데이터를 요청 할 수 있다.

  1. 초단기 실황 조회
    실황정보를 조회하기 위해 발표일자, 발표시각, 예보지점 X 좌표, 예보지점 Y 좌표의 조회 조건으로 자료구분코드, 실황값, 발표일자, 발표시각, 예보지점 X 좌표, 예보지점 Y 좌표의 정보를 조회하는 기능

  2. 초단기 예보 조회
    초단기예보정보를 조회하기 위해 발표일자, 발표시각, 예보지점 X 좌표, 예보지점 Y 좌표의 조회 조건으로 자료구분코드, 예보값, 발표일자, 발표시각, 예보지점 X 좌표, 예보지점 Y 좌표의 정보를 조회하는 기능

  3. 동네 예보 조회
    동네예보 정보를 조회하기 위해 발표일자, 발표시각, 예보지점 X좌표, 예보지점 Y 좌표의 조회 조건으로 발표일자, 발표시각, 자료구분문자, 예보 값, 예보일자, 예보시각, 예보지점 X 좌표, 예보지점 Y 좌표의 정보를 조회하는 기능

  4. 예보 버전 조회
    동네예보정보조회서비스 각각의 오퍼레이션(초단기실황, 초단기예보, 동네예보)들의 수정된 예보 버전을 파악하기 위해 예보버전을 조회하는 기능

주의점은 각 동작 마다 필수로 요구하는 항목들이 있다. 예를 들어 초단기 실황 조회의 경우, 서비스 키, 발표일자, 발표시각, 예보지점 X좌표, 예보지점 Y 좌표 정보를 필수로 보내 줘야 한다.

동네 예보정보 조회 Request/ 형식

아래 그림은 초단기 실황 조회를 위한 Request 패킷 형식이다. 아래와 같은 포맷으로 데이터를 보내면 두번째 사진과 같은 응답을 받을 수 있다.

20161103_145554

20161103_145555

응답 받은 데이터를 카테고리별로 분석하면 하늘의 상태 및 강수량 등의 정보를 얻을 수 있다.
해당 카테고리 정보는 OpenAPI 사용자 활용 가이드를 참고 하기 바란다.


저작자 표시
신고
이 댓글을 비밀 댓글로

DIY Projects using WizFi250 or WizFi210

Posted by 카이젠8501 카이젠8501
2016.10.10 10:50 IT 개발/DIY 프로젝트

본 포스팅은 WIZnet의 Wi-Fi Module인 WizFi250과 WizFi210을 활용한 DIY 프로젝트들을 소개한다.

To Make Canon DSLR’s Remote controller using  WizFi250

본 프로젝트에서는 Canon Camera를 제어하기 위한 Wi-Fi Remote Controller를 만드는 방법에 대해 설명한다.

 해당 장치를 위해서는 아래와 같은 구성 요소가 필요하다.

  • Camera
    • Receiver와 2.5pi Audio Cable을 이용하여 연결
  • Receiver
    • Arduino Uno(MCU)+WizFi250 (Wi-Fi Module)
    • WizFi250의 AP 기능을 사용 ( 별도의 유/무선 공유기 없이 스마트폰과 다이렉트로 연결 )
  • Remote Controller
    • Smart Phone
    • Simple Android App

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/to-make-canon-dslrs-remote-controller-using-wizfi250/

Author’s Blog(KOR) : http://kaizen8501.tistory.com/86

Author’s Blog(ENG) : http://www.life4iot.com/2015/01/18/to-make-canon-dslrs-remote-controller-using-wizfi250/?lang=en

 

WiFi Electric Skateboard using WIZwiki-W7500ECO + WizFi250

본 프로젝트에서는 WIZwiki-W7500ECO MCU Board와 WizFi250 Wi-Fi Module을 이용하여 전동 스케이트 보드를 만드는 방법에 대해 설명한다.

필요한 구성 요소는 아래와 같다. 해당 구성 요소에 대한 구입을 원하는 경우, 아래 구성 요소들의 이름을 클릭하여 구매 사이트로 이동하면 된다.

 

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/to-make-canon-dslrs-remote-controller-using-wizfi250/

Author’s Blog(KOR) :

http://kaizen8501.tistory.com/112

http://kaizen8501.tistory.com/113

http://kaizen8501.tistory.com/114

Author’s Blog(ENG) :

- http://www.life4iot.com/2015/10/29/electric-skateboard-1-material/

http://www.life4iot.com/2015/10/29/electric-skateboard2-servo-motor-test/

http://www.life4iot.com/2015/10/29/electric-skateboard3-wi-fi-receiver-and-controller/

 

Hedgehog - Educational Robotics Controller

Hedgehog는 Robot을 이용하여 교육 및 연구를 하기 원하는 사람들을 위한 프로젝트이다. 본 프로젝트는 2015년에 KickStarter에 게시 되었지만 펀딩에는 실패 하였다. 하지만 로봇 동작 원리 및 임베디드 디바이스의 동작 원리를 쉽고 간단하게 학습 하기 좋은 프로젝트로 판단 되어 본 포스팅에서 소개 하게 되었다. 참고로 Hedgehog의 Wi-Fi 통신에는 WizFi210 Wi-Fi Module이 탑재되어 있다.

본 프로젝트의 자세한 내용은 아래 링크를 참고 하기 바란다.

Wiznet Museum : http://wiznetmuseum.com/portfolio-items/hedgehog-educational-robotics-controller-2/

KickStarter : https://www.kickstarter.com/projects/priarobotics/hedgehog-educational-robotics-controller


Drainage tank of water purifier IoT

본 프로젝트는 정수기를 사용하면서 한번 쯤 필요하다고 생각한 아이디어를 실제로 구현하고 구현 방법을 정리 하였다.
저자는 Arduino와 WizFi250(Wi-Fi Module)을 이용하여, 정수기 배수통에 물을 비워야 하는지 확인하고 배수통에 물이 일정 높이 이상 차면 등록된 E-mail로 알려주는 장치를 구현하였다.

해당 장치에 대한 자세한 설명이 필요하면 아래 링크를 참고 하기 바란다.
Wiznet Museum : http://wiznetmuseum.com/portfolio-items/drainage-tank-of-water-purifier-iot/





신고
이 댓글을 비밀 댓글로

DIY Smart Home Projects 소개

Posted by 카이젠8501 카이젠8501
2016.09.05 11:06 IT 개발/DIY 프로젝트

DIY Smart Home Projects

사물인터넷의 발전과 함께 스마트 홈 으로 주거문화가 바뀌고 있다. 최근 모 통신사의 광고와 같이 집 밖에서 냉/난방기의 온도를 조절하고 집에 있는 기기를 제어 한 다거나, 웹캠을 이용하여 집 안을 모니터링 하는 일은 이미 우리에게 낯익은 풍경이 되어 가고 있다.

이와 더불어, 인터넷 상에서는 아두이노와 라즈베리파이와 같은 오픈소스하드웨어의 영향으로 메이커(Maekr)들이 직접 설계하고 구현한 스마트 홈 프로젝트들을 공유 하고 있다.

본 포스팅에서는 메이커(Maker)들이 직접 만든 스마트 홈 프로젝트를 종류 별로 분류하고 소개 한다.

Aquarium

Arduino Fish Tank Controller

이 프로젝트는 Arduino와 Ethernet Shield를 사용해서 웹 서버를 구현하고, 구현한 웹 서버를 이용해서 물고기 밥을 주는 장치와 조명 장치를 제어 한다. 그리고 온도 센서를 이용해서 수족관 안의 온도 및 외부 온도를 모니터링 하는 장치를 구현 하였다.

Feeder

CatFeeder

본 프로젝트의 저자는 고양이 먹이를 자동으로 주기 위한 장치를 개발 하였다.

장치에는 버튼이 부착되어 있어, 이 버튼을 이용하여 고양이 먹이를 줄 수 있다. 또한 이더넷을 위한 장치를 연결하여 외부에서도 스마트 폰을 이용하여 고양이 먹이를 줄 수 있다.

Twitter Controlled Pet Feeder

본 프로젝트는 Twitter와 연동하여 애완 동물의 먹이를 Twitter Message로 제어 할 수 있는 장치를 구현 하였다. 앞에서 소개한 CatFeeder는 자체 웹 서버를 구현하여 스마트폰이 웹 브라우저를 통해 제어 하였다면 이 프로젝트는 Twitter라는 범용 SNS 툴을 이용하여 제어 할 수 있다는 점이 특징이다.

Garden

SmartGarden

본 프로젝트의 저자는 본인이 키우는 화분의 온/습도를 측정하고 물을 원격에서 줄 수 있는 시스템을 구축 하였다. 프로젝트는 Paraimpu(https://www.paraimpu.com) 라는 클라우드 서비스를 이용하였으며 Paraimpu를 통해 측정된 온도 값을 Tweeter로 보내고 Tweeter로 부터 받은 제어 신호를 가지고 자동 급수기를 On/Off 할 수 있다.

CloudCooker

본 프로젝트의 저자는 바베큐 그릴의 온도 및 음식의 온도를 측정하고 온도를 조절 할 수 있는 스마트 그릴를 만드는 것을 목표로 하였다.

이 프로젝트는 Microsoft에서 만든 Azure 클라우드 서비스의 기능을 이용하여 프론트엔드(Front-end)에서 더 다양한 형태로 데이터를 출력하고 제어 하는 기능을 제공 할 수 있다는 특징이 있다.

http://www.codeproject.com/KB/AzureIoT/882552/egg2.jpg


지금까지 메이커(Maker)들이 직접 만든 Smart Home Project들을 소개 하였다. 각 프로젝트에 있는 링크를 따라가면, 프로젝트에서 사용한 보드,클라우드 시스템 및 구축 방법이 자세히 설명되어 있고 심지어는 소스코드 까지 공유 되어 있다.

이런 자료들을 이용하여 한개 혹은 두가지 프로젝트를 튜토리얼 식으로 따라 하다 보면 필요한 기술을 쉽게 습득 할 수 있다. 더불어 습득한 기술에 아이디어를 추가하면 여러분 만의 독창적인 프로젝트를 만드는 것도 어렵지 않을 것으로 판단 한다.

저작자 표시
신고
이 댓글을 비밀 댓글로
    • 박지수
    • 2017.04.26 22:06 신고
    우와.. 진짜 멋지시네요!

Arduino에서 Wi-Fi 기반의 MQTT 사용하기

Posted by 카이젠8501 카이젠8501
2016.09.05 10:44 IT 개발/Arduino

앞 포스팅에서 기술한 것과 같이, WizFi250 Arduino Library가 업데이트 되면서 기존에 ESP8266이나 Ethernet에서 사용하는 예제들을 별도의 수정 없이 그대로 사용 할 수 있게 되었다.

http://www.life4iot.com/2016/07/27/wizfi250-arduino-library/

본 포스팅에서는 업데이트 된 WizFi250 Arduino Library를 이용하여 Arduino에서 Wi-Fi를 사용하고 MQTT 연결 후 데이터를 Publish하고 Subscribe 하는 예제를 구현 하는 방법을 설명 한다.

MQTT란?

mqttorg

MQTT란 경량의 Publish/Subscribe 메시징 프로토콜이다. IoT(Internet of things)나 M2M(machine-to-machine)에서 사용하기 위해 설계 되었으며, 이런 이유로 낮은 전력, 낮은 대역폭 환경에서 사용할 수 있다.

아래 문서를 참고 하면, MQTT에 대한 자세한 내용을 확인 할 수 있다.
MQTT 소개

WizFi250 Library 설치 및 PubSub Client Libary 설치

아두이노 IDE에서는 라이브러리 매니저를 지원한다. 라이브러리 매니저를 이용하면, Arduino에서 사용 할 Library를 편하게 검색하고 설치 할 수 있으며, WizFi250 Library 역시 라이브러리 매니저를 이용하여 설치 할 수 있다.

아두이노 IDE의 메뉴에서 [스케치]-[Include Library]-[Manage Libraries] 선택 후, Library Manager에서 WizFi250을 검색 후 설치 한다.

20160801_140536

20160801_140642

Arduino에서 MQTT를 사용하기 위해서는 PubSubClient Library를 설치 해야 한다. 설치 방법은 WizFi250 Library 설치와 동일하며 검색어만 pubsubclient로 바꿔서 사용하면 된다.

Arduino에서 Wi-Fi 연결 후 MQTT 사용하기

WizFi250 Library에는 MQTT를 사용하기 위한 기본적인 예제를 포함하고 있다. 아두이노 IDE에서 [파일]-[예제]-[WizFi250]-[mqtt_wizfi250]를 열고 Wi-Fi SSID와 Password를 공유기에 맞게 설정하면 그대로 사용 할 수 있으며, broker.mqtt-dashboard.com에 설치되어 있는 broker에 접속해서 데이터를 publish 하고 subscribe 할 수 있다.

20160801_142526

// Update these with values suitable for your network.
const char* ssid = "DIR-815_Wiznet";
const char* password = "12345678";
const char* mqtt_server = "broker.mqtt-dashboard.com";

위 코드에서 mqtt_server 값을 변경하면, broker.mqtt-dashboard.com에 있는 broker 이외의 다른 broker를 이용 할 수 있다.

아래 코드는 WizFi250을 AP에 연결한 후, MQTT Broker에 접속하고 Callback 함수를 등록한다. Callback 함수는 Arduino+WizFi250이 MQTT Broker로 부터 MQTT Message를 수신 하였을 때 처리 하기 위한 내용을 정의 한다.

void setup() {
  pinMode(9, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.init();
  WiFi.begin((char*)ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

본 예제의 callback 함수는 Broker로 부터 Message를 수신하면 “Topic”을 출력하고 “Topic”에 대한 Payload 값을 출력 한다.
그리고 모든 “Topic”에 대하여 Payload 값이 ‘1’이면 9번 핀에 연결되어 있는 LED를 ON하고 ‘0’이면 LED를 OFF 한다.

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(9, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is acive low on the ESP-01)
  } else {
    digitalWrite(9, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

Main Loop에서는 MQTT Broker와 연결이 끊어 지면 다시 연결 하고, 2초에 한번씩 “outTopic”이라는 Topic으로 “WizFi250 hello world xxxx” 메시지를 보낸다.

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, 75, "WizFi250 hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("outTopic", msg);
  }
}

MQTT Publish/Subscribe Test

위 예제를 컴파일 하고 아두이노에 업로드 한 후, 예제가 정상적으로 구동 한다면 아래와 같은 로그 메시지를 확인 할 수 있다.

20160801_144011

MQTT Publish Test

PC의 웹브라우저를 이용하여 broker.mqtt-dashboard.com에 접속하면 아래와 같은 화면을 볼 수 있으며, 빨간 박스로 표시된 부분과 같이 “outTopic”에 “WizFi250Hello world #xxxx” 메시지가 출력되면 아두이노에서 메시지를 정상적으로 publish 한 것으로 판단 할 수 있다.

20160801_143851

MQTT Subscirbe Test

PC에 MQTT.fx 툴을 설치 한다. MQTT.fx Download

MQTT.fx의 Connection Profile에 연결할 broker.mqtt-dashboard.com 정보를 입력한 후 Connect 버튼을 누르면 broker.mqtt.dashboard.com에 연결 할 수 있다.

20160801_150203

20160801_150215

아래 그림과 같이 첫번째 박스에 Topic, 두번째 박스에 Message를 입력한 후 Publish 버튼을 누르면, Arduino에서 해당 토픽에 대한 메시지를 로그 메시지로 출력한다. 아래 그림과 같이 출력 되면, 정상적으로 Subscribe가 된다고 판단 할 수 있다.

20160801_150232

20160801_145851

저작자 표시
신고
이 댓글을 비밀 댓글로

Arduino Library Manger에 Library 등록하기

Posted by 카이젠8501 카이젠8501
2016.09.05 10:23 IT 개발/Arduino

Library를 Arduino Library Manager에 등록하는 방법

새로 작성한 라이브러리를 Arduino Library Manager에 등록하기 위해서는 아래 문서에 있는 조건들을 만족해야 한다.
https://github.com/arduino/Arduino/wiki/Library-Manager-FAQ

간단하게 정리하면

  • GitHub에 Library Repository 등록
  • GitHub Repository 폴더 구조는 아래과 같은 구조로 구성
    • examples : 라이브러리 예제
    • src : 라이브러리를 구성하는 전체 소스 파일 (.h, .cpp)
    • README.md : 라이브러리를 설명하는 문서
    • keywords.txt : 아두이노 IDE에서 Highlite 할 문자 표시
    • library.properties : 라이브러리 이름, 버전, 저자, 및 다운로드 url
  • 라이브러리 Tag 생성

20160801_155014

위 조건에 따라 GitHub Repository를 만든 후, https://github.com/arduino/Arduino의 Issues 탭에 GitHub Repository를 등록 해 달라는 이슈를 남기면, 관리자가 검토 후 Arduino Library Manager에 등록 한다.

20160801_155508

20160801_155519

저작자 표시
신고
이 댓글을 비밀 댓글로