golang.tokyo #26 LT https://golangtokyo.connpass.com/event/147175/
GoΛͬͨηϯαʔσʔλऩूج൫ͷࣄྫͷ͓@takeshinoda
View Slide
ࣗݾհ• ࣰా ݈ (͠ͷͩ ͚ͨ͠)• @takeshinoda• MODE, Inc ۈ• ීஈRubyist • னGoͱTypeScriptॻ͍ͯ·͢• Go݁ߏ͖
MODE, Inc.• γϦίϯόϨʔʹͯ2014ۀ• B2BͳIoTج൫Λఏڙ• ϦΞϧͷσʔλऩू• ϦΞϧσʔλͬͨϏδωεͷ͓ख͍
ϓϩμΫγϣϯͷ͓ख͍MODE Ϋϥυ࣌ܥྻ DBWebHookΠϕϯτج൫ OTA (Over-the-Air)ϩάऩूσόΠεཧೝূ Users / Devices / API accessMODE ήʔτΣΠMODE αʔϏεϏδωεɾۀαʔϏεݱ࣮σʔλ ηϯαʔ/֤छػثσʔλ͜͜ͷϨΠϠʔʹରͯ͠PoCϨϕϧ͔ΒϓϩμΫγϣϯϨϕϧ·Ͱͷٕज़Λఏڙ͢Δ
MODE ΫϥυMODE ήʔτΣΠMODE αʔϏεϢʔβʔɾఏܞاۀݱ࣮ੈքSensorCloudMobilityCloudFactoryCloud࣌ܥྻ DB ࣌ܥྻ DB/SDS ࣌ܥྻ DB
MODEGatewayPLCBluetoothMODbusGPSOBD-IIControllerPCRS-485Bluetooth LEMODbus/RTUNMEA 0183CANbus / ISO9141-2Smb protocolMODEPlatformApplicationTSDBEventDispatcherManageDevicesOTAUpdateAuthenticationApplicationMQTTREST APIREST API
MODEGatewayPLCBluetoothMODbusGPSOBD-IIControllerPCRS-485Bluetooth LEMODbus/RTUNMEA 0183CANbus / ISO9141-2Smb protocolMODEPlatformApplicationTSDBEventDispatcherManageDevicesOTAUpdateAuthenticationApplicationMQTTREST APIREST APIGo: Gateway, Server sideTypeScript: Frontend, Gateway
GatewayOS: Ubuntu 16.04, 18.04, Yocto…Gateway mainprocessNode processWiFi / 3GOTA UpdaterLog collector
GoIoTͰศརIntel, ARMUbuntu, YoctoIntel NUC, VIA, OpenBlocks, etc…
GoIoTͰศར• ࠷ॳظES6• ΫϩείϯύΠϧͷखؒͷ• ඇಉظσʔλ௨৴ͷ੍ޚͷ؆ศ͞• select, channel, goroutine• σϓϩΠͷ؆ศ͞• ͜ͷྖҬͷ؆ศ͞ͱͦͦ͜͜ศརͳܕ
Server sideඇಉظॲཧͱಉظॲཧ͕ࠞͬͯ͟ΔGatewayEventॲཧ࠶ૹॲཧ࠶ଓॲཧEventόοϑΝϦϯάCommandSynced data
GoIoTͰศར• ඇಉظ෦channelͱgoroutine• ಉظ෦௨ৗͷίʔυ• channelͱselect͕ͳ͍߹ɺͨ͘͞ΜͷΠϕϯτۦಈͰσʔλ͕ൃੜ͢ΔσʔλΛඇಉظॲཧͰॻ͘ͷ͕େม• nodeEventEmitterͳͲͰద͍ͯͨ͠• ֤छGWσϓϩΠͷ؆ศ͞ͱσόοάͷ؆ศ͞ͰGo͕࠾༻͞Εͨ
Πϕϯτൃੜॲཧ TSfor 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;}}
Πϕϯτൃੜॲཧ Goselect {case l := <- serial.Rx:return string(l), nilcase <-time.After(timeout):return "", errors.New(“readtimeout”)}for {buf := make([]bytes, 1024)if _, err := s.Read(buf); err != nil {…}serial.Rx <- buf}
GoIoTͰศར• Ͳ͕ͬͪྑ͍͔͍͘͢͝͠• ͲͬͪͳΜͱ͔ͳΔ• nodeGoඇಉظॲཧ༏ल• ݸਓతʹGoͷํ͕҆৺• TSతͳॻ͖ํʹ׳Εͯͳ͍ͷͪΖΜ͋Δ• ͔͠͠nodeͰΔͱ͖ʹTS҆͘͢͝৺
ͭ͠Μ
͋Γ͕ͱ͏͍͟͝·ͨ͠