Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goを使ったセンサーデータ収集基盤の事例のお話 / golang.tokyo 26 LT
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takeshi Shinoda
September 25, 2019
Programming
0
1k
Goを使ったセンサーデータ収集基盤の事例のお話 / golang.tokyo 26 LT
golang.tokyo #26 LT
https://golangtokyo.connpass.com/event/147175/
Takeshi Shinoda
September 25, 2019
Tweet
Share
More Decks by Takeshi Shinoda
See All by Takeshi Shinoda
多様なプロトコルと 駆動モデルをサポートするIoTゲートウェイの開発と運用の知見
takesinoda
1
1.4k
API Gateway / Lambda / Kinesis を使ったストリーミングなバッチ実行基盤の実装
takesinoda
12
9.2k
捨てて開発できるチームづくり
takesinoda
50
15k
Rubyを始点としてもう一つのエンタープライズ開発を続けたあるSIerの事例 - Oedo RubyKaigi 03 Edition
takesinoda
2
3.5k
エンタープライズ開発にもう一つの文化を
takesinoda
4
11k
Rubyを始点としてもう一つのエンタープライズ開発を続けたあるSIerの事例
takesinoda
5
4.2k
Introduction of thinreports-rails
takesinoda
6
2.7k
Other Decks in Programming
See All in Programming
文字コードの話
qnighy
43
16k
CopilotKit + AG-UIを学ぶ
nearme_tech
PRO
1
110
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
400
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
7
1.2k
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
490
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
480
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
360
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1.1k
朝日新聞のデジタル版を支えるGoバックエンド ー価値ある情報をいち早く確実にお届けするために
junkiishida
1
280
CSC307 Lecture 09
javiergs
PRO
1
850
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
340
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
9
4.6k
Featured
See All Featured
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
350
The browser strikes back
jonoalderson
0
740
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
300
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Paper Plane
katiecoart
PRO
0
47k
Designing for Timeless Needs
cassininazir
0
150
Raft: Consensus for Rubyists
vanstee
141
7.3k
The SEO Collaboration Effect
kristinabergwall1
0
380
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
210
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
380
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
92
Transcript
GoΛͬͨ ηϯαʔσʔλऩूج൫ ͷ ࣄྫͷ͓ @takeshinoda
ࣗݾհ • ࣰా ݈ (͠ͷͩ ͚ͨ͠) • @takeshinoda • MODE,
Inc ۈ • ීஈRubyist • னGoͱTypeScriptॻ͍ͯ·͢ • Go݁ߏ͖
MODE, Inc. • γϦίϯόϨʔʹͯ2014ۀ • B2BͳIoTج൫Λఏڙ • ϦΞϧͷσʔλऩू • ϦΞϧσʔλͬͨϏδωεͷ͓ख͍
None
ϓϩμΫγϣϯͷ͓ख͍ MODE Ϋϥυ ࣌ܥྻ DB WebHook Πϕϯτج൫ OTA (Over-the-Air) ϩάऩू
σόΠεཧ ೝূ Users / Devices / API access MODE ήʔτΣΠ MODE αʔϏε ϏδωεɾۀαʔϏε ݱ࣮σʔλ ηϯαʔ/֤छػثσʔλ ͜͜ͷϨΠϠʔʹରͯ͠ PoCϨϕϧ͔Β ϓϩμΫγϣϯϨϕϧ·Ͱͷ ٕज़Λఏڙ͢Δ
MODE Ϋϥυ MODE ήʔτΣΠ MODE αʔϏε Ϣʔβʔɾఏܞاۀ ݱ࣮ੈք Sensor Cloud
Mobility Cloud Factory Cloud ࣌ܥྻ DB ࣌ܥྻ DB/SDS ࣌ܥྻ DB
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
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
Gateway OS: Ubuntu 16.04, 18.04, Yocto… Gateway main process Node
process WiFi / 3G OTA Updater Log collector
GoIoTͰศར Intel, ARM Ubuntu, Yocto Intel NUC, VIA, OpenBlocks, etc…
GoIoTͰศར • ࠷ॳظES6 • ΫϩείϯύΠϧͷखؒͷ • ඇಉظσʔλ௨৴ͷ੍ޚͷ؆ศ͞ • select, channel,
goroutine • σϓϩΠͷ؆ศ͞ • ͜ͷྖҬͷ؆ศ͞ͱͦͦ͜͜ศརͳܕ
Server side ඇಉظॲཧͱ ಉظॲཧ͕ࠞͬͯ͟Δ Gateway Eventॲཧ ࠶ૹॲཧ ࠶ଓॲཧ Event όοϑΝϦϯά
Command Synced data
GoIoTͰศར • ඇಉظ෦channelͱgoroutine • ಉظ෦௨ৗͷίʔυ • channelͱselect͕ͳ͍߹ɺͨ͘͞ΜͷΠϕ ϯτۦಈͰσʔλ͕ൃੜ͢ΔσʔλΛඇಉظ ॲཧͰॻ͘ͷ͕େม •
nodeEventEmitterͳͲͰద͍ͯͨ͠ • ֤छGWσϓϩΠͷ؆ศ͞ͱσόοάͷ؆ศ ͞ͰGo͕࠾༻͞Εͨ
Πϕϯτൃੜॲཧ TS for await (const sensorData of sensorModule.dataIterator()) { try
{ await timeout(dataSender.sendData(sensorData), timeout); } catch (error) { logger.error(`Failed: ${error}`); } } async* dataIterator(): AsyncIterable<SensorData[]> { while (true) { let sensorData: SensorData[]; try { sensorData = await this.next(); } catch (error) { throw error; // break loop } yield sensorData; } }
Πϕϯτൃੜॲཧ 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 }
GoIoTͰศར • Ͳ͕ͬͪྑ͍͔͍͘͢͝͠ • ͲͬͪͳΜͱ͔ͳΔ • nodeGoඇಉظॲཧ༏ल • ݸਓతʹGoͷํ͕҆৺ •
TSతͳॻ͖ํʹ׳Εͯͳ͍ͷͪΖΜ͋Δ • ͔͠͠nodeͰΔͱ͖ʹTS҆͘͢͝৺
ͭ͠Μ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠