6/27/2016

AVR RS232 통신 Protocol 설계 및 구현

1. RS232 기반의 Protocol 구현

2개의 AVR128 Board를 통신하기 위해서 RS232 Serial port를 사용하기로 결정을 했다
하지만 RS232를 이용하여 실시간으로 다른 Board를 Control 하고 Status를 읽어야 해야하기때문에 새로운 Protocol 을 만들기로 결정했다.

  • 새로운 Protocol 의 적용 방안  
  1. Protocol의 Flow Control 기능( TCP/IP와 참고 )  
  2. Fast Response 
  3. Connection Status 확인 ( CSMA/CD 와 유사하게 구현)
  4. Protocol의 안정성 ( CRC or Checksum)
  5. Simple Protocol 

기본 개념은 많이 사용되어지는 Protocol과 비슷하게 구현하도록 했으며, 구조도 비슷하고 개념도 비슷하다.
다만 최대한 간략하게 만들었고, Network에 필요한 기능과 Checksum 기능을 추가했다.

간단히 개념을 소개하면 Host->Device로 GET, SET으로 Command 명령보내면, Device는 DATA를 Host에 전송해주거나 이 DATA를 Device에 설정하는 것이다.
그리고 더불어 Device->Host는 ACK or NAK인지 알아 Feedback을 받는 방식이다.

RPT Command는 Device->Host로 주기적으로 보내는 명령으로 Device의 상태를 주기적으로 알기위해서 만들었다.
그리고, 내부에 TYPE을 두어 원하는 각각의 별도의 명령을 만들었다.

위 것으로 보면, 사실 USB 이나, IETF 기반 HTTP/SIP/등 기본개념의 Protocol 인 것 같다.

두 CPU 간의 실시간 적용이다 보니, TCP/IP 처럼 Flow Control 개념이 필요 할 부분이 있는 것 간단히 이를 구현을 했다.
예를 들면, Host-> Device 가 GET를 이용하여 Data를 얻고자 했다면, Device->Host NAK or Checksum 에러로 인하여 얻지 못할 경우,
다른 Command를 바로 실행하는 것이 아니라 이를 반복하여 DATA 값을 얻는 것이다.


1.1 기본 Protocol Message 개념 

기본 동작개념은 Master(Host) 와 Slave(Device) 개념을 가지고 Master가 Slave에게 SET or GET 명령을 주어 제어를 하고
Slave는 Master에게 ACK or NACK 주어 확인받는 방식이다.
사용하다보니, NACK의 사용이 거의 불필요 해지는 것 같다는 생각이 들어 이부분은 좀 더 생각을 해야 했다.

더불어 Protocol Parsing 하는 부분에서 내부 Buffer(FIFO형식) 를 두어 Flow Control을 하는 부분을 추가하였다.

매번 TYPE-0의 Message를 Count하고 이를 추적하여 ACK를 받았는지 확인하고 못받았다면, 자동으로 재 발송하는 System이다.

  • Master Board의 동작방식  
  1. MSG_DAT_TYP_SND_SET  : TYPE-0의 방식으로  동작 제어 및 관련 설정 명령 
  2. MSG_DAT_TYP_SND_GET :  TYPE-0의 방식으로  동작 정보 읽기 및 상태정보 명령 

  • Slave Board의 동작방식   
  1. MSG_DAT_TYP_ACK:  TYPE-0의 두개 명령을 받으면 ACK를 주는 방식 
  2. MSG_DAT_TYP_RPT_SET : TYPE-1의 방식으로 Master에 보고하는 방식 

  • TYPE-0 과 TYPE-1의 차이 
    TYPE-0은 Flow Control 기능을 제공하며, TYPE-1은 Flow Control 기능을 제공하지는 않게 구현을 했다.


1.2 Protocol Message 방식 

MAIN : Master
SUB   : Slave

  • MAIN과 SUB의 Message의 기본설명  

MAIN,SUB

  TX,RX
     TYPE-0
         MSG_DAT_TYP_SND_SET OR
         MSG_DAT_TYP_SND_GET

   RX,TX
     TYPE-0
          MSG_DAT_TYP_ACK
          MSG_DAT_TYP_NACK 
     TYPE-1
          MSG_DAT_TYP_RPT_SET  

  

 There are two kind of Messages , TYPE-0, TYPE-1 
 
 Main can send two kinds of message GET or SET (TYPE0) to sub , this messages have flow control system. 
 it's similar to window but simple so Sub have to resposne ack messages that sometimes includes datas to main.
 Sub can send messages to main but this don't have flow control, only report.  (TYPE1)


요즘 주석을 영어로 쓰려고 하는 노력을 하고 있어서 그러니, 틀려도 이해를 해주시기 바람

  • Message Types 구현 방법


- For Default Message (TYPE-0)


****** TYPE-0   (General Type, M->S or S->M)
------------------------------------------------------------
    0      1     2          3        4   [  5     6     7    ]->LENs  Except SEQ, 
   ID0    ID1   TYP        LENs     SEQ  [  CMD   DAT0  DAT1 ]->LENs  CMD and DATAs.   
-----------------------------------------------------------  
  0xEA  0x57   0x10-SET   0x03     0x01 (M->S)  odd number.         --> checksum 
               0x11-GET                                             --> checksum 

         0x20-ACK            0x02 (S->M)  even number


IDs    : Preamble 0xEA 0x57  
TYP    : Type-0

     (M->S)
    MSG_DAT_TYP_SND_SET OR
    MSG_DAT_TYP_SND_GET     
   
  ** two commands have to receive ACK with data or without it. 

        (S->M)   
   MSG_DAT_TYP_ACK  

SEQ    : Sequence Number between Main and Sub. 

LENs   : Lens between CMD and DATs

CMD    : MSG_CMD_T is below ******


- For Report Message (TYPE-1)

This Message is Only for Reporting Main so Do not need SEQ. 

******  TYPE-1  (For Report Type, S->M ) 
-------------------------------------------------------------
   0       1      2          3     [ 4       5     6    ]->LENs
  ID0     ID1    TYP        LENs   [ CMD   DAT0   DAT1  ]
-------------------------------------------------------------
 0xEA    0x57   0x31-RPT    0x03

IDs    : Preamble 0xEA 0x57  
TYP    : Type 
SEQ    : Sequence Number between Main and Sub. 

LENs   : Lens between CMD and DATs

CMD    : MSG_CMD_T is below **** 



1.3 결론 

현재 이 버전은 안정적으로 잘돌아가고 있으지만 사실 파싱하는 부분은 개선을 해나가야 할 것 같다.
실시간으로 빠른 모터제어와 다른 기능들을 제어를 하고 있어 괜찮게 구현을 한 것 같지만, AT Command 방식이 쉽고, 구현하기 더 좋은 것 같다.

6/20/2016

GSTREAMER - PYTHON 예제분석 및 다양한 예제

1. Gstreamer Programing  

Gstreamer을  gst-launch로 pipeline으로 연결하여 실행도 가능하지만, Gstreamer을 C나 python을
이용하여 간단히 Programming이 가능하다. 이때 UBUNTU에서 GTK이 이용을 한다.

Gstreamer 관련설명 및 관련 C기반 예제 
  http://blog.daum.net/basetechnology/6998023

일반 Gstreamer 의 플러그들 
  https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/

지금 현재 GSTREAM로 PHYTHON을 지원하는 것은 UBUNTU에서 지원을 해준다.
  https://wiki.ubuntu.com/Novacut/GStreamer1.0#Using_GStreamer_1.0_from_Python


1.1  Gstreamer Python 준비

아래의 Python을 하기 위해서는 반드시 Python version 3이며, 아래와 같이 설치가 필요하다.


$ sudo apt-get install python-gi python3-gi \
    gstreamer1.0-tools \
    gir1.2-gstreamer-1.0 \
    gir1.2-gst-plugins-base-1.0 \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-libav


처음 프로그래밍하기 전에 주의해야 할 사항은 다음과 같다.
1. python version 확인
2. 띄어쓰기 문제
3. #!/usr/bin/env python 문제


만약 Ubuntu를 사용한다면 Ubuntu version에따라 Gstreamer version이 지원이 다를수 있으니, 아래 사이트를 참고하자.
gstremer0.10 용 video player 와 gstreamer 1.0 용 video player는 다르다.
(video player 각 예제가 ubuntu에서 동작되는 것을 기본적으로 확인했음)

  https://wiki.ubuntu.com/Novacut/GStreamer1.0#Adding_PPA_for_Ubuntu_Precise


1.2 Python 관련기본자료 


  • Python 관련 기본설명 
  https://ahyuo79.blogspot.com/2016/06/python-and-django.html

  • GSTREAMER-PYTHON TUTORIAL 
  http://brettviren.github.io/pygst-tutorial-org/pygst-tutorial.pdf

  • Gst-1.0  (Function 과 Hierarchy 로 구조파악)
  https://lazka.github.io/pgi-docs/#Gst-1.0

  • Python GOBJECT
  https://pygobject.readthedocs.io/en/latest/

  • Python GTK
  https://python-gtk-3-tutorial.readthedocs.io/en/latest/


솔직히 Python Gstreamer은 gst-lanuch을 다룬다면, 프로그래밍을 하기가 쉬운거 같다.
아래와 같이 시작 매뉴얼을 익히고, 기본 GTK 이나, QT에 연결하여 하면 되는 것 같다.
다만 문제가 최종동작이 되는지는 보장이 되는지는 모르겠다.


gst-lanuch와 동일하게 Gst.ElementFactory.make() 에 PlugIns의 Element의 정보를 넣으면 된다.

Gstreamer 관련 사항은 Tutorial 에 나와 있지만, 관련사항을 다음과 같이 정리한다.

  1. Pipeline을 우선 만들고, 
  2. add로 추가한다
  3. link로 연결한다.
  4. connect 는 일종의 call back function이다.

manual의 4.3 connection에서 event와 bus 부분을 보면 쉽게 개념을 잘 이해 할 수 있다.
일종의 Timing 맞추기 위해서 사용한다고 보면된다.

아래의 상태는 Gstreamer의 상태를 말하며, pipeline의 상태를 말한다.

Gst.State.PAUSE
Gst.State.PLAYING


GTK관련 Example Manual 보면 Gst.parse_launch 있는데, 사용법이 독특하다.
사용하기도 편한데 아직 다뤄보지 못했다.


1.3  Python Gstremer ex-1

아래의 예제는 위의 pygst-tutorial-org/pygst-tutorial.pdf에서 가져온것이며,실제로 실행본 것이 아니다.
하지만 대충 보면 쉽게 이해가기 때문에 일단 정리한다. 

#!/usr/bin/env python
import os
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GObject, Gtk

### GTK Main Class로 구성 및 이기반으로 실행 
class GTK_Main(object):
     
   def __init__(self):
          window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
          window.set_title("Mpeg2-Player")
          window.set_default_size(500, 400)
          window.connect("destroy", Gtk.main_quit, "WM destroy")
          vbox = Gtk.VBox()
          window.add(vbox)
          hbox = Gtk.HBox()
          vbox.pack_start(hbox, False, False, 0)
          self.entry = Gtk.Entry()
          hbox.add(self.entry)
          self.button = Gtk.Button("Start")
          hbox.pack_start(self.button, False, False, 0)
          self.button.connect("clicked", self.start_stop)
          self.movie_window = Gtk.DrawingArea()
          vbox.add(self.movie_window)
          window.show_all()

          self.player = Gst.Pipeline.new("player")
          source = Gst.ElementFactory.make("filesrc", "file-source")
          demuxer = Gst.ElementFactory.make("mpegpsdemux", "demuxer")
          demuxer.connect("pad-added", self.demuxer_callback)      # callback function 
          self.video_decoder = Gst.ElementFactory.make("mpeg2dec", "video-decoder")
          self.audio_decoder = Gst.ElementFactory.make("mad", "audio-decoder")
          audioconv = Gst.ElementFactory.make("audioconvert", "converter")
          audiosink = Gst.ElementFactory.make("autoaudiosink", "audio-output")
          videosink = Gst.ElementFactory.make("autovideosink", "video-output")
          self.queuea = Gst.ElementFactory.make("queue", "queuea")
          self.queuev = Gst.ElementFactory.make("queue", "queuev")
          colorspace = Gst.ElementFactory.make("videoconvert", "colorspace")

####pipleline 추가 

          self.player.add(source)
          self.player.add(demuxer)
          self.player.add(self.video_decoder)
          self.player.add(self.audio_decoder)
          self.player.add(audioconv)
          self.player.add(audiosink)
          self.player.add(videosink)
          self.player.add(self.queuea)
          self.player.add(self.queuev)
          self.player.add(colorspace)


          source.link(demuxer)


          self.queuev.link(self.video_decoder)
          self.video_decoder.link(colorspace)
          colorspace.link(videosink)

          self.queuea.link(self.audio_decoder)
          self.audio_decoder.link(audioconv)
          audioconv.link(audiosink)

          bus = self.player.get_bus()
          bus.add_signal_watch()
          bus.enable_sync_message_emission()
          bus.connect("message", self.on_message)
          bus.connect("sync-message::element", self.on_sync_message)


   def start_stop(self, w):

      if self.button.get_label() == "Start":
            filepath = self.entry.get_text().strip()
            if os.path.isfile(filepath):
                 filepath = os.path.realpath(filepath)
                 self.button.set_label("Stop")
                 self.player.get_by_name("file-source").set_property("location", filepath)
                 self.player.set_state(Gst.State.PLAYING)
            else:
                 self.player.set_state(Gst.State.NULL)
                 self.button.set_label("Start")


   def on_message(self, bus, message):
      t = message.type
      if t == Gst.MessageType.EOS:
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")
      elif t == Gst.MessageType.ERROR:
            err, debug = message.parse_error()
            print "Error: %s" % err, debug
            self.player.set_state(Gst.State.NULL)
            self.button.set_label("Start")

   def on_sync_message(self, bus, message):
      if message.get_structure().get_name() == 'prepare-window-handle':
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            xid = self.movie_window.get_property('window').get_xid()
            imagesink.set_window_handle(xid)

   def demuxer_callback(self, demuxer, pad):
      if pad.get_property("template").name_template == "video_%02d":
            qv_pad = self.queuev.get_pad("sink")
            pad.link(qv_pad)
      elif pad.get_property("template").name_template == "audio_%02d":
           qa_pad = self.queuea.get_pad("sink")
           pad.link(qa_pad)
####

#### Main Call 
Gst.init(None)
GTK_Main()
GObject.threads_init()
Gtk.main()


1.4  Python simple example 수정방법

아래의 example은 video-player-1.0을 기반으로 돌아가는 video-player를 rtsp용으로 본인이 변경한 것이다.
이전에 다른회사에서 요청이 와서 관련부분들을 고쳤는데, 간단한 것만 정리한다. 

Jeston TK1/TX1 기반으로 작성한 것이므로, 일반 Ubuntu에서는 동작이 되지 않는다.
아래와 같이 Jeston TK1/TX1에서 gstreamer로 확인한 후, phython으로 아래와 같이 변경하였다.

$ gst-launch-1.0 -v rtspsrc location=rtsp://192.168.1.168:8557/PSIA/Streaming/channels/2?videoCodecType=H.264 caps="video/x-h264,mapping=/video " \
! rtph264depay ! h264parse  ! omxh264dec ! nveglglessink -e


main은 p = Player()  p.run() 이며 아래소스와 상위 command 를 보면 대충  쉽게 이해가며 각 필요한 부분들은 자신에 맞게 수정하도록하자 
나의 경우는 각 Jetson에 맞게 수정하였으며, 각 Jetson의 Manual을 참조해야함 

#!/usr/bin/python3
# http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0

from os import path

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk

# Needed for window.get_xid(), xvimagesink.set_window_handle(), respectively:
from gi.repository import GdkX11, GstVideo

GObject.threads_init()
Gst.init(None)

WORKAROUND_SLEEP_SEC = 0.5
#WORKAROUND_SLEEP_SEC = 0.0

class Player(object):
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('destroy', self.quit)
        self.window.set_default_size(800, 450)

        self.drawingarea = Gtk.DrawingArea()
        self.window.add(self.drawingarea)

        # Create GStreamer pipeline
        self.pipeline = Gst.Pipeline()

        # Create bus to get events from GStreamer pipeline
        self.bus = self.pipeline.get_bus()
        self.bus.add_signal_watch()
        self.bus.connect('message::eos', self.on_eos)
        self.bus.connect('message::error', self.on_error)

        # This is needed to make the video output in our DrawingArea:
        self.bus.enable_sync_message_emission()
        self.bus.connect('sync-message::element', self.on_sync_message)

# 상위와 같이 RTSP기반으로 Gst make 및 property 설정 
        videosource = Gst.ElementFactory.make('rtspsrc', 'videosource')
        videosource.set_property('location', 'rtsp://192.168.1.168:8557/PSIA/Streaming/channels/2?videoCodecType=H.264')
        videosource.set_property('latency', 500)
       #videoqueue = Gst.ElementFactory.make('queue', 'videoqueue')
        videodepay = Gst.ElementFactory.make('rtph264depay', 'videodepay')
        videoparser = Gst.ElementFactory.make('h264parse', 'videoparser')
        videodecoder = Gst.ElementFactory.make('omxh264dec', 'videodecoder')

        #filesink = Gst.ElementFactory.make('filesink', 'sink')
        #filesink.set_property('location', r'/home/ubuntu/Downloads/N/test11.mp4')
        #filesink.set_property('sync', 'false')

        videosink = Gst.ElementFactory.make('nveglglessink', 'videosink')
        videosink.set_property('create-window', False)


        #self.player.add(videosource, videoqueue, videodepay, videoparser,videodecoder,videosink)
        #Gst.element_link_many(videosource, videoqueue, videodepay, videoparser,videodecoder,videosink)

### Callback Functions 등록 변경 및 테스트할 경우   
        videosource.connect("pad-added", self.videosource_pad_added)
       # videodepay.connect("pad-added", self.test2_pad_added)
       # videoparser.connect("pad-added", self.test3_pad_added)
       # videodecoder.connect("pad-added", self.videodecoder_pad_added)

### Pipeline self.pipeline.add(videosource) #self.pipeline.add(videoqueue) self.pipeline.add(videodepay) self.pipeline.add(videoparser) self.pipeline.add(videodecoder) self.pipeline.add(videosink) #self.pipelie.add(filesink) ### TEST Callback 과 필요 Callback Functions 추가하며 필요시 디버깅 및 상위에서 등록 def test1_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test1_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test2_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test2_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test3_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test3_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def test4_pad_added(self, dbin, pad): print('jhlee-debugmsg connected test4_pad_added!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!') def videosource_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videosource_pad_added start') #####videosource.link(videodepay) 각 부분 디버깅 pipeline = dbin.get_parent() videodepay = pipeline.get_by_name('videodepay') dbin.link(videodepay) #####videodepay.link(videoparser) videoparser = pipeline.get_by_name('videoparser') videodepay.link(videoparser) ######videoparser.link(videodecoder) videodecoder = pipeline.get_by_name('videodecoder') videoparser.link(videodecoder) videosink = pipeline.get_by_name('videosink') videodecoder.link(videosink) #### PIPELINE STATE 변경 pipeline.set_state(Gst.State.PLAYING) if (WORKAROUND_SLEEP_SEC > 0): sleep(WORKAROUND_SLEEP_SEC) print('jhlee-debugmsg connected videosource_pad_added end') def videodepay_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videodepay_pad_added start') def videodecoder_pad_added(self, dbin, pad): print('jhlee-debugmsg connected videodecoder_pad_added start') pipeline = dbin.get_parent() videosink = pipeline.get_by_name('videosink') # Link decodebin to video sink dbin.link(videosink) pipeline.set_state(Gst.State.PLAYING) // PIPELINE STATE 변경 if (WORKAROUND_SLEEP_SEC > 0): sleep(WORKAROUND_SLEEP_SEC) print('jhlee-debugmsg connected videodecoder_pad_added end') def run(self): self.window.show_all() # You need to get the XID after window.show_all(). You shouldn't get it # in the on_sync_message() handler because threading issues will cause # segfaults there. self.xid = self.drawingarea.get_property('window').get_xid() self.pipeline.set_state(Gst.State.PLAYING) Gtk.main() def quit(self, window): self.pipeline.set_state(Gst.State.NULL) Gtk.main_quit() def on_sync_message(self, bus, msg): if msg.get_structure().get_name() == 'prepare-window-handle': print('prepare-window-handle') msg.src.set_window_handle(self.xid) def on_eos(self, bus, msg): print('on_eos(): seeking to start of video') self.pipeline.seek_simple( Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT, 0 ) def on_error(self, bus, msg): print('on_error():', msg.parse_error()) p = Player() p.run()


1.5 Python 의 API 관련 설명 

솔직히 상위 Python은 Python3를 이해하고, Gstreamer를 이해하며 눈짐작으로 대충은 이해하지만 정확한 이해는 하지 못한다.
아래의 각각의 GTK or Gstreamer의 API를 정확히 어떻게 동작하는 지를 그 함수들의 API 설명해주는 곳이 
아래 SITE이며 , 이곳에서 각각의 함수의 동작을 알아보자.

  https://lazka.github.io/pgi-docs/


1.6  Python 관련 Open Source 

python의 opensource를 보다보니, repo source도 좋은 예제인 것 같다.

  • QT Example
  https://wiki.python.org/moin/PyQt/Using%20GStreamer%20with%20PyQt
  http://www.jonobacon.org/2006/08/28/getting-started-with-gstreamer-with-python/

  • Gstreamer 일반다른예제들 (아래 예제포함)
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/files/79

  • Video Player (상위예제)
기본적으로 ubuntu에서 동작이 되는것을 확인했으며, 본인의 것에 따라 수정을 해줘야한다.
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0

  • Webcam 예제 
  http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/webcam-0.10
  https://storage.googleapis.com/git-repo-downloads/repo

  • NVIDIA의 JETSON 의 RTSP 작업 오픈소스에 반영
이전에 다른회사에서 개발의뢰가 들어와서 이기반으로 소스를 수정하여 다른 회사의 RTSP 문제를 해결 해주었다. (적은돈이 아니라 기쁘다) 
mulitmedia.py 기반으로 multimedia-rtsp.py 새로 만들어 아래에 내가 반영했으며, Open Source라서 회사에는 크게 문제는 상관이 없다.

6/07/2016

STM32F103x and ESP8266

1. STM32F10x

IOT에 관련된 개인일이 있어 잠시 STM과 ESP8266 조합으로 사용하여 Interface를 UART를 이용하여 IOT Device를 만든적이 있는데,
너무 쉽고 다양한 기능을 제공하여 간단히만 소개한다.
사실 MCU는 본인이 직접 선택하여 다른 것을 사용되며, MCU라서 금방배우고, 익힐 수 있기 때문에 구지 ST사 것을 사용할 필요 없다.
더 싼 Device가 있다면 그것으로 사용하면 그뿐이다.
ESP8266은 WIFI Module(AP/STA/AP+STA) 기능 및 다양한 기능을 제공하고 있어 많은 개발하기 편한 걸로 기억한다.

2. ESP8266

UART(Serial Interface)로 손쉽게 Wifi 기능은 물론 (STA와 AP) 선택도 쉽게 선택가능하며,
다양한 Server들을 자체 제공을 해주고 있어 HTTP,DHCP,FTP Server 같은 것들을 기본으로 제공하고 있어 IOT 개발에 있어서 편하게 사용되었다.
다만, Parser의 크기가 상당히 좀 큰 거 같아, Internet을 검색해보면 다 수정을 해서 사용한 것  같다.

내가 이것을 개발했을 때문만 해도 인터넷에 자료가 많이 없었는데, 최근들어 풍부하게 자료들이 많이 늘어 더욱 쉽게 개발이 가능할 것 같다.
자세히 더 다루고 싶지만, 현재 관련 IOT보드를 지인에게 돌려주었기 때문에 현재 기억나는부분과 관련사이트를 Link만 한다.

  https://en.wikipedia.org/wiki/ESP8266
  http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1257

2.1 ESP8266 AT Commands Parser

  http://esp8266at.com/index.html#sect_requirements

    A. How to upgrade to latest firmware

  http://bbs.espressif.com/viewtopic.php?f=16&t=1613

    B. Flash Download Tool

  http://bbs.espressif.com/viewtopic.php?f=57&t=433

2.2 ESP8266 API Function 

  http://esp8266at.com/group___e_s_p8266___a_p_i.html
  http://esp8266at.com/group___e_s_p8266___functions.html

  http://www.espressif.com/en/support/download/sdks-demos?keys=&field_type_tid%5B%5D=14

6/03/2016

PYTHON 기본 설명

1. Python 

PYTHON은 기본적으로 컴파일러 형식이 아닌 인터프리터 방식의 언어를 채택하여 사용하며, 호환성을 기본목적으로 하는 것 같다.
이는 Java의 JVM(Java Virutal Machine)과 비교하면 되겠지만, Java 와 다른게 인터프리터 형식으로 연결해주는 것 같다.
그래서 계산이 많고, 복잡한 기능들을 빠른 실행이 힘들지만, 다양한 호환성과 다루기편하여  쉽게 Programming이 가능하여 Programer에게 편이성을 제공하는 것 같다.

이도 역시JVM의 목적과도 유사한 것 같다.Embeded에서 이제는 주로 ARM을 사용하지만,이 전에는 PowerPC 및 x86의 호환성을 생각하고,
다루기 편하게 설계된 것이 Java 인 것 처럼 Python 역시 호환성과 프로그래밍 용이성이 생명인 것 같다.

위에서 언급했듯이 Python의 장점은 인터프리터 언어로만 끝나는것이 아니라, 기존에 존재하는 C , Java와 함께 연동이 가능하며,
쉽게 Python으로 Programming 하여 이들을 이용하는 것이다. 이는 Graphic Library 인 GTK or QT 뿐만 아니라
Gstreamer 그 밖에 Protocol 및 Device 제어, 다양하게 제공해주는 Module과 함께 손쉽게 프로그래밍 하는 것이다.

  • 이외 에도 Google에서 만든 Go 가 존재하지만, 경험이 없어 비교만 하겠다. 
     https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=python3

  • Python의 동작원리 및 인터프리터관련 추가설명 
     https://medium.com/@cookatrice/why-python-is-slow-looking-under-the-hood-7126baf936d7#.hxqffvzb3
     https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EC%8D%AC


1.1  Python의 Version 

Python의 문법과 Design은 Version 이 변경이 되면서 부터 좀 많이 변경이 되었으며,
Version 별로 지원되는 Library가 있기에 확인이 중요한 것 같다.
Version 3과 2가 호환이 되지 않기에 이를 좀 주의하면서 확인을 해야 할 것 같다.

  • Python 2.6/7
주로 이전 소스 및 관련 Open Source에 연결된 Package들 때문에 v2를 사용하며, 가급적 v3사용
      https://docs.python.org/2.6/tutorial/index.html

  • Python 3
상위와 호환이 되지 않으며 최신 오픈소스들은 이 기반이지만, 예전 소스는 v2이므로 주의 
      https://docs.python.org/3/tutorial/index.html
      https://docs.python.org/3/tutorial/controlflow.html

나의 경우는 갑자기 Python을 써야하는 경우가 발생하여, 위 Manual을 읽고,
많은 도움이 되었으며, Gstreamer 와 GTK관련부분 Python부분을 수정하여 구현을 하였다.
하지만 머리가 좋지 않아, 익숙지 않으며, 매번 Manual을 읽어야만 하는 것 같다.

1.2 Python의 종류

Cpython과 관련 Library 및 GTK에 Gstreamer를 사용을 하며,Android에서 사용하는 qpython이나 가지고 장난하는 수준이어서 많은 정보를 제공을 못하지만,
아래와 같이 간단히 설명한다.

  • Cpython(Cython)
C언어로 작성된 Python으로 Python의 Virtual machine에 의해 interpret가 되며, CPython의 모듈을 통한 C Library들과의
호환성을 최대로 하며, 장점은 C Library의 접근이 용이하여, 그래서 많은 Module과 Library를 제공을 한다.
기본적으로 Python이라고 하면 Cpython을 말한다.

     https://www.python.org/
     https://en.wikipedia.org/wiki/CPython
     https://wiki.python.org/moin/PyGtk
     https://docs.python.org/3/faq/library.html

  • PyPi (The Python Package Index)
PyPi는 RPython라는 Python의 제한 정적 형식의 구현이 된 Python interpreter이며, PyPi는  (just-in-time) 컴파일러 기능
다양한 back-ends (C, CLI, JVM을)지원을 한다, PyPy는 성능향상과 CPython과의 호환성을 목표로하고 있으며, PyPi는 CPython보다 5배정도 빠르다고 한다.

     https://pypi.org/
     https://pypi.python.org/pypi

  • Jython
자이썬이라고 불리는 이 Python는 Java bytecode 정확히말하면, JVM에 실행이되는 코드와 Python Code를 Compile을 하여
만들어진 Python이며, 장점은 Java의 호환성이라고 한다.

     http://www.jython.org/index.html
     http://jythonbook-ko.readthedocs.io/en/latest/JythonAndJavaIntegration.html

  • IronPython 과 PythonNet
.Net framework를 위한 Python으로 생각하면 될 것 같으며, 현재 나의 경우는 Window Program을 사용할 일이 없을 것 같아 정리만한다.

  • Python의 종류와 그 밖에 관련설명
     http://docs.python-guide.org/en/latest/starting/which-python/
     http://codedragon.tistory.com/865
     http://www.wikitree.co.kr/main/news_view.php?id=160061


2. Python의 Module Library 

Python은 Import 기능은 Module Library를 Include 하여, 그 안에 존재하는 Funcion을 이용가능하며,
이는 손쉽게 사용하고자 하는 Module Library 제어가 가능하다.
그래서 Module 및 Library의 지원확인이 매우 중요하다.

A. Module의 위치 
  1. 현재 directory
  2. 만약 위해서 찾지 못했다면, 환경변수 PYTHONPATH 에 있는 곳으로 찾음
  3. 그래도 찾지 못하면, UNIX는 /usr/local/lib/python/.

B. Module 기본 사용법

  • 자신의 Module 사용법
     단순히 자신의 module.py를 만들어, 다른 test.py에서 호출 수준.
     http://www.ibiblio.org/g2swap/byteofpython/read/making-modules.html

  • C와 Python의 Interface
     자신이 만든 C의 동적 Lib *.so와 python을 연결하는 방법
     http://www.scipy-lectures.org/advanced/interfacing_with_c/interfacing_with_c.html
     https://docs.python.org/2/extending/extending.html
     https://docs.python.org/3.3/extending/extending.html#

     직접 동적 lib *.so를 호출가능
     https://docs.python.org/2/library/dl.html

  • 기본 Module 사용방법
     http://www.tutorialspoint.com/python/python_modules.htm


C. Module과 Package 이용방법

     Package는 여러 Python Program의 묶음이라고 생각하면 되겠다.
     https://docs.python.org/2/tutorial/modules.html


D. 유용한 Python Module Library

     https://wiki.python.org/moin/UsefulModules

이곳에서, Python이 제공되는 Module Library를 확인가능하다.

E. Python Standard Library 

  • V3
     https://docs.python.org/3.3/library/index.html#library-index
     https://docs.python.org/3/library/

  • V2
     https://docs.python.org/2/library/


2.1 Python의 활용

Python의 활용은 지원되는 Module Library에 있으며, 이 기본 API들을 사용방법을
아는것이 최대 활용이겠다.

GTK, QT, Gstreamer, Android의 각종 Deivce 제어 뿐만 아니라, http 연결 활용용도가 너무 많다.

  • Python 기본사용법     
     http://www.tutorialspoint.com/python/index.htm

  • Android에서의 파이썬
      http://nullege.com/codes/search/android.Android
      http://qpython.com/#qrcode
      https://wikidocs.net/145
      http://nullege.com/codes/show/src@w@e@WebSocket-for-Python-HEAD@example@droid_sensor.py/48/android.Android

  • 장고 (Web)
      http://tutorial.djangogirls.org/ko/django/

  • 파이썬과 장고
      http://raccoonyy.github.io/useful-korean-blog-for-python-and-django/