$30 off During Our Annual Pro Sale. View Details »

Goを使ったセンサーデータ収集基盤の事例のお話 / golang.tokyo 26 LT

Goを使ったセンサーデータ収集基盤の事例のお話 / golang.tokyo 26 LT

Takeshi Shinoda

September 25, 2019
Tweet

More Decks by Takeshi Shinoda

Other Decks in Programming

Transcript

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

    View Slide

  2. ࣗݾ঺հ
    • ࣰా ݈ (͠ͷͩ ͚ͨ͠)

    • @takeshinoda

    • MODE, Inc ۈ຿

    • ීஈ͸Rubyist

    • ன͸GoͱTypeScriptॻ͍ͯ·͢

    • Go΋݁ߏ޷͖

    View Slide

  3. MODE, Inc.
    • γϦίϯόϨʔʹͯ2014೥૑ۀ

    • B2BͳIoTج൫Λఏڙ

    • ϦΞϧͷσʔλऩू

    • ϦΞϧσʔλ࢖ͬͨϏδωεͷ͓ख఻͍

    View Slide

  4. View Slide

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

    View Slide

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

    View Slide

  7. 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

    View Slide

  8. 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

    View Slide

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

    View Slide

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

    View Slide

  11. Go͸IoTͰศར
    • ࠷ॳظ͸ES6

    • ΫϩείϯύΠϧͷखؒͷ໰୊

    • ඇಉظσʔλ௨৴ͷ੍ޚͷ؆ศ͞

    • select, channel, goroutine

    • σϓϩΠͷ؆ศ͞

    • ͜ͷྖҬͷ؆ศ͞ͱͦͦ͜͜ศརͳܕ

    View Slide

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

    View Slide

  13. Go͸IoTͰศར
    • ඇಉظ෦෼͸channelͱgoroutine

    • ಉظ෦෼͸௨ৗͷίʔυ

    • channelͱselect͕ͳ͍৔߹ɺͨ͘͞ΜͷΠϕ
    ϯτۦಈͰσʔλ͕ൃੜ͢ΔσʔλΛඇಉظ
    ॲཧͰॻ͘ͷ͕େม

    • node΋EventEmitterͳͲͰదͯ͠͸͍ͨ

    • ֤छGWσϓϩΠͷ؆ศ͞ͱσόοάͷ؆ศ
    ͞ͰGo͕࠾༻͞Εͨ

    View Slide

  14. Πϕϯτൃੜॲཧ 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;
    }
    }

    View Slide

  15. Πϕϯτൃੜॲཧ 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
    }

    View Slide

  16. Go͸IoTͰศར
    • Ͳ͕ͬͪྑ͍͔͸͘͢͝೉͍͠

    • Ͳͬͪ΋ͳΜͱ͔ͳΔ

    • node΋Go΋ඇಉظॲཧ͸༏ल

    • ݸਓతʹ͸Goͷํ͕҆৺

    • TSతͳॻ͖ํʹ׳Εͯͳ͍ͷ΋΋ͪΖΜ͋Δ

    • ͔͠͠nodeͰ΍Δͱ͖ʹ͸TS͸҆͘͢͝৺

    View Slide

  17. ͭ͠΋Μ

    View Slide

  18. ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠

    View Slide