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

SoCの上にも三年

 SoCの上にも三年

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

Other Decks in Technology

Transcript

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

    View Slide

  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屋

    View Slide

  3. No. 3
    (んー、競技プログラミングぐらいなら)
    はい
    C 言語書ける?

    View Slide

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

    View Slide

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

    View Slide

  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
    とりあえず読んでみるか

    View Slide

  7. No. 7
    C言語でスタートアップやるって
    こういうことか…

    View Slide

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

    View Slide

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

    View Slide

  10. ちなみに:CI/CD・開発環境の改善はこんなかんじ
    No. 10
    スライドのタイトル
    Code 慣れたものを使いたい
    →CLIで構築、自分の使うエディタと連携
    Build 状況に応じて工夫したい
    →コード化されたビルドに機能を追加
    Release 自動化したい
    →開発環境のCLI化でCI/CDパイプラインも構築可能に
    Test スマホアプリとの相互依存を解消したい
    →仕様からクライアントを自動生成、デバイス単独でテスト

    View Slide

  11. No. 11
    そして次期モデルは最初から内製することに…

    View Slide

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

    View Slide

  13. 次期モデルのファームウェアに対する要求と無限に湧き上がる懸念
    No. 13
    結局マルチユーザーとマルチタスクからは逃れられない
    無線は同時に接続されるし、他にも相手がいようとすぐ反応して欲しい。単に断
    るだけだとしても。
    BLE
    同時接続
    素早い
    動作
    接続ごとのデータの分離…
    ノンブロッキングッ!
    全てCallbackで!
    リソースの排他制御
    時計のI/Oは1s間
    キャッシュで共有
    タイムアウトしなきゃ…
    リクエストに応じた
    メモリの確保と開放…!
    でもメモリは
    限られてる…
    Flashへの永続化は
    トランザクションを順番待ちさせて…
    並行処理する
    ということは…
    I/Oをブロックしたら
    他の接続に応答できない
    この処理、絶対止まるのか…?
    メモリリークしない…?
    キューは確実に捌かれる? ロックは開放される?

    View Slide

  14. でもそれなんか似てない?
    No. 14
    BLEでコマンドを実行
    →バイナリで操作するシェルが欲しいのでは?
    1つのCPU(≒シングルスレッド)でノンブロッキング
    →Node.jsでは?

    View Slide

  15. BLEのシェル
    No. 15
    ● BLEコマンド = Shellコマンド
    ○ コマンドとその実行はメモリ上区別すべき
    ● BLEコマンドの実行 = プロセス
    ○ 切断:返信先を切り離す
    ○ 実行完了:削除
    ○ Linked Listで管理すれば良さそう
    ■ あれ、task_struct…?
    A
    返信先:1
    B
    返信先:1
    A
    返信先:2

    View Slide

  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できる言語はやく来てくれー

    View Slide

  17. ちなみにC++17ならconstexpr lambdaが関数ポインタになる
    無名の関数を直接引数に書ける
    ● 簡単なデモとかの書き捨てのコードに便利
    ● キャプチャはコンパイル時定数のみ可能
    No. 17
    start_mortor(duty, [](auto code) {
    // start_mortor が完了すると呼び出される
    });

    View Slide

  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


    View Slide

  19. まとめ:Web・アプリ→デバイス開発で転生しませんか?
    No. 19
    「何って…俺はただ〇〇を参考にしただけだが…」
    汎用製品に含まれるアイディアはとても有用
    ● プロセス、JavaScript、CleanArchitecture
    ● 参考になるものを見つける
    ○ OS無しで書く ← OS/ミドル/アプリの垂直統合
    ○ 「良いこと思いついた」 ← だいたいヤバい
    ■ 型破りではなく型無し
    ● そこまでやるなら組み込みOS乗せれば?

    View Slide