Lorawan-stack: ํ•˜๋‚˜์˜ ํ˜•์‹์—์„œ ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ ์ง€์›

์— ๋งŒ๋“  2019๋…„ 08์›” 13์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: TheThingsNetwork/lorawan-stack

์š”์•ฝ

ํ•˜๋‚˜์˜ ttnpb.ApplicationUp ๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ํ”„๋ŸฐํŠธ ์—”๋“œ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™œ ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

ํ˜„์žฌ, ํ•˜๋‚˜์˜ ttnpb.ApplicationUp ๋Š” ํ•˜๋‚˜์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ ๋ฉ”์‹œ์ง€(ํ•˜๋‚˜์˜ HTTP ํ˜ธ์ถœ, ํ•˜๋‚˜์˜ MQTT ๋ฉ”์‹œ์ง€ ๋“ฑ)๋กœ ์ด์–ด์ง€๋Š” ํ•˜๋‚˜์˜ ๋ฐ”์ดํŠธ ์Šฌ๋ผ์ด์Šค๋กœ๋งŒ ๋งˆ์ƒฌ๋ง๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—…๋งํฌ์˜ ํŽ˜์ด๋กœ๋“œ์— ์—ฌ๋Ÿฌ ์ธก์ •๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ(ํ•˜๋‚˜์˜ ์žฅ์น˜์— ์—ฐ๊ฒฐ๋œ ์—ฌ๋Ÿฌ ์„ผ์„œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค) ํŠน์ • ํ˜•์‹์ด ๊ฐ ์ธก์ •๊ฐ’์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ฑฐ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/TheThingsNetwork/lorawan-stack/blob/9112dd7bcd3f1f03190055542908b427b27acd1c/pkg/applicationserver/io/formatters/formatter.go#L23
์ด ํ˜•์‹์€ ํ˜„์žฌ ํ”„๋ŸฐํŠธ ์—”๋“œ๋กœ ๋ณด๋‚ผ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์—†์–ด์ง„ ๋ฌผ๊ฑด ์žˆ์–ด์š”? ๋ญ๋ฅผ๋ณด๊ณ  ์‹ถ์œผ์„ธ์š”?

๊ฒฐ๊ณผ๋Š” []byte ์—์„œ [][]byte ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ

93ea01b4b5af2672da5883b570be825a54b8afc1

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

Format ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ๊ฐ ํ”„๋ŸฐํŠธ ์—”๋“œ๋Š” ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„๋ก ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ณ  Pull Request๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ํ•˜์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋‚จ๊ฒจ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

application server needtriage

๋ชจ๋“  12 ๋Œ“๊ธ€

@adriansmares ์ €๋Š” ํ˜„์žฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. formatter.go ํŒŒ์ผ์—์„œ *ttnpb.ApplicationUp ํ•จ์ˆ˜๋ฅผ []byte์—์„œ [][]byte๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ json.go ๋ฐ protobuf.go ํŒŒ์ผ์—์„œ๋„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
image
์นœ์ ˆํ•˜๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@mihirr93 ์ด์ œ ๊ฒฐ๊ณผ ์กฐ๊ฐ(๊ฐ ๊ฒฐ๊ณผ๋Š” ๋ฐ”์ดํŠธ ์กฐ๊ฐ์ž„)์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ [][]byte{ slice-containing-result } ๋กœ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜๋˜๋Š” ์œ„์น˜๋ฅผ ๋ž˜ํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” Mr. @adriansmares ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ”„๋ก ํŠธ ์—”๋“œ ๋ฉ”์‹œ์ง€(์›์‹œ ํŽ˜์ด๋กœ๋“œ)๋ฅผ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋กœ ๋ถ„ํ• ํ•˜๋„๋ก ๋ฌถ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์Šฌ๋ผ์ด์‹ฑ๋˜๋Š” ์ง€์ ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ธ์ฝ”๋”ฉ(์นด์ด์—” ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฝ”๋”ฉ)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋””์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ TTN์˜ ํŽ˜์ด๋กœ๋“œ ํ˜•์‹ ํƒญ์— ๋””์ฝ”๋”๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‹ค์ œ๋กœ ๋””์ฝ”๋”ฉ๋œ ๊ฐ’์„ JSON์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ฆผ ์ฐธ์กฐ). ์ด ๋””์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ง์ ‘ ๋ถ„ํ• ํ•˜๊ณ  http๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
image
์ด ํ˜ผ๋ž€์— ๋Œ€ํ•ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์กฐ๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๊ทธ๋ฆฌ๊ณ  pkg ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด .proto ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๊นŒ?
๊ท€ํ•˜์˜ ์นœ์ ˆํ•œ ์ง€์›๊ณผ ์‹œ๊ฐ„์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

_์ด ์ €์žฅ์†Œ์—๋Š” LoRaWAN ์Šคํƒ์˜ V3 ๋ฒ„์ „์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ œ๊ณต๋œ ์‚ฌ์ง„์€ V2 ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋Š” TTN์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค._

์ด ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€์—์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด๋กœ๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ง€์›๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ ๊ด€์‹ฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ˜•์‹ ๋ฌธ์ œ๋Š” https://github.com/TheThingsNetwork/lorawan-stack/issues/1158์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ๋กœ ์ฐพ๊ณ  ์žˆ๋Š” ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๊ฒฝ์šฐ ์—…๋งํฌ ๋‚ด๋ถ€์—์„œ ๋ฐœ๊ฒฌ๋œ ๋””์ฝ”๋”ฉ๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” JSON ํ˜•์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ˜•์‹์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
DecodedPayload ํ•„๋“œ์˜ ์ผ๋ถ€๋กœ ๊ด€์‹ฌ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ApplicationUp_UplinkMessage ์—…๋งํฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด proto ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์Šคํƒ์˜ ๋‚ด๋ถ€ ์ž‘์—…๊ณผ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ €๋Š” #1158์ด ์•„๋‹Œ ์ด ๋ฌธ์ œ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ApplicationUp_Uplinkmessage ์ˆ˜์ •์„ ์ œ์•ˆํ•˜์…จ๋“ฏ์ด ์ €๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1) ApplicationUplink ๊ตฌ์กฐ์ฒด์™€ ApplicationUp_UplinkMessage ํ•จ์ˆ˜๋Š” ttnpb ๋””๋ ‰ํ† ๋ฆฌ์˜ messages.pb.go ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŒŒ์ผ์˜ ํ—ค๋”์—๋Š” "DO NOT EDIT"๊ฐ€ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์‹œํ•ด์•ผ ํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?
2) " introduce a new format, based on the JSON one "์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ƒˆ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ๊ธฐ์กด ํ˜•์‹์„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
3) ๋˜ํ•œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ ๋ž˜ํ•‘์— ๋Œ€ํ•ด์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ๊ฐ€? ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋‚˜๋กœ ๋‹ค์‹œ ๊ฒฐํ•ฉํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์—…๋งํฌ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

[์ง€์†์ ์ธ ์ง€๋„๋ฅผ ํ•ด์ฃผ์‹  @adriansmares ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋น„๋ก golang ํŠœํ† ๋ฆฌ์–ผ์„ ์ˆ˜๊ฐ•ํ–ˆ์ง€๋งŒ, ์ด๊ฒƒ์€ GO ์–ธ์–ด์™€์˜ ์ฒซ ์ƒํ˜ธ์ž‘์šฉ์ž…๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ํŒŒ์ผ์ด๋‚˜ *.pb.* ํŒŒ์ผ์„ ํŽธ์ง‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. mage proto:all ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ *.proto ํŒŒ์ผ์—์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด ๋ฌธ์ œ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ทธ๋Ÿฌํ•œ ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ๊ทธ ๋‚ด์šฉ์„ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.
  • ๋ž˜ํ•‘ ์ œ์•ˆ์„ ํ†ตํ•ด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์—ฌ์ „ํžˆ ํ•˜๋‚˜์˜ ์—…๋งํฌ ๋ฉ”์‹œ์ง€์—์„œ ๊ฒŒ์‹œํ•  ํ•˜๋‚˜์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•จ).

์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋” ์ž˜ ์„ค๋ช…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋น›์„ ๋น„์ถฐ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์žฅ์น˜๋Š” 1๊ฐœ์˜ ์—…๋งํฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  2. 1 ์—…๋งํฌ๋Š” ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ˆ˜์‹ ํ•˜์—ฌ ๊ฒŒ์ดํŠธ์›จ์ด ์„œ๋ฒ„๋กœ ๋ณด๋‚ด ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. AS์— ๋„๋‹ฌํ•˜๋Š” ๋ฉ”์‹œ์ง€๋Š” *ttnpb.ApplicationUplink ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  3. ์• ์ฆˆ ๋””์ฝ”๋”ฉ ๋œ ํ•„๋“œ์— ์ด์ง„ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•ด 1์ด ๊ฐœ ์—… ๋งํฌ ๋ฐ ์‹œ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (์˜ ๋ฐ”์ดํŠธ ํšŒ์ „ FRMPayload ์˜ ๋ณตํ˜ธํ™” ๊ตฌ์กฐ๋กœ ํ•„๋“œ DecodedPayload ๋””๋ฐ”์ด์Šค ํŽ˜์ด๋กœ๋“œ ํฌ๋งท์„ ์ด์šฉํ•˜์—ฌ).
  4. ๊ทธ๋Ÿฐ ๋‹ค์Œ *ttnpb.ApplicationUp ๋กœ ํฌ์žฅํ•˜์—ฌ ํ”„๋ŸฐํŠธ์—”๋“œ(MQTT, ์›นํ›…, PubSub, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง€)๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  5. ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ด 1 *ttnpb.ApplicationUp ์ˆ˜์‹ ํ•˜๊ณ  ์„ค์ •(ํ˜•์‹)์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ํฌ๋งทํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค(ํฌ๋งทํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” pkg/applicationserver/io/formatters ).
  6. ํ”„๋ก ํŠธ์—”๋“œ๋Š” 1 *ttnph.ApplicationUp formatter.FromUp ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  1 ๋ฉ”์‹œ์ง€์˜ ๋ณธ๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”์ดํŠธ ์กฐ๊ฐ( []byte )์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ 6๋‹จ๊ณ„์—๋งŒ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • FromUp ๊ฐ€ ์—ฌ๋Ÿฌ ํŽ˜์ด๋กœ๋“œ(๋ฐ”์ดํŠธ ์กฐ๊ฐ ์กฐ๊ฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด Protobuf ๋ฐ JSON ํ˜•์‹์€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๊ณ„์†ํ•ด์„œ 1๊ฐœ์˜ ํŽ˜์ด๋กœ๋“œ๋งŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋ž˜์„œ ๋žฉ์ด ํ•„์š”ํ•œ ์ด์œ ).
  • [][]byte ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ด 2๊ฐœ(์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํฌ๋งทํ„ฐ)๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค( FromUp ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์†Œ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด๋กœ๋“œ๋งŒ ์ˆ˜์‹ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฏ€๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ ์‚ฌ์ดํŠธ๋Š” ํŽ˜์ด๋กœ๋“œ ๋ชฉ๋ก์„ ํ†ตํ•ด ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ๊ฐ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋™์ž‘์„ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋œ ํ›„์—๋งŒ ๊ฐ ์ธก์ •์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์—ฌ๋Ÿฌ ํŽ˜์ด๋กœ๋“œ ์กฐ๊ฐ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ ์œ ํ•œ ํฌ๋งทํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด ์ƒˆ๋กœ์šด ํ˜•์‹์€ ์ด ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค!).

@adriansmares ์˜ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ๊ฐ€์ด๋“œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ./mage go:test js:test jsSDK:test ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์•„๋ž˜์— ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
formatter.go

type Formatter interface {
    FromUp(*ttnpb.ApplicationUp) ([][]byte, error)
    ToDownlinks([]byte) (*ttnpb.ApplicationDownlinks, error)
    ToDownlinkQueueRequest([]byte) (*ttnpb.DownlinkQueueRequest, error)
}

json.go

func (json) FromUp(msg *ttnpb.ApplicationUp) ([][]byte, error) {
    m, e := jsonpb.TTN().Marshal(msg)
    return [][]byte{m}, e
}

protobuf.go
๊ฐ™์€ ์ƒ๊ธฐ์™€

mqtt.go

buf, err := c.format.FromUp(up.ApplicationUp)
                if err != nil {
                    logger.WithError(err).Warn("Failed to marshal upstream message")
                    continue
                }
                logger.Debug("Publish upstream message")
                for _, v := range buf {
                    c.session.Publish(&packet.PublishPacket{
                        TopicName:  topic.Join(topicParts),
                        TopicParts: topicParts,
                        QoS:        qosUpstream,
                        Message:    v,
                    })
                }

pubsub.go
๊ฐ™์€ ์ƒ๊ธฐ์™€

webhooks.go

unc (w *webhooks) newRequest(ctx context.Context, msg *ttnpb.ApplicationUp, hook *ttnpb.ApplicationWebhook) ([]*http.Request, error) {
    var cfg *ttnpb.ApplicationWebhook_Message
    switch msg.Up.(type) {
    case *ttnpb.ApplicationUp_UplinkMessage:
        cfg = hook.UplinkMessage
    case *ttnpb.ApplicationUp_JoinAccept:
        cfg = hook.JoinAccept
    case *ttnpb.ApplicationUp_DownlinkAck:
        cfg = hook.DownlinkAck
    case *ttnpb.ApplicationUp_DownlinkNack:
        cfg = hook.DownlinkNack
    case *ttnpb.ApplicationUp_DownlinkSent:
        cfg = hook.DownlinkSent
    case *ttnpb.ApplicationUp_DownlinkFailed:
        cfg = hook.DownlinkFailed
    case *ttnpb.ApplicationUp_DownlinkQueued:
        cfg = hook.DownlinkQueued
    case *ttnpb.ApplicationUp_LocationSolved:
        cfg = hook.LocationSolved
    }
    if cfg == nil {
        return nil, nil
    }
    url, err := url.Parse(hook.BaseURL)
    if err != nil {
        return nil, err
    }
    url.Path = path.Join(url.Path, cfg.Path)
    expandVariables(url, msg)
    if err != nil {
        return nil, err
    }
    format, ok := formats[hook.Format]
    if !ok {
        return nil, errFormatNotFound.WithAttributes("format", hook.Format)
    }
    buf, err := format.FromUp(msg)
    if err != nil {
        return nil, err
    }
    var requests []*http.Request
    for i, v := range buf {
        req, err := http.NewRequest(http.MethodPost, url.String(), bytes.NewReader(v))
        requests[i] = req
        if err != nil {
            return nil, err
        }
        for key, value := range hook.Headers {
            req.Header.Set(key, value)
        }
        if hook.DownlinkAPIKey != "" {
            req.Header.Set(downlinkKeyHeader, hook.DownlinkAPIKey)
            req.Header.Set(downlinkPushHeader, w.createDownlinkURL(ctx, hook.ApplicationWebhookIdentifiers, msg.EndDeviceIdentifiers, "push"))
            req.Header.Set(downlinkReplaceHeader, w.createDownlinkURL(ctx, hook.ApplicationWebhookIdentifiers, msg.EndDeviceIdentifiers, "replace"))
        }
        req.Header.Set("Content-Type", format.ContentType)
        req.Header.Set("User-Agent", userAgent)
    }
    return requests, nil
}

ํ”ผ๋“œ๋ฐฑ๊ณผ ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค. ์ž‘์—…์ด ์™„์ „ํžˆ ์™„๋ฃŒ๋˜๋ฉด ์ฝ”๋“œ ์Šคํƒ€์ผ ์ง€์นจ์— ๋”ฐ๋ผ ์ˆ˜์ •(Var ์ด๋ฆ„ ์ง€์ •, ๋“ค์—ฌ์“ฐ๊ธฐ ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์ด ์ •ํ™•ํ•˜๋‹ค๋ฉด #1158 ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•ˆ๋‚ดํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@mihirr93 ์ž˜

@adriansmares ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น pull ์š”์ฒญ์€ ์–ธ๊ธ‰๋œ ํ™˜๊ฒฝ ๋˜๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ ์Šคํƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜์ค‘์— ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์‹  master ์œ„์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค์‹œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๊ฝค ์˜ค๋žซ๋™์•ˆ ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๋ถ„๋ฅ˜๋กœ ์ด๋™ํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ์„ฑ์ด ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰