1.
ํ์ฅ ์ฌํญ: Navigator
์ธํฐํ์ด์ค
[Exposed =Window ,SecureContext ]partial interface Navigator { [SameObject ]readonly attribute Serial serial ; };
1.1. serial ์์ฑ
๊ฐ์ ๊ฐ์ ธ์ฌ ๋, serial
์์ฑ์ด ํญ์ ๋ฐํํ๋ ๊ฒ์ ๋์ผํ
์ธ์คํด์ค์ด๋ฉฐ, ์ด๋ Serial
๊ฐ์ฒด์ ์ธ์คํด์ค์
๋๋ค.
2. ํ์ฅ ์ฌํญ: WorkerNavigator
์ธํฐํ์ด์ค
[Exposed =DedicatedWorker ,SecureContext ]partial interface WorkerNavigator { [SameObject ]readonly attribute Serial serial ; };
2.1. serial
์์ฑ
๊ฐ์ ๊ฐ์ ธ์ฌ ๋, serial
์์ฑ์ด ํญ์ ๋ฐํํ๋ ๊ฒ์ ๋์ผํ
์ธ์คํด์ค์ด๋ฉฐ, ์ด๋ Serial
๊ฐ์ฒด์ ์ธ์คํด์ค์
๋๋ค.
3. Serial ์ธํฐํ์ด์ค
[Exposed =(DedicatedWorker ,Window ),SecureContext ]interface Serial :EventTarget {attribute EventHandler onconnect ;attribute EventHandler ondisconnect ;Promise <sequence <SerialPort >>getPorts (); [Exposed =Window ]Promise <SerialPort >requestPort (optional SerialPortRequestOptions = {}); };options
3.1. requestPort() ๋ฉ์๋
requestPort().
์ด ํธ์ถ์
๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ดํธ์์ ์ ์ดํ ์ฅ์น๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ฌผ์ ๊ธฐํ๋ฅผ
์ ๊ณตํฉ๋๋ค. ์ฌ์ดํธ๊ฐ ํน์ ์ฅ์น์ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ,
๊ทธ ์ฅ์น๊ฐ ํญ์ USB๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋ค๋ฉด ์ฌ์ดํธ๋
์ฌ์ฉ์๊ฐ ์ ํํ ์ ์๋ ์ฅ์น๋ฅผ ์ ํํ๋ ํํฐ๋ฅผ ์ ๊ณตํ์ฌ,
ํธํ๋๋ ์ฅ์น๋ง ์ ํํ๊ฒ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Arduino ๊ธฐ๋ฐ ๋ก๋ด์ ํ๋ก๊ทธ๋๋ฐํ๋ ์ฌ์ดํธ๋
๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ์ฌ ์ ํ ๊ฐ๋ฅํ ํฌํธ ์งํฉ์ USB ์ฅ์น๋ก๋ง ์ ํํ ์ ์์ต๋๋ค.
์ด ์ฅ์น๋ Arduino์ USB ๊ณต๊ธ์
์ฒด ID๋ฅผ ๊ฐ์ง ์ฅ์น์
๋๋ค.
const filter= { usbVendorId: 0x2341 }; const port= await navigator. serial. requestPort({ filters: [ filter] });
๋ฐ๋ฉด ์ฌ์ดํธ๊ฐ ๋งค์ฐ ๋ค์ํ ์ข ๋ฅ์ ์ฅ์น๋ USB-์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ์ฅ์น์ ํจ๊ป ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ฉด, ํํฐ๋ฅผ ์ ํ ์ง์ ํ์ง ์๊ณ ์ฌ์ฉ์๊ฐ ์ ์ ํ ์ฅ์น๋ฅผ ์ ํํ๋๋ก ํ ์ ์์ต๋๋ค.
const port= await navigator. serial. requestPort();
์ฌ์ฉ์์๊ฒ ํฌํธ ์ ํ์ ์์ฒญํ๋ ค๋ฉด ์ฌ์ฉ์์๊ฒ ํ๋กฌํํธ๋ฅผ ํ์ํด์ผ ํ๋ฏ๋ก, ์ฌ์ดํธ์๋ ์ผ์์ ํ์ฑํ๊ฐ ์์ด์ผ ํ๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ ๋ฑ์ ๋์์์ ๋น๋กฏ๋ฉ๋๋ค.
< button id = "connect" > ์ฐ๊ฒฐ</ button >
const connectButton= document. getElementById( "connect" ); connectButton. addEventListener( 'click' , () => { try { const port= await navigator. serial. requestPort(); // |port|์ ์ฐ๊ฒฐ๋ ์ฅ์น์ ๋ํ ์ฐ๊ฒฐ์ ๊ณ์ ์งํํฉ๋๋ค. } catch ( e) { // ์ฅ์น๋ฅผ ์ ํํ์ง ์๊ณ ํ๋กฌํํธ๋ฅผ ๋ซ์์ต๋๋ค. } });
์ฌ์ฉ์๋ ์ฅ์น๋ฅผ ์ ํํ์ง ์์ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ Promise
๋
๋ค์์ผ๋ก ๊ฑฐ๋ถ๋ฉ๋๋ค: "NotFoundError"
DOMException
์ด๋ ์ฌ์ดํธ์์ ๋ฐ๋์
์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
requestPort()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ ์ฐ๊ด๋ Document๊ฐ ์ฌ์ฉํ๋๋ก ํ์ฉ๋์ง ์์ ์ ์ฑ ์ผ๋ก ์ ์ด๋๋ ๊ธฐ๋ฅ์ ์ด๋ฆ์ด "serial"์ด๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
SecurityError"DOMException๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด, ์ฆ this์ ํด๋น ๊ฐ์ฒด์ ์ผ์์ ํ์ฑํ๊ฐ ์์ผ๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
SecurityError"DOMException๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ options["
filters"] ๊ฐ ์์ผ๋ฉด, ๊ฐ filter์ ๋ํด, ๊ทธ ๋์์ options["filters"] ์ ์ํ๋ ํญ๋ชฉ์ด๋ฉฐ, ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:-
๋ง์ฝ filter["
bluetoothServiceClassId"] ๊ฐ ์์ผ๋ฉด:-
๋ง์ฝ filter["
usbVendorId"] ๊ฐ ์์ผ๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผTypeError๋ก ๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ filter["
usbProductId"] ๊ฐ ์์ผ๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผTypeError๋ก ๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
๋ง์ฝ filter["
usbVendorId"] ๊ฐ ์์ผ๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผTypeError๋ก ๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค.์ฐธ๊ณ : ์ด ๊ฒ์ฌ๋ ๋ค์์ ๊ฒฐํฉ๋ ๊ท์น์ ๊ตฌํํฉ๋๋ค:
SerialPortFilter๋ ๋น์ด ์์ ์ ์์ผ๋ฉฐ, ๋ง์ฝusbProductId๊ฐ ์ง์ ๋์๋ค๋ฉดusbVendorId๋ ๋ฐ๋์ ํจ๊ป ์ง์ ํด์ผ ํฉ๋๋ค.
-
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
allPorts๋ฅผ ๋น ๋ชฉ๋ก์ผ๋ก ๋ก๋๋ค.
-
๊ฐ๊ฐ์ ๋ํด, ๊ทธ ๋์์ ์์คํ ์ ๋ฑ๋ก๋ Bluetooth ์ฅ์น์ ๋๋ค:
-
๊ฐ๊ฐ์ ๋ํด, ๊ทธ ๋์์
BluetoothServiceUUIDuuid์ด๋ฉฐ, ์ด๋ฅผ ์ง์ํ๋ ๊ฒ์ ํด๋น ์ฅ์น์ ๋๋ค:-
๋ง์ฝ uuid๊ฐ ์ฐจ๋จ๋ Bluetooth ์๋น์ค ํด๋์ค UUID๊ฐ ์๋๋ฉด:
-
๋ง์ฝ uuid๊ฐ ์ง๋ ฌ ํฌํธ ํ๋กํ์ผ ์๋น์ค ํด๋์ค ID์ ๊ฐ๊ฑฐ๋, ๋๋
-
options["
allowedBluetoothServiceClassIds"] ๊ฐ ์๊ณ ํฌํจํ๋ ๊ฐ์ด uuid์ด๋ฉด:-
port๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค:
SerialPort์ด๋ ์๋น์ค๋ฅผ ๋ํ๋ด๋ฉฐ, ํด๋น Bluetooth ์ฅ์น์ ์๋น์ค์ ๋๋ค. -
์ถ๊ฐํฉ๋๋ค: port๋ฅผ allPorts์.
-
-
-
-
-
๊ฐ๊ฐ์ ๋ํด, ๊ทธ ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋น Bluetooth ์ง๋ ฌ ํฌํธ์ ๋๋ค:
-
port๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค:
SerialPort์ด๋ ํด๋น ํฌํธ๋ฅผ ๋ํ๋ ๋๋ค. -
์ถ๊ฐํฉ๋๋ค: port๋ฅผ allPorts์.
-
-
์ฌ์ฉ์์๊ฒ ํฌํธ ๋ชฉ๋ก์ ํ์ํ์ฌ ์ฌ์ดํธ์ ์ง๋ ฌ ํฌํธ ์ ๊ทผ์ ํ์ฉํ๋๋ก ์์ฒญํฉ๋๋ค. ํ์๋๋ ๊ฒ์ allPorts์ ์๋ ํฌํธ ์ค ํ๋ ์ด์์ ํํฐ์ ์ผ์นํ๋ ํฌํธ์ด๋ฉฐ, ํํฐ๋ options["
filters"] ๊ฐ ์์ผ๋ฉด ํด๋น ๊ฐ์ ์๋ ํํฐ์ด๊ณ , ์์ผ๋ฉด allPorts๋ฅผ ํ์ํฉ๋๋ค. -
์ฌ์ฉ์๊ฐ ํฌํธ๋ฅผ ์ ํํ์ง ์์ผ๋ฉด, ์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
NotFoundError"DOMException๊ทธ๋ฆฌ๊ณ ์ด ๋จ๊ณ๋ค์ ์ค๋จํฉ๋๋ค. -
port๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค:
SerialPort์ด๋ ์ฌ์ฉ์๊ฐ ์ ํํ ํฌํธ๋ฅผ ๋ํ๋ ๋๋ค. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ port๋ก.
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
์ง๋ ฌ ํฌํธ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์กฐ๊ฑด์, ์ ์ ์ง๋ ฌ ํฌํธ์ด๋ฉด์ ํด๋น ํฌํธ๊ฐ ์์คํ ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ฑฐ๋, ๋ฌด์ ์ง๋ ฌ ํฌํธ์ด๋ฉด์ ํด๋น ํฌํธ๋ฅผ ์ ๊ณตํ๋ ๋ฌด์ ์ฅ์น๊ฐ ์์คํ ์ ๋ฑ๋ก๋์ด ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
3.1.1. SerialPortRequestOptions
์ฌ์
dictionary SerialPortRequestOptions {sequence <SerialPortFilter >filters ;sequence <BluetoothServiceUUID >allowedBluetoothServiceClassIds ; };
filters๋ฉค๋ฒ, ๋ค์ ํ์ sequence<SerialPortFilter>- ์ง๋ ฌ ํฌํธ์ ๋ํ ํํฐ
allowedBluetoothServiceClassIds๋ฉค๋ฒ, ํ์ sequence<BluetoothServiceUUID>-
๋ค์์ ๋ชฉ๋ก์
๋๋ค:
BluetoothServiceUUID๊ฐ์ผ๋ก, Bluetooth ์๋น์ค ํด๋์ค ID๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ์ฉ์ ์ ์ ์๋น์ค ํด๋์ค ID๋ฅผ ๊ฐ์ง Bluetooth ํฌํธ๋ ์ฌ์ฉ์์๊ฒ ํ์๋๋ ํฌํธ ๋ชฉ๋ก์์ ์ ์ธ๋ฉ๋๋ค. ๋จ, ์๋น์ค ํด๋์ค ID๊ฐ ์ด ๋ชฉ๋ก์ ํฌํจ๋์ด ์์ผ๋ฉด ์ ์ธ๋์ง ์์ต๋๋ค.
3.1.2.
SerialPortFilter ์ฌ์
dictionary SerialPortFilter {unsigned short usbVendorId ;unsigned short usbProductId ;BluetoothServiceUUID bluetoothServiceClassId ; };
usbVendorId๋ฉค๋ฒ, ๋ค์ ํ์ unsigned short- USB ๊ณต๊ธ์ ์ฒด ID
usbProductId๋ฉค๋ฒ, ๋ค์ ํ์ unsigned short- USB ์ ํ ID
bluetoothServiceClassId๋ฉค๋ฒ, ํ์ BluetoothServiceUUID- Bluetooth ์๋น์ค ํด๋์ค ID
true๋ฅผ ๋ฐํํ๋ค๋ ๋ป์
๋๋ค:
-
info๋ฅผ ๋ค์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค: port.
getInfo(). -
๋ง์ฝ filter["
bluetoothServiceClassId"] ๊ฐ ์์ผ๋ฉด:-
์ง๋ ฌ ํฌํธ๊ฐ Bluetooth ์ฅ์น์ ์ผ๋ถ๊ฐ ์๋๋ฉด,
false๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ filter["
bluetoothServiceClassId"] ๊ฐ ๋ค์๊ณผ ๊ฐ์ผ๋ฉด: info["bluetoothServiceClassId"],true๋ฅผ ๋ฐํํฉ๋๋ค. -
๊ทธ๋ ์ง ์์ผ๋ฉด,
false๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
๋ง์ฝ filter["
usbVendorId"] ๊ฐ ์์ผ๋ฉด, ๋ค์์ ๋ฐํํฉ๋๋ค:true. -
์ง๋ ฌ ํฌํธ๊ฐ USB ์ฅ์น์ ์ผ๋ถ๊ฐ ์๋๋ฉด,
false๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ info["
usbVendorId"] ๊ฐ ๋ค์๊ณผ ๊ฐ์ง ์์ผ๋ฉด: filter["usbVendorId"],false๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ filter["
usbProductId"] ๊ฐ ์์ผ๋ฉด, ๋ค์์ ๋ฐํํฉ๋๋ค:true. -
๋ง์ฝ info["
usbProductId"] ๊ฐ ๋ค์๊ณผ ๊ฐ์ง ์์ผ๋ฉด: filter["usbProductId"],false๋ฅผ ๋ฐํํฉ๋๋ค. -
๊ทธ๋ ์ง ์์ผ๋ฉด,
true๋ฅผ ๋ฐํํฉ๋๋ค.
SerialPortFilter์
์ํ์ค์ด๋ฉฐ,
๋ค์ ๋จ๊ณ๊ฐ true๋ฅผ ๋ฐํํ๋ค๋ ๋ป์
๋๋ค:
-
์ํ์ค์ ๊ฐ filter์ ๋ํด, ๋ค์ ํ์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
๋ง์ฝ port๊ฐ ํํฐ์ ์ผ์นํ๋ฉฐ ๊ทธ ํํฐ๊ฐ filter์ด๋ฉด, ๋ค์์ ๋ฐํํฉ๋๋ค:
true.
-
-
false๋ฅผ ๋ฐํํฉ๋๋ค.
3.2. getPorts() ๋ฉ์๋
// ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ํ์ธํฉ๋๋ค. document. addEventListener( 'DOMContentLoaded' , async () => { let ports= await navigator. serial. getPorts(); // ์ฌ์ฉ์๊ฐ ์ ํํ ์ ์๋ ์ต์ ์ผ๋ก UI๋ฅผ ์ฑ์ฐ๊ฑฐ๋ // ์ฅ์น์ ์๋์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. }); navigator. serial. addEventListener( 'connect' , e=> { // |e.target|์ UI์ ์ถ๊ฐํ๊ฑฐ๋ ์๋์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. }); navigator. serial. addEventListener( 'disconnect' , e=> { // |e.target|์ UI์์ ์ ๊ฑฐํฉ๋๋ค. ์ฅ์น๊ฐ ์ด๋ ค ์์๋ค๋ฉด // ์ฐ๊ฒฐ ํด์ ๋ฅผ ์คํธ๋ฆผ ์ค๋ฅ๋ก๋ ๊ด์ฐฐํ ์ ์์ต๋๋ค. });
getPorts()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ ์ฐ๊ด๋ Document๊ฐ ์ฌ์ฉํ๋๋ก ํ์ฉ๋์ง ์์ ์ ์ฑ ์ผ๋ก ์ ์ด๋๋ ๊ธฐ๋ฅ์ ์ด๋ฆ์ด
"serial"์ด๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "SecurityError"DOMException๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋ฐํํฉ๋๋ค: promise. -
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
availablePorts๋ฅผ ๋ค์์ ์ํ์ค๋ก ๋ก๋๋ค: ์ฌ์ฉ ๊ฐ๋ฅํ ์ง๋ ฌ ํฌํธ ์ค์์, ์ด์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์ ๊ทผ์ ํ์ฉํ ํฌํธ์ด๋ฉฐ, ํธ์ถ ๋์์
requestPort()์ ๋๋ค. -
ports๋ฅผ ๋ค์์ ์ํ์ค๋ก ๋ก๋๋ค:
SerialPort๊ฐ์ฒด๋ค๋ก, ์ด๋ค์ด ๋ํ๋ด๋ ๊ฒ์ availablePorts์ ์๋ ํฌํธ์ ๋๋ค. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ ports๋ก.
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
3.3. onconnect ์์ฑ
onconnect
๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ IDL ์์ฑ์ด๋ฉฐ,
connect ์ด๋ฒคํธ ์ ํ์ ํด๋นํฉ๋๋ค.
3.4. ondisconnect ์์ฑ
ondisconnect
๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ IDL ์์ฑ์ด๋ฉฐ,
disconnect ์ด๋ฒคํธ ์ ํ์ ํด๋นํฉ๋๋ค.
4. SerialPort ์ธํฐํ์ด์ค
[Exposed =(DedicatedWorker ,Window ),SecureContext ]interface SerialPort :EventTarget {attribute EventHandler onconnect ;attribute EventHandler ondisconnect ;readonly attribute boolean connected ;readonly attribute ReadableStream ?readable ;readonly attribute WritableStream ?writable ;SerialPortInfo getInfo ();Promise <undefined >open (SerialOptions );options Promise <undefined >setSignals (optional SerialOutputSignals = {});signals Promise <SerialInputSignals >getSignals ();Promise <undefined >close ();Promise <undefined >forget (); };
์ด ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์๋ฃ๋๋ฉฐ, ์์ ์ ๋ค์์ ํ์ํฉ๋๋ค: ์ง๋ ฌ ํฌํธ ์์ ์์ค.
์ด ๋ถ๋ชจ
๊ฐ์ ธ์ค๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ๋์์ธ SerialPort
์ ๋ํด์๋ ๋์ผํ Serial
์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ฉฐ, ๊ทธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ SerialPort์
๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์
Navigator
๊ฐ์ฒด์ serial
๊ฒํฐ์
๋๋ค.
์ธ์คํด์ค์ ๋์์ธ SerialPort
๋ ๋ด๋ถ ์ฌ๋กฏ์ ๊ฐ์ง ์ธ์คํด์ค๋ก ์์ฑ๋๋ฉฐ, ํด๋น ์ฌ๋กฏ์
๋ค์ ํ์ ์ค๋ช
๋์ด ์์ต๋๋ค:
| ๋ด๋ถ ์ฌ๋กฏ | ์ด๊ธฐ๊ฐ | ์ค๋ช (๋น๊ท๋ฒ์ ) |
|---|---|---|
[[state]]
| "closed"
| ํ์ฑ ์ํ๋ฅผ ์ถ์ ํ๋ฉฐ, ๊ทธ ๋์์ SerialPort
|
[[bufferSize]]
| undefined | ์ก์์ ์ ์ํด ๋ฒํผ๋งํ ๋ฐ์ดํฐ์ ์ |
[[connected]]
| false
| ์ง๋ ฌ ํฌํธ์ ๋ ผ๋ฆฌ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ํ๋ด๋ ํ๋๊ทธ |
[[readable]]
| null
| ํด๋น ReadableStream
์ ํฌํธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค
|
[[readFatal]]
| false
| ํฌํธ์ ์น๋ช ์ ์ธ ์ฝ๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋ ํ๋๊ทธ |
[[writable]]
| null
| ํด๋น WritableStream
์ ํฌํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค
|
[[writeFatal]]
| false
| ํฌํธ์ ์น๋ช ์ ์ธ ์ฐ๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋ ํ๋๊ทธ |
[[pendingClosePromise]]
| null
|
ํด๋น Promise
๋ ๋ค์์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค: readable
๋ฐ
writable
์ด ๋ซํ๋ ๊ฒ
|
4.1. onconnect ์์ฑ
onconnect
๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ IDL ์์ฑ์ด๋ฉฐ,
connect
์ด๋ฒคํธ ์ ํ์ ํด๋นํฉ๋๋ค.
requestPort()
ํด๋น ํฌํธ๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก
์ฐ๊ฒฐ๋จ ์ํ๊ฐ ๋๋ฉด, ์คํํฉ๋๋ค:
๋ค์ ๋จ๊ณ๋ฅผ.
-
port๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค:
SerialPort์ด๋ ํด๋น ํฌํธ๋ฅผ ๋ํ๋ ๋๋ค. -
์ค์ ํฉ๋๋ค: port.
[[connected]]๋ฅผtrue๋ก. -
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ทธ ์ด๋ฆ์
connect์ด๊ณ , ๋์์ port์ด๋ฉฐ, ์ด๋ฒคํธ์bubbles์์ฑ์true๋ก ์ด๊ธฐํํฉ๋๋ค.
์ง๋ ฌ ํฌํธ๊ฐ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋จ ์ํ์ธ ์กฐ๊ฑด์, ์ ์ ์ง๋ ฌ ํฌํธ์ด๋ฉด์ ์์คํ ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ฑฐ๋, ๋ฌด์ ์ง๋ ฌ ํฌํธ์ด๋ฉด์ ์์คํ ์ด ๋ฌด์ ์ฅ์น์ ๋ํ ํ์ฑ ์ฐ๊ฒฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ์ ๋๋ค(์: ์ด๋ฆฐ Bluetooth L2CAP ์ฑ๋).
4.2. ondisconnect ์์ฑ
ondisconnect
๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ IDL ์์ฑ์ด๋ฉฐ,
disconnect
์ด๋ฒคํธ ์ ํ์ ํด๋นํฉ๋๋ค.
requestPort()
ํด๋น ํฌํธ๊ฐ ๋ ์ด์ ๋
ผ๋ฆฌ์ ์ผ๋ก
์ฐ๊ฒฐ๋จ ์ํ๊ฐ ์๋๋ฉด, ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
port๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค:
SerialPort์ด๋ ํด๋น ํฌํธ๋ฅผ ๋ํ๋ ๋๋ค. -
์ค์ ํฉ๋๋ค: port.
[[connected]]๋ฅผfalse๋ก. -
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค. ๊ทธ ์ด๋ฆ์
disconnect์ด๊ณ , ๋์์ port์ด๋ฉฐ, ์ด๋ฒคํธ์bubbles์์ฑ์true๋ก ์ด๊ธฐํํฉ๋๋ค.
4.3. getInfo() ๋ฉ์๋
getInfo()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
info๋ฅผ ๋น ์์ ์๋ ๋งต์ผ๋ก ๋ก๋๋ค.
-
ํฌํธ๊ฐ USB ์ฅ์น์ ์ผ๋ถ์ด๋ฉด, ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค:
-
์ค์ ํฉ๋๋ค: info["
usbVendorId"] ๋ฅผ ๊ณต๊ธ์ ์ฒด ID๋ก, ๊ทธ ๋์์ ํด๋น ์ฅ์น์ ๋๋ค. -
์ค์ ํฉ๋๋ค: info["
usbProductId"] ๋ฅผ ์ ํ ID๋ก, ๊ทธ ๋์์ ํด๋น ์ฅ์น์ ๋๋ค.
-
-
ํฌํธ๊ฐ Bluetooth ์ฅ์น์ ์๋น์ค์ด๋ฉด, ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค:
-
์ค์ ํฉ๋๋ค: info["
bluetoothServiceClassId"] ๋ฅผ ์๋น์ค ํด๋์ค UUID๋ก, ์ด๋ ํด๋น Bluetooth ์๋น์ค์ ๊ฐ์ ๋๋ค.
-
-
info๋ฅผ ๋ฐํํฉ๋๋ค.
4.3.1.
SerialPortInfo ์ฌ์
dictionary SerialPortInfo {unsigned short usbVendorId ;unsigned short usbProductId ;BluetoothServiceUUID bluetoothServiceClassId ; };
usbVendorId๋ฉค๋ฒ, ํ์ unsigned short-
ํฌํธ๊ฐ USB ์ฅ์น์ ์ผ๋ถ์ด๋ฉด ์ด ๋ฉค๋ฒ๋ 16๋นํธ ๊ณต๊ธ์
์ฒด ID์ด๋ฉฐ,
ํด๋น ์ฅ์น์ ID์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด
undefined์ ๋๋ค. usbProductId๋ฉค๋ฒ, ํ์ unsigned short-
ํฌํธ๊ฐ USB ์ฅ์น์ ์ผ๋ถ์ด๋ฉด ์ด ๋ฉค๋ฒ๋ 16๋นํธ ์ ํ
ID๋ก์ ํด๋น ์ฅ์น์ ID์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด
undefined์ ๋๋ค. bluetoothServiceClassId๋ฉค๋ฒ, ํ์ BluetoothServiceUUID-
ํฌํธ๊ฐ Bluetooth ์ฅ์น์ ์๋น์ค์ด๋ฉด ์ด ๋ฉค๋ฒ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
BluetoothServiceUUID์ด๋ ์๋น์ค ํด๋์ค UUID๋ฅผ ํฌํจํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉดundefined์ ๋๋ค.
4.4. open()
๋ฉ์๋
await port. open({ baudRate: /* ์ฌ์ฉํ ๋ณด ๋ ์ดํธ๋ฅผ ์ ํํฉ๋๋ค */ });
์ผ๋จ open()
์ด ํด๊ฒฐ๋๋ฉด readable
๋ฐ
writable
์์ฑ์ ์ ๊ทผํ์ฌ ๋ค์์ ์ป์ ์ ์์ต๋๋ค:
ReadableStream
๋ฐ WritableStream
์ธ์คํด์ค๋ก, ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ
์ก์ ํ ๋์์ ์ฐ๊ฒฐ๋ ์ฅ์น์
๋๋ค.
open()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this.
[[state]]๊ฐ"closed"๊ฐ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋ "InvalidStateError"DOMException์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ options["
baudRate"] ๊ฐ 0์ด๋ฉด, promise๋ฅผ ๋ค์์ผ๋ก ๊ฑฐ๋ถํฉ๋๋ค:TypeError๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ options["
dataBits"] ๊ฐ 7๋ 8๋ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋TypeError์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ options["
stopBits"] ๊ฐ 1๋ 2๋ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋TypeError์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ options["
bufferSize"] ๊ฐ 0์ด๋ฉด, promise๋ฅผ ๋ค์์ผ๋ก ๊ฑฐ๋ถํฉ๋๋ค:TypeError๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
์ ํ์ ์ผ๋ก, ๋ง์ฝ options["
bufferSize"] ๊ฐ ๋ค์๋ณด๋ค ํฌ๋ฉด, ์ฆ ๊ตฌํ์ด ์ง์ํ ์ ์๋ ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด, promise๋ฅผTypeError๋ก ๊ฑฐ๋ถํ๊ณ ์ด์ด์ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค.
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ์ง๋ ฌ ํฌํธ๋ฅผ ์ฝ๋๋ค. ์ด๋ ์ฌ์ฉํ ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์(๋๋ ๊ธฐ๋ณธ๊ฐ)๋ options์ ์ง์ ๋ ๊ฐ์ ๋๋ค.
-
์ด๋ค ์ด์ ๋ก๋ ์ด ์์ ์ด ์คํจํ๋ฉด, ์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
NetworkError"DOMException๊ทธ๋ฆฌ๊ณ ์ด ๋จ๊ณ๋ค์ ์ค๋จํฉ๋๋ค. -
์ค์ ํฉ๋๋ค: this.
[[bufferSize]]๋ฅผ ๋ค์ ๊ฐ์ผ๋ก: options["bufferSize"]. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
4.4.1.
SerialOptions ์ฌ์
dictionary SerialOptions {required [EnforceRange ]unsigned long baudRate ; [EnforceRange ]octet dataBits = 8; [EnforceRange ]octet stopBits = 1;ParityType parity = "none"; [EnforceRange ]unsigned long bufferSize = 255;FlowControlType flowControl = "none"; };
baudRate๋ฉค๋ฒ, ํ์ unsigned long-
๋ณด ๋ ์ดํธ๋ฅผ ๋ํ๋ด๋ 0์ด ์๋ ์์ ๊ฐ์ผ๋ก, ์ง๋ ฌ
ํต์ ์ ์ค์ ํ ๋ ์ฌ์ฉํ ๊ฐ์
๋๋ค.
์ฐธ๊ณ :
baudRate๋ ์ด ์ฌ์ ์์ ์ ์ผํ ํ์ ๋ฉค๋ฒ์ ๋๋ค. ๋ค๋ฅธ ์ฐ๊ฒฐ ๋งค๊ฐ๋ณ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ๊ฐ์ด ์์ง๋ง, ๊ฐ๋ฐ์๋ ๊ฐ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ฐ๊ฒฐํ๋ ค๋ ์ฅ์น์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ํํ ์ฌ์ฉ๋๋ ๊ฐ์ ์์ง๋ง ํ์ค ๋ณด ๋ ์ดํธ๋ ์์ต๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ฅผ ํ์๋ก ์ง์ ํ๋ฉด ์์์ ๊ธฐ๋ณธ๊ฐ์ ์ด ๋ช ์ธ์์ ์ ํํ์ ๋ ์๊ธธ ์ ์๋ ํผ๋์ ์ค์ผ ์ ์์ต๋๋ค. dataBits๋ฉค๋ฒ, ํ์ octet, ๊ธฐ๋ณธ๊ฐ8- ํ๋ ์๋น ๋ฐ์ดํฐ ๋นํธ ์์ ๋๋ค. 7 ๋๋ 8์ ๋๋ค.
stopBits๋ฉค๋ฒ, ํ์ octet, ๊ธฐ๋ณธ๊ฐ1- ํ๋ ์ ๋์ ์ ์ง ๋นํธ ์์ ๋๋ค. 1 ๋๋ 2์ ๋๋ค.
parity๋ฉค๋ฒ, ํ์ ParityType, ๊ธฐ๋ณธ๊ฐ"none"- ํจ๋ฆฌํฐ ๋ชจ๋์ ๋๋ค.
bufferSize๋ฉค๋ฒ, ํ์ unsigned long, ๊ธฐ๋ณธ๊ฐ255- ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ 0์ด ์๋ ์์ ๊ฐ์ผ๋ก, ์์ฑํ ๋ฒํผ์ ์ ์ฉ๋ฉ๋๋ค.
flowControl๋ฉค๋ฒ, ํ์ FlowControlType, ๊ธฐ๋ณธ๊ฐ"none"- ํ๋ฆ ์ ์ด ๋ชจ๋์ ๋๋ค.
4.4.1.1. ParityType ์ด๊ฑฐํ
enum ParityType {"none" ,"even" ,"odd" };
none- ๊ฐ ๋ฐ์ดํฐ ์๋์ ๋ํด ํจ๋ฆฌํฐ ๋นํธ๋ฅผ ๋ณด๋ด์ง ์์ต๋๋ค.
even- ๋ฐ์ดํฐ ์๋์ ํจ๋ฆฌํฐ ๋นํธ๋ฅผ ํฉํ ์ ์ฒด๊ฐ ์ง์ ํจ๋ฆฌํฐ๋ฅผ ๊ฐ์ง๋๋ค.
odd- ๋ฐ์ดํฐ ์๋์ ํจ๋ฆฌํฐ ๋นํธ๋ฅผ ํฉํ ์ ์ฒด๊ฐ ํ์ ํจ๋ฆฌํฐ๋ฅผ ๊ฐ์ง๋๋ค.
4.4.1.2.
FlowControlType ์ด๊ฑฐํ
enum FlowControlType {"none" ,"hardware" };
none- ํ๋ฆ ์ ์ด๊ฐ ํ์ฑํ๋์ง ์์ต๋๋ค.
hardware- RTS ๋ฐ CTS ์ ํธ๋ฅผ ์ฌ์ฉํ๋ ํ๋์จ์ด ํ๋ฆ ์ ์ด๊ฐ ํ์ฑํ๋ฉ๋๋ค.
4.5. connected ์์ฑ
connected
๊ฒํฐ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๋ฐํํฉ๋๋ค: this.
[[connected]].
4.6. readable ์์ฑ
while ( port. readable) { const reader= port. readable. getReader(); try { while ( true ) { const { value, done} = await reader. read(); if ( done) { // |reader|๊ฐ ์ทจ์๋์์ต๋๋ค. break ; } // |value|๋ก ์์ ์ ์ํํฉ๋๋ค... } } catch ( error) { // |error|๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค... } finally { reader. releaseLock(); } }
๋ด๋ถ ๋ฃจํ๋ ํฌํธ์์ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ์ฝ๋ค๊ฐ ์ค๋ฅ๊ฐ
๋ฐ์ํ๋ฉด "catch" ๋ธ๋ก์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์ธ๋ถ ๋ฃจํ๋ ํจ๋ฆฌํฐ ๊ฒ์ฌ ์คํจ์ ๊ฐ์ด ๋ณต๊ตฌ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ,
์ด๋ฅผ ์ํด ์ ๋ฆฌ๋๋ฅผ ์ฝ๋๋ค. ์น๋ช
์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด readable
์ด
null์ด ๋๊ณ ๋ฃจํ๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
์ง๋ ฌ ํฌํธ๊ฐ ์ด๋ ค ์๋ ๋์์๋ ๊ณ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ,
๋ฐํ๋๋ ๊ฐ ์ฒญํฌ์ ๋ฐ์ดํฐ ์์, ๋ฐํํ๋ ๋ฉ์๋์ธ
read()
์ ํธ์ถ ์์ ์ ๋ฐ๋ผ ์ฌ์ค์ ์์๋ก
๊ฒฐ์ ๋ฉ๋๋ค. ์ฅ์น์ ํด๋น ์ฅ์น์ ํต์ ํ๋ ์ฝ๋๊ฐ
๋ฌด์์ ์์ ํ ๋ฉ์์ง๋ก ๊ฐ์ฃผํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฅ์น๋ ASCII ํ์์ ํ
์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํธ์ ํต์ ํ ์ ์์ผ๋ฉฐ,
๊ฐ ๋ฉ์์ง๋ ์ค๋ฐ๊ฟ(๋๋ ์ํ์ค "\r\n")์ผ๋ก ๋๋ฉ๋๋ค. ํ์ดํ๋ผ์ธ์
๊ตฌ์ฑํ๋ TransformStream๋ค์
์ฌ์ฉํ๋ฉด ๋ค์์ ์๋์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค:
Uint8Array
์ฒญํฌ๋ก, ์ด๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ readable
์ด๋ฉฐ, ๋ณํ ๊ฒฐ๊ณผ๋ DOMString๋ค๋ก,
๊ฐ๊ฐ ์์ ํ ํ
์คํธ ํ ์ค์ ํฌํจํฉ๋๋ค.
class LineBreakTransformer{ constructor () { this . container= '' ; } transform( chunk, controller) { this . container+= chunk; const lines= this . container. split( '\r\n' ); this . container= lines. pop(); lines. forEach( line=> controller. enqueue( line)); } flush( controller) { controller. enqueue( this . container); } } const decoder= new TextDecoderStream(); const streamClosed= port. readable. pipeTo( decoder. writable); const lineReader= decoder. readable. pipeThrough( new TransformStream( new LineBreakTransformer())) . getReader();
์์ 7๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ดํ ์ฒด์ธ์
pipeThrough()๋ง์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. pipeTo()๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์์ ์
์ฒซ ๋ฒ์งธ TransformStream
์ SerialPort
์ ์ฐ๊ฒฐํ ๋์ด๋ฉฐ, ๊ทธ๋์ผ
ํฌํธ๋ฅผ ๋ซ์ผ๋ ค ํ ๋ ํ์ดํ ์ฒด์ธ์ด ๋ซํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
lineReader. cancel(); await streamClosed; await port. close();
๋ฉ์์ง ๊ฒฝ๊ณ๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ ๋ฉ์์ง ์์
๊ธธ์ด๋ฅผ ๋ถ์ด๊ฑฐ๋, ์ ํด์ง ์๊ฐ ๋์ ๊ธฐ๋ค๋ฆฐ ํ ๋ค์
๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. TransformStream
์ ๊ตฌํํ์ฌ ์ด๋ฌํ ์ ํ์ ๋ฉ์์ง
๊ฒฝ๊ณ๋ฅผ ์ฒ๋ฆฌํ๋ ์์
์ ๋
์์ ์ฐ์ต ๊ณผ์ ๋ก ๋จ๊ฒจ ๋ก๋๋ค.
์ด read()
๋ฉ์๋๋ ๋น๋๊ธฐ์ ์ด๋ฉฐ
์คํ์ ์ฐจ๋จํ์ง ์์ง๋ง, async/await ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ์ฝ๋์์๋
์คํ์ ์ฐจ๋จํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ ์๊ฐ ์ ํ์ ๊ตฌํํ๋ฉด ๋์์ด ๋ ์ ์์ผ๋ฉฐ,
์ผ์ ๊ธฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ๋ชปํ์ ๋ ์ฝ๋ ์คํ์ ๊ณ์ํ ์
์๋๋ก ํฉ๋๋ค. ์๋ ์์ ๋ releaseLock()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ํธ์ถ์ ์ค๋จํฉ๋๋ค: read()
๊ทธ ์์ ์
ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋ ํ์
๋๋ค. ์ด ์์
์ ์คํธ๋ฆผ์ ๋ซ์ง ์์ผ๋ฏ๋ก,
์๊ฐ ์ ํ ์ดํ์ ์์ ํ ๋ฐ์ดํฐ๋ ๋์ค์ ์ฝ์ ์ ์์ผ๋ฉฐ,
getReader()
๋ฅผ ๋ค์ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
async function readWithTimeout( port, timeout) { const reader= port. readable. getReader(); const timer= setTimeout(() => { reader. releaseLock(); }, timeout); const result= await reader. read(); clearTimeout( timer); reader. releaseLock(); return result; }
์ด ๊ธฐ๋ฅ์ releaseLock()
์ ๋ค์ ๋ณ๊ฒฝ์ผ๋ก ์ถ๊ฐ๋์์ผ๋ฉฐ,
whatwg/streams#1168
๋ธ๋ผ์ฐ์ ์์๋ ์ต๊ทผ์์ผ ๊ตฌํ๋์์ต๋๋ค.
readable
๊ฒํฐ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๋ง์ฝ this.
[[readable]]์ดnull์ด ์๋๋ฉด, ๋ค์์ ๋ฐํํฉ๋๋ค: this.[[readable]]. -
๋ง์ฝ this.
[[state]]๊ฐ"opened"๊ฐ ์๋๋ฉด,null์ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ this.
[[readFatal]]์ดtrue์ด๋ฉด,null์ ๋ฐํํฉ๋๋ค. -
stream์ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด
ReadableStream. -
pullAlgorithm์ ๋ค์ ๋จ๊ณ๋ก ๋ก๋๋ค:
-
desiredSize๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์ํ๋ ํฌ๊ธฐ(ํ์ด ์ํฐ ๋งํฌ๊น์ง ์ฑ์ฐ๊ธฐ ์ํ), ๊ทธ ๋์์ this.
[[readable]]์ ๋๋ค. -
๋ง์ฝ this.
[[readable]]์ ํ์ฌ BYOB ์์ฒญ ๋ทฐ ๊ฐ null์ด ์๋๋ฉด, desiredSize๋ฅผ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค: this.[[readable]]์ ํ์ฌ BYOB ์์ฒญ ๋ทฐ์ ๋ฐ์ดํธ ๊ธธ์ด. -
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ํ๋์ ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ์ต๋ desiredSize๋ฐ์ดํธ๋ฅผ ์ฝ์ต๋๋ค. ์ฝ๊ธฐ ๋์์ ํฌํธ์ด๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํธ ์ํ์ค bytes์ ๋ฃ์ต๋๋ค.
์ฐธ๊ณ : this.
[[state]]๊ฐ"forgotten"์ด ๋๋ ๊ฒ์ the port was disconnected์ธ ๊ฒฝ์ฐ์ฒ๋ผ ์ทจ๊ธํ ์ ์์ต๋๋ค. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์๋ค๋ฉด:
-
๋ง์ฝ this.
[[readable]]์ ํ์ฌ BYOB ์์ฒญ ๋ทฐ๊ฐ null์ด ์๋๋ฉด, ๋ค์์ ์๋๋ค: bytes๋ฅผ ๋ค์์: this.[[readable]]์ ํ์ฌ BYOB ์์ฒญ ๋ทฐ. ๊ทธ๋ฆฌ๊ณ view๋ฅผ ์ค์ ํฉ๋๋ค: ๋ค์ this.[[readable]]์ ํ์ฌ BYOB ์์ฒญ ๋ทฐ๋ก. -
๊ทธ๋ ์ง ์์ผ๋ฉด, view๋ฅผ ๋ค์ ๊ฒฐ๊ณผ๋ก ์ค์ ํฉ๋๋ค: ์์ฑํ
Uint8Array์ด๋ฉฐ, ๊ทธ ์๋ณธ์ bytes์ด๊ณ , ์์ฑ ์์ญ์ this์ ๊ด๋ จ Realm์ ๋๋ค. -
ํ์ ๋ฃ์ต๋๋ค: view๋ฅผ ๋ค์์: this.
[[readable]]. -
ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
๋ฒํผ ์ค๋ฒ๋ฐ ์ํ๊ฐ ๋ฐ์ํ๋ฉด, ๋ค์์ ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "BufferOverrunError"DOMException์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ. -
๋ธ๋ ์ดํฌ ์ํ๊ฐ ๋ฐ์ํ๋ฉด, ๋ค์์ ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "BreakError"DOMException์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํํ ๋จ๊ณ๋ ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋๋ค. -
ํ๋ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ๋ค์์ ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "FramingError"DOMException์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํํ ๋จ๊ณ๋ ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋๋ค. -
ํจ๋ฆฌํฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ๋ค์์ ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "ParityError"DOMException์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํํ ๋จ๊ณ๋ ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋๋ค. -
์ด์์ฒด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ๋ค์์ ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "UnknownError"DOMException์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ํด๋น ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ. -
๋ง์ฝ the port was disconnected์ด๋ฉด, ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
์ค์ ํฉ๋๋ค: this.
[[readFatal]]๋ฅผtrue๋ก, -
ํธ์ถํฉ๋๋ค: ์ค๋ฅ ๋ฐ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ์ธ์๋ "NetworkError"DOMException์ ๋๋ค. -
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ ๋ซ๊ธฐ.
-
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
cancelAlgorithm์ ๋ค์ ๋จ๊ณ๋ก ๋ก๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ํ๋์ ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค.
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํฌํธ์ ๋ชจ๋ ์ํํธ์จ์ด ๋ฐ ํ๋์จ์ด ์์ ๋ฒํผ์ ๋ด์ฉ์ ๋ฒ๋ฆฝ๋๋ค.
-
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๊ทธ ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ.
-
ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
๋ฐ์ดํธ ์ฝ๊ธฐ๋ฅผ ์ง์ํ๋๋ก ์ค์ ํฉ๋๋ค: stream์ ๋ํด, pullAlgorithm ์ ์ค์ ํฉ๋๋ค: pullAlgorithm์ผ๋ก, cancelAlgorithm ์ cancelAlgorithm์ผ๋ก ์ค์ ํ๊ณ , highWaterMark ๋ ์ค์ ํฉ๋๋ค: ๋ค์ this.
[[bufferSize]]๋ก. -
์ค์ ํฉ๋๋ค: this.
[[readable]]์ stream์ผ๋ก. -
stream์ ๋ฐํํฉ๋๋ค.
-
์ค์ ํฉ๋๋ค: this.
[[readable]]์null๋ก. -
๋ง์ฝ this.
[[writable]]์ดnull์ด๊ณ this.[[pendingClosePromise]]๊ฐnull์ด ์๋๋ฉด, ํด๊ฒฐํฉ๋๋ค: this.[[pendingClosePromise]]๋ฅผundefined๋ก.
4.7. writable ์์ฑ
WritableStreamDefaultWriter
๋ฅผ ํ์์ ๋ฐ๋ผ ์์ฑํ๊ณ ํด์ ํ ์ ์์ต๋๋ค. ์ด
์์ ๋ TextEncoder๋ฅผ ์ฌ์ฉํ์ฌ DOMString
์ ํ์ํ
Uint8Array
๋ก ์ธ์ฝ๋ฉํ์ฌ ์ ์กํฉ๋๋ค.
const encoder= new TextEncoder(); const writer= port. writable. getWriter(); await writer. write( encoder. encode( "PING" )); writer. releaseLock();
๋ ํฐ ์ฒญํฌ๋ฅผ ์ธ ๋๋ ํฌํธ๊ฐ ์ญ๋ฐฉํฅ
์๋ ฅ์ ์ ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒ์ด ์ค์ํ ์ ์์ต๋๋ค. ์ด๋ ์ง๋ ฌ ์ก์ ๊ธฐ๊ฐ
์ ํ๋ฆฌ์ผ์ด์
์ด ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ง๋์น๊ฒ ๋ค์ฒ์ง์ง ์๋๋ก ํฉ๋๋ค.
write()
๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฒ์ Promise
์ด๋ฉฐ,
๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋๋ฉด ํด๊ฒฐ๋ฉ๋๋ค. ์ ์ก ๋ฒํผ์
์ด๋ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋์ ์ฒ๋ฆฌ๋์ ์ ์งํ๋ ๋ฐ ์ค์ํ์ง๋ง, ์ด
Promise
๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ ์ฒญํฌ๊ฐ ์์ฑ๋์ง ์๋๋ก ํ๋ ๊ฒ์
๊ณผ๋ํ ๋ฒํผ๋ง์ ํผํ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค.
writable
๊ฒํฐ์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๋ง์ฝ this.
[[writable]]์ดnull์ด ์๋๋ฉด, ๋ค์์ ๋ฐํํฉ๋๋ค: this.[[writable]]. -
๋ง์ฝ this.
[[state]]๊ฐ"opened"๊ฐ ์๋๋ฉด,null์ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ this.
[[writeFatal]]์ดtrue์ด๋ฉด,null์ ๋ฐํํฉ๋๋ค. -
stream์ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด
WritableStream. -
signal์ stream์ ์ ํธ๋ก ๋ก๋๋ค.
-
writeAlgorithm์ chunk๊ฐ ์ฃผ์ด์ก์ ๋์ ๋ค์ ๋จ๊ณ๋ก ๋ก๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ํ๋์ ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋จ์ธ: signal์ ์ค๋จ๋จ ์ํ๊ฐ ์๋๋๋ค.
-
๋ง์ฝ chunk๋ฅผ IDL ๊ฐ์ผ๋ก ๋ณํํ ์ ์๊ณ , ๊ทธ ํ์ ์ด
BufferSource์ด๋ฉด, promise๋ฅผ ๋ค์์ผ๋ก ๊ฑฐ๋ถํฉ๋๋ค:TypeError๊ทธ๋ฆฌ๊ณ ๋ฐํํฉ๋๋ค: promise. ๊ทธ๋ ์ง ์์ผ๋ฉด, ๋ณํ ๊ฒฐ๊ณผ๋ฅผ source์ ์ ์ฅํฉ๋๋ค. -
๋ฒํผ ์์ค์ ๋ณต์ฌ๋ณธ์ ๊ฐ์ ธ์ต๋๋ค. ๋์์ source์ด๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ค์์ ์ ์ฅํฉ๋๋ค: bytes.
-
๋ณ๋ ฌ๋ก, ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ bytes๋ฅผ ํฌํธ์ ์๋๋ค. ๋๋ ๋์ค์ ๋ณํฉํ๊ธฐ ์ํด ์ฒญํฌ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ฐธ๊ณ : ์ด์์ฒด์ ๋ ๋ค์ ์์ ์ ์ด ์์ ์์ ๋ฐํํ ์ ์์ต๋๋ค: bytes์ ์ ์ก์ด ์๋ฃ๋ ํ๊ฐ ์๋๋ผ ์ ์ก ํ์ ๋ค์ด๊ฐ ์์ ์ ๋๋ค.
์ฐธ๊ณ : this.
[[state]]๊ฐ"forgotten"์ด ๋๋ ๊ฒ์ the port was disconnected์ธ ๊ฒฝ์ฐ์ฒ๋ผ ์ทจ๊ธํ ์ ์์ต๋๋ค. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
์ฒญํฌ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๊ธฐ๋ก๋์๊ฑฐ๋ ๋์ค์ ๋ณํฉํ๊ธฐ ์ํด ์ ์ฅ๋์๋ค๋ฉด, ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.์ฐธ๊ณ : [STREAMS]๋ ๋ค์๊ณผ ๊ฐ์ด ๊ท์ ํฉ๋๋ค: writeAlgorithm์ ๋ค์
Promise๊ฐ ํด๊ฒฐ๋ ํ์๋ง ํธ์ถ๋๋ฉฐ, ์ด๋ ์ด์ ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ํธ์ถํ์ฌ ๋ฐํ๋ ๊ฐ์ ๋๋ค. ํจ์จ์ฑ์ ์ํด ๊ตฌํ์ ์ดPromise๋ฅผ ์ผ์ฐ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ๋ฌ ์ฒญํฌ๋ฅผ ๋ณํฉํ๊ธฐ ์ํ ๊ฒ์ผ๋ก, ํด๋น ์ฒญํฌ๋WritableStream์ ๋ด๋ถ ํ์์ ๋๊ธฐํ๋ค๊ฐ ์ด์์ฒด์ ์ ๋ํ ๋จ์ผ ์์ฒญ์ผ๋ก ๋ณํฉ๋ฉ๋๋ค. -
์ด์์ฒด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
UnknownError"DOMException. -
๋ง์ฝ the port was disconnected์ด๋ฉด, ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
์ค์ ํฉ๋๋ค: this.
[[writeFatal]]์true๋ก. -
๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
NetworkError"DOMException. -
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ์ฒ๋ฆฌ: ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ ๋ซ๊ธฐ.
-
-
๋ง์ฝ signal์ด ์ค๋จ๋จ ์ํ์ด๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ signal์ ์ค๋จ ์ฌ์ ๋ก.
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
abortAlgorithm์ ๋ค์ ๋จ๊ณ๋ก ๋ก๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ํ๋์ ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค.
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํฌํธ์ ๋ชจ๋ ์ํํธ์จ์ด ๋ฐ ํ๋์จ์ด ์ก์ ๋ฒํผ์ ๋ด์ฉ์ ๋ฒ๋ฆฝ๋๋ค.
-
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ.
-
ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
closeAlgorithm์ ๋ค์ ๋จ๊ณ๋ก ๋ก๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ํ๋์ ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค.
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํฌํธ์ ๋ชจ๋ ์ํํธ์จ์ด ๋ฐ ํ๋์จ์ด ์ก์ ๋ฒํผ์ ๋ด์ฉ์ ํ๋ฌ์ํฉ๋๋ค.
-
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค:
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค: ๋ซ๊ธฐ ์ฒ๋ฆฌ: ์ฐ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ.
-
๋ง์ฝ signal์ด ์ค๋จ๋จ ์ํ์ด๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ signal์ ์ค๋จ ์ฌ์ ๋ก.
-
๊ทธ๋ ์ง ์์ผ๋ฉด, ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
-
-
์ค์ ํฉ๋๋ค: stream์ ๋ํด, writeAlgorithm์ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค: writeAlgorithm, abortAlgorithm์ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค: abortAlgorithm, closeAlgorithm์ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค: closeAlgorithm, highWaterMark๋ ๋ค์์ผ๋ก ์ค์ ํฉ๋๋ค: this.
[[bufferSize]], ๊ทธ๋ฆฌ๊ณ sizeAlgorithm์ ๋ฐ์ดํธ ์๋ฅผ ์ธ๋ ํฌ๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ค์ ํฉ๋๋ค. -
์ถ๊ฐํฉ๋๋ค: ๋ค์ ์ค๋จ ๋จ๊ณ๋ฅผ signal์.
-
ํฌํธ์ ์ฐ๊ธฐ ์ํ ๋ชจ๋ ์ด์์ฒด์ ํธ์ถ์ด ๊ธฐ๋ก๋ ๋ฐ์ดํฐ ์๊ณผ ๊ด๊ณ์์ด ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ฐํํ๋๋ก ํฉ๋๋ค.
-
-
์ค์ ํฉ๋๋ค: this.
[[writable]]์ stream์ผ๋ก. -
stream์ ๋ฐํํฉ๋๋ค.
-
์ค์ ํฉ๋๋ค: this.
[[writable]]์null๋ก. -
๋ง์ฝ this.
[[readable]]์ดnull์ด๊ณ this.[[pendingClosePromise]]๊ฐnull์ด ์๋๋ฉด, ํด๊ฒฐํฉ๋๋ค: this.[[pendingClosePromise]]๋ฅผundefined๋ก.
4.8. setSignals() ๋ฉ์๋
await port. setSignals({ dataTerminalReady: false }); await new Promise( resolve=> setTimeout( resolve, 200 )); await port. setSignals({ dataTerminalReady: true });
setSignals()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this.
[[state]]๊ฐ"opened"๊ฐ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋ "InvalidStateError"DOMException์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
signals์ ๋ช ์๋ ๋ฉค๋ฒ๊ฐ ๋ชจ๋ ์์ผ๋ฉด, ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ
TypeError๋ก ๊ทธ๋ฆฌ๊ณ promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
์ฐธ๊ณ : ์ด์์ ์ผ๋ก๋ ๋ค์์ ์ง์ ๋ ๋ณ๊ฒฝ ์ฌํญ, ์ฆ signals์ ๋ณ๊ฒฝ ์ฌํญ์ ์์์ ์ผ๋ก ์ ์ฉํด์ผ ํ์ง๋ง, ์ฌ์ฉ์ ์์ด์ ํธ๊ฐ ์ด ๋จ๊ณ๋ค์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ๋ POSIX ๋ฐ Windows API๋ ๋ชจ๋ ์ด๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋์ ์ ์๋ ์์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์กดํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
-
๋ง์ฝ signals["
dataTerminalReady"] ๊ฐ ์์ผ๋ฉด, ์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํ์ฑํํ๊ฑฐ๋(true์ธ ๊ฒฝ์ฐ) ๋นํ์ฑํํฉ๋๋ค(false์ธ ๊ฒฝ์ฐ). ๋์์ ์ง๋ ฌ ํฌํธ์ "๋ฐ์ดํฐ ๋จ๋ง ์ค๋น" ๋๋ "DTR" ์ ํธ์ ๋๋ค. -
๋ง์ฝ signals["
requestToSend"] ๊ฐ ์์ผ๋ฉด, ์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํ์ฑํํ๊ฑฐ๋(true์ธ ๊ฒฝ์ฐ) ๋นํ์ฑํํฉ๋๋ค(false์ธ ๊ฒฝ์ฐ). ๋์์ ์ง๋ ฌ ํฌํธ์ "์ก์ ์์ฒญ" ๋๋ "RTS" ์ ํธ์ ๋๋ค. -
๋ง์ฝ signals["
break"] ๊ฐ ์์ผ๋ฉด, ์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ํ์ฑํํ๊ฑฐ๋(true์ธ ๊ฒฝ์ฐ) ๋นํ์ฑํํฉ๋๋ค(false์ธ ๊ฒฝ์ฐ). ๋์์ ์ง๋ ฌ ํฌํธ์ "๋ธ๋ ์ดํฌ" ์ ํธ์ ๋๋ค.์ฐธ๊ณ : "๋ธ๋ ์ดํฌ" ์ ํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋์ญ ๋ด ์ ํธ๋ก ๊ตฌํ๋๋ฉฐ, ์ก์ ์ ์ "๋งํฌ" ์ ์์ผ๋ก ์ ์งํ๋ฏ๋ก ํ์ฑํ๋์ด ์๋ ๋์ ๋ฐ์ดํฐ ์ ์ก์ ๋ง์ต๋๋ค.
-
์ด์์ฒด์ ๊ฐ ์ด๋ฌํ ์ ํธ ์ค ์ด๋ ๊ฒ์ ์ํ๋ผ๋ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ณ , ๊ทธ ์ด์ ๊ฐ ๋ฌด์์ด๋ , ์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
NetworkError"DOMException. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
4.8.1.
SerialOutputSignals ์ฌ์
dictionary SerialOutputSignals {boolean dataTerminalReady ;boolean requestToSend ;boolean break ; };
dataTerminalReady, ํ์ boolean- ๋ฐ์ดํฐ ๋จ๋ง ์ค๋น (DTR)
requestToSend, ๋ค์ ํ์ boolean- ์ก์ ์์ฒญ (RTS)
break, ํ์ boolean- ๋ธ๋ ์ดํฌ
4.9. getSignals() ๋ฉ์๋
getSignals()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this.
[[state]]๊ฐ"opened"๊ฐ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋ "InvalidStateError"DOMException์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
์ด์์ฒด์ ์ ์ ์ด ์ ํธ์ ์ํ๋ฅผ ์กฐํํ๋ฉฐ, ์ด ์ ํธ๋ ์ง๋ ฌ ํฌํธ์ ์ฐ๊ฒฐ๋ ์ฅ์น๊ฐ ํ์ฑํํ ์ ์๋ ์ ํธ์ ๋๋ค.
-
์ด์์ฒด์ ๊ฐ ์ด๋ฌํ ์ ํธ์ ์ํ๋ฅผ ์์๋ด์ง ๋ชปํ๊ณ , ๊ทธ ์ด์ ๊ฐ ๋ฌด์์ด๋ , ์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ ๋ค์์ผ๋ก: "
NetworkError"DOMException๊ทธ๋ฆฌ๊ณ ์ด ๋จ๊ณ๋ค์ ์ค๋จํฉ๋๋ค. -
dataCarrierDetect๋ฅผ
true๋ก ๋๋ ์กฐ๊ฑด์ "๋ฐ์ดํฐ ๋ฐ์กํ ๊ฐ์ง" ๋๋ "DCD" ์ ํธ๊ฐ ์ฅ์น์ ์ํด ํ์ฑํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดfalse๋ก ๋ก๋๋ค. -
clearToSend๋ฅผ
true๋ก ๋๋ ์กฐ๊ฑด์ "์ก์ ํ๊ฐ" ๋๋ "CTS" ์ ํธ๊ฐ ์ด๋ฏธ ์ฅ์น์ ์ํด ํ์ฑํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดfalse๋ก ๋ก๋๋ค. -
ringIndicator๋ฅผ
true๋ก ๋๋ ์กฐ๊ฑด์ "ํธ์ถ ํ์" ๋๋ "RI" ์ ํธ๊ฐ ์ด๋ฏธ ์ฅ์น์ ์ํด ํ์ฑํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดfalse๋ก ๋ก๋๋ค. -
dataSetReady๋ฅผ
true๋ก ๋๋ ์กฐ๊ฑด์ "๋ฐ์ดํฐ ์ธํธ ์ค๋น" ๋๋ "DSR" ์ ํธ๊ฐ ์ด๋ฏธ ์ฅ์น์ ์ํด ํ์ฑํ๋ ๊ฒฝ์ฐ์ด๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดfalse๋ก ๋ก๋๋ค. -
signals๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์์ ์๋ ๋งต ยซ[ "
dataCarrierDetect" โ dataCarrierDetect, "clearToSend" โ clearToSend, "ringIndicator" โ ringIndicator, "dataSetReady" โ dataSetReady ]ยป. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ signals๋ก.
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
4.9.1.
SerialInputSignals ์ฌ์
dictionary SerialInputSignals {required boolean dataCarrierDetect ;required boolean clearToSend ;required boolean ringIndicator ;required boolean dataSetReady ; };
dataCarrierDetect๋ฉค๋ฒ, ํ์ boolean- ๋ฐ์ดํฐ ๋ฐ์กํ ๊ฐ์ง (DCD)
clearToSend๋ฉค๋ฒ, ๋ค์ ํ์ boolean- ์ก์ ํ๊ฐ (CTS)
ringIndicator๋ฉค๋ฒ, ํ์ boolean- ํธ์ถ ํ์ (RI)
dataSetReady๋ฉค๋ฒ, ํ์ boolean- ๋ฐ์ดํฐ ์ธํธ ์ค๋น (DSR)
4.10. close() ๋ฉ์๋
๋ค์์ ํธ์ถํ๋ฉด: port.close()
์๋ฌต์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค:
port.readable.cancel()
๋ฐ
port.writable.abort()
์ด๋ ๋น์ฐ๊ธฐ ์ํ ๊ฒ์ผ๋ก,
๋ฒํผ๋ง๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ์ฉ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค์์ ํธ์ถํ๋ค๋ฉด:
port.readable.getReader()
๋๋
port.writable.getWriter()
์คํธ๋ฆผ์
์ ๊ธฐ๋ฉฐ ํฌํธ๋ฅผ ๋ซ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋
์งํ ์ค์ธ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ์์
์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
ํฌํธ๊ฐ ๋ซํ๊ธฐ ์ ์ ๋ฒํผ๋ง๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋๋ก ๋ณด์ฅํ๋ ค๋ฉด
์ ํ๋ฆฌ์ผ์ด์
์ Promise
๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ, ์ด๋ฅผ ๋ฐํํ๋ ๊ฒ์
writer.close()์
๋๋ค.
const encoder= new TextEncoder(); const writer= port. writable. getWriter(); writer. write( encoder. encode( "A long message that will take..." )); await writer. close(); await port. close();
์ ์ก๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฌ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ๋ค์์ ํธ์ถํ ์ ์์ต๋๋ค:
writer.abort().
๋ง์ฝ TransformStream
์ด ํ์ดํ๋ก ์ฐ๊ฒฐ๋ ๋์์ด port.writable
์ด๋ผ๋ฉด,
๋ค์ Promise
๊ฐ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ, ์ฆ
writer.close()
๊ฐ ๋ฐํํ ๊ฐ์ ํด๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ ํ์ดํ ์ฒด์ธ์ด ๋ซํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด
Promise
๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ด๋ฅผ ๋ฐํํ๋ ๊ฒ์ pipeTo()
์ด๋ฉฐ, ๋์ ์ด ๊ฐ์ ํด๊ฒฐ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.
const encoder= new TextEncoderStream(); const writableStreamClosed= encoder. readable. pipeTo( port. writable); const writer= encoder. writable. getWriter(); writer. write( "A long message that will take..." ); writer. close(); await writableStreamClosed; await port. close();
ํฌํธ์์ ์ฒญํฌ๋ฅผ ์ฝ๊ธฐ ์ํด ๋ฃจํ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด,
์์ 4์์์ฒ๋ผ, ๋จผ์ ๋ฃจํ๋ฅผ ์ข
๋ฃํ ํ
๋ค์์ ํธ์ถํด์ผ ํฉ๋๋ค: port.close().
let keepReading= true ; let reader; async function readUntilClosed() { while ( port. readable&& keepReading) { reader= port. readable. getReader(); try { while ( true ) { const { value, done} = await reader. read(); if ( done) { // |reader|๊ฐ ์ทจ์๋์์ต๋๋ค. break ; } // |value|๋ก ์์ ์ ์ํํฉ๋๋ค... } } catch ( error) { // |error|๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค... } finally { reader. releaseLock(); } } await port. close(); } const closed= readUntilClosed(); // ์ผ๋ง ํ... keepReading= false ; reader. cancel(); await closed;
๋ค์์ ํธ์ถํ๋ฉด: reader.cancel()
๋ค์ ํธ์ถ์ด
reader.read()
์ฆ์ ๋ฐํํ๊ฒ ๋์ด,
๋ด๋ถ ๋ฃจํ๋ฅผ ์ข
๋ฃํ๊ณ ๋ค์์ ํธ์ถํฉ๋๋ค:
reader.releaseLock().
๊ทธ๋ฌ๋ฉด ์ธ๋ถ ๋ฃจํ๋
keepReading์ด false๋ก ์ค์ ๋์์ผ๋ฏ๋ก ์ข
๋ฃ๋๋ฉฐ, ์คํธ๋ฆผ์
์ ๊ธ์ด ํด์ ๋์ด port.close()
๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ ์์ต๋๋ค.
๋ค์์ ํธ์ถํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง: port.close()
๊ทธ ์์ ์
๋ค์ Promise
๋ฅผ ๊ธฐ๋ค๋ฆฐ ์งํ๋ก ํ๋ ๊ฒ์ผ๋ก, ์ด๋ฅผ ๋ฐํํ๋ ๊ฒ์
reader.cancel()
์
๋๋ค. ๋ ๋์ ๋ฐฉ๋ฒ์
๋ค์ ํธ์ถ์ port.close()
readUntilClosed()์ ๋ง์ง๋ง ๋จ๊ณ์ ๋๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ฉด ์น๋ช
์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ
port.readable
์ด null์ด ๋ ๋๋ ํฌํธ๊ฐ ๋ซํ๋๋ค.
close()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
promise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this.
[[state]]๊ฐ"opened"๊ฐ ์๋๋ฉด, promise๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ๊ฑฐ๋ถ ์ฌ์ ๋ "InvalidStateError"DOMException์ด๋ฉฐ, promise๋ฅผ ๋ฐํํฉ๋๋ค. -
cancelPromise๋ฅผ ๋ค์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค: ์ทจ์, ๋์์ this.
[[readable]]์ด๋ฉฐ, ๋๋ ๋ค์์ผ๋ก ํด๊ฒฐ๋ ํ๋ก๋ฏธ์ค๋ก ๋ก๋๋ค:undefined, ๋ง์ฝ this.[[readable]]์ดnull์ด๋ฉด. -
abortPromise๋ฅผ ๋ค์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค: ์ค๋จ, ๋์์ this.
[[writable]]์ด๋ฉฐ, ๋๋ ๋ค์์ผ๋ก ํด๊ฒฐ๋ ํ๋ก๋ฏธ์ค๋ก ๋ก๋๋ค:undefined, ๋ง์ฝ this.[[writable]]์ดnull์ด๋ฉด. -
pendingClosePromise๋ฅผ ๋ค์์ผ๋ก ๋ก๋๋ค: ์๋ก์ด ํ๋ก๋ฏธ์ค.
-
๋ง์ฝ this.
[[readable]]๋ฐ this.[[writable]]์ดnull์ด๋ฉด, ํด๊ฒฐํฉ๋๋ค: pendingClosePromise๋ฅผundefined๋ก. -
์ค์ ํฉ๋๋ค: this.
[[pendingClosePromise]]๋ฅผ ๋ค์์ผ๋ก: pendingClosePromise. -
combinedPromise๋ฅผ ๋ค์์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค: ๋ชจ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก๋ฏธ์ค ๊ฐ์ ธ์ค๊ธฐ, ์ธ์๋ ยซcancelPromise, abortPromise, pendingClosePromiseยป์ ๋๋ค.
-
๋ฐ์ํฉ๋๋ค. ๋์์ combinedPromise์ ๋๋ค.
-
combinedPromise๊ฐ ์ดํ๋์๋ค๋ฉด:
-
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
์ด์์ฒด์ ๋ฅผ ํธ์ถํ์ฌ ์ง๋ ฌ ํฌํธ๋ฅผ ๋ซ๊ณ ๊ด๋ จ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํฉ๋๋ค.
-
์ค์ ํฉ๋๋ค: this.
[[readFatal]]๋ฐ this.[[writeFatal]]์false๋ก. -
์ค์ ํฉ๋๋ค: this.
[[pendingClosePromise]]๋ฅผnull๋ก. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค ๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
-
-
combinedPromise๊ฐ r์ ์ฌ์ ๋ก ๊ฑฐ๋ถ๋์๋ค๋ฉด:
-
์ค์ ํฉ๋๋ค: this.
[[pendingClosePromise]]๋ฅผnull๋ก. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ถํฉ๋๋ค: promise๋ฅผ r๋ก.
-
-
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
4.11. forget() ๋ฉ์๋
// ์ง๋ ฌ ํฌํธ๋ฅผ ์์ฒญํฉ๋๋ค. const port= await navigator. serial. requestPort(); // ๊ทธ๋ฐ ๋ค์ ๋์ค์... ์ง๋ ฌ ํฌํธ์ ๋ํ ๊ถํ์ ์ฒ ํํฉ๋๋ค. await port. forget();
forget()
๋ฉ์๋์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
์ฌ์ฉ์ ์์ด์ ํธ๊ฐ ์ด ๋์์ ์ํํ ์ ์๋ค๋ฉด(์: ๊ถํ์ด ๊ด๋ฆฌ์ ์ ์ฑ ์ ์ํด ๋ถ์ฌ๋ ๊ฒฝ์ฐ), ๋ฐํํฉ๋๋ค: ๋ค์์ผ๋ก ํด๊ฒฐ๋ ํ๋ก๋ฏธ์ค:
undefined. -
๋ค์ ๋จ๊ณ๋ฅผ ์คํํฉ๋๋ค. ์คํ ๋ฐฉ์์ ๋ณ๋ ฌ์ ๋๋ค:
-
์ ๊ฑฐํฉ๋๋ค: this๋ฅผ ์์คํ ์ ์ง๋ ฌ ํฌํธ ์ํ์ค์์. ํด๋น ์ํ์ค๋ ์ด์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์ ๊ทผ์ ํ์ฉํ ํฌํธ๋ค์ด๋ฉฐ, ํธ์ถ ๋์์
requestPort()์ ๋๋ค. -
์ ์ญ ์์ ์ ํ์ ๋ฃ์ต๋๋ค. ๋์์ ๊ด๋ จ ์ ์ญ ๊ฐ์ฒด์ด๋ฉฐ, ์ด๋ this์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ ์ง๋ ฌ ํฌํธ ์์ ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํฉ๋๋ค: promise๋ฅผ
undefined๋ก.
-
promise๋ฅผ ๋ฐํํฉ๋๋ค.
5. ์ฐจ๋จ ๋ชฉ๋ก
์ด ๋ช ์ธ๋ ๋ค์ ์์น์ ์๋ ์ฐจ๋จ ๋ชฉ๋ก ํ์ผ์ ์ฌ์ฉํฉ๋๋ค: https://github.com/whatwg/serial ์ ์ฅ์์ด๋ฉฐ, ์ด๋ฅผ ํตํด ์น์ฌ์ดํธ๊ฐ ์ ๊ทผํ ์ ์๋ ํฌํธ ์งํฉ์ ์ ํํฉ๋๋ค.
๋ค์์ ์ํํ ๊ฒฐ๊ณผ๋ Bluetooth ์๋น์ค ํด๋์ค ID
์ฐจ๋จ ๋ชฉ๋ก ํ์ฑ์ด๋ฉฐ, ๊ทธ ์์น์ธ
URL url์์ ์ป๋ ๊ฒฐ๊ณผ๋ ๋ชฉ๋ก์ผ๋ก, ๊ทธ ํญ๋ชฉ์ UUID
๊ฐ์ด๋ฉฐ ์ฌ์ฉ์ ์ ์
์๋น์ค ID๋ฅผ ๋ํ๋
๋๋ค.
์ด ์ง๋ ฌ ํฌํธ
ํ๋กํ์ผ ์๋น์ค ํด๋์ค ID๋
BluetoothServiceUUID
์ด๋ฉฐ, ๊ฐ์ "00001101-0000-1000-8000-00805f9b34fb"์
๋๋ค.
BluetoothServiceUUID
serviceUuid๊ฐ ์ฐจ๋จ๋ Bluetooth ์๋น์ค
ํด๋์ค UUID์ธ ์กฐ๊ฑด์ ๋ค์ ๋จ๊ณ๊ฐ true๋ฅผ ๋ฐํํ๋ ๊ฒ์
๋๋ค:
-
uuid๋ฅผ ๋ค์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค:
BluetoothUUID.getService()์ธ์๋ serviceUuid์ ๋๋ค. -
blocklist๋ฅผ ๋ค์์ ๊ฒฐ๊ณผ๋ก ๋ก๋๋ค: Bluetooth ์๋น์ค ํด๋์ค ID ์ฐจ๋จ ๋ชฉ๋ก ํ์ฑ, ๋์ ์์น๋ https://github.com/whatwg/serial/blob/main/bluetooth-service-blocklist.txt์ ๋๋ค.
-
๋ง์ฝ blocklist๊ฐ ํฌํจํ๋ ๊ฐ์ด uuid์ด๋ฉด,
true๋ฅผ ๋ฐํํฉ๋๋ค. -
๋ง์ฝ uuid์ ๊ฐ์ ๊ฒ์ด ์ง๋ ฌ ํฌํธ ํ๋กํ์ผ ์๋น์ค ํด๋์ค ID์ด๋ฉด, ๋ฐํํฉ๋๋ค:
false. -
๋ง์ฝ uuid๊ฐ ๋๋๋ ๊ฐ์ด "
-0000-1000-8000-00805f9b34fb"์ด๋ฉด, ๋ฐํํฉ๋๋ค:true. -
๊ทธ๋ ์ง ์์ผ๋ฉด,
false๋ฅผ ๋ฐํํฉ๋๋ค.
6. ํตํฉ
6.1. ๊ถํ ์ ์ฑ
์ด ๋ช
์ธ๋ ๋
ธ์ถ๋ ๋ฉ์๋์ ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ฉฐ,
๋
ธ์ถํ๋ ๊ฒ์ serial
์์ฑ์ผ๋ก, ์ด ์์ฑ์ Navigator
๊ฐ์ฒด์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ฅ ์ด๋ฆ์ "serial"์
๋๋ค.
์ด ๊ธฐ๋ณธ ํ์ฉ ๋ชฉ๋ก์ ์ด ๊ธฐ๋ฅ์ ๋ํด
'self'์
๋๋ค.
7. ๋ณด์ ๊ณ ๋ ค ์ฌํญ
์ด ์ ์ ๋น๊ท๋ฒ์ ์ ๋๋ค.
์ด API๋ ๋ค์๊ณผ ์ ์ฌํ ๋ณด์ ์ํ์ ์๋ฐํฉ๋๋ค: [WEBBLUETOOTH] ๋ฐ [WEBUSB], ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ ์ด๋ค๋ก๋ถํฐ ์ป์ ๊ตํ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
์ ์ฑ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์๋ฅผ ์์ฌ ์ ๊ทผ ๊ถํ์ ์ป์ ์ฅ์น์ ์๋ ๊ธฐ๋ฅ์ ์ ์์ ์ธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ก๋ด์ด ๋ฌผ๋ฆฌ์ ํผํด๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
-
์ ์ฑ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์๋ฅผ ์์ฌ ์ ๊ทผ ๊ถํ์ ์ป์ ์ฅ์น์ ์์ฒด ํ์จ์ด๋ฅผ ์ค์นํ์ฌ, ์ฅ์น์ ์๋ ๊ธฐ๋ฅ์ ์ ์์ ์ธ ๋ชฉ์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฐ๊ฒฐ๋ ํธ์คํธ๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค๋ฅธ ํธ์คํธ ์ํํธ์จ์ด๊ฐ ์ฅ์น์ ํต์ ํ ๋ ๋ฒํผ ์ค๋ฒํ๋ก๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
-
์ ๊ทผ ๊ถํ์ ๋ถ์ฌ๋ฐ์ ์ ๋ขฐํ ์ ์๋ ์ฌ์ดํธ์ ์ ์ฑ ์ฝ๋๊ฐ ์ฃผ์ ๋์ด, ํด๋น ์ฅ์น์ ๋ํด ์์ ๋์ ์ค ํ๋๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์จ๋ผ์ธ ํ์จ์ด ์ ๋ฐ์ดํธ ์ ํธ๋ฆฌํฐ๊ฐ ํดํน๋์ด ์ ์ฑ ํ์จ์ด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
-
๊ณต๊ฒฉ์๊ฐ ์ฌ์ฉ์๋ฅผ ์ค๋ํ์ฌ ์ ์ฑ ์ฅ์น๋ฅผ ์์คํ ์ ์ฐ๊ฒฐํ๊ฒ ํ๊ณ , ์ด ์ฅ์น๊ฐ ์ ์ฑ ์ฌ์ดํธ๋ ์นจํด๋ ์ฌ์ดํธ์ ๊ณต๋ชจํ์ฌ ๊ณต๊ฒฉ์์๊ฒ ๋ค์ ํต์ ํ ์ ์๋ ์น ๊ธฐ๋ฐ ์ฑ๋์ ๋ง๋๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ด๋ฌํ ๋ชจ๋ ๊ณต๊ฒฉ์ ๋ํ ์ฃผ๋ ์ํ์ฑ
์ requestPort()
ํจํด์ผ๋ก, ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๊ตฌํ๋ฉฐ ํ ๋ฒ์
ํ๋์ ์ฅ์น์ ๋ํ ์ ๊ทผ๋ง ํ์ฉํฉ๋๋ค. ์ด๋ ์ฌ์ดํธ๊ฐ
์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฅ์น๋ฅผ ์ด๊ฑฐํ์ฌ ์ทจ์ฝํ ์ฅ์น์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์์๋ผ ์ ์๊ฒ ํ๋ฏ๋ก ๋๋ผ์ด๋ธ๋ฐ์ด ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ฉฐ,
๋์ ์ ๊ทผ์ ์ํ๋ค๋ ์ฌ์ค์ ์ฌ์ฉ์์๊ฒ ๋ช
์์ ์ผ๋ก ์๋ ค์ผ ํฉ๋๋ค.
๊ตฌํ์ ์ฌ์ดํธ๊ฐ ํ์ฌ ์ฅ์น์ ํต์ ํ๊ณ ์๋ค๋
์๊ฐ์ ํ์์ ํด๋น ๊ถํ์ ์ธ์ ๋ ์ง ์ฒ ํํ ์ ์๋
์ ์ด ์๋จ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
์ด ๋ช ์ธ๋ ์ฌ์ดํธ๊ฐ ๋ณด์ ์ปจํ ์คํธ์์ ์ ๊ณต๋์ด์ผ ํ๋ค๊ณ ์๊ตฌํ๋ฉฐ, ์ด๋ ๋คํธ์ํฌ ๊ธฐ๋ฐ ๊ณต๊ฒฉ์์ ์ ์ฑ ์ฝ๋ ์ฃผ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ๊ถํ์ ๊ฒฐ์ ํ ๋ ํ์๋๋ ์ฌ์ดํธ์ ์ ์์ด ์ ํํจ์ ๋ณด์ฅํฉ๋๋ค. ๋ํ ์ด ๋ช ์ธ๋ ์ต์์ ๋ฌธ์๊ฐ ๋ค์์ ํตํด ๋ช ์์ ์ผ๋ก ํ์ฉํ ํ์๋ง [PERMISSIONS-POLICY], ๊ต์ฐจ ์ถ์ฒ iframe์ด API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์๊ตฌํฉ๋๋ค. ๋ค์๊ณผ ๊ฒฐํฉํ๋ฉด [CSP3], ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์ ์ฑ ์ฝ๋ ์ฃผ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํด ์ค๋๋ค.
๋จ์ ์๋ ์ฐ๋ ค๋ ์ฐ๊ฒฐ๋ ์ฅ์น๊ฐ ํผ์ฑ ๊ณต๊ฒฉ์ผ๋ก ์ ์ฉ๋๋ ๊ฒ์ผ๋ก, ์ฌ์ฉ์๋ฅผ ์ค๋ํ์ฌ ์ ์ฑ ์ฌ์ดํธ์ ์ฅ์น ์ ๊ทผ์ ํ์ฉํ๊ฒ ํ๋ ๊ณต๊ฒฉ์ ๋๋ค. ์ด๋ฌํ ๊ณต๊ฒฉ์ ์ฅ์น์ ์๋ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ฑฐ๋ ์ฅ์น์ ์ ์ฑ ํ์จ์ด๋ฅผ ์ค์นํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ด ํ์จ์ด๋ ๋ค์ ํธ์คํธ ์ปดํจํฐ๋ฅผ ๊ณต๊ฒฉํฉ๋๋ค. ํธ์คํธ ์ํํธ์จ์ด๋ ์ฐ๊ฒฐ๋ ์ฅ์น์ ์ ๋ ฅ์ ์ ๋๋ก ๊ฒ์ฆํ์ง ์์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ต๋๋ค. ์ด ๋ถ์ผ์ ๋ณด์ ์ฐ๊ตฌ๋ ์ํํธ์จ์ด ๊ณต๊ธ์ ์ฒด๊ฐ ์ฐ๊ฒฐ๋ ์ฅ์น๋ฅผ ์ ๋ขฐํ ์ ์๋ ๊ฒ์ผ๋ก ์ทจ๊ธํ๋๋ก ์ ๋ํด ์์ต๋๋ค.
์ด๋ฌํ ์ ํ์ ๊ณต๊ฒฉ์ ์์ ํ ๋ฐฉ์งํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์์ต๋๋ค. ํ์ด์ง์์ ์ฅ์น๋ก ๋ณด๋ด๋ ๋ฐ์ดํฐ๋ ๋ด์ฉ์ ํด์ํ ์ ์๋ ๋ฐ์ดํธ ์ํ์ค์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ํน์ ์ ํ์ ๋ฐ์ดํฐ ์ ์ก์ ์ฐจ๋จํ๋ ค๋ ์๋์ ๋ํด์๋ ๊ทธ๋ผ์๋ ํด๋น ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ค๋ ์ฅ์น ์ ์กฐ์ ์ฒด๊ฐ ์ฐํ ๋ฐฉ๋ฒ์ ๋ง๋ จํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ฌ์ฉ์ ์์ด์ ํธ๋ ์ฅ์น ์ ๊ทผ์ ์ ์ดํ๋ ์ถ๊ฐ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค:
-
์ฌ์ดํธ๊ฐ ๋ค์์ ํธ์ถํ์ง ๋ชปํ๋๋ก ํ๋ ์ค์ ์ ๋๋ค:
requestPort()๋จ, ๋ช ์์ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐ๋ ๊ฒฝ์ฐ๋ ์ ์ธํฉ๋๋ค.์์คํ ๊ด๋ฆฌ์๋ ๊ด๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๊ธฐ์ ์ด๋ฌํ ์ค์ ์ ์ ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ํด ๊ธฐ์ ์ ์ฑ ์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ์ด๋ ๊ด๋ฆฌ์๊ฐ ์ ํํ ์ฌ์ดํธ์ ํน์ ์ฅ์น์ ์ ๊ทผ ๊ถํ๋ง ์๋์ผ๋ก ๋ถ์ฌํ๊ณ ๋ค๋ฅธ ์ฅ์น์ ์ ๊ทผ์ ํ์ฉํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
-
์ ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์๋ ค์ง ํ๋์จ์ด์ ์ฅ์น ID ๋ชฉ๋ก์ ์ฌ์ฉ์ ์์ด์ ํธ์ ํจ๊ป ๋ฐฐํฌํ ์ ์์ต๋๋ค. ๋ชฉ๋ก์ ์๋ ์ฅ์น๋ก์ ์ฐ๊ฒฐ์ ์ฐจ๋จ๋ฉ๋๋ค. ๊ตฌํ์ ์๋ ์ ๋ฐ์ดํธ ๋๋ ์คํ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ์ด ๋ชฉ๋ก์ ์ ๋ฐ์ดํธ๋ฅผ ์ฆ์ ๋ฐฐํฌํจ์ผ๋ก์จ ์งํ ์ค์ธ ๊ณต๊ฒฉ์ ์ฐจ๋จํ ์ ์์ต๋๋ค.
๋ค์์ ๊ตฌํ๋ค์ [WEBBLUETOOTH] ๋ฐ [WEBUSB], ์ด๋ฌํ ์ํ์ฑ ์ ์คํํด ์์ง๋ง, ๊ทธ ํจ๊ณผ์๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ์ฒซ์งธ, ์ฅ์น์ ์ ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด API๋ ์ฌ์ดํธ๊ฐ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ ๊ฐ๋ฐ ๋ณด๋์ ํ์จ์ด๋ฅผ ์ ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ด API์ ํต์ฌ ์ฌ์ฉ ์ฌ๋ก๋ก, ์ด๋ฌํ ์ฅ์น๊ฐ ๊ต์ก ๋ฐ ์ทจ๋ฏธ ์์ฅ์์ ํํ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ๋ณด๋๋ ํ์จ์ด ์๋ช ๊ฒ์ฆ์ ๊ตฌํํ์ง ์์ผ๋ฏ๋ก ์ฝ๊ฒ ์ ์ฑ ์ฅ์น๋ก ๋ฐ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณด๋๋ ๋ถ๋ช ํ ์ ์ฉ ๊ฐ๋ฅํ์ง๋ง ์ฐจ๋จํด์๋ ์ ๋ฉ๋๋ค.
๋ํ ์ทจ์ฝํ ์ฅ์น ๋ชฉ๋ก์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ USB ๋ฐ Bluetooth์ ์ ์ ์ฉ๋ฉ๋๋ค. ์ด ํ๋กํ ์ฝ๋ค์ด ์ฅ์น ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋์ญ ์ธ ๋ฉ์ปค๋์ฆ์ ์ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ฅ์น์ ์ ์กฐ์ฌ์ ๋ชจ๋ธ์ ํธ์คํธ์ ๊ฐ์ ์ง๋ ฌ ํฌํธ๋ก ํ์๋๋๋ผ๋ ์ฝ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฒ์ฉ USB-์ง๋ ฌ ๋๋ Bluetooth-์ง๋ ฌ ์ด๋ํฐ๋ฟ ์๋๋ผ "์ค์ " ์ง๋ ฌ ํฌํธ๋ฅผ ๊ฐ์ถ ์์คํ ๋ ์์ผ๋ฉฐ, DB-25, DE-9 ๋๋ RJ-45 ์ปค๋ฅํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์ฐ๊ฒฐ๋ ์ฅ์น์ ์ ์์ ์์๋ด๊ธฐ ์ํด ์ฝ์ ์ ์๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก, ํด๋น ์ฅ์น์ ๋ํ ์ ๊ทผ์ ์ฐจ๋จํ ์ ์์ต๋๋ค.
8. ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ณ ๋ ค ์ฌํญ
์ด ์ ์ ๋น๊ท๋ฒ์ ์ ๋๋ค.
์ง๋ ฌ ํฌํธ์ ์ง๋ ฌ ์ฅ์น์๋ ๋ ์ข ๋ฅ์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ํฌํธ๊ฐ USB ๋๋ Bluetooth ์ฅ์น์ธ ๊ฒฝ์ฐ, ๊ณต๊ธ์ ์ฒด ๋ฐ ์ ํ ID(์ ์กฐ์ฌ์ ๋ชจ๋ธ์ ์๋ณํจ)์ ๊ฐ์ ์๋ณ์๋ฟ ์๋๋ผ ์ผ๋ จ๋ฒํธ ๋๋ MAC ์ฃผ์๊ฐ ์์ต๋๋ค. ์ง๋ ฌ ์ฅ์น ์์ฒด์๋ ๊ณ ์ ํ ์๋ณ์๊ฐ ์์ ์ ์์ผ๋ฉฐ, ์ง๋ ฌ ํฌํธ๋ฅผ ํตํด ๋ณด๋ธ ๋ช ๋ น์ผ๋ก ์ด๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ฅ์น์๋ ์๋ณ ๊ฐ๋ฅ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ค๋ฅธ ์ฌ์ ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์์ ์๋ ์์ต๋๋ค.
์ฅ์น ๊ถํ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ตฌํ์ ์ฅ์น ์๋ณ์, ์๋ฅผ ๋ค์ด USB ๊ณต๊ธ์ ์ฒด ID, ์ ํ ID ๋ฐ ์ผ๋ จ๋ฒํธ๋ฅผ ์ฌ์ฉ์ ํ๊ฒฝ์ค์ ํ์ผ์ ์ ์ฅํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ์ ๊ทผ์ ํ์ฉํ ์ฅ์น์ ์์ ์ ์ธ ์๋ณ์๋ก ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ฌ์ดํธ์ ์ง์ ๊ณต์ ๋์ง ์์ผ๋ฉฐ, ๊ถํ์ด ์ฒ ํ๋๊ฑฐ๋ ์ฌ์ดํธ ๋ฐ์ดํฐ ์ ์ฒด๊ฐ ์ญ์ ๋๋ฉด ํจ๊ป ์ญ์ ๋ฉ๋๋ค.
์ ๊ทผ์ ํ์ฉ๋ฐ์ ํ์ด์ง๊ฐ ์ฅ์น์ ๋ณด๋ผ ์ ์๋ ๋ช ๋ น์ ํตํด ํ์ด์ง๋ ์ฅ์น์ ์ ์ฅ๋ ๋ค๋ฅธ ๋ฏผ๊ฐํ ์ ๋ณด์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. ยงโฏ7 ๋ณด์ ๊ณ ๋ ค ์ฌํญ์์ ์ธ๊ธํ ์ด์ ๋ก, ์ด๋ฅผ ๋ง๋ ๊ฒ์ ๋นํ์ค์ ์ด๋ฉฐ ๋ํ ํ์ด์ง๊ฐ ์ด ์ ๋ณด์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์๋ํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
๊ตฌํ์ ์ฌ์ดํธ๊ฐ ์ ๊ทผํ ์ ์๋ ์ฅ์น์ ๋ํ ์์ ํ ์ ์ด๊ถ์
์ฌ์ฉ์์๊ฒ ์ ๊ณตํด์ผ ํ๋ฉฐ, ์ฌ์ฉ์ ์ํธ์์ฉ ์์ด ์ฅ์น ์ ๊ทผ์ ํ์ฉํด์๋ ์ ๋ฉ๋๋ค. ์ด๊ฒ์ด
๋ค์ requestPort()
๋ฉ์๋์ ์๋์
๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ดํธ๊ฐ
์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฅ์น๋ฅผ ๋ชฐ๋ ์ด๊ฑฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ง ๋ชปํ๋๋ก ํฉ๋๋ค. ์ด๋
ํ์ผ ์ ํ๊ธฐ UI์ ์ ์ฌํฉ๋๋ค. ์ฌ์ดํธ๋ ํ์ผ ์์คํ
์ ์ฒด๋ฅผ ์ ์ ์์ผ๋ฉฐ,
์ฌ์ฉ์๊ฐ ์ ํํ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ง ์ ์ ์์ต๋๋ค. ๊ตฌํ์
์ฌ์ดํธ๊ฐ ์ด๋ฌํ ๊ถํ์ ์ฌ์ฉํ ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆด ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ํด ํ์
์์ด์ฝ์ ํญ์ด๋ ์ฃผ์ ํ์์ค์ ๋ํ๋ผ ์ ์์ต๋๋ค.
"๋น๊ณต๊ฐ" ๋๋ "์ํฌ๋ฆฟ" ํ์ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ ๊ตฌํ์ ์ฌ์ฉ์์ ์ผ๋ฐ ํ๋กํ์ ์๋ ๊ถํ์ด ์ด๋ฌํ ์ธ์ ์ผ๋ก ์ด์ด์ง์ง ์๋๋ก ํ๊ณ , ํด๋น ์ธ์ ์์ ๋ถ์ฌ๋ ๊ถํ์ด ์ธ์ ์ข ๋ฃ ํ์๋ ์ ์ง๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ๊ตฌํ์ ์ด๋ฌํ ์ธ์ ์์ ์ฅ์น ์ ๊ทผ์ ํ์ฉํ ๋ ์ฌ์ฉ์์๊ฒ ๊ฒฝ๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ ์๋ณ ์ ๋ณด๋ฅผ ์ง์ ์ ๋ ฅํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฅ์น ์๋ณ์ ๋ฐ ๊ธฐํ ๊ณ ์ ์์ฑ์ ์์ ์ธ๊ธํ ์ฅ์น์์ ํต์ ์ ํตํด ์ป์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ๊ฐ์ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฌ์ฉ์๊ฐ ์ฅ์น ์ ๊ทผ์ ํ์ฉํ๋ ๊ฒ์ด ์น ๋ณด์ ๋ชจ๋ธ์ ๊ธฐ์กด ๊ฒฉ๋ฆฌ ๊ฒฝ๊ณ๋ฅผ ์ด๋ป๊ฒ ํ๋ฌด๋์ง ์ดํดํ์ง ๋ชปํ๋ฉด, ์ด API๊ฐ ๋ถ์ฌํ๋ ๊ธฐ๋ฅ์ ๋๋ ์ ์์ต๋๋ค. ๋ณด์ UI์ ๋ฌธ์๋ ์ฌ์ดํธ์ ์ฅ์น ์ ๊ทผ์ ํ์ฉํ๋ฉด ์ฌ์ดํธ๊ฐ ์ฅ์น์ ๊ทธ ์์ ํฌํจ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์ดํ ์ ์๊ฒ ๋ ์ ์์์ ์ค๋ช ํด์ผ ํฉ๋๋ค.
๊ฐ์ฌ์ ๋ง
๋ค์ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค: Anatol Ulrich, Chris Mumford, Clรฉment Menard, Domenic Denicola, Dominique Hazael-Massieux, Florian Loitsch, Florian Scholz, Francis Gulotta, Franรงois Beaufort, Jack Hsieh, Keavon Chambers, Kenneth Rohde Christiansen, Marcos Cรกceres, Matt Reynolds, Jesse Melhuish, Michael Kohler, Ms2ger, Rick Waldron, Sankha Narayan Guria, Simon Pieters, Suz Hinton, Travis Leithead, ๊ทธ๋ฆฌ๊ณ Vincent Scheib ์ฌ๋ฌ๋ถ์ ํ๋ฅญํ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ํ์ค์ ์์ฑ์๋ Reilly Grant์ ๋๋ค. (Google, reillyg@google.com).
์ง์์ฌ์ฐ๊ถ
์ ์๊ถ ยฉ WHATWG (Apple, Google, Mozilla, Microsoft). ์ด ์ ์๋ฌผ์๋ ํฌ๋ฆฌ์์ดํฐ๋ธ ์ปค๋จผ์ฆ ์ ์์ํ์ 4.0 ๊ตญ์ ๋ผ์ด์ ์ค๊ฐ ์ ์ฉ๋ฉ๋๋ค. ์ด ์ ์๋ฌผ์ ์ผ๋ถ๊ฐ ์์ค ์ฝ๋์ ํฌํจ๋๋ ๊ฒฝ์ฐ, ์์ค ์ฝ๋์ ํฌํจ๋ ํด๋น ๋ถ๋ถ์๋ BSD 3-Clause ๋ผ์ด์ ์ค๊ฐ ๋์ ์ ์ฉ๋ฉ๋๋ค.