takuwan's blog

感じたことを書きますよ

ウェブ・アプリから組み込み系ソフトウェアを扱うTips

ウェブやiOS・Androidのアプリケーションから、プリンタ・POS・体重計などのいわゆる組み込み系と言われるようなハードウェア上のソフトウェアと疎通・連携する機能を開発するときのTipsをまとめます。

開発者が利用するための環境・情報が整っているOSSや各種クラウドサービスとは異なり、組み込み系のソフトウェアは外部の開発者にとっては優しくないことが多く、見積もり通りの開発にはならない傾向が強いためです。

  

 

設計・実装をはじめる前にやること

ハードウェアを選定する

実現したい機能から逆算して、ウェブ・アプリから利用するハードウェアを選定します。外部の開発者に開かれていてSDK等が提供されているハードウェアとそうでないものがあったり、iOS・Android・Windowsアプリはサポートしていてもウェブ(JS)はサポートしていないものがあります。

ハードウェアの機能重視で比較検討すると、外部開発者の利用を想定して設計されていない(けどリバースエンジニアリングはできそうな)製品が候補にあがったりしますが、意図せぬバグの可能性、将来性、法律の問題など色々問題があるので、潔く諦めましょう。妥協できないようであれば、ハードウェアベンダと提携したり、自社ブランドでハードウェアを開発する道を検討しましょう。

 
Windowsの開発機を用意する

ウェブやiOS・Androidアプリを開発する人であれば、MacやLinuxで開発をするエンジニアがほとんどだと思いますが、Windowsの開発機は事前に用意しておくのが無難です。Windowsでの開発しかサポートしていない組み込み系ソフトウェアは結構多くて、なんだかんだ必要になってくるケースがあります。

ドキュメントを一見して、Windows機は使わなくてもなんとかなりそうと感じても、実はWindows機でのみ動く開発用ソフトウェアを使わないと利用できない機能とかあったりします。実際に、SSL周りの設定はWindow機がなくてもできたのに、実はSSL証明書のインポートにはWindows機が必要だったとか、そういう経験があります。実装中にWindows機が必要であることがはじめて発覚し、そこからWindows機の選定と発注をしているようだと、余計なリードタイムが生じてしまいます。選定次第では数万円程度で済むので先行投資しましょう。

 

ハードウェアを販売している営業マンとつながっておく

ハードウェアを販売している営業マン、さらにできれば、その先にいるソフトウェアベンダーと繋がっておけると開発が行き詰まる可能性がぐっと減ります。というのも、組み込み系のソフトウェアは、まともなエラーログを吐いてくれないことが往々にしてあります。組み込み系ソフトウェアは外部開発者にとってはブラックボックスなので(OSSと違ってissueもコードも何も見えないので)、ログもないとなると何か詰まったときにはどうしても内部のつくりを知っているベンダーに問い合わせたくなってきます。問い合わせると意外な答えだったり、隠れた機能を教えてもらえたりするものです。

ただ、組み込み系ソフトウェアを開発しているベンダーの情報はなかなか手に入らないので、ハードウェアベンダや販売会社にまずは問い合わせることになります。コールセンターやメールでの問い合わせは大抵役に立たないので(ソフトウェアに関することを答えるケーパのない人たちに繋がるので仕方ないですね)、そこから頑張って営業マンやソフトウェアベンダに繋いでもらいます。コールセンターや問い合わせフォームの中の人からはマニュアル化された答えしか返ってこない、さらには営業マンと繋いではもらえないと思いますが、そこは頑張るしかありません。(電話での交渉が得意な方に頼りましょう。)

所謂ウェブ系のエンジニアなら大丈夫だとは思いますが、ベンダが外資の場合は当然英語でのやりとりになります。

  

 

実装・保守で意識すること

ドキュメントを過信しない

外部開発者の利用を想定している組み込み系ソフトウェアには大抵ドキュメントがあり、ウェブ上からダウンロードできるようになっています。SDKごとにサンプルコードとか付いてたりします。しかし残念なことに、何故か肝心なことが書かれていなかったり、普通に間違った記載がされていることがあるので、ドキュメントに頼ってばかりではいけません。

大抵SDKの中を読むことになりますし(そしてバグを見つけたりする)、結構雑なつくりだったりするのでびっくりすることもあります。パフォーマンス上の課題とかも、SDKを読み解くことで見つかったりします。組み込み系とウェブ系で言語や慣習が異なる以上、元々SDKの開発や言語に慣れていない人がSDKをつくってたりもするでしょうし、仕方ないのかなと思ったりもします。

 

なるべく早い段階で、リアルな現場で一通りの動作確認をする

なるべく早い段階で、ハードウェアを設置するリアルな現場で一通りの動作確認をします。ハードウェアの配置、電源、ネットワーク(疎通)等で問題が出てくることがあります。(ありました。)

組み込み系ソフトウェアとの疎通には、プライベートなIPに対してHTTPやWebsocketで疎通したり、Bluethoothで疎通することになると思います。(ハードウェアにパブリックIPを当ててドメイン付与とかはしないでしょう。)仮にウェブフロントからSDKを叩いてハードウェアを操作する場合には、プライベートなIPを叩く以上はSSL周りを工夫しないとブラウザからMixed Contentで怒られてblockされたりするケースがあるでしょうし、iOSならATSやその管理をどうするかといった話があります。Bluetoothで疎通するなら、Bluetoothは電力依存で壁を透過しないという性質があるので、常に電源を確保できて配置上疎通に問題がないかを確認します。

 

ファームウェアのアップデートを欠かさない

アップデート内容次第ですが、ファームウェアのアップデートには追従できるようにします。OSSのバージョンアップデートの考え方とほぼ同じ考え方でいますが、例えばセキュリティの脆弱性対策とか、ブラウザの自己証明書に対する扱いの変更に関するアップデートとか重要なものもあり、アップデートに追従できないと機能が死ぬケースもあるかと思います。 

私はまだ開発したことはないですが、他社にハードウェア一式もろともSaaSとして(?)貸し出すPOSシステムなど(Airregiとか)は、どうやってファームウェアアップデートを管理するかとか、ちゃんと設計しないといけなさそうですね。

 

 

まとめ

組み込み系ソフトウェアとの連携機能をそんなすごい数開発したわけではないですが、いままで詰まったこと、こうしたほう良いなと思ってたこと、またよく起きることをまとめてみました。

個人的に、大抵どこかで詰まるのであまり開発に乗り気になれる分野ではないのですが、でも機能が一通りできたときの達成感は並以上のものがあるので、また機会があったら率先してやってみようと思っている所存です。