SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
Raspberry Pi + Go で IoT した話
Report
yaegashi
Follow
Sep. 25, 2019
•
0 likes
•
3,027 views
1
of
17
Raspberry Pi + Go で IoT した話
Sep. 25, 2019
•
0 likes
•
3,027 views
Download Now
Download to read offline
Report
Technology
golang.tokyo #26 https://golangtokyo.connpass.com/event/147175/
yaegashi
Follow
Recommended
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
60.9K views
•
33 slides
ロードバランスへの長い道
Jun Kato
13.5K views
•
20 slides
分散システムについて語らせてくれ
Kumazaki Hiroki
119K views
•
45 slides
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
21K views
•
91 slides
DockerとPodmanの比較
Akihiro Suda
45.8K views
•
37 slides
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
15.4K views
•
78 slides
More Related Content
What's hot
Keycloak入門
Hiroyuki Wada
11.7K views
•
42 slides
目grep入門 +解説
murachue
88.6K views
•
83 slides
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
18.3K views
•
63 slides
Linux女子部 systemd徹底入門
Etsuji Nakai
137.2K views
•
50 slides
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
24.4K views
•
55 slides
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
25.2K views
•
51 slides
What's hot
(20)
Keycloak入門
Hiroyuki Wada
•
11.7K views
目grep入門 +解説
murachue
•
88.6K views
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
•
18.3K views
Linux女子部 systemd徹底入門
Etsuji Nakai
•
137.2K views
Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで
Akihiro Suda
•
24.4K views
CODE BLUE 2014 : バグハンターの愉しみ by キヌガワマサト Masato Kinugawa
CODE BLUE
•
25.2K views
開発速度が速い #とは(LayerX社内資料)
mosa siru
•
60K views
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
•
27.8K views
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
Hironobu Isoda
•
6.6K views
10分でわかる Cilium と XDP / BPF
Shuji Yamada
•
11.5K views
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
•
42K views
Binderのはじめの一歩とAndroid
l_b__
•
7.6K views
Redisの特徴と活用方法について
Yuji Otani
•
100.2K views
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
•
10.8K views
FPGA+SoC+Linux実践勉強会資料
一路 川染
•
4.3K views
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
•
2.6K views
オススメの標準・準標準パッケージ20選
Takuya Ueda
•
14.1K views
DockerコンテナでGitを使う
Kazuhiro Suga
•
18.2K views
本当は恐ろしい分散システムの話
Kumazaki Hiroki
•
677.6K views
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
•
22.9K views
Similar to Raspberry Pi + Go で IoT した話
GoでEPC作って本番運用している話
雄也 日下部
1.2K views
•
49 slides
レベルを上げて物理で殴る 16x9
Knit Tiger
2.8K views
•
12 slides
【初心者向け】API を使ってクラウドの管理を自動化しよう
富士通クラウドテクノロジーズ株式会社
675 views
•
16 slides
Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)
Yuji Chino
447 views
•
75 slides
AppGameKit on raspberry pi概概要
SI系、ゲーム系
534 views
•
7 slides
Google IoT Core × SORACOM
Yuji Chino
348 views
•
75 slides
Similar to Raspberry Pi + Go で IoT した話
(20)
GoでEPC作って本番運用している話
雄也 日下部
•
1.2K views
レベルを上げて物理で殴る 16x9
Knit Tiger
•
2.8K views
【初心者向け】API を使ってクラウドの管理を自動化しよう
富士通クラウドテクノロジーズ株式会社
•
675 views
Google IoT Core × SORACOM(補足:PrivateGarden機能の部分は、PublicGate機能の間違えです)
Yuji Chino
•
447 views
AppGameKit on raspberry pi概概要
SI系、ゲーム系
•
534 views
Google IoT Core × SORACOM
Yuji Chino
•
348 views
Node-RED のフローを isaax で配信してみた
Tomoyuki Sugita
•
725 views
JTAGを使ってみよう
Study Group by SciencePark Corp.
•
276 views
Modernization of Factory Automation with Elixir based systems and communities
Yutaka Kikuchi
•
114 views
『自走プログラマー』 が我々に必要だった理由
Takayuki Shimizukawa
•
692 views
20191113 python raspberry_pi_gpio
Kioto Hirahara
•
136 views
Deploy TypeScript Application by CodePipeline
bitbank, Inc. Tokyo, Japan
•
615 views
Singularityで分散深層学習
Hitoshi Sato
•
9.3K views
Datadog Agent on CloudRunによるGCPトレービリティ向上
Ryo Sasaki
•
364 views
今話題のいろいろなコンテナランタイムを比較してみた
Kohei Tokunaga
•
61.6K views
ロボットシステム学2015年第7回
Ryuichi Ueda
•
5.9K views
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
•
252.4K views
GoBGP活用によるSD-WANプラクティス
Toshiki Tsuboi
•
4.7K views
gcpug_okinawa_#2_hiroshi_kawakami
Hiroshi Kawakami
•
330 views
msgraph-sshpubkey
yaegashi
•
205 views
More from yaegashi
Terraforming Windows Virtual Desktop Infrastructure on Azure
yaegashi
126 views
•
18 slides
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
yaegashi
195 views
•
57 slides
Customazed CLI: カスタムVMイメージ作成支援ツール
yaegashi
678 views
•
16 slides
Goで作って配布するAzureコマンドラインユーティリティ
yaegashi
226 views
•
16 slides
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
yaegashi
156 views
•
27 slides
msgraph: Terraform provider for Microsoft Graph
yaegashi
71 views
•
26 slides
More from yaegashi
(13)
Terraforming Windows Virtual Desktop Infrastructure on Azure
yaegashi
•
126 views
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
yaegashi
•
195 views
Customazed CLI: カスタムVMイメージ作成支援ツール
yaegashi
•
678 views
Goで作って配布するAzureコマンドラインユーティリティ
yaegashi
•
226 views
JTF2020 クロスコンパイルだけが能ではない組み込みLinuxシステムのCI/CDインフラ構築
yaegashi
•
156 views
msgraph: Terraform provider for Microsoft Graph
yaegashi
•
71 views
go generate 完全入門
yaegashi
•
1.5K views
msgraph.go: Go言語で Microsoft Graph プログラミング
yaegashi
•
1.1K views
AnsibleでAzureの インフラを管理する話 + α
yaegashi
•
474 views
Microsoft Graph API Library for Go
yaegashi
•
4.4K views
golang binary hacks
yaegashi
•
2.8K views
StackExchangeで見たシステムプログラミング案件
yaegashi
•
434 views
Ansible モジュール 作成・配布・貢献
yaegashi
•
2.1K views
Recently uploaded
CatBoost on GPU のひみつ
Takuji Tahara
203 views
•
30 slides
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
57 views
•
12 slides
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
97 views
•
31 slides
テスト自動化.pdf
ssuserf8ea02
16 views
•
26 slides
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
81 views
•
16 slides
gtk4_gem_usage.pdf
ssuser0ef4681
11 views
•
6 slides
Recently uploaded
(10)
CatBoost on GPU のひみつ
Takuji Tahara
•
203 views
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
•
57 views
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
•
97 views
テスト自動化.pdf
ssuserf8ea02
•
16 views
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
•
81 views
gtk4_gem_usage.pdf
ssuser0ef4681
•
11 views
2023情報処理学会関西支部大会-G12.pdf
KoseiShimoda1
•
6 views
松下研究室紹介_関西大学高槻キャンパスオープンキャンパス
Matsushita Laboratory
•
26 views
GraphQLはどんな時に使うか
Yutaka Tachibana
•
6 views
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
•
25 views
Raspberry Pi + Go で IoT した話
1.
Raspberry Pi +
Go で IoT した話 2019-09-25 Takeshi Yaegashi golang.tokyo #26
2.
自己紹介 八重樫 剛史 Takeshi
Yaegashi ● 株式会社バンダイナムコスタジオ所属 ● Linux・Unix・OSS・低レベルなことが好きなエンジニア ● ホームページ・ブログ https://l0w.dev ● Go のお仕事 ○ Raspberry Pi を使った IoT 案件 ○ スマホゲームアプリのサーバ ● Go のお話 ○ golang.tokyo #25「golang binary hacks」 ○ Go Conference 2019 Autumn「MS Graph API Library for Go (仮)」
3.
Raspberry Pi +
Go で IoT した事例を紹介します ※ 2018年の事例です。案件について具体的なお話はできません。申しわけありません。 本日のお話 Wi-Fi Router Cloud Services Edge DevicesThings
4.
IoT エッジデバイス・組み込みシステムの開発に適した Go
言語 ● マイコン用のクロスコンパイルが驚くほど簡単 $ GOARCH=arm GOARM=6 go get ./cmd/hello ● シングルバイナリが扱いやすい ● 言語レベルの並行処理サポート: goroutine, chan ● システム構築に使えるライブラリ、パッケージの充実 ○ 様々なネットワークプロトコルのサポート ○ Linux カーネルなどのシステムプログラミング 本日のお話の背景
5.
Raspberry Pi の
GPIO・ストレージ・Wi-Fi を使ったデータ収集システム ● エッジデバイス (Raspberry Pi 0/1/2/3) ○ Wi-Fi によるインターネット接続 ○ GPIO などでイベント発生を監視、サーバに逐次送信 (MQTT) ○ サーバ接続不良時は発生イベントをMicroSDに蓄積、復旧時に再送 ○ ソフトウェアアップデートに対応 ● サーバ (AWS) ○ IoT + Lambda + DynamoDB (イベントデータ蓄積) ○ API Gateway + Lambda (デバイス登録APIなど) ○ S3 + CloudFront (アップデート配信) 事例紹介:システム概要
6.
事例紹介:エッジデバイス (Raspberry Pi)
のシステム構成 pigpiod MQTT wpa_ supplicant I/O System Event Queue (LevelDB) AWS IoT dhcpcd GPIO EthernetWi-Fi timedated timesyncd ClockMicroSD System Daemons Go Process Hardware 💡💡💡 Goroutine Library mutex chan named pipe unix socketD-Bus TLS
7.
組み込み Linux システムを
Go で動かす ● 組み込みシステム向けに改造した Raspbian stretch 上で動作 ○ 圧縮・耐障害ファイルシステム (squashfs + overlayfs) ○ 圧縮後のシステムイメージサイズは 100MB 程度 ● システムコンポーネントと仲良く ○ systemd, dhcpcd, wpa_supplicant などのデーモンを活用 ○ IPC (named pipe, unix socket, D-Bus) を利用して Go から制御 ● goroutine, chan の活用 ○ 基本はリソース専用 goroutine 割り当てと chan による相互通信・同期 ○ イベントキューは DB ライブラリ関数内部の mutex 同期を活用 事例紹介:エッジデバイスのシステム設計のポイント
8.
コンポーネント紹介:MQTT Eclipse Paho MQTT
Go client ● https://github.com/eclipse/paho.mqtt.golang ● 定番の MQTT 通信ライブラリ ● X.509 証明書によりクライアントの認証 ● QoS=1 でサーバへのデータ到達を保証
9.
コンポーネント紹介:イベントキュー LevelDB によるイベントキューの実装 ● goleveldb
- https://github.com/syndtr/goleveldb ○ LevelDB の Go による実装 ● goque - https://github.com/beeker1121/goque ○ goleveldb による stack/queue/priority queue ○ イベントキュー実装において参考にした ● DB 障害対策 ○ Micro SD に専用のパーティション・ファイルシステム (ext4) を作る ○ DB が壊れたら Recover() で修復、だめなら mkfs して初期化
10.
コンポーネント紹介:Wi-Fi 制御 wpa_supplicant /
dhcpcd ● wpasupplicant - https://github.com/dpifke/golang-wpasupplicant ○ wpa_supplicant と unix socket で通信するライブラリ ○ WPAのSSID/PSKの設定やAPスキャンなどができる ● dhcpcd - WPA 接続が確立すると自動的に IP アドレスを取得してくれる ● この他、エッジデバイスの設置と運用を支援するため、定期的にAPスキャンを行い Wi-Fi電波情報をイベントキューに入れてサーバに送信している
11.
コンポーネント紹介:システム時刻設定 systemd-timedated / systemd-timesyncd ●
システム時刻、タイムゾーン、NTP 設定は systemd により管理されている ● 基本的な NTP クライアントは systemd に内 蔵されている ● timedatectl - CLI ○ タイムゾーンや時刻設定に使用 ● godbus - https://github.com/godbus/dbus ○ D-Bus で制御することもできる $ timedatectl Local time: Wed 2019-09-25 05:03:11 JST Universal time: Tue 2019-09-24 20:03:11 UTC RTC time: n/a Time zone: Asia/Tokyo (JST, +0900) Network time on: yes NTP synchronized: yes RTC in local TZ: no $ timedatectl set-timezone Japan $ timedatectl set-ntp false $ timedatectl set-time "2019-09-25 19:00:00"
12.
コンポーネント紹介:GPIO 制御 pigpio による
GPIO 制御 ● pigpio - http://abyz.me.uk/rpi/pigpio/ ○ Raspberry Pi の GPIO を内蔵ハードで制御する C 言語のライブラリ ○ PCM/PWM クロックと GPU DMA で高速・高精度・低負荷な入出力 ○ スクリプティングエンジン搭載 ● pigpiod - pigpio デーモン ○ 名前つきパイプやソケットで別プロセスから制御 ● pigs - pigpiod のクライアント CLI ● apt-get install pigpio でインストール可能
13.
コンポーネント紹介:GPIO 制御 # GPIO
5 状態読み取り $ pigs "R 5" 0 # GPIO 4 出力モード 500ms "1" パルス出力 $ pigs "M 4 W W 4 0" $ pigs "W 4 1 MILS 500 W 4 0" # GPIO 0-3 状態変化を /dev/pigpio0 に通知 $ pigs "NO" 0 $ pigs "NB 0 0x0000000F" $ cat /dev/pigpio0 @?2$8??!@*??;??!@9DK???!@B??B??!@QWrF??! pigpio スクリプト http://abyz.me.uk/rpi/pigpio/pigs.html
14.
コンポーネント紹介:GPIO 制御 pin, err
:= os.OpenFile("/dev/pigpio", os.O_RDWR, 0) if err != nil { return err} defer pin.Close() pout, err := os.Open("/dev/pigout") if err != nil { return err } defer pout.Close() pin.Write([]byte("W 4 1 MILS 500 W 4 0")) // 3命令のスクリプトを実行 buf := make([]byte, 128) // 3命令の実行結果を取得 n, err := pout.Read(buf) if err != nil { return err } fmt.Printf("%sn", string(buf[:n])) // "0n0n0n"を表示(成功×3) Go + pigpiod:named pipe (文字列) や socket (バイナリ)で制御可能
15.
コンポーネント紹介:GPIO 制御 Go +
pigpiod:用途を選ぶが、はまれば非常に便利 ● 利点 ○ Go だけでは難しいレベルのリアルタイム I/O が可能になる ○ 全 GPIO 端子で解像度 5μs (200kHz) の入出力を実現 ○ 強力なスクリプトで様々な機能を実装可能 ■ チャタリング除去つきの入力パルス検出 ■ プロシージャによるインジケータLED自動点滅制御 ● 欠点 ○ 遅延が大きい (スクリプト制御は必ずコンテキストスイッチを伴う) ○ pigpiod の CPU 負荷が高い (3B+ で 7〜10%)
16.
コンポーネント紹介:GPIO 制御 その他の Go
I/O ライブラリの紹介 ● gobot.io - https://gobot.io ○ Raspberry Pi 以外もサポートする汎用のライブラリ ○ メモリマップ I/O による低遅延な入出力 ● periph.io - https://periph.io ○ gobot.io と同様な汎用ライブラリ ○ 徹底した高速化・最適化 ○ pigpio のような GPU DMA 入出力を pure Go で実装 ○ 開発が活発、現時点で一番おすすめできるライブラリ
17.
まとめ Raspberry Pi +
Go で IoT エッジデバイスを作った事例を紹介しました IoT や組み込みの分野で Go をもっと活用していきましょう!