레이블이 Google인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Google인 게시물을 표시합니다. 모든 게시물 표시

2016년 8월 14일 일요일

mbed OS상에서의 physical web과 web bluetooth (Physical Web and Web Bluetooth on mbed OS)

IoT 개발자로서 마주치게 되는 가장 큰 의문은 '사용자가 어떻게 우리 디바이스를 사용할 수 있게 하지?' 이다. 최근 몇년간 이 문제를 해결하는 가장 일반적이고 표준적인 방법은 디바이스 전용 앱을 만드는 것이었다. 하지만 주변에 디바이스가 점점 많아지기 시작하면서 사용자들에게 '또 다른 전용 앱'을 설치하라고 하는게 점점 힘들어지고 있다. 물론 이건 사용자가 그곳에 당신의 디바이스가 있다는걸 알고 있다는 전제 하에서의 이야기이다...디바이스가 있는지 모른다면 저 질문 자체가 성립하지 않을것이다.

그러므로 주변에 있는 IoT 디바이스를 사용하게 하기 위한 더 편한 방법이 필요하게 된다. 단순히 디바이스를 조작하는 것 뿐 아니라 디바이스를 발견할 수 있어야만 한다. 이 두가지 문제를 해결하기 위해 구글은 안드로이드용 크롬 48부터 브라우져에 추가한 두가지 기능은 매우 흥미롭다.

먼저 Physical Web을 추가했는데 이 기능은 운영체제에 통합되어 주변의 블루투스 비콘을 보여준다. Eddystone-URL 프로토콜을 사용해 저가형 BLE 비콘을 가지고 URL을 브로드캐스트하는데 사용할 수 있게 해 주어 주변 디바이스와 상호작용을 할 수 있게 해 준다. 이것은 주차 미터의 결제 포털부터 새로운 장난감을 제어하는 웹 어플리케이션까지 다양한 곳에 적용할 수 있다. 이것만으로도 충분히 흥미롭지만 구글은 Web Bluetooth 지원도 추가해 웹 어플리케이션이 BLE 디바이스와 통신을 할 수 있게 해 주었다.

이 두 기능은 각각 그 자체로도 훌륭하지만, 두 기능을 통합하면 IoT 개발자에게 매우 유용한 기능을 제공해 준다.

1. 디바이스가 URL을 브로드캐스트 해서 주변에 있는 사용자가 디바이스를 발견할 수 있게 해 줌
2. 이 URL이 가르키는 곳에는 사용자가 디바이스를 컨트롤 할 수 있는 웹 앱이 있음

BOOM~! 이제 디바이스 발견 문제와 전용 앱 설치 문제를 해결했다. Physical world에서 디바이스를 발견하는것 부터 발견한 디바이스를 제어하는데 까지 몇초 내로 가능하다. 다음은 이 기능의 데모로 Parrot 드론을 발견하고 그것을 제어하는 비디오이다.



Eddystone beacons are non-connectable


하지만 임베디드 개발자 관점에서 코드를 작성하려고 하면 마주치게 되는 문제는 Eddystone 비콘도 '비콘'이라는 것이다. 비콘의 역할은 특정 위치에서 advertisement 패킷을 브로드캐스트 하는 것이다. 비콘 디바이스는 브로드캐스트만 수행하지 다른 디바이스가 비콘에 연결하는걸 허용하지 않는다. 그러므로 그 디바이스와 통신을 하기 위해 GATT로 연결할 수 없다. 문제를 더 복잡하게 만드는건 Eddystone 프로토콜에는 GATT 서비스 UUID 목록을  보내기 위한 공간이 없기 때문에 다른 어플리케이션이 디바이스가 가지고 있는 기능을 발견할 수 없다는 것이다. 이렇게 되면 사용성이 매우 제한되게 된다. 하지만 개발자로서 이 문제를 해결해 보자.

BLE examples repository에는 mbed OS에서 실행되는 훌륭한 Eddystone 라이브러리가 포함되어 있다. 최근 동료인 Andres Amaya Garcia가 이 라이브러리에 frame scheduling을 위한 몇가지 새로운 기능을 추가했다. 이 기능은 비콘이 URL과 telemetry 데이터를 둘 다 브로드캐스트 할 수 있도록 허용한다. 이는 한 비콘에서 서로 다른 advertisement 패키지를 보냄으로서 가능해졌다.

이 기능은 비콘이 Physical Web/Eddystone URL 비콘과, 연결할 수 있는(connectable) 블루투스 디바이스가 되길 바라는 우리들에게 딱 맞는 기능이다. 매 500ms마다 URL을 브로드캐스트 하고 그 500ms후에 일반 블루투스 프레임을 브로드캐스트 할 수 있다. 이 기능이 다음 라이브러리에 훌륭하게 포함되었다. 'eddystone' 폴더를 자신의 mbed OS 프로젝트 내의 source 폴더에 추가하고 나서 다음과 같이 라이브러리를 초기화 하면 된다.


#include "mbed-drivers/mbed.h"
#include "minar/minar.h"
#include "core-util/FunctionPointer.h"
#include "ble/BLE.h"
#include "eddystone/EddystoneService.h"

using namespace mbed::util;

// Eddystone URL
static const char defaultUrl[] = "https://control.me";
// Normal Beacon name
static char beaconName[] = "I'm a beacon!";
// Service UUIDs for the beacon
static uint16_t uuid16_list[] = { 0x8765 };

static const PowerLevels_t defaultAdvPowerLevels = {-47, -33, -21, -13};
static const PowerLevels_t radioPowerLevels      = {-30, -16, -4, 4};

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    BLE::Instance().gap().startAdvertising(); // restart advertising
}

void onBleInitError(BLE &ble, ble_error_t error)
{
    (void)ble;
    (void)error;
   /* Initialization error handling should go here */
}

void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
    BLE&        ble   = params->ble;
    ble_error_t error = params->error;

    if (error != BLE_ERROR_NONE) {
        onBleInitError(ble, error);
        return;
    }

    if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
        return;
    }

    ble.gap().onDisconnection(disconnectionCallback);

    // Set up Eddystone
    auto eddyServicePtr = new EddystoneService(ble, defaultAdvPowerLevels, radioPowerLevels, 0);
    eddyServicePtr->setURLData(defaultUrl);
    // The name of the beacon and the service list
    eddyServicePtr->setNormalFrameData(beaconName, strlen(beaconName), uuid16_list, sizeof(uuid16_list));

    // Every 500 ms. Eddystone URL, then Normal frame
    eddyServicePtr->setUIDFrameAdvertisingInterval(0);
    eddyServicePtr->setTLMFrameAdvertisingInterval(0);
    eddyServicePtr->setURLFrameAdvertisingInterval(500);
    eddyServicePtr->setNormalFrameAdvertisingInterval(500);

    eddyServicePtr->startBeaconService();
}

void app_start(int, char**) {
    BLE::Instance().init(bleInitComplete);
}

Seeing it all come together


모든것이 동작하는지 확인하려면 안드로이드 6 버젼 이상을 사용하는 안드로이드 폰이 필요하고 그 폰에 Chrome Dev를 설치해야 한다. 설치한 후에 chrome://flags#enable-physical-web 과 chrome://flags#enable-web-bluetooth 두가지 기능을 활성화 시켜야 한다.


주소창에 'chrome://flags#enable-physical-web'  을 입력한다.


Enable the Physical Web 항목을 선택한다.


Enable the Physical Web 항목을 'Enabled'로 바꿔주면 된다.


주소창에 'chrome://flags#enable-web-bluetooth' 를 입력한다.



Web Bluetooth 항목을 'Enabled'로 바꿔주면 된다. 





 두 항목을 활성화 시켰으면 아래쪽의 'Relaunch Now'버튼을 눌러 크롬을 재시작 해 준다.

이제 drawer를 아래로 내리면 주변의 Physical Web 비콘과 URL 목록을 보여준다.


'Pair'를 터치하면 커넥션이 연결되고 characteristic을 읽거나 쓸 수 있게 된다.


Physical Web URL을 통해 연결할 때는 페어링 스탭은 더 이상 필요하지 않다고 생각하지만 아직까지는 이 스탭이 필요하다.

Conclusion


이제 가능성은 무한하다. 디바이스와의 적절한 BLE 커넥션을 가지고 있으니 네이티브 안드로이드 앱에서처럼 characteristic을 원하는 대로 읽고 쓸 수 있다. 다음 단계로 넘어갈 준비가 된 사람들을 위해 가속도 센서값을 블루투스를 통해 전송하고 복수의 BLE 디바이스에서의 움직임을 그래프로 그리는 웹 앱 코드를 준비 해 놓았다. 소스코드는 github에서 찾아볼 수 있다.













2011년 2월 28일 월요일

구글 2단계 인증 사용하기 (Using Google 2-step verification)

구글에서 새로 시작한 서비스이다.
비밀번호 유출이 걱정되거나 계정이 해킹당한거 같다고 걱정하는 사람들은 이 서비스를 이용하면 구글을 훨씬 안심하고 사용할 수 있게 된다.


사용하려면 먼저 구글 어카운트 설정으로 가서 Using 2-step verification을 선택한다.
 

아래와 같이 2-step verification 설정이 시작된다.

먼저 어떤 스마트폰을 사용할건지 선택한다.


플랫폼을 선택하면 해당 플랫폼에 필요한 앱을 설정하는 법이 나온다. 그대로 따라해서 폰에 필요한 앱을 설치해준다.


 설치가 완료된 다음 next를 누르면 아래와 같이 화면에 QR코드가 나타난다.


폰에 설치한 앱을 실행한다. 여기서는 안드로이드에 설치된 경우이다.


Scan account barcode를 선택한 다음 컴퓨터 화면의 QR코드를 인식시킨다.

정상적으로 QR 코드가 인식되면 화면에 위와 같은 확인 코드가 나오게 된다.
PC에 위의 확인코드를 넣어주면 된다.


모든게 정상적으로 되었다면 아래와 같은 화면이 나오게 된다.
여기까지 오면 일단 설정은 끝난건데 문제는 암호를 잊어버리고 폰도 없어지거나 분실되는 경우 사용할 수 있는 수단이 필요하게 된다. 

은행의 보안카드같이 화면에 아래와 같은 코드들이 나타나게 된다. 이 코드들은 별도로 잘 보관해 두어야 한다. 만일 암호도 기억이 나지 않고 스마트폰도 없는 경우는 이 코드를 알고 있어야만 자신을 확인시켜줄 수 있게 된다.

꼼꼼하게 확인하기 위해 저 표를 인쇄하건 어딘가에 잘 보관해 두었다는걸 체크해 주지 않으면 next버튼이 활성화 되지 않는다.


다음으로 넘어가면 마지막 수단으로 문자메시지나 음성으로 확인할 수 있도록 하기 위해 휴대폰 번호를 등록한다.

여기까지 왔으면 이제 설정이 끝난것이다. 아래와 같은 최종 확인 화면이 나오게 되고 여기서 Turn on 2-step verification 버튼을 눌러주면 이 기능이 활성화되어 바로 적용된다.


 자동으로 로그아웃되고 다시 로그인하도록 암호를 물어본다.

암호를 넣으면 이전과 다르게 바로 로그인이 되는게 아니고 아래와 같은 화면이 나와 인증코드를 물어보게 된다. 자신의 폰에 설치한 앱을 실행하면 화면에 나오는 인증코드를 넣어주면 된다.

 
 정상적으로 로그인이 되면 다음과 같은 화면을 볼 수 있다.

여기서 모든 설정은 끝난 셈이지만 남은 문제는 웹 브라우져로 로그인 할 때는 인증코드를 물어볼 수 있지만 전용 클라이언트(구글계정에 연동되는 메일이나 웹 서비스 클라이언트들) 은 인증코드를 물어볼 수 없기 때문에 제대로 동작을 하지 않게 된다. 그 경우를 위해 Application-specific passwords 기능을 제공한다. 아래에서 Manage application-specific passwords를 선택한다.


여러 클라이언트마다 별도로 관리할 수도 있다. 그걸 위해 각 application-specific passwords마다 이름을 붙여준다. 아래에 원하는 이름을 정해주고 Generate password버튼을 누르면 된다.


그럼 아래 노란색 박스에 암호가 만들어진다. 클라이언트에 자신의 원래 암호 대신 저 암호를 넣어주면 클라이언트들도 정상적으로 동작하게 된다. 이 암호는 랜덤하게 생성된 길고 복잡한 암호이기 때문에 brute-force 방식의 password cracker들에게는 거의 깨질일이 없는 안전한 암호이다. 이 암호는 클라이언트에 한번만 넣어주면 되고 따로 암기할 필요는 없는 암호이다.

이렇게 하면 스마튼 폰을 통해 구글의 2단계 인증 기능을 사용할 수 있고 훨씬 더 안전하게 구글을 사용할 수 있게 된다. 특히 PC방이나 공공장소에서 구글에 로그인 할 때 혹시라도 키로깅을 당하더라도 OTP 코드는 계속 바뀌기 때문에 설사 암호가 로깅되어도 계정이 뚤릴까봐 걱정할 필요가 없어진다.

2010년 3월 25일 목요일

Google Docs를 사용해서 쉽게 설문조사 하기 (Easy email survey using Google Docs)

Google Docs에는 많이 알려지지 않았지만 매우 편리한 기능이 숨겨져있다.
그 중 유용한 것이 이메일을 통한 설문조사 기능이다.


Google Docs의 좌측 상단에 있는 'Create New'를 눌러 그 중 'Form'을 선택한다.


위와 같이 질문을 입력하는 화면이 나오게 된다. 여기서 각 질문을 만들어주면 된다.


각 항목에 대한 설명은 위와 같다.


답변 타입은 위와 같이 7개가 있다.


질문을 추가하려면 좌측 상단의 Add item 버튼을 눌러주면 된다.


설문지가 어떻게 보이는지 미리보기를 하고 싶으면 화면 아래쪽의 검은색 부분에 있는 주소를 눌러주면 된다.


그러면 브라우져의 새 창이나 탭에 위와같이 설문지를 미리보기 할 수 있다.


설문지 디자인이 심심(?)하다고 생각되면 Theme 버튼을 눌러 테마를 선택할 수 있다. 모든 확인이 끝났으면 Email this form 버튼을 눌러 설문지를 보내면 된다.


현재 약 70개 정도의 테마가 있다.


Email this form 버튼을 누르면 위와 같은 화면이 열려 누구에게 메일로 보낼지 지정해 줄 수 있다. 여러 사람의 주소를 쓰는 경우 각 주소는 ','로 구분해주면 된다.


설문지를 받은 사람의 브라우져 화면이다.


설문에 답한 다음 Submit버튼을 눌러주면 된다.


Submit 버튼을 누르면 데이터를 보내기 때문에 진짜로 보낼건지 확인한다. 'OK'를 눌러주면 된다.


데이터가 전달되고 나면 위와 같이 Thank you 화면이 나온다.


이렇게 메일로 수집된 데이터는 자동으로 설문을 보낸 사람의 스프레드쉬트 파일에 입력된다. Google Docs에 가 보면 자신이 만든 설문에 대한 파일이 생겨져 있다.


파일을 열어보면 위와 같이 설문 응답 내용이 자동으로 스프레드 쉬트에 입력되어 있다.


또한 설문을 보내 사람은 메일함을 열어보면 설문결과를 확인할 수 있는 링크와 설문지를 추가로 발송할 수 있는 링크가 들어있는 메일이 google docs로부터 와 있다.

이 기능을 사용하면 설문지를 돌리고 수집한 다음 결과를 정리하기 위해 입력하는 수고 없이 매우 쉽게 설문조사를 할 수 있다.

2010년 2월 4일 목요일

구글앱스 사용자 관리 (Manage accounts in google apps)

구글앱스에서 사용자 및 그룹 추가/관리법에 대해 설명하겠다.


해당 도메인의 관리자 아이디로 로그인하면 화면 오른쪽 상단에 Manage this domain 링크가 보인다. 이걸 클릭해 준다.


관리자 화면으로 넘어오면 도메인에 관련된 여러가지를 설정할 수 있다. 사용자를 추가하기 위해 Users and groups를 선택한다.


사용자를 추가해야 하니까 Create a new user를 선택한다. 이 방법은 한명씩 추가하는 것이고 여러명을 한꺼번에 추가할수도 있다.


사용자의 이름과 아이디를 넣어준다. 기본적으로는 랜덤하게 정해진 초기암호가 설정되어 있다. 해당 사용자가 저 암호를 가지고 처음으로 로그인을 하면 새 암호를 넣으라고 나오게 된다. 랜덤한 암호 대신 관리자가 임의로 암호를 설정해 주고 싶으면 Set password를 눌러주면 된다. 모든 정보를 다 입력했으면 Create new user 버튼을 눌러주면 된다.


이제 Test User라는 이름의 계정이 만들어 진 것이다. 이 사용자의 아이디는 'testuser', 초기암호는 'Z57829'이고 예를 들어 회사 도메인이 xyz.com이라고 하면 이메일 주소는 testuser@xyz.com 이다.
또한 웹 브라우져에서 이 계정으로 로그인 하기 위한 초기 웹 페이지는 http://start.xyz.com이 된다.


좀 더 상세하게 설정하거나 입력된 내용을 수정하고 싶으면 위의 화면에서 Edit settings for test를 눌러주면 된다.


Edit settings for test를 누르면 화면이 위와 같이 바뀐다. 여기서 이 사용자가 다음번 로그인하면 강제적으로 암호를 바꾸기, 도메인 관리자 권한 부여(관리자가 되면 사용자 생성, 수정, 삭제등 모든것이 가능), 별명 추가(여기서 사용자 이메일 주소는 testuser@xyz.com인데 별명으로 foo를 추가해주면 foo@xyz.com으로 보낸 메일도 testuser@xyz.com으로 배달된다.), 그룹 설정등이 가능하다.


하나라도 변경하면 맨 아래 Save changes의 글자가 진하게 바뀐다. 변경한 다음에는 잊지 말고 꼭 눌러줘야 변경된게 적용된다.


계정이 추가되었으므로 처음 화면으로 돌아가보면 위와 같이 추가된 계정이 보인다.





그룹을 추가하려면 Groups 탭을 선택한 다음 Create a new group을 눌러준다.


그룹에 관련된 정보를 넣어준다. 위와 같이 RnD라는 그룹을 만들어주고 그룹의 이메일 주소를 rnd@xyz.com으로 해 주면 rnd@xyz.com으로 메일을 보내면 그룹에 속한 모든 멤버에게 메일이 날라가게 된다.
또한 그룹의 억세스 권한을 따로 설정해 줄 수 있다.

- Team : xyz.com 도메인의 모든 멤버(그룹에 속해있지 않아도 관계 없음)가 rnd@xyz.com으로 메일을 보낼 수 있고 멤버 목록을 볼 수 있다.
- Announcement-only : 공지사항 전용으로 그룹의 owner만 rnd@xyz.com으로 메일을 보내거나 멤버 목록을 볼 수 있다.
- Restricted : 그룹에 속한 멤버만 rnd@xyz.comdm로 메일을 보내거나 멤버 목록을 볼 수 있다.

즉 회사 내에 연구개발 팀을 위한 그룹을 두개 만들어서 그룹 멤버는 같지만 하나는 rnd-public@xyz.com, 나머지는 rnd-private@xyz.com 으로 해 주고 rnd-public은 억세스 권한을 Team으로, rnd-private은 억세스 권한을 Restricted로 해 주면 사내의 다른 부서 사람이 연구개발팀원 전체에게 메일을 보낼때는 rnd-public@xyz.com을 사용하고 연구개발팀원중 한명이 팀원에게 공지사항을 보낼때는 rnd-private@xyz.com을 사용할수도 있다.
이렇게 하면 메일의 필터 기능을 이용해서 팀원에게 오는 메일은 별도의 라벨을 붙여 관리할수도 있어 편리하다.

모든 정보를 입력했으면 아래쪽의 Create new group 버튼을 눌러준다.


그룹의 멤버를 추가해준다. 위쪽의 칸에 이미 만들어져 있는 사용자의 이름, 아이디 또는 이메일 주소를 넣어주고 Member 로 추가할것인지 Owner로 추가할것인지 정한 다음에 Add버튼을 누르면 된다. 위쪽의 칸에 여러명을 한꺼번에 추가할 경우는 ','로 구분해주면 된다.


여기서는 testuser@xyz.com을 RnD 그룹의 Member로 추가했다.

이렇게 계정 추가가 끝났으면 실제 계정 사용자에게 아이디와 임시 암호를 알려주면 된다.


만들어 진 계정을 사용하려면 웹 브라우져에서 시작페이지로 가면 된다. 이 예제에서는 http://start.xyz.com 으로 가면 된다. 위의 화면에서 오른쪽 상단의 Sign in을 눌러준다.


위와 같은 화면이 나온다. 여기서 자신의 아이디와 임시 암호를 넣어주고 Sign in 버튼을 누른다.


처음 로그인 하는 것이기 때문에 위와 같은 화면이 나오고 새 암호를 넣으라고 나온다. 여기에 자신이 원하는 암호를 넣어주고 사람이라는걸 확인(컴퓨터가 자동으로 하는걸 방지하기 위함)해주기 위해 중간에 녹색으로 나온 글자를 그래도 입력(여기서는 gitation 을 넣어준다.)하고 맨 아래쪽의 I accept. Create my accounts를 눌러준다.


그럼 모든 설정이 끝난 것이고 위와 같은 화면이 나와서 자신이 사용할 수 있는 서비스 목록을 보여준다.


Email 화면이다. 구글의 gmail을 그대로 사용하는 것이지만 메일 주소는 testuser@gmail.com이 아니고 testmail@xyz.com (자신의 회사 도메인을 그대로 사용)하게 된다. 웹 브라우져로 메일을 사용하려면 이대로도 문제없지만 만일 아웃룩, 썬더버드, 애플 메일등 외부 메일 클라이언트를 사용할 예정이면 우측 상단의 Settings를 눌러준다.


설정 화면에서 Forwarding and POP/IMAP을 눌러준다.


기본적으로 POP3는 활성화 되어있고 IMAP은 비활성화 되어 있다. IMAP프로토콜을 사용할 생각이면 Enable IMAP을 선택하고 Save Changes를 눌러 설정변경을 저장해주면 된다.

* 도메인을 구입한 후 구글앱스 신청 및 도메인을 구글앱스에 연동시키는 방법은 이 포스트를 참조하면 된다.
* 각 사용자가 자신의 계정을 아웃룩에 연동시키는 방법은 이 포스트를 참조하면 된다.