먹는게 남는거다!

Raspberry pi로 Amazon Echo 만들기

장난감

미국 아마존에서 Amazon Echo라는 재미난 기기를 팔고 있습니다.


애플의 Siri와 비슷한 가상 비서 서비스를 제공하는 기기입니다.


아래 동영상을 보면 이해하기 쉬울 겁니다.




시간이나 날씨를 묻는건 기본이고 피자 주문도 합니다. (이게 실제로 되는지 궁금합니다.)


그 외에 인터넷에서 찾아보면 IFTTT, Tasker와 연동하여 작동하는 예를 쉽게 볼 수 있습니다.



흥미가 생겨서 웹서핑을 하다보니 Raspberry pi로 Amazon Echo를 만든 블로그 포스트를 찾게 되었습니다.


영어로 되어 있지만 워낙 자세하게 설명되어 있고 중간 중간 스샷도 있어서 만만해 보였습니다.


더구나 집에 돌아다니는 스피커도 있고 초소형 USB 마이크도 옥션 등에서 싸게 팔기 때문에 주문한 USB 마이크가 


오자마자 블로그 포스트대로 시도해 봤습니다.



원본 블로그: How to Build Your Own Amazon Echo with a Raspberry Pi



원본 블로그에 약간 오해할만하게 적어놓은 부분이 있는데


Step Two - 5.에서 ProductID에는 Step One - 8.에서 생성된 문자열이 아니라 Step One - 4.에서 


입력한 device type을 입력해야 한다는 점입니다.


(이 부분 때문에 Step Four에서 아마존 페이지 오류가 발생해서 한참 고생했습니다.)



설치를 완료하고 "Alexa, What time is it now?"라고 말하면


뜬금없는 시간을 말합니다.


이는 알렉사의 기본 설정이 시애틀로 되어 있어서 그렇습니다.


그런데 아쉽게도 Amazon Echo는 미국에서만 서비스하기 때문에 한국 시간은 지원하지 않아서 약간의 수고가 필요합니다.


아래 유튜브를 따라하면 time zone을 변경할 수 있습니다.


참고로 한국은 Asia/Seoul 로 하면 됩니다.







크롬북 액정 수리

잡다...

얼마 전에 구입하여 잘 쓰고 있던 크롬북 액정이 깨졌습니다.

전투 모드로 굴리지도 않았건만 언제 어디서 깨진지도 모르게 액정이 깨져 있었습니다.



가출한 정신을 추스르고 수리할 방법을 찾아보았습니다.

도시바 AS의 소문은 익히 알고 있어서 처음부터 고려하지도 않고 사설 수리 업체를 찾았습니다.

검색엔진에서 "노트북 액정 수리"로 검색하니 몇 개의 업체가 있었습니다.

우선 업체 목록을 표로 만들고 홈페이지가 있는 업체는 홈페이지 내 질문 게시판에 없는 업체는 SMS로 수리 가능 여부와 총비용을 확인했습니다.



물론 일부 업체들은 홈페이지를 관리하지 않는지 질문은 올린지 며칠이 되어도 답변이 없었습니다.

그렇게 연락된 업체 중에서 장소와 금액이 맞는 용산 notelcd.com을 방문했습니다.

다행히 토요일에도 영업을 해서 오랜만에 용산 구경도 할 겸 방문했는데 노트북 액정 부품들이 가지런히 정렬되어 있는 것이 한눈에 봐도 액정 전문 수리업체라는 것을 알 수 있었습니다.

바로 수리를 해주셨는데 작업 시간이 30분 밖에 걸리지 않았습니다.

사장님께 농담으로 말씀드렸지만 설탕 액정 때문에 언젠가 또 방문할 것 같은 불길에 예감이 듭니다.


[크롬북으로 개발하기] 원격접속시 텔레그램 메시지 받기 : 5. 전송 프로그램 만들기 (C#)

C#, ASP.NET

드디어 모든 개발 환경이 구축되었기 때문에 본격적인 개발을 시작하려 합니다.

사실 개발할 프로그램은 단순합니다. 입력받은 메시지를 텔레그램봇에게 전송하는 것이 전부입니다.


소스도 정말 간단해서 기본 콘솔 프로그램 클래스와 텔레그램 전송 클래스만으로 구성되어 있습니다.

텔레그램 메시지 전송 클래스 (\src\TelegramBot.cs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Net;
using System.Net.Cache;
using System.Text;
using System.IO;
 
public class TelegramBot
{
    private static readonly string _baseUrl = "https://api.telegram.org/bot";
    private static readonly string _token = "xxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static readonly string _chatId = "xxxxxxxx";
 
    /// <summary>
    /// 텔레그램봇에게 메시지를 보냅니다.
    /// </summary>
    /// <param name="text">보낼 메시지</param>
    /// <param name="errorMessage">오류 메시지</param>
    /// <returns>결과</returns>
    public static bool SendMessage(string text, out string errorMessage)
    {
        return SendMessage(_chatId, text, out errorMessage);
    }
    
    /// <summary>
    /// 텔레그램봇에게 메시지를 보냅니다.
    /// </summary>
    /// <param name="chatId">chat id</param>
    /// <param name="text">보낼 메시지</param>
    /// <param name="errorMessage">오류 메시지</param>
    /// <returns>결과</returns>
    public static bool SendMessage(string chatId, string text, out string errorMessage)
    {
        string url = string.Format("{0}{1}/sendMessage", _baseUrl, _token);
        
        HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
        req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
        req.Timeout = 30 * 1000;        
        req.Method = "POST";
        req.ContentType = "application/json";
 
        string json = String.Format("{{\"chat_id\":\"{0}\", \"text\":\"{1}\"}}", chatId, EncodeJsonChars(text));
        byte[] data = UTF8Encoding.UTF8.GetBytes(json);
        req.ContentLength = data.Length;
        using (Stream stream = req.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
            stream.Flush();
        }
 
        HttpWebResponse httpResponse = null;
        try
        {
            httpResponse = req.GetResponse() as HttpWebResponse;
            if (httpResponse.StatusCode == HttpStatusCode.OK)
            {
                string responseData = null;
                using (Stream responseStream = httpResponse.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream, UTF8Encoding.UTF8))
                    {
                        responseData = reader.ReadToEnd();
                    }
                }
                
                if (0 < responseData.IndexOf("\"ok\":true"))
                {
                    errorMessage = String.Empty;
                    return true;
                }
                else
                {
                    errorMessage = String.Format("결과 json 파싱 오류 ({0})", responseData);
                    return false;
                }
            }
            else
            {
                errorMessage = String.Format("Http status: {0}", httpResponse.StatusCode);
                return false;
            }
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            return false;
        }
        finally
        {
            if (httpResponse != null)
                httpResponse.Close();
        }
    }
    
    private static string EncodeJsonChars(string text)
    {
        return text.Replace("\b""\\\b")
            .Replace("\f""\\\f")
            .Replace("\n""\\\n")
            .Replace("\r""\\\r")
            .Replace("\t""\\\t")
            .Replace("\"""\\\"")
            .Replace("\\", "\\\\");
    }
}
    
cs


텔레그램에서 제공하는 Web api를 호출하는 것이 주 내용입니다.

위 코드 중에서 _token, _chatId는 이전 포스트([크롬북으로 개발하기] 원격접속시 텔레그램 메시지 받기 : 2. 텔레그램봇 생성하기)에서 발급받은 token과 chat id를 입력하시면 됩니다.

콘솔 프로그램 클래스 (\src\main.cs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
 
public class RemoteAlert 
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Telegram Remote Alert v0.1\n\n");
        
        if (args.Length == 0)
        {
            Console.WriteLine("사용 예) TelegramRemoteAlert.exe \"보낼 내용\"");
            return;
        }
        
        string text = args[0];
        string errorMessage = null;
        bool ret = TelegramBot.SendMessage(text, out errorMessage);
        
        if (ret)
            Console.WriteLine(String.Format("발송: {0}", text));
        else
            Console.WriteLine(String.Format("오류: {0}", errorMessage));
    }
}
cs


위의 코드를 컴파일 후 cmd 창에서 아래와 같이 입력하면 메시지가 전송되는 것을 확인할 수 있습니다.


실행파일.exe "보낼 메시지"



위 화면은 cloud ide인 goorm.io에서 컴파일 후 실행한 모습입니다.

"발송: 메시지 왔숑! 메시지 왔숑!"에서 메시지가 성공적으로 발송된 것을 알 수 있습니다.



이제 해당 프로그램을 윈도우 시작 프로그램에 등록만 해주면 윈도우 시작 때마다

텔레그램으로 메시지를 받을 수 있습니다.


- 끝 -