-
์ค๋งํธ ์นดํธ ์ค๊ณ๊ธฐ (3) - ๊ธฐ๋ฅ ํฉ์น๊ธฐ, NFC ์ฝ๋ฉ์ ์์Soliloquy 2020. 12. 25. 00:02
๐จ
๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ๊ณผ์ ์ตํฉ
ํ ํ๊ธฐ์ ์ ๋ฐ์ด ์ง๋ฌ์ ๋์ฏค, ํฐํ๋ด3์ ๋ค๋น๊ฒ์ด์ ๋ถ๋ถ์ ๋งก์ ์น๊ตฌ๊ฐ ์ํ๋ ์ขํ๊น์ง ์์ง์ด๋ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ์ ๊ฑฐ์ ๋ค ์์ฑํ๋ค๋ ๋ง์ ํ์๋ค. ์ฃผ์ ์ ์ ์ด ๋น ๋ฅด๊ธฐ๋ ํ๊ณ ๊ฐ์๊ฐ ๋๋ฆ๋๋ก ์๊ฐ์ด ์์๋ ๋ถ์ผ์ฌ์ ๊ทธ๋ฐ์ง ๋ค๋ฅธ ์กธ์ ์ํ ์ค๊ณ ํ๋ค๋ณด๋ค ์์ฑ ์๋๊ฐ ์์ฒญ ๋นจ๋๋ค.
์์ฝ๊ฒ๋ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ์ ์๊ฐ๋ณด๋ค ๊ณ ๋ คํด์ผ ํ ๋ถ๋ถ๋ค์ด ๋๋ฌด๋ ๋ง์๊ธฐ ๋๋ฌธ์, ์น๊ตฌ๊ฐ ๊ฐ์ ธ์จ ์ฝ๋๋ ๋ฐ๋ฅ๋ถํฐ ๋๊น์ง ์ง ์ฝ๋๋ ์๋์๋ค. ํ์ง๋ง, ์ผ๋จ ๊ฐ์ฅ ํฐ ๊ฑธ๋ฆผ๋์ด์๋ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ๋ง ๋คํ์ด์๋ค.
์น๊ตฌ๊ฐ ๊ฐ์ง ์ฝ๋๋ Python ํ์ผ๋ก turtlebot3_navigation์ด๋ผ๋ ROS ํจํค์ง์ ์ขํ๋ฅผ ๋ณด๋ด ์ด๋ํ๋ ๊ตฌ์กฐ์๋ค. ์ฐ๋ฆฌ๊ฐ ์๊ฐํ์ ๋ ๊ฐ์์ ์ฝ๋๋ฅผ ์ฐ๋ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ์์ ์น์๋ฒ ์์ค ํ์ผ์์ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ ์์ค๋ฅผ ๋ชจ๋์ฒ๋ผ import๋ก ๋ถ๋ฌ์์ ์น์๋ฒ ์ฝ๋ ๋ด์์ ์ง์ ์คํํ๋ ๋ฐฉ์์ด์๋ค.ํ์ง๋ง Python์ ๊ดํ ์ง์ ๋ถ์กฑ์ผ๋ก ์ธํด ๋ชจ๋ ํ์์ผ๋ก import๋ฅผ ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋น์์ ๊ตฌํํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ด์ ๊น์ง ์๊ณ ์์๋ ๋ฐฉ์์ ์์ฉํ๊ธฐ๋ก ํ๋ค.
์ฐ๋ฆฌ๊ฐ ์๊ฐํ ๋ฐฉ์์ ์คํ ์ ์๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅ ๋ฐ์ ์ ์๊ฒ ๋ง๋ค๊ณ Flask ๋ด์์ ํด๋น ํ์ผ์ Python์ ์ด์ฉํ์ฌ ๋ณ๋์ ์๋ก ์คํ์ํค๋ ๋ฐฉ๋ฒ์ด์๋ค. ์ผ๋จ์ ์ด๋ ๊ฒ ๊ตฌํํ๊ณ ๋์ค์ ์๊ฐ์ด ๋จ๋๋ค๋ฉด ๋ชจ๋์ฒ๋ผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๊ณต๋ถํ ๋ค์ ๋ฐ๊พธ๊ธฐ๋ก ํ๋ค.
์น๊ตฌ์๊ฒ ๊ทธ ์ฝ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ขํ ๊ฐ์ ๋ฐ์์ ๋์ํ๋๋ก ์์ ์ ๋ถํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๋ฌผํ ์์ธ ํ์ด์ง์์ ๋ฌผํ ์ถ์ ๋ฒํผ์ ๋๋ฅด๋ฉด Python์ subprocess ๋ชจ๋์ ์ด์ฉํด์ ์์์ ํ์ด์ฌ ํ์ผ์ ์คํ์ํค๋ ๊ฒ์ฒ๋ผ ์๋์ํค๋ ๋ฐ ์ฑ๊ณตํ๋ค.def send2ros(tablequery): print('x: ',tablequery.locationx,'y: ', tablequery.locationy,'z: ', tablequery.locationz ) subpro = subprocess.Popen(["python", "go_to_specific_point_on_map.py", str(tablequery.locationx), str(tablequery.locationy) ])
์์น ์ด๋ ๋ฒํผ์ ๋๋ ธ์ ๋ ์คํํ๋ ํจ์
๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ ์๋ ๋์์
NFC ๋ชจ๋ ์ฌ์ฉ๊ธฐ
์น ํ์ด์ง๋ฅผ ์ด๋ ์ ๋ ๋ง๋ฌด๋ฆฌํ๊ณ ๋ ๋ค NFC ๋ชจ๋์ ์์ ํ๊ธฐ ์์ํ๋ค. 1
๋ง๋ค์ด์ง ํ๋ก๊ทธ๋จ๋ค ๋ชจ๋ Python์ผ๋ก ์ฐ์์ผ๋, NFC ๋ชจ๋ ๊ตฌ๋ ๋ฐฉ์๋ Python์ผ๋ก ๊ตฌํํ๋ฉด ์ฝ๋ ์น์๋ฒ์ ์ฐ๋ํ๊ธฐ์ ์ข ๋ ์ ๋ฆฌํ์ง ์์๊น?๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ ์ฌ๋ฌ NFC ์๋ ํ๋ก๊ทธ๋จ์ ์ฐพ์๋ณด๋ค๊ฐ, nfcpy๋ผ๋ ํ๋ก๊ทธ๋จ์ด ๋์ ๋์๋ค.
nfcpy์ ์ฌ์ฉ
nfcpy๋ USB๋ UART๋ฅผ ์ด์ฉํ์ฌ ์๋ํ๋ ํ๋ก๊ทธ๋จ์ผ๋ก, ํ๋ก๊ทธ๋จ ์ฌ์ฉ ์ค๋ช ์ ๊ดํ ๋ฌธ์์ ์์ ํ๋ก๊ทธ๋จ๋ค์ด ๋ง์์ ์ข์๋ค.
์ํ ์ผ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ GPIO๋ฅผ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ, ์์ ํ๋ก๊ทธ๋จ์ ์ด์ฉํ์ฌ NFC ๋ชจ๋์ ์ฌ์ฉํด๋ณด์๋ค. ๋คํํ ๋ณ๋์ ๋ณด์กฐ์ ์ ์์ด NFC ๋ชจ๋์ ์ ์์ ์ผ๋ก ๋์ํจ์ ํ์ธํ ์ ์์๋ค.
์ด์ ์๋์ ์ด์์ด ์์์ ํ์ธ์ ํ๊ณ , nfcpy๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฅ ๋ณต์กํ ๋ฐฉ๋ฒ์ธ NFC ํ๊ทธ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ํ๋ก๊ทธ๋จ์ ์๋์์ผ๋ณด๋ ค๊ณ ํ๋ค. ํ์ง๋ง ์ํ๊น๊ฒ๋ nfcpy ๋ฌธ์์ ๊ธฐ๋ก๋ ์๋ฎฌ๋ ์ด์ ์ฝ๋๋ฅผ ์ ์ดํดํ์ง ๋ชปํ๋ ๋ฐ๋์ ์ ์์ ์ผ๋ก ๋์์ํฌ ์ ์์๋ค. ๋ค๋ฅธ ๋์์ผ๋ก ์์ ์ ์ ํ SNEP ํ๋กํ ์ฝ์ ์ด์ฉํด ๋ณด๊ธฐ๋ ํ๋ค.
ํด๋น ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด NFC ํ๊ทธ๊ฐ ์ฝํ๋์ง ํ์ธํ ์ ์์ด์ ๋ณด์ ๋ฉด์์๋ ์๋นํ ์ ์ฉํ๋ค ์ถ์๋๋ฐ, ํด๋ํฐ ๊ธฐ์ข ์ ๋ฐ๋ผ ์๋์ด ์๋ฒฝํ ๋์ง ์๋ ํธํ์ฑ์ ๋ฌธ์ ๊ฐ ์์๋ค. 2 ํ๋ ์ ์์ด NFC ํ๊ทธ ์๋ฎฌ๋ ์ด์ , SNEP ํ๋กํ ์ฝ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ํฌ๊ธฐํ๊ธฐ๋ก ํ๋ค. ๋์ NFC ์คํฐ์ปค์ ๊ฐ์ NFC ํ๊ทธ๋ฅผ NFC ๋ชจ๋์ ๋ณ๋๋ก ๋ถ์ฌ์ NFC ๋ชจ๋ –> NFC ํ๊ทธ –> ์ค๋งํธํฐ ์์ผ๋ก ์ฐ๋์ ํ๊ธฐ๋ก ํ๋ค. 3์๊ฐํ ๋ฐฉ๋ฒ๋๋ก ๊ตฌํํ๊ธฐ ์ํด nfcpy ์ค๋ช ์๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ ์์ ํ์ผ๋ค์ ๊ดํ ์ค๋ช ์ ๋ณผ ์ ์์๋ค. ์์ ํ์ผ ์ค ๋์๊ฒ ํ์ํ ํ์ผ์ tagtool.py ํ์ผ๋ก, tagtool.py format tt2 ๋ฅผ ์คํํ ๋ค์ tagtool.py load ‘ndef ํ์ผ ๊ฒฝ๋ก’๋ฅผ ์คํํ๋ฉด ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ค๋น๊ฒ์ด์ ๊ธฐ๋ฅ์ ์น์๋ฒ ๊ธฐ๋ฅ๊ณผ ํฉ์น ๋์ฒ๋ผ, ๊ฐ๋จํ subprocess๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ์ ํจ์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ๋จํ ์ตํฉํ์๋ค. ์ฐธ๊ณ ๋ก ndef ํ์ผ์๋ ์ํธ ์ฝ๋๊ฐ ํฌํจ๋ Flask ์๋ฒ URL์ด ์ ํ ์๋ค.
๋จ, ์ฌ๊ธฐ์ ํ์ํ ํ์ผ์ธ ndef ํ์ผ์ ์ด๋ป๊ฒ ์์ฑํ ์ ์๋์ง ์ด์ฌํ ์ฐพ๋ค๊ฐ, ndeftool์ด๋ผ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ์ฐพ์๋ค. ๊ทธ๋ ๋ค๋ฉด ndeftool๋ก ๋ง๋ค์ด์ง ํ์ผ์ ์ด๋ป๊ฒ ๋ณด๋ด๊ณ ๋ฐ์ ์ ์์๊น? ๋ผ๋ ๊ณ ๋ฏผ ๋์ ํ๋ค๊ฐ ์๋์ ๊ฐ์ ๊ตฌ์์ ํ์๋ค.- Flask ์๋ฒ๊ฐ ๋ก๊ทธ ์์์ด๋ ์ด๊ธฐ ์คํ ์ ๋น๋ฐ ๋ฒํธ๋ฅผ ํฌํจํ์ฌ ์ฌ์ดํธ ์ฃผ์๊ฐ ๋ด๊ธด ndefํ์ผ์ ๋ง๋ ๋ค. (์ฃผ์ ์์: https://***.ipdisk.co.kr/?passcode=1234)
- Tcp/Ip๋ฅผ ์ด์ฉํ์ฌ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์ a๋ผ๋ ๋ฌธ์๋ฅผ ๋ณด๋ด๋ฉด ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ Flask ์๋ฒ์ ์จ๊ฒจ์ง ๊ฒฝ๋ก์์ ndef ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.
- ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด๋ ๋ค์ด๋ก๋๋ ndef ํ์ผ์ ์ด์ฉํ์ฌ nfc ํ๊ทธ์ ํด๋น URL์ ๊ธฐ๋กํ๋ค.
- ์ฌ์ฉ์๋ ํด๋ํฐ์ผ๋ก ํด๋น ํ๊ทธ๋ฅผ ํ๊น ํ์ฌ ์น ์๋น์ค์ ์ ์ํ๋ค.
์ด๋ ๊ฒ ํ๋ค๋ฉด https๋ฅผ ํตํด ํ์ผ์ด ์ํธํ๋์ด ์ ์ก๋๋ฏ๋ก ์ 3์๋ ์ํธ ์ฝ๋๋ฅผ ๊ฐ๋ก์ฑ ์ ์์์ผ๋ฉฐ, ๋ฐ๋ผ์ ๋ณด์์ ์ ๋ฆฌํ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํ ๋๋ก ndef ํ์ผ ์ ์ก ๊ตฌํ์ ์ฑ๊ณตํ์ผ๋ฉฐ, ๋์๋ ์ ์์ ์์ ํ์ธํ ์ ์์๋ค.
context = ssl._create_unverified_context() def get_ndef(): ##url ndefdata = request.urlopen(url,context=context).read() with open('./urlreceived.ndef', 'wb') as f: f.write(ndefdata) if data.decode('utf-8') == 'a' : get_ndef() subpro1 = subprocess.Popen(['python', 'tagtool.py', '--device', '/dev/ttyS0', 'format', 'tt2']) print('subpro1 ended') subpro2 = subprocess.Popen(['python', 'tagtool.py', 'load', 'urlreceived.ndef']) print('subpro2 ended')
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์ ์ฌ์ฉ๋๋ Subprocess์ tagtool.py๋ฅผ ์ฌ์ฉํ ์ฝ๋
@app.route('/url.ndef', methods=['GET']) def urlndef(): if request.args.get('passcode', "pass") == ndefpasskey : return send_from_directory(app.static_folder, request.path[1:]) else : flash('Wrong url download code') return redirect ('/') def nfcdatacreate(secretword) : #On windows, pip install python-magic-bin==0.4.14 subpro = subprocess.Popen(["ndeftool","uri", "https://***.ipdisk.co.kr?passcode=" + str(secretword), "save","--force", "./static/url.ndef"], close_fds=True) time.sleep(0.5) #nfcํ์ผ์ด ์๊ธธ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ
Flask ์๋ฒ์์ ์ฌ์ฉ๋๋ ์ฝ๋
์๊ฐ์ง ๋ชปํ ๋ฌธ์
์๋์ด ์ ๋ ๋๋ ์์ง๋ง, ์๋์ ๊ฐ์ด ๊ฐํน NFC ๋ชจ๋์ ์ฐพ์ ์ ์๋ค๋ฉด์ ์๋์ ์คํจํ๋ ๊ฒฝ์ฐ๋ ๊ฐ๋์ฉ ์์๋ค. ๋ด๊ฐ ๊ฒช์ ์๋ ์คํจ ์ํฉ์ ํฌ๊ฒ ๋ ๊ฐ์ง ์ํฉ์ผ๋ก ๋๋์ด์ก๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ํฉ์ ๋ถํ ํ ์ฒ์ NFC๋ฅผ ์ฌ์ฉํ ๋, ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ํฉ์ ์๊ฐ์ ๊ด๊ณ์์ด ๋ฌด์์๋ก ๋ํ๋๋ ๊ฒฝ์ฐ์๋ค.
[nfc.clf] searching for reader on path tty:S0
[nfc.clf] searching for reader on path tty:S0
[nfc.clf] using PN532v1.6 at /dev/ttyS0
** waiting for a tag **
[nfc.clf.pn532] input/output error while waiting for ack
[nfc.clf] [Errno 5] Input/output error
[nfc.clf.pn532] input/output error while waiting for ack
[nfc.clf] no reader available on path tty:S0
[main] no contactless reader found on tty:S0
[main] no contactless reader availableNFC ๋ชจ๋ ์ฝ๊ธฐ์ ์คํจํ ๋ฉ์์ง
์ค๋ฅ๊ฐ ๋๋ ์ด์ ๊ฐ ๋ฌด์์ธ์ง ๊ณ ๋ฏผํ๋ค๊ฐ ํน์๋ subprocess.Popen๋ฅผ ์ด์ฉํ tagtool.py์ด ๊ฑฐ์ ๋์์ 2๋ฒ ์ฌ์ฉ๋์ด ์ฝ๊ธฐ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ธ๊ฐ?๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋ ๋ค๋ฉด, ๋์ ์คํ์ด ๋์ง ์๊ฒ ๋ง๋ค์ด์ผ ํ ๊ฒ ๊ฐ์๋ฐ… ๋ผ๋ ์๊ฐ์ด ๋ค์ด์ ๊ณ ๋ฏผํ๋ค๊ฐ, time.sleep(0.5) ๋ก ๋์ ์คํ์ ๋ฐฉ์งํ๊ธฐ๋ก ํ๋ค.
subpro1 = subprocess.Popen(['python3', './tagtool.py', '--device', 'tty:S0', 'format', 'tt2']) time.sleep(0.5) subpro2 = subprocess.Popen(['python3', './tagtool.py', 'load', 'urlreceived.ndef'])
๊ฐ๋จํ time.sleep๋ง ์ถ๊ฐํ ์ฝ๋
์์ ๋ ์ฝ๋๋ก ์คํ์ ํด ๋ณธ ๊ฒฐ๊ณผ, ๋ฌด์์๋ก ๋ํ๋๋ ์ธ์ ๋ถ๋ ๋ฌธ์ ์๋ ํจ๊ณผ๊ฐ ์กฐ๊ธ ์๋ ๋ฏํ๋ค. ํ์ง๋ง, ๋ถํ ์งํ์ NFC ๋ชจ๋์ด ์ธ์์ด ์ ๋๋ ํ์์ ํด๊ฒฐํ ์ ์์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ์ด ํ์ํด ๋ณด์๋ค.
NFC ๋ชจ๋ ์ธ์ ์คํจ์จ์ ์ค์ด๊ธฐ ์ํ ์๋
์ธ์ ์คํจ์จ์ ์ค์ด๊ธฐ ์ํด ์๋์ ๊ฐ์ ๋ฐฉ์์ ์๊ฐํ๋ค.
- NFC ๋ชจ๋์ ๊ต์ฒด
- NFC ๋ชจ๋์ ๋ถ๋์ด๊ฑฐ๋ NFC๋ฅผใน ๋๋ฌด ๋ง์ด ์ฌ์ฉํด์ NFC ๋ชจ๋์ด ๊ณ ์ฅ์ด ๋ฌ์ ์๋ ์๋ค๋ ์๊ฐ์ด์๋ค. - ๋ธ๋ฃจํฌ์ค ๊ธฐ๋ฅ ๋๊ธฐ
- ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด3์๋ ๋ธ๋ฃจํฌ์ค์ UART๋ฅผ ๋์์ ์ฌ์ฉ ์ค์ด๋ฏ๋ก ํผ์ ์ด ์์ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ธ๋ฃจํฌ์ค ๋ชจ๋์ ๊บผ๋ณด๋ ๊ฒ๋ ์ข์ ์๋์ผ ๊ฒ ๊ฐ์๋ค. - ๋ชจ๋ ํต์ ๋ฐฉ์์ ์์
- ๋ค๋ฅธ ํต์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ข ๋ ๋์์ง์ง ์์๊น? - NFC ์๋ ๋ฐฉ์์ ์์
- nfcpy๋ฅผ ์ด์ฉํ๋ Tagtool.py์ subprocess๋ก ์ธํ ๋ฒ๊ทธ์ ๋ฐ์์ผ ๊ฒ์ด๋ค. Tagtool.py์ subprocess ์ฌ์ฉ์ ํ์ง ์๊ณ , nfcpy๋ง ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ๋ฉด ํด๊ฒฐ๋ ์๋ ์๋ค.
์ฐ์ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ธ NFC ๋ชจ๋์ ๊ต์ฒด๋ฅผ ๋จผ์ ํด๋ณด์๋ค. ํ์ง๋ง ์ํ๊น๊ฒ ๊ต์ฒด ํ์๋ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์๋ค.
๋ ๋ฒ์งธ ๋ฐฉ์์ผ๋ก ๋ธ๋ฃจํฌ์ค ๋ชจ๋์ ๋๊ณ NFC ๋ชจ๋ ์ฝ๊ธฐ๋ฅผ ์๋ํ์๋ค. ์ด๋ ๋ด ์ค์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋ธ๋ฃจํฌ์ค๋ฅผ ๊บผ๋ฒ๋ฆฌ๋ ๊ธฐ์กด์ ttyS0๋ก ์๋ํ๋ ์ฝ๋๊ฐ ์๋์ ์์ ํ์ง ์๊ฑฐ๋ ๋ ๋ถ์์ ํ๊ฒ ์๋ํ๋ค. ๋ธ๋ฃจํฌ์ค๋ฅผ ๋๋ ๋ฐฉ๋ฒ๋ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ ๋์ ์ธ ๋ฒ์งธ ๋ฐฉ์์ธ ๋ค๋ฅธ ํต์ ๋ฐฉ๋ฒ์ ์๋ํ๋ ค๊ณ ํ์ผ๋, nfcpy๋ ๋ค๋ฅธ ํต์ ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์๋ ๋ฏํ๋ค. nfcpy๋ฅผ ํฌ๊ธฐํ๊ณ ๋ค๋ฅธ ๋ชจ๋์ด๋ ํ๋ก๊ทธ๋จ๋ค์ ์ฐพ๋ ๊ฒ ๋์์ง ๊ณ ๋ฏผํ์ง๋ง, ์๋ฌด๋๋ ๋ค ๋ฒ์งธ ๋ฐฉ์์ด ๋จ์ ์์ผ๋, ๋ค ๋ฒ์งธ ๋ฐฉ์์ ๋จผ์ ํด๋ณด๊ธฐ๋ก ํ๋ค. 4
๋ง์ง๋ง์ผ๋ก ์๋จ์ธ ์๋ ๋ฐฉ์์ ์์ ์ด์๋ค. ์๋ ๋ฐฉ์์ ์์ ํ๊ธฐ ์ํด์ ๊ธฐ๋ณธ์ ์ผ๋ก nfcpy Python ๋ชจ๋์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์๊ฐ์ผ ํ๋ค. ๋ฌธ์ํ๊ฐ ์ ๋์ด ์์ด์ ์์ ๋ฅผ ์ฐธ์กฐํ๋ฉด์ ์กฐ๊ธ์ฉ ๋ฐฐ์ ๋๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ 3์ผ ๋์ nfcpy ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋ฒ์ ์ฐธ์กฐํ๋ฉฐ ์ฝ๋๋ฅผ ํ๋์ฉ ํํค์ณ ๋๊ฐ๋ค. ๋ด๊ฐ ์๋ก ์์ฑํ ์ฝ๋๋ tagtool.py๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์ ndef ํ์ผ์ ์ฝ๋ ์ ์ฐจ, nfc ํ๊ทธ์ URL์ ๊ธฐ๋กํ๊ธฐ ์ nfc ํ๊ทธ๋ฅผ ์ด๊ธฐํํ๋ ์ ์ฐจ, ๊ทธ๋ฆฌ๊ณ time.sleep ๊ตฌ๋ฌธ์ด ํ์ ์์ด์ก๋ค. ๋๋ถ์ ์๋ ์๋์ ์์ ์ฑ๋ ํจ์ฌ ์ข์์ก๋ค. 5
if data.decode('utf-8') == 'a' : with nfc.ContactlessFrontend('tty:S0') as clf: target = clf.sense(RemoteTarget('106A')) tag = nfc.tag.activate(clf, target) record = ndef.UriRecord(get_uri()) tag.ndef.records=[record]
๊ฐ๊ฒฐํด์ง NFC ํ๊ทธ ์ฝ๋
๊ธฐ์กด์๋ ndef ํ์ผ์ Flask ์๋ฒ์์ ๋ง๋ ๋ค ํด๋น ndef ํ์ผ์ ์ ์ก๋ฐ์์ ndef ํ์ผ์ ์ฝ๊ณ ํด๋น ํ์ผ์ NFC ํ๊ทธ์ ๊ธฐ๋กํ๋ ๋ฐฉ์์ด์๋ค๋ฉด, ์๋ก์ด ๋ฐฉ์์ Flask ์๋ฒ์์ ndef ํ์ผ์ด ์๋ ๋ฐ๋์ด์ง ์ฌ์ดํธ์ URL์ ์ํธ ์ฝ๋๋ง ๋ฐ์๋ ์๋ํ ์ ์๋ ๋ฐฉ์์ด์๋ค.
NFC ๋ชจ๋ ๊ตฌ๋ ์ฝ๋์ ์์ ๊ณผ ํจ๊ป, Flask ์๋ฒ์ ์ฌ์ฉ๋ ์ฝ๋๋ ์๋ก์ด ๋ฐฉ์์ ๋ง์ถฐ์ ๋ณ๊ฒฝํด์ค์ผ ํ๋ค. ๊ธฐ์กด์ ndef ํ์ผ์ ์์ฑํ๋ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ณ , ndef ํ์ผ์ ๋ณด๋ด๋ ๊ฒ ๋์ ์ Resoponse๋ฅผ ํตํด ์ฌ์ดํธ์ URL๊ณผ ์ํธ ์ฝ๋ ํ ์คํธ๋ง https๋ก ์ ์กํ๋๋ก ๋ณ๊ฒฝํ๋ค.
@app.route('/url.ndef', methods=['GET']) def urlndef(): if request.args.get('passcode', "pass") == ndefpasskey : return Response("https://beatcart.ipdisk.co.kr/?passcode=" + str(secretword), mimetype='text/plain') else : flash('Wrong url download code') return redirect ('/')
์๋ก ์์ฑ๋ Flask ์๋ฒ์์ ์ฌ์ฉ๋๋ ์ฝ๋
์์ ์ฑ ํฅ์
50๋ฒ์ ์ฐ์์ ์ธ NFC ์ฐ๊ธฐ ์คํ์ ํด๋ดค์ง๋ง, NFC ๋ชจ๋ ์ฌ์ฉ์ ์คํจ๋ฅผ ํ ์ ์ ์์๋ค. ํน์๋ ๋ฐ์ํ ์ ์๋ ์ฝ๊ธฐ ์คํจ์ ๋๋นํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก NFC ๋ชจ๋ ํ์ง์ ์ฑ๊ณตํ ๋๊น์ง 1์ด๋ง๋ค ๋ชจ๋์ ๊ฒ์ํ๊ฒ ์์ ํ๋ค. 6
with nfc.ContactlessFrontend('tty:S0') as clf: while True: target = clf.sense(RemoteTarget('106A')) if target is None: sleep(1) print("NFC Module Searching..") continue ##Search everytime else: print("Found a NFC Module") break
NFC ๊ฒ์์ ์ง์์ ์ผ๋ก ํ๋ ๋ฌดํ ๋ฃจํ ์ฝ๋
๋ฌดํ ๋ฃจํ๋ฅผ ์ฌ์ฉํ NFC ์ฐ๊ธฐ ์ฝ๋๋ฅผ ๊ต์๋๊ป ๋ณด์ฌ๋๋ ธ๋๋ฐ, ๊ต์๋๊ป์ ์ด๋ฐ ์์ while๋ฌธ ๋ฌดํ ๋ฃจํ๋ ์ข ์ํํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ง์ ํด ์ฃผ์ จ๋ค. ๊ทธ๋์ ์ต์ข ์ ์ผ๋ก๋ ์ต์ข ํ์๊ฐ ์ ํด์ง for ๋ฌธ์ผ๋ก ๊ตฌํํ์๋ค. ์ด๋ ๊ฒ NFC ํ๊ทธ ๋ชจ๋ ์ฝ๋๋ฅผ ๋์ ๋งบ์ ์ ์์๋ค.
for i in range(30) : ##for safe coding, retry 30 times for searching a nfc module. with nfc.ContactlessFrontend('tty:S0') as clf: target = clf.sense(RemoteTarget('106A')) if target is None: sleep(1) print("Failed to find NFC Module, retrying..") continue ##Search everytime else: print("Found a NFC Module") tag = nfc.tag.activate(clf, target) record = ndef.UriRecord(get_uri()) tag.ndef.records=[record] print("Wrote on a tag") break if i == 29 : print("Couldn't find nfc tag") exit()
์์ฑ๋ NFC ์ฐ๊ธฐ ์ฝ๋ ์ผ๋ถ
[๋ณธ๋ฌธ ๋์์ ํ์ผ]
- ๋ด๊ฐ ๊ณ ๋ฅธ NFC ๋ชจ๋์ ITHEAD์ฌ์์ ๋ง๋ค์์ผ๋ฉฐ PN532 ์นฉ์ ์ ์ฌ์ฉํ๋ฉฐ, UART, I2C, SPI ํต์ ์ ์ง์ํ์๋ค. [๋ณธ๋ฌธ์ผ๋ก]
- ์ค์ ์ฌ์ฉ์ ํด ๋ณธ ๊ฒฐ๊ณผ ์ด์ํ๊ฒ ๊ฐค๋ญ์ ํด๋ํฐ์์๋ ์ธ์์ด ๋์ง ์๊ณ LG ํด๋ํฐ์์๋ง ์๋์ ํ์์ผ๋ฉฐ, ์ธํฐ๋ท์์๋ ์์ดํฐ์์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ง์ ์ฐพ์ ์ ์์๋ค. [๋ณธ๋ฌธ์ผ๋ก]
- ์ฐธ๊ณ : https://github.com/nfcpy/nfcpy/issues/111 [๋ณธ๋ฌธ์ผ๋ก]
- ์ถ์ฒ: https://stackoverflow.com/questions/44845043/using-nfcpy-and-spi-to-connect-pn532-to-rasperry-pi#comment76672809_44845605 [๋ณธ๋ฌธ์ผ๋ก]
- ์ฐธ๊ณ : https://blog.sigsec.net/posts/2019/04/reading-and-writing-nfc-tags.html [๋ณธ๋ฌธ์ผ๋ก]
- ์ฐธ๊ณ : https://blog.sigsec.net/posts/2019/04/reading-and-writing-nfc-tags.html [๋ณธ๋ฌธ์ผ๋ก]