Slide 1

Slide 1 text

GoΛ࢖ͬͨ ηϯαʔσʔλऩूج൫ ͷ ࣄྫͷ͓࿩ @takeshinoda

Slide 2

Slide 2 text

ࣗݾ঺հ • ࣰా ݈ (͠ͷͩ ͚ͨ͠) • @takeshinoda • MODE, Inc ۈ຿ • ීஈ͸Rubyist • ன͸GoͱTypeScriptॻ͍ͯ·͢ • Go΋݁ߏ޷͖

Slide 3

Slide 3 text

MODE, Inc. • γϦίϯόϨʔʹͯ2014೥૑ۀ • B2BͳIoTج൫Λఏڙ • ϦΞϧͷσʔλऩू • ϦΞϧσʔλ࢖ͬͨϏδωεͷ͓ख఻͍

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

ϓϩμΫγϣϯ΁ͷ͓ख఻͍ MODE Ϋϥ΢υ ࣌ܥྻ DB WebHook Πϕϯτج൫ OTA (Over-the-Air) ϩάऩू σόΠε؅ཧ ೝূ Users / Devices / API access MODE ήʔτ΢ΣΠ MODE αʔϏε Ϗδωεɾۀ຿αʔϏε ݱ࣮σʔλ ηϯαʔ/֤छػثσʔλ ͜͜ͷϨΠϠʔʹରͯ͠ PoCϨϕϧ͔Β ϓϩμΫγϣϯϨϕϧ·Ͱͷ ٕज़Λఏڙ͢Δ

Slide 6

Slide 6 text

MODE Ϋϥ΢υ MODE ήʔτ΢ΣΠ MODE αʔϏε Ϣʔβʔɾఏܞاۀ ݱ࣮ੈք Sensor Cloud Mobility Cloud Factory Cloud ࣌ܥྻ DB ࣌ܥྻ DB/SDS ࣌ܥྻ DB

Slide 7

Slide 7 text

MODE Gateway PLC Bluetooth MODbus GPS OBD-II ControllerPC RS-485 Bluetooth LE MODbus/RTU NMEA 0183 CANbus / ISO9141-2 Smb protocol MODE Platform Application TSDB Event Dispatcher Manage Devices OTA Update Authentica tion Application MQTT REST API REST API

Slide 8

Slide 8 text

MODE Gateway PLC Bluetooth MODbus GPS OBD-II ControllerPC RS-485 Bluetooth LE MODbus/RTU NMEA 0183 CANbus / ISO9141-2 Smb protocol MODE Platform Application TSDB Event Dispatcher Manage Devices OTA Update Authentica tion Application MQTT REST API REST API Go: Gateway, Server side TypeScript: Frontend, Gateway

Slide 9

Slide 9 text

Gateway OS: Ubuntu 16.04, 18.04, Yocto… Gateway main process Node process WiFi / 3G OTA Updater Log collector

Slide 10

Slide 10 text

Go͸IoTͰศར Intel, ARM Ubuntu, Yocto Intel NUC, VIA, OpenBlocks, etc…

Slide 11

Slide 11 text

Go͸IoTͰศར • ࠷ॳظ͸ES6 • ΫϩείϯύΠϧͷखؒͷ໰୊ • ඇಉظσʔλ௨৴ͷ੍ޚͷ؆ศ͞ • select, channel, goroutine • σϓϩΠͷ؆ศ͞ • ͜ͷྖҬͷ؆ศ͞ͱͦͦ͜͜ศརͳܕ

Slide 12

Slide 12 text

Server side ඇಉظॲཧͱ ಉظॲཧ͕ࠞͬͯ͟Δ Gateway Eventॲཧ ࠶ૹॲཧ ࠶઀ଓॲཧ Event όοϑΝϦϯά Command Synced data

Slide 13

Slide 13 text

Go͸IoTͰศར • ඇಉظ෦෼͸channelͱgoroutine • ಉظ෦෼͸௨ৗͷίʔυ • channelͱselect͕ͳ͍৔߹ɺͨ͘͞ΜͷΠϕ ϯτۦಈͰσʔλ͕ൃੜ͢ΔσʔλΛඇಉظ ॲཧͰॻ͘ͷ͕େม • node΋EventEmitterͳͲͰదͯ͠͸͍ͨ • ֤छGWσϓϩΠͷ؆ศ͞ͱσόοάͷ؆ศ ͞ͰGo͕࠾༻͞Εͨ

Slide 14

Slide 14 text

Πϕϯτൃੜॲཧ TS for await (const sensorData of sensorModule.dataIterator()) { try { await timeout(dataSender.sendData(sensorData), timeout); } catch (error) { logger.error(`Failed: ${error}`); } } async* dataIterator(): AsyncIterable { while (true) { let sensorData: SensorData[]; try { sensorData = await this.next(); } catch (error) { throw error; // break loop } yield sensorData; } }

Slide 15

Slide 15 text

Πϕϯτൃੜॲཧ Go select { case l := <- serial.Rx: return string(l), nil case <-time.After(timeout): return "", errors.New(“readtimeout”) } for { buf := make([]bytes, 1024) if _, err := s.Read(buf); err != nil { … } serial.Rx <- buf }

Slide 16

Slide 16 text

Go͸IoTͰศར • Ͳ͕ͬͪྑ͍͔͸͘͢͝೉͍͠ • Ͳͬͪ΋ͳΜͱ͔ͳΔ • node΋Go΋ඇಉظॲཧ͸༏ल • ݸਓతʹ͸Goͷํ͕҆৺ • TSతͳॻ͖ํʹ׳Εͯͳ͍ͷ΋΋ͪΖΜ͋Δ • ͔͠͠nodeͰ΍Δͱ͖ʹ͸TS͸҆͘͢͝৺

Slide 17

Slide 17 text

ͭ͠΋Μ

Slide 18

Slide 18 text

͋Γ͕ͱ͏ ͍͟͝·ͨ͠