IBM Developer Day 2018์—์„œ ๋ฐฐํฌํ•œ IoT ๋ฑƒ์ง€๋Š” ESP32 Devkit์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ ๋‹น์‹œ ์„ค์น˜๋œ ํ–‰์‚ฌ์šฉ ์†Œํ”„ํŠธ์›จ์–ด ๋Œ€์‹  ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ์ด ํฌํŒ…๋œ ํŽŒ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜๋ฉด IoT ๋ฑƒ์ง€๋ฅผ ๊ฐœ๋ฐœ ๋ณด๋“œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ๋ณด๋“œ๋กœ ์—…๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ๋ชฉํ‘œ

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋งˆ์น˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • USB ๋ฐ์ดํ„ฐ ์ผ€์ด๋ธ”๋กœ IoT Badge์˜ ๋งˆ์ดํฌ๋กœํŒŒ์ด์ฌ REPL ํ„ฐ๋ฏธ๋„ USB ์—ฐ๊ฒฐ
  • REPL์„ ์ด์šฉํ•˜์—ฌ IoT Badge์— ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์‹คํ–‰
  • Web Browser์—์„œ IoT Badge์˜ ๋งˆ์ดํฌ๋กœํŒŒ์ด์ฌ WebREPL ํ„ฐ๋ฏธ๋„ ์—ฐ๊ฒฐ
  • WebREPL์„ ์ด์šฉํ•˜์—ฌ IoT Badge์— ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๋‹ค์šด๋กœ๋“œ

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ

  1. Developer Day 2018 IoT Badge ํŽŒ์›จ์–ด ์„ค์น˜ํ•˜๊ธฐ
  2. IBM Developer Day 2018 IoT Badge
  3. ๋ฐ์ดํ„ฐ ํ†ต์‹ ์šฉ USB 2.0 Micro B Type ์ผ€์ด๋ธ” (๋งˆ์ดํฌ๋กœ 5ํ•€)
  4. Developer Day 2018 ํŽŒ์›จ์–ด ๋‹ค์šด๋กœ๋“œ
  5. 2.4GHz ๋Œ€์—ญํญ ๋ฌด์„  ๊ณต์œ ๊ธฐ

์†Œ์š” ์‹œ๊ฐ„

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์™„๋ฃŒํ•˜๊ธฐ๊นŒ์ง€ ๋Œ€๋žต 30๋ถ„ ์ •๋„๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

๋‹จ๊ณ„

Serial ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

REPL ํ„ฐ๋ฏธ๋„์€ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅํ•œ USB 2.0 Micro B Type ์ผ€์ด๋ธ” (๋งˆ์ดํฌ๋กœ 5ํ•€) ์ผ€์ด๋ธ”์„ ์ด์šฉํ•ด IoT๋ฑƒ์ง€์™€ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  UART ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ค์ • ๊ฐ’
Baudrate 115200
Data bits 8
Parity bit None
Stopbit 1
Flow Control OFF

Windows์ธ ๊ฒฝ์šฐ

Windows๋Š” ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์šฉ Software๋ฅผ ๋ณ„๋„๋กœ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” PuTTY๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Putty๋ฅผ ์‹คํ–‰ํ•˜๋ฉด PuTTY Configurationํ™”๋ฉด์ด ๋จผ์ € ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Connection type์„ Serial๋กœ ๋ณ€๊ฒฝ ํ•ด ์ค๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ์œผ๋กœ Serial line์— USB๋กœ ์—ฐ๊ฒฐ๋œ COM๊ฐ’์„ ์ž…๋ ฅํ•ด ํฌํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , Speed์—๋Š” 115200์„ ์ž…๋ ฅํ•ด baudrate๋ฅผ ์„ค์ • ํ›„ ํ•˜๋‹จ์˜ Open์„ ํด๋ฆญํ•˜์—ฌ REPL์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, USB๋กœ ์—ฐ๊ฒฐ๋œ ์‹œ๋ฆฌ์–ผ ํฌํŠธ๋Š” ๋‚ด ์ปดํ“จํ„ฐ์˜ ์žฅ์น˜๊ด€๋ฆฌ์ž์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ ๋ช…๋ น์ฐฝ์—์„œ devmgmt.msc ๋‚˜ hdwwiz.cpl ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์น˜๊ด€๋ฆฌ์ž์—์„œ ํฌํŠธ(COM & LPT) ํ•ญ๋ชฉ์„ ํด๋ฆญํ•ด Sillicon Labs CP210x USB to UART Bridge ์— ํ• ๋‹น๋œ COM ์ˆซ์ž ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋˜๋Š” USB ํฌํŠธ๋ณ„๋กœ ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๊ณ  ๋“œ๋ผ์ด๋ฒ„ ์„ค์น˜์— ๋”ฐ๋ผ ๊ธฐ๊ธฐ ์ธ์‹ ์‹œ๊ฐ„์ด ์ง€์—ฐ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ ํ™•์ธ๋œ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” COM5์ž…๋‹ˆ๋‹ค.

Linux์ธ ๊ฒฝ์šฐ

์ ‘์† ํ™˜๊ฒฝ์ด Linux์ธ๊ฒฝ์šฐ picocom์ด๋‚˜ minicom์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

USB ์ผ€์ด๋ธ”์„ ์—ฐ๊ฒฐ ํ›„ ์‹œ๋ฆฌ์–ผ ํฌํŠธ ํ™•์ธ์„ ์œ„ํ•ด dmesg | grep tty ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.924251] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[55711.845191] usb 2-2.1: cp210x converter now attached to ttyUSB0

์—ฌ๊ธฐ์„œ ํ™•์ธ๋œ /dev/ttyUSB0 ํฌํŠธ๋ฅผ picocom์œผ๋กœ ์ ‘์†ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ sudo picocom /dev/ttyUSB0 -b 115200

MacOS์ธ ๊ฒฝ์šฐ

MacOS์˜ ๊ฒฝ์šฐ screen ๋ช…๋ น์„ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„ค์น˜๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋œ USB ํฌํŠธ ์ •๋ณด๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ •์ƒ ์„ค์น˜๋˜์—ˆ๋‹ค๋ฉด USB๋กœ ์—ฐ๊ฒฐ๋œ ์‹œ๋ฆฌ์–ผ ํฌํŠธ๋Š” /dev/tty.SLAB_USBtoUART๊ฐ€ ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ screen /dev/tty.SLAB_USBtoUART 115200

๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ REPL ์‚ฌ์šฉํ•˜๊ธฐ

REPL์€ Read-Eval-Print Loop์˜ ์•ฝ์ž๋กœ ์ผ์ข…์˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ผ์ข…์˜ Shell ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. IoT Badge์—๋Š” MicroPython ์ด ํฌํŒ…๋˜์–ด ์žˆ์–ด USB ์ผ€์ด๋ธ”์„ ์ด์šฉํ•ด Serial ํ†ต์‹  ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ REPL์— ์—ฐ๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. USB ์ผ€์ด๋ธ”์ด ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋ผ๋ฉด ์‹œ๋ฆฌ์–ผ ํ†ต์‹  ์†Œํ”„ํŠธ์›จ์–ด ์‹คํ–‰ ์ƒํƒœ์—์„œ ์ปดํ“จํ„ฐ์˜ enter ํ‚ค๋ฅผ ๋ช‡ ๋ฒˆ ์ž…๋ ฅํ•˜๋ฉด Shell ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋น„์Šทํ•˜๊ฒŒ >>> ์™€ ๊ฐ™์€ Prompt๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Linux ํ™˜๊ฒฝ์˜ picocom์—์„œ REPL ํ„ฐ๋ฏธ๋„๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

REPL์—์„œ Tab ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ด ์ œ์‹œ๋˜๋ฉฐ ๋ณ„๋‹ค๋ฅธ ์ž…๋ ฅ์ด ์—†๋Š” ์ƒํƒœ์—์„œ๋Š” ์ „์—ญ์œผ๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

>>> 
>>> 
__class__       __name__        execfile        gc
json            machine         network         run
sys             time            ugfx            uos
bdev            webrepl         sta_if          ap_if
util            rtc             appname         startup
display_logo    home            reboot          restart
unload          get_version     Config          wait_network
>>> 

IoT ๋ฑƒ์ง€์—๋Š” ์ž‘๊ฒŒ๋‚˜๋งˆ File System์ด ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €์žฅ๋œ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด uos ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. uos ํŒจํ‚ค์ง€๋Š” ์ผ๋ฐ˜์ ์ธ ํŒŒ์ด์ฌ์—์„œ ์ œ๊ณตํ•˜๋Š” os ํŒจํ‚ค์ง€๋ฅผ ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ์— ๋งž์ถฐ ์ถ•์•ฝํ•ด ๋†“์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. uos.lsdir() ๋ช…๋ น์œผ๋กœ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ํฌํ•จ๋œ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

>>> uos.listdir()
['boot.py', 'ibm_logo.gif', 'main.py', 'util.py', 'version.txt', 'config', 'apps', 'webrepl_cfg.py']

IoT ๋ฑƒ์ง€์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ค์น˜๋œ apps ํด๋”์— ํฌํ•จ๋œ ํŒŒ์ผ ๋ชฉ๋ก๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

>>> uos.listdir('apps')
['netconfig', 'home', 'appmanager', 'nametag', 'rps']

์ด์ œ ๊ฐ„๋‹จํ•œ python ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด ๋ณผ๊นŒ์š”? REPL ์ƒ์—์„œ print(`Hello, World`) ๋ผ๊ณ  ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด Hello, World๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

>>> print(`Hello, World`)
Hello, World
>>>

์ด๋ฒˆ์—๋Š” ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด 4์ค„์„ ์ž…๋ ฅํ•˜์—ฌ 3์ด ์ถœ๋ ฅ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

>>> a = 1
>>> b = 2
>>> c = a + b
>>> print(c)
3
>>> 

์ด๋ฒˆ์—๋Š” test๋ผ๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•ด ๋ณด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

def test(a, b):
    return a + b

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

>>> print(test(1, 2))
3
>>>

REPL ์ž…๋ ฅ ๋ชจ๋“œ

๊ธฐ์กด ์ž…๋ ฅ ๋‚ด์šฉ

์ตœ๋Œ€ 8๊ฐœ๊นŒ์ง€ ๊ธฐ์กด ์ž…๋ ฅ ๋‚ด์šฉ์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉํ–ฅํ‚ค ์œ„/์•„๋ž˜๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ธ ํŽธ์ง‘

  • ๋ฐฉํ–ฅํ‚ค ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ปค์„œ๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์ž…๋ ฅ ์ค„์˜ ์ฒ˜์Œ์œผ๋กœ ์ด๋™: Home ๋˜๋Š” Ctrl-A (๋‹จ, MacOS์˜ screen๊ฒฝ์šฐ Ctrl-A๊ฐ€ ์˜ˆ์•ฝ ๋‹จ์ถ•ํ‚ค์ด๋ฏ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ)
  • ํ•ด๋‹น ์ž…๋ ฅ ์ค„์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋™: End ๋˜๋Š” Ctrl-E

๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ชจ๋“œ

REPL์—์„œ Ctrl-E ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๋ฉฐ, ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ค„์˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ์™„๋ฃŒ ํ›„ Ctrl-D ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ผ๋ฐ˜๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๋ฉฐ REPL์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ถ™์—ฌ ๋„ฃ์€ ๋‚ด์šฉ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์˜ ํ•  ์ ์€ ํ†ต์‹ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋งŽ์€ ๋‚ด์šฉ์„ ํ•œ๋ฒˆ์— ์ž…๋ ฅํ•  ๋•Œ ๊ฐ„ํ˜น ๋‚ด์šฉ์ด ๋ˆ„๋ฝ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ•˜๋ฉฐ, ํ•œ ๋ฒˆ์— ๋งŽ์ด ์ž…๋ ฅํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆ„์–ด ๋˜๋„๋ก ์งง์€ ์ฝ”๋“œ๊ฐ€ ์ž…๋ ฅ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์–‘์ด ๋งŽ์•„์ง€๋Š” ๊ฒฝ์šฐ ๋‚˜๋ˆ„์–ด ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋ณด๋‹ค ์•ˆ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” WebREPL ์ด์šฉํ•˜๊ธฐ๋ฅผ ์ด์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

WebREPL ์ด์šฉํ•˜๊ธฐ

USB ์‹œ๋ฆฌ์–ผ ํ†ต์‹ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” REPL์„ ์ด๋”๋„ท ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ WebREPL์ด๋ผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด USB ๋“œ๋ผ์ด๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ ์ผ€์ด๋ธ”์ด ์—†์–ด๋„ ์—†์ด IoT ๋ฑƒ์ง€์™€ ์ปดํ“จํ„ฐ๊ฐ€ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ ๋ง์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ปดํ“จํ„ฐ์—์„œ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ IoT ๋ฑƒ์ง€์— ์ ‘์† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ, IoT Badge์—๋Š” WiFi ๋ชจ๋“ˆ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€๋งŒ 2.4GHz ๋Œ€์—ญ๋งŒ ์ ‘์†์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 5GHz ๋Œ€์—ญ์ธ ๊ฒฝ์šฐ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์ฃผ์˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

IoT ๋ฑƒ์ง€ WiFi ์—ฐ๊ฒฐ

IoT ๋ฑƒ์ง€์˜ ๋ฐฉํ–ฅํ‚ค๋ฅผ ์›€์ง์ด๋ฉด ๋ฉ”๋‰ด๋ฅผ ์„ ํƒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐฉํ–ฅํ‚ค ์˜ค๋ฅธํŽธ์— ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๋ฒ„ํŠผ ์ค‘ ์™ผ์ชฝ์— ์žˆ๋Š” A ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์„ ํƒํ•œ ๋ฉ”๋‰ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ํ™”๋ฉด์—์„œ Apps ๋ฉ”๋‰ด๋กœ ์ง„์ž…ํ•˜๋ฉด IoT ๋ฑƒ์ง€์— ์„ค์น˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Network Config ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ ํƒ ํ›„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Network config์—์„œ WiFi๋ฅผ ์„ ํƒํ•˜๋ฉด ํ˜„์žฌ ์ฃผ์œ„์˜ WiFi SSID ๋ชฉ๋ก์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค‘ ์ž์‹ ์˜ ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ WiFi ๊ณต์œ ๊ธฐ์˜ SSID๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ณต์œ ๊ธฐ์˜ WiFi ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ํ›„ โ†ต๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋ฉด Network configuration Saved๋ผ๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ IoT ๋ฑƒ์ง€๊ฐ€ ์žฌ๋ถ€ํŒ…ํ•ฉ๋‹ˆ๋‹ค.

WebREPL ํ™œ์„ฑํ™”

์ด๋ฒˆ์—” WebREPL์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ WiFi ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ํ–ˆ๋˜ Network Config ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  B ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ IoT ๋ฑƒ์ง€์— ํ• ๋‹น๋œ IP ์ •๋ณด๊ฐ€ ํ‘œ๊ธฐ๋ฉ๋‹ˆ๋‹ค. ์ด IP๋Š” ์ปดํ“จํ„ฐ์—์„œ ์ ‘์†ํ•  WebREPL ์ฃผ์†Œ๊ฐ€ ๋˜๋ฏ€๋กœ ์ž˜ ๊ธฐ์–ตํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉํ–ฅํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ Webrepl ๋ฉ”๋‰ด๋กœ ์ง„์ž…ํ•˜๋ฉด WiFi ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •๊ณผ ์œ ์‚ฌํ•œ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ด๋Š” WebREPL์˜ ๊ฒฝ์šฐ IP๋ฅผ ์•Œ๋ฉด ๋ˆ„๊ตฌ๋‚˜ IoT ๋ฑƒ์ง€์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ๊ธฐ์ดˆ์ ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž„์˜์˜ ๊ฐ’์„ ์ž…๋ ฅ ํ›„ WebREPL ์—ฐ๊ฒฐ ์‹œ ์ž…๋ ฅํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , โ†ต๋ฅผ ์„ ํƒํ•˜๋ฉด, Webrepl password saved. ๋ž€ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ IoT ๋ฑƒ์ง€๊ฐ€ ์žฌ๋ถ€ํŒ…๋ฉ๋‹ˆ๋‹ค.

WebREPL ์ฝ”๋“œ ์„ค์น˜

์ด์ œ๋Š” ์ปดํ“จํ„ฐ์—์„œ WebREPL์„ ์ค€๋น„ํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ URL์—์„œ WebREPL ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ ๋†“์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์••์ถ•์„ ํ•ด์ œํ•˜๋ฉด webrepl.html ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฉด WebREPL ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ ‘์† URL์„ IoT๋ฑƒ์ง€์˜ IP์— ๋งž์ถฐ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. IP๊ฐ€ 192.168.1.58์ธ ๊ฒฝ์šฐ ws://192.168.1.58:8266/์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Connect ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ ์š”๊ตฌํ•˜๋Š” ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์•ž์„œ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‹œ๋ฆฌ์–ผ ์ผ€์ด๋ธ”๋กœ ์—ฐ๊ฒฐํ•œ REPL๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ๋ช…๋ น์„ ์ธ์‹ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WebREPL์„ ์ด์šฉํ•œ ํŒŒ์ผ ์†ก์ˆ˜์‹ 

REPL๊ณผ ๋‹ฌ๋ฆฌ WebREPL์€ ํŒŒ์ผ ์ „์†ก ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. WebREPL์˜ ์˜ค๋ฅธ์ชฝ ๋ฉ”๋‰ด๋ฅผ ๋ณด๋ฉด Send a file๊ณผ Get a file์ด๋ž€ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. Send a file์€ ํŒŒ์ผ์„ ์ปดํ“จํ„ฐ์—์„œ IoT ๋ฑƒ์ง€๋กœ ํŒŒ์ผ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ, Get a file์€ IoT ๋ฑƒ์ง€์˜ ํŒŒ์ผ์„ ์ปดํ“จํ„ฐ๋กœ ๋‚ด๋ ค ๋ฐ›๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์†ก์ˆ˜์‹  ์‹œ ์‹ ๊ฒฝ ์จ ์ฃผ์–ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, WebREPL์—์„œ ํŒŒ์ผ์„ ์†ก/์ˆ˜์‹ ํ•  ๋•Œ๋Š” IoT ๋ฑƒ์ง€์˜ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. uos.chdir ๋ช…๋ น์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ณณ์„ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์ผ์„ ์†ก์ˆ˜์‹ ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WebREPL CLI๋ฅผ ์ด์šฉํ•œ ํŒŒ์ผ ์ „์†ก

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ WebREPL์„ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋‚˜ ํŒŒ์ผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, Web browser๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ „์†ก ๊ฒฝ๋กœ ์„ค์ •์ด๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•ด๋‹น ๋™์ž‘์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ์‹œ ๋‹จ์ˆœ ๋ฐ˜๋ณต๋˜๋ฉด์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๊ฒƒ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์—…๋ฌด ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ Web Browser๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด WebREPL์—์„œ๋Š” CLI(webrepl_cli.py)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, Python ์‹คํ–‰ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด๋Š” ๋ฏธ๋ฆฌ ์ค€๋น„๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํŠน์ • ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ IoT ๋ฑƒ์ง€์˜ ํŠน์ • ๊ฒฝ๋กœ๋กœ ์ „์†กํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด webrepl_cli.py๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

webrepl_cli.py -p helloiot test.py 192.168.1.58:/apps/test/

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ IoT ๋ฑƒ์ง€์˜ IP๋Š” 192.168.1.58 ๊ทธ๋ฆฌ๊ณ  WebREPL ์ ‘์† ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” helloiot, ์ „์†กํ•˜๊ณ ์žํ•˜๋Š” ํŒŒ์ผ์€ test.py ๊ทธ๋ฆฌ๊ณ  ์ „์†ก๋˜๋Š” ์œ„์น˜๋Š” /apps/test/ ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

WebREPL CLI๋ฅผ ์ด์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ IDE์—์„œ ์ œ๊ณตํ•˜๋Š” Script ์‹คํ–‰ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ ์Šคํฌ๋ฆฝํŠธ ์„ธํŠธ๋„ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งบ์Œ๋ง

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Develper Day 2018 IoT ๋ฑƒ์ง€์˜ REPL ๋ฐ WebREPL ํ„ฐ๋ฏธ๋„์„ ์—ฐ๊ฒฐ๋ฐฉ๋ฒ•๊ณผ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋งˆ์ดํฌ๋กœ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฅผ IoT ๋ณด๋“œ์— ์ง์ ‘ ์˜ฌ๋ ค์„œ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™•์žฅํ•ด ๊ฐ€์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.