๐Ÿ Python/Project

[ํŒŒ์ด์ฌ ํ”„๋กœ์ ํŠธ] Python Struct (feat.c์–ธ์–ด)

18์ง„์ˆ˜ 2021. 9. 9. 02:03

์•ˆ๋…•ํ•˜์„ธ์š”. 

 

์š”์ฆ˜ LoRa์—์„œ End Device์—์„œ ๋ฐ”์ดํŠธํ˜•์‹์œผ๋กœ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด bytearray๋กœ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ๊ณ  ์žˆ๋Š”๋ฐ, ์—ฐ๊ตฌ์‹ค ํ˜•๋‹˜์ด Python Struct์„ ์ถ”์ฒœํ•ด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Python์ด ๊ต‰์žฅํžˆ ์ž˜ ๋งŒ๋“  ์–ธ์–ด์ด์ง€๋งŒ, ๋ฐ”์ดํŠธ๋‚˜ ๋น„ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. 

 

bytearray๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๊ฑฐ๋‚˜ checksum ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ PTSD๊ฐ€ ์™”๋Š”๋ฐ, Python Struct๋Š” ์ •๋ง ์‹ ์„ธ๊ณ„์— ๊ฐ€๊นŒ์› ์Šต๋‹ˆ๋‹ค.

checksum
bytearray

 


ํŒŒ์ด์ฌ Struct๋Š” C์–ธ์–ด Struct์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

https://docs.python.org/3/library/struct.html

 

struct — Interpret bytes as packed binary data — Python 3.9.7 documentation

struct — Interpret bytes as packed binary data Source code: Lib/struct.py This module performs conversions between Python values and C structs represented as Python bytes objects. This can be used in handling binary data stored in files or from network c

docs.python.org

 

https://coding-yoon.tistory.com/120

 

[C] UNION ๊ณต์šฉ์ฒด์™€ Struct ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ํŒจํ‚ท ๋งŒ๋“ค๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ UNION๊ณผ STRUCT์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. coding-yoon.tistory.com/119 [C] ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ์ ‘๊ทผ๊ณผ ์ตœ์ ํ™” ์š”์ฆ˜ ๊ธฐ๋ณธ๊ธฐ๊ฐ€ ์ค‘์š”ํ•จ์„ ๋А๋ผ๊ณ  C๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 1. ๊ตฌ์กฐ์ฒด ๋‹จ์ˆœํžˆ์ ‘๊ทผ

coding-yoon.tistory.com

 

์œ„ ๋‚ด์šฉ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ € ๋ง์ด ๋ฌด์Šจ ๋ง์ธ์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์•„๋ž˜์™€ ๊ฐ™์€ ํ•˜๋‚˜์˜ 14๋ฐ”์ดํŠธ์˜ packet์„ ์ „์†กํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ( ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‹ค์ œ ํŒจํ‚ท ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์‰ฌ์šด ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ทธ๋ฆผ์œผ๋กœ)

์œ„ union์„ ์„ค๋ช…ํ•˜๋Š” ๋ธ”๋กœ๊ทธ์—์„œ๋Š” __attribute__์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. __attribute__๋Š” ํŒจ๋”ฉ ๋น„ํŠธ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 16๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ 14๋ฐ”์ดํŠธ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. 

Packet

ํŒŒ์ด์ฌ์—์„œ ์œ„ ๊ฐ™์€ ๋ฐ”์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ํŒจํ‚ท์„ ๋ฐ›์„๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜? bytearray๋ฅผ ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด ์ •์‹ ์ด ํ˜ผ๋ฏธํ•ด์ง€์ง€๋งŒ,  Python Struct๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จธ๋ฆฌ์˜ ๋‘ํ†ต์ด ์‚ฌ๋ผ์ง„๋‹ค.

 

์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ํ•œ ์ค„์ด๋ฉด ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

from struct import *

"""
Do Something
"""

data = "14๋ฐ”์ดํŠธํŒจํ‚ท" # stirng ์•„๋‹˜ # <class 'bytes'>

payload = unpack('<Hfff',data)

u_cnt = payload[0]
lat = payload[1]
long_ = payload[2]
alt = payload[3]

unpack ๋ช…๋ น์–ด ํ•œ ์ค„๋กœ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

'<Hfff' ์˜ foramt ํ˜•์‹๋งŒ ์‚ฌ์šฉํ•  ์ค„ ์•Œ๋ฉด ๋œ๋‹ค. ๊ฐ„๋‹จํ•˜๋‹ค. ์œ„ python ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€ ์žˆ๋Š” ๋‚ด์šฉ์ด๋‹ค. 

 

1. ๋งจ ์ฒ˜์Œ์“ฐ๋Š” ๊ฒƒ์€ ๋ฐ”์ดํŠธ ์ •๋ ฌ์ด๋‹ค. ์œ„ ์‚ฌ์ง„์˜ ํŒจํ‚ท์€ litte endian์ด๋ฏ€๋กœ '<' ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 

byteorder

2. ๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ์ ์—ˆ๋‹ค๋ฉด, ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ํŒจํ‚ท์˜ ๊ตฌ์„ฑ์€ unsigned int(2), float(4), float(4), float(4)์˜ ์ˆœ์„œ๋กœ ์•„๋ž˜ ํ‘œ์˜ C Type์„ ๋ณด๊ณ  ํ•ด๋‹นํ•˜๋Š” format์„ ์ ์œผ๋ฉด๋œ๋‹ค.  'HFF'

๊ฒฐ๊ณผ์ ์œผ๋กœ unpack์€ list ํ˜•ํƒœ๋กœ payload๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

728x90
๋ฐ˜์‘ํ˜•