2018. 12. 25.

wemos 와 raspberyy pi 를 이용한 dot matrix 버스정보표시

WEMOS를 이용한 버스출도착 정보 전광판 제작
Version 0.2
kawadakr@gmail.com
개요 
작업실 앞에 있는 버스정류장에 버스출도착 정보가 없어서 표시 해보려고 함
와이파이가 되는 아두이노계열 wemos(lonin)와 8x8도트 매트릭스를 이용
이 문서를 만든 목적
 페이스북 개발 그룹에 뭔가를 만들거나 개발 할 때 무엇을 배워야 할지 무엇이 필요한 지 몰라 질문 하는 사람들이 많은 것을 보고 도움이 되고자 적어 보았음. 
 본 프로젝트는 간단한 프로젝트이지 만, 기획/준비/프로그램개발/전자회로설계/하드웨어케이스설계/하드웨어제작등의 생산품을 위해서 필요한 전단계를 거치는 과정을 포함 하고 있다.
준비물 
• wemos(LONIN) 
• dot matrix 8x8  2개 (드라이버포함)  
• raspberry pi ( gateway api server) 
• wifi 공유기
• 전원
• 버스출도착정보-공공디비접속 계정 및 키 
• 포맥스 보드 (전자부품 고정/배치용)
• 3d-printer 케이스제작용(없으면 다른걸로 만들어 보세요~)
• 설계용 fusion360 s/w stl 파일은 git 에 올려놨어요
결과물
• https://github.com/JamesSeo/arduino_busInfo
전체구조

전체 작업 순서
하드웨어주문
• 제작에 필요한 하드웨어를 주문한다. ( www.devicemart.co.kr, eleparts.co.kr) .
버스출도착 정보 얻기 : https://www.data.go.kr/
• 공공디비 사이트에서 얻을수 있으며, 바로 쓸수는 없고 회원가입을 하고, 접속키를 발급해야 한다. 
• 어떤 목적으로 사용 할 것인지등을 쓰고, 바로 사용이 가능하다.
• 관련 스펙은 문서를 다운받을 수 있으니 잘 읽어보자. 하나의 api를 사용하기 위해서 필요한 관련 추가 파라메터는 다른 api를 사용해야 할수도 있으니 약간의 노력이 필요핟.
api 호출  ( gateway api 서버)
• 결과 값이 xml 인데, wemos에서 직접 그값을 파싱해서 사용 할 수도 있지만, 그러면 실제 하는 일에 비해서 코드가 길어지는 문제와, 2차 가공의 문제등으로 gateway를 두기로 했다. gayteway의 역할은 xml 읽어드려서 단순화한 정보로 바꾸어 wemos로 전달하는 역할을 한다. 
• gateway서버는 Flask 에 python을 이용해서 rest-api서버를 만들고, wemos에서  정보요청을 하면, 공공디비서버에 대신접속을 하여 필요한 api를 대신 호출하고, XML중에서 필요한 정보만 뽑아서, 단순한 텍스트로 변환을 한다.
• XML 문서가 아주 친절하지는 않기 때문에 이런 저런 api를 불러 보면서 호출시 필요한 정보가 어떤 것인지 확인 해야 하고, 웹사이트 자체에 테스트 하는 기능이 있어서  테스트가  가능하다.
 
Dot-matrix 글자표시 (wemos)
• 아두이노는 스펙에 따라 메모리 크기가 다르지만, 일반 컴퓨터에 비하면 용량이 매우 작기 때문에 최대한 간단하게 코드를 구성 하려고 했다.
• dot-matirx는 비트맵을 뿌려주는데, 라이브러리를 이용하면, 아스키 코드는 간단하게 표시 할 수 있다. 그러나, 한글을 표시하기 위해서는 각 글자에 맞는 비트맵이 필요 한데, 이번 모델에서는 '분,초,곧,도착' 이라는 글자만 필요하므로, wemos내에 비트맵을 정의해 놓고, gateway쪽에서. 분:m, 초:s, 후:a, 곧:n, 도:b, 착:c 등으로 재변환해서 전달하면 wemos쪽에서 문자에 해당하는 한글 비트맵을 뿌려주는 방법을 선택했다. 좀 더 스마트 한 방법이 있을지도 모르지만, 이 부분은 이 정도선에서 마무리 짓기로 했다. 
• Ex) 5분 10초후 도착 —> 5m 10sa bc (후 글자는 별도로 처리)
• 라이브러리에서는 매트릭스의 개수를 지정할수 있기 때문에 필요에 따라서 크기를 조정해서 더 크게 만들 수도 있다.
• 관련 라이브러리는 include된 라이브러리를 검색해보면 찾을수 있다.
Base 조립/배치
• 취미 공작에 많이 사용되는 Fomax 를 잘라서 m2, m3나사를 이용해서 wemos와 dot-matrix를 고정했다.
Boxing/housing
• 외부에 노출되어야 하기 때문에 최종 housing은 3d printer로 출력하고, 외부에 lcd가 노출되어야 하므로 이부분은 씨디 케이스를 잘라서 붙였다. 
• 모델링은 autocad사에서 나온 fusion360을 이용했다. 뚜껑부분과 하단 박스부분으로 나누어져 있다.
• stl파일은 git에 올려놓았다.
제작 과정 사진 -하드웨어
검정색 바닥이 포맥스, 8x8 dot matrix이다. 

Led 아래쪽은 플라스틱 서포터를 이용해서 고정을 했다.(흰색 나사모양)

1차 배선 연결 변경 - 원래 있던 커넥터는 높이가 높아서, 핀을 직접 랩핑기로 선을 연결했다. (실제로는 더 타이트 하게 변경했음)

1차 완성되어 프로그램 로딩및 버스 API연동 된 상태
https://www.youtube.com/watch?v=iPfTcxBjmMI
 
제작과정 사진 - case/housing 설계, 제작

 

 

표시창 부분에는 씨디케이스를 잘라서 순간 접착제로 붙였다.

최종 완성된 모습 ( 글씨는 스크롤 된다)
 

2018. 11. 27.

batch replace string in files by command line

batch replace string in files by command line
sed -i — ‘s/want_str/rep_str/g’ file_patterns

ex) -i — ‘s/abc/123/g’ *.txt




November 27, 2018 at 01:06PM

2018. 11. 10.

Listing wifi at command line in Mac OS X

Listing wifi at command line in Mac OS X
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s

Or

cd /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources 
./airport -s 


November 10, 2018 at 04:16PM

2018. 10. 31.

Passing all arguments to other functions

Passing all arguments to other functions

using $@

ex)  run.sh
    # instead  
   oher_command $1 $2 ...
    # with
    other_command $@ 

!! That’s all.


October 31, 2018 at 12:30PM

2018. 9. 22.

Upload string to S3 with boto3 python

Upload string to S3 with boto3 python
# this code sometimes occurs error.  Body parameter is byte or file handle.
body_string = “abc..."
s3.client.Object(bucketname, key).put(Body= body_string) 

# using encode method. 
s3.client.Object(bucketname, key).put(Body=body_string.encode()) 


September 21, 2018 at 04:06PM

2018. 9. 5.

Write custom log in python

Write custom log in python
base_record = dict(
    name=‘module.sub’, levelname=‘error’, levelno=logging.ERROR, 
level=logging.ERROR,
funcName=‘callername’, lineno=0, args=(), exe_info=None)

record = logging.makeLogRecord(dict(base_record, msg=“some messages”))
logger.handle(record) # write log



September 05, 2018 at 11:10AM

How to get caller function name in python

get caller name
import sys

def a():
  print sys._getfrmae(1).f_code.co_name

def b():
  a()

## result
b





Tags: python, blog, flask
September 04, 2018 at 04:14PM
Open in Evernote

2018. 6. 17.

grep keyword recursively


grep -R —include’{file patterns}’ {keyword}

## example 


grep -R --include '*.xml' server  # find server in xml files. 

Finding older files than specif times

# created time is more than 24hour
    find . -mtime +1    

#find files and delete 

  find  . -mtime +1 -exec rm  {} \; 

2018. 4. 28.

How to send rich pushes to ios and android in firebase api

Firebase cloud message  (FCM) is very easy to use. You can send messages on firebase console. but if you want to send rich messages, you cannot them in firebase console. You need to use firebase message api. and You must send rich messages to each platforms (iOS, android) because json structures are different each other. 
 
  •  Android & iOS common part  
Method: POST
Headers:
           Content-Type: application/json
           Authorization: key={your key }
 
  • Android (body)  
    • If title,body element are in outside of data node.   app cannot receive messages in background state.
{
"to" : "/topics/subject_android",

"data": {
    "title": “Your title",
     "body": “Your messages",
     "image": “https://image full urls "
    }
}
 
 
  • iOS  
    • title, body  can be in notification-node , data-node contains image urls.  you must add ‘mutable_content’ node. This node will be converted to ‘mutable-content’ in app and call  ios push extention-component. ( You can show image in push.  You need more codings)
    •  
{

"to" : "/topics/subject_ios",
"content_available": true,
"mutable_content": true,
"priority": "high",

"notification": {

"title": “Your title",
"body": “Your messages",
"badge": 1,
"sound": "cheering.caf"
 
},
"data": {

 "image": “https://image full urls "
 
}

}

2018. 4. 23.

summer vacation in Saipan (2017) (사이판 가족 여행기)

2017년 사이판 가족여행기 입니다.

너무 미뤄 둬서 그냥 요약만 올립니다...(5일3박)


8/3 9:30 이스타


와이프는 랜덤검사에 당첨되어 2차검색을 했음 (여기도 미국 소속인지라 랜덤으로 심화 검색을 하는데 와이프가 당첨이 되어서 정밀 검색을 당했습니다. 그 규칙은 아무도 모른다고 합니다) , 손에서 화약류 검출이 되는지, 가방에서 그런 종류가 검출이 안되는지 검사를 받습니다. 그런거 만진적 없으면 크게 신경쓰지않으셔도 됩니다.  주로 가족들이 많이 탑승합니다 (아이들이 많음)

세관 신고서만 작성했고,  이전에 이스타를 발급하였습니다. ( 입국시 이스타 시스템에서 셀프로 진행하는데 시스템 반응이 좀 느림) 와이프와 큰딸은 출력물에 x가 찍히고, 다시 입국심사 대에서 추가 작업이 있어야 해야 되었음.  나올 때 큰 딸은 전신스캔하고 나왔음.
와이파이를 빌리고, 렌트카를 하루 빌렸음. 와이파이는 안에 배터리가 물에 잠겨서 붉은색이 되면 안된다고 강조~. 와이파이는 속도도 좋고, 배터리는 오래가서 가격대비로 만족도가 높았음. (약 3만원정도) 렌터카는 우리가 둘째날 묵는 숙소에서 반납이 가능하기 때문에, 택시비와 별차이가 없어서 사용. 여기는 한국 면허증으로 렌트카 대여가 가능함. - 운전을 해보니, 차가 그다지 많지 않아서, 크게 신경쓰지 않고 다닐 수 있음. 

1일 : 
히마와리 호텔(Himawari hotel) - 매우 낡은 호텔(모텔)인데,   1층에  마켓이 있습니다. 도시락, 유부초밥, 초밥,빵 등을 팔고 근처 관광객들이 아침에 많이 들르는 명소입니다. 우리 식구를 숙소에 크게 신경쓰지 않기 때문에 상관이 없었습니다. 마트에서 입맛대로 사서 드시면 되기 때문에, 식구들은 매우 좋아했습니다.

   야시장, 
   - 광선검- 그동네 통신사에서 하는 축제 같은 건데, 밥도 팔고 기념품도 줍니다 우리는 광선검을 받았습니다.  
   - 석양보기 - 여기 석양이 아름답습니다. 석양만 바라 봐도 기분이 좋아 집니다. 
  - 아이러브사이판/철판아이스크림/ - 쇼핑몰이 아이러브사이판이고 저도 이전에 회사에 직원이 가져다준 열쇠고리에 이 문구를 본적이 있네요. 작은 딸이 가지고 싶어하는 철판아이스크림 도구가 있는데 여기서 직접 철판아이스크림을 만들어 주네요 .  

2일~3일:
  히마와리 체크아웃 
  스노클링  - 이전에 갔던 코타키나발루 만큼 물고기가 화려하지는 않았지만 얕은 바다에서 안전하게 즐기실수 있고 해파리 문제는 없는거 같습니다. 
  kana resort 
  식사-쌀국수  - 리조트 근처 쌀국수 집에서 먹었는데 먹을만 합니다. (사실 식구들이 안가리고 잘 먹습니다.) 
    렌트카 반납 - 호텔내에 렌트카 사무실이 있어 바로 반납 할 수 있게 되어 있어서 편리합니다. 그런데, 제가 반납할 때는 렌트카 사무실에 아무도 없어서 호텔 프론트에 이야기 하니 자기들이 열쇠를 맡아 줍니다. 
  로비에서 음식파는 행사가 있었습니다 미니 야시장 같은 분위기였고 많은 사람들이 거기서 사서 먹습니다. 우리도 먹었습니다. (중국 관광객이 엄청 많이 있습니다.)    
 물놀이 - 메인 행사입니다.~
조텐마트- 우리 식구들이 제일 좋아하는 '해외 나가서 그동네 수퍼에서 장보기' 입니다. 기념품도 사고 그동네 음식도 사서 먹어 봅니다. 
 
3일
   토니로마스 - 우리나라에서 거의 없어진 프랜차이즈 식당이지요.   
   티겔러리아 - 쇼핑몰입니다. 여기 구경만 합니다.
   네이키드피쉬 - 여긴 식당 이라기 보다는 약간 호프집 분위기인데 조명이 좀 어둡습니다. 어린 식구가 있다면 그다지 추천하지는 않습니다. 

4일  
택시로 이동 - 
이원민숙( JC guest) - 게스트 하우스 입니다. 중국인 주인인거 같은데 영어 하시면 됩니다. 
모비딕 점심
조텐마트  - 또 갔습니다. 이제 익숙합니다. 

마이크로 비치 

킨파치 레스토랑

택시를 미리 예약해서 새벽에 택시를 타고 공항에 도착해서 한국을 옵니다...


2018. 4. 22.

App Transport Security has blocked a cleartext HTTP

Error Message: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
  • Allow all sites

// 전체 허용 
<key> NSAppTransportSecurity </key>
  <dict> 
    <key> NSAllowsArbitraryLoads </key>
      <true /> 
    </dict>
  • Allow specific sites

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>



firebase rich push notification iOS example links