Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SoCの上にも三年

 SoCの上にも三年

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. IoTぶっちゃけNight SoCの上にも三年 No. 1 Web・アプリの開発者が組込開発をはじめたら

  2. 津島 雅俊 Masatoshi Tsushima 2004 ソフトウェア開発との出会い Webサイトや携帯アプリを作って遊んでいました 2015 社会人のスタート 情報系の大学院を卒業、ERPベンダーに就職

    社内クラウドをKubernetes/Go/Vue.jsで構築 2018秋 Bitkeyに参画 当初はbitkey platformの開発を担当 主にGoでサーバサイドを開発 2019秋 ファームウェアチームを立ち上げ bitlock LITEのファームウェアを内製化 現在に続く開発スタイルを構築 2020夏 第二世代ロックデバイスの開発 内製を前提としたファームウェア開発 2021春リリース 2022春 スマホアプリ開発 FlutterのAndroidネイティブ部分を担当 DroidKaigi 2021 スポンサー寄稿:餅は餅屋、BLEはBLE屋
  3. No. 3 (んー、競技プログラミングぐらいなら) はい C 言語書ける?

  4. No. 4 ほう ファームウェアのソース もらってきたよ

  5. No. 5 よろしく! しゃーない

  6. まず main.c からか。3,000 行あるな。この switch のブロックどこ までスクロールしたら終わるんや?ここbreakが無いのは正し…そ う。セーフ…。なんか改行コードがCR/LF/CRLF混ざっとるしどん なエディタ使ったんだ…。タブとスペースのインデントが混ざって るし…。ん、このソースは

    BOM あるな。 UTF-8 か。あれ、こっち は文字化けしてる。 Shift-JIS …?とりあえず nkf かけとけ。そう いえば SDK の zip ごともらったんだけど、公式が配布してるやつと ディレクトリ名一緒…。何か手をいれてるのか…?あ、ヘッダに const の無い static int がある。まさか本当は extern にするべき なのでは…?えっ、これで正しいの!?それとこのあらゆる場所で 読み書きされる巨大な構造体 info は超重要そうな匂いが…あー、ブ レークポイント張ったら IDE がクラッシュした。謎の “delay_ms(3000) // Don’t remove” ← なぜ? atuo_lock ← 熱男? 駆動する部分も無い製品なのに rotate_motor?一体何が回るん だ?デッドコード?んー、じゃぁまぁヨシ!って思ったけど付属の time.h の difftime の引数が標準と逆なの!?なぜ!?!? No. 6 とりあえず読んでみるか
  7. No. 7 C言語でスタートアップやるって こういうことか…

  8. No. 8 いや、C言語が悪いわけじゃなくない?

  9. ちなみに:CI/CD・開発環境の改善はこんなかんじ No. 9

  10. ちなみに:CI/CD・開発環境の改善はこんなかんじ No. 10 スライドのタイトル Code 慣れたものを使いたい →CLIで構築、自分の使うエディタと連携 Build 状況に応じて工夫したい →コード化されたビルドに機能を追加

    Release 自動化したい →開発環境のCLI化でCI/CDパイプラインも構築可能に Test スマホアプリとの相互依存を解消したい →仕様からクライアントを自動生成、デバイス単独でテスト
  11. No. 11 そして次期モデルは最初から内製することに…

  12. No. 12 Web・アプリの開発者が デバイス開発をはじめたら

  13. 次期モデルのファームウェアに対する要求と無限に湧き上がる懸念 No. 13 結局マルチユーザーとマルチタスクからは逃れられない 無線は同時に接続されるし、他にも相手がいようとすぐ反応して欲しい。単に断 るだけだとしても。 BLE 同時接続 素早い 動作

    接続ごとのデータの分離… ノンブロッキングッ! 全てCallbackで! リソースの排他制御 時計のI/Oは1s間 キャッシュで共有 タイムアウトしなきゃ… リクエストに応じた メモリの確保と開放…! でもメモリは 限られてる… Flashへの永続化は トランザクションを順番待ちさせて… 並行処理する ということは… I/Oをブロックしたら 他の接続に応答できない この処理、絶対止まるのか…? メモリリークしない…? キューは確実に捌かれる? ロックは開放される?
  14. でもそれなんか似てない? No. 14 BLEでコマンドを実行 →バイナリで操作するシェルが欲しいのでは? 1つのCPU(≒シングルスレッド)でノンブロッキング →Node.jsでは?

  15. BLEのシェル No. 15 • BLEコマンド = Shellコマンド ◦ コマンドとその実行はメモリ上区別すべき •

    BLEコマンドの実行 = プロセス ◦ 切断:返信先を切り離す ◦ 実行完了:削除 ◦ Linked Listで管理すれば良さそう ▪ あれ、task_struct…? A 返信先:1 B 返信先:1 A 返信先:2
  16. もしNode.jsで書くなら No. 16 • 入力側:WebフレームワークのBLE版が欲しい ◦ BLEのExpress.jsみたいなやつ ◦ 初期フェーズの最初の目標 •

    出力側:Promise以前のCallbackスタイルで考える ◦ エディタでジャンプできればそれほど怖くない fs.lstat(path, (err, stats) => { // write 完了 }); fs.lstat(path) .then((stats) => { /* 完了 */ }) .catch((err) => { /* エラー */ }); try { const stats = await fs.lstat(path); } catch (err) { // エラー } Cに代わるasync/awaitできる言語はやく来てくれー
  17. ちなみにC++17ならconstexpr lambdaが関数ポインタになる 無名の関数を直接引数に書ける • 簡単なデモとかの書き捨てのコードに便利 • キャプチャはコンパイル時定数のみ可能 No. 17 start_mortor(duty,

    [](auto code) { // start_mortor が完了すると呼び出される });
  18. 最終的な設計のWebシステム的解釈 No. 18 Service Application Engine Device Touch BLE Auth

    Smart Lock Sensor Storage ADC NOR Flash 入力を解釈して機能を呼び出す • TCP/IP の Socket API • リバースプロキシ • MVC の Controller と View 機能を実現する • Framework に依存しない Service, ViewModel • MVC の Model • ミドルウェア 機能間のリソース共有を解決する • ファイルシステム • 外部 API 周辺回路を操作する • デバイスドライバ TCP
 Controllers
 Presenters
 Gateways
 DB
 Use Cases
 Entities
 Devices
 Web の製品に例えたら… 
 Logger Database BLE

  19. まとめ:Web・アプリ→デバイス開発で転生しませんか? No. 19 「何って…俺はただ〇〇を参考にしただけだが…」 汎用製品に含まれるアイディアはとても有用 • プロセス、JavaScript、CleanArchitecture • 参考になるものを見つける ◦

    OS無しで書く ← OS/ミドル/アプリの垂直統合 ◦ 「良いこと思いついた」 ← だいたいヤバい ▪ 型破りではなく型無し • そこまでやるなら組み込みOS乗せれば?