<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>WebUSB API &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/webusb-api/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Webブラウザからハードウェアにアクセス！WebUSB APIを使ってログイン認証を実装してみよう</title>
		<link>https://html5experts.jp/tokutoku393/24790/</link>
		<pubDate>Wed, 20 Dec 2017 01:00:12 +0000</pubDate>
		<dc:creator><![CDATA[ちゃんとく]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[WebUSB API]]></category>
		<category><![CDATA[WoT]]></category>

		<guid isPermaLink="false">/?p=24790</guid>
		<description><![CDATA[近年「IoT」がバズワードとなっていますが、「WoT（Web of Things）」というワードを聞いたことがあるでしょうか？ 「WoT」はごくごく簡単にいうと、既に普及しているHTMLやJavaScriptなどのWeb...]]></description>
				<content:encoded><![CDATA[<p>近年「IoT」がバズワードとなっていますが、「WoT（Web of Things）」というワードを聞いたことがあるでしょうか？</p>

<p>「WoT」はごくごく簡単にいうと、<strong>既に普及しているHTMLやJavaScriptなどのWeb技術を使ってIoTの開発を標準化しよう</strong>、という考え方です。WebBluetooth APIやWebNFC APIなど、みなさんが慣れ親しんでいるWeb技術を使ってハードウェアを制御する方法も増えてきています。</p>

<p>今回は、WebページからPCに繋がれたUSBデバイスを制御することができる「WebUSB API」の概要とサンプルを紹介します。</p>

<p>HTMLと簡単なJavaScriptで試せる内容になっていますので、Webデザイナーやディレクターなどエンジニアではない方もぜひチャレンジしてみてください！</p>

<h2>WebUSB APIとは</h2>

<p>WebUSB APIは<strong>PCに接続された全てのUSBデバイスにウェブから直接アクセスすることができる技術</strong>です。USBデバイスの認識、読み出し、書き込みなどを行うことができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/e60c1a3a-95f1-a163-598e-e9214908c49e.png" alt="スクリーンショット 2017-12-13 18.23.13.png" title="スクリーンショット 2017-12-13 18.23.13.png" /></p>

<p>Googleの2人のエンジニアによって開発され、2017年9月にはChromeブラウザ（Google Chrome 61）で正式に採用されました。</p>

<p>WebUSB APIを利用するとただちにユーザのUSBデバイス全てにアクセスできる、というわけではなく、ユーザがWebページとUSBデバイスの相互通信を明示的に許可することで開始されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/c98a6e79-dff6-b100-7413-01fc77b20901.png" alt="スクリーンショット 2017-12-13 16.19.16.png" title="スクリーンショット 2017-12-13 16.19.16.png" /></p>

<p>WebUSB APIのポリシーやセキュリティについては、Googleの開発者向けページで詳細に紹介されています。</p>

<p>⇒ <a href="https://developers.google.com/web/updates/2016/03/access-usb-devices-on-the-web" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Access USB Device on the Web</a>（Google Developers）</p>

<h3>WebUSB APIの活用シーン</h3>

<p>WebUSB APIを活用することで、これまで事前にドライバやソフトウェアのインストールが必要だったUSBデバイスのセットアップが、サイトにアクセスして許可するだけで自動で行えるなどの連携が考えられそうです。</p>

<p>またデバイスの開発者サイドのメリットとしても、OSごとに異なっていたドライバ開発がJavaScript SDKを使ってクロスプラットフォームに構築できるそう。</p>

<p><a href="https://github.com/webusb/arduino" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">webusb/arduino</a>などの例を利用してArduinoなどのマイコンボードをWebから制御することも可能になりました。</p>

<p>詳細な仕様は開発者のドラフトを確認してみてください。</p>

<p>⇒ <a href="https://wicg.github.io/webusb/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebUSB API</a></p>

<h3>本格利用はこれから</h3>

<p>ただし、実際にWebUSB APIを導入するにはまだまだ課題がありそうです。</p>

<p>USBアクセスを求めるWebページを公開するために資格や証明が必要ということはなく、利用ユーザは「本当に信頼できるWebページか」ということを知る方法が今のところありません。</p>

<p>また開発者サイドも、USBデバイスの情報が新しくなったり変更されたりするたびにWebページを改修する必要がある可能性もあります。</p>

<p>利用には気をつけるべきポイントが多く、WebUSBはまだ開発中の段階と捉えたほうがよさそうです。安全面、実装面ともに改良され、より使いやすい機能となっていくことに期待ですね。</p>

<h2>WebUSB APIを使ってログイン認証を実装してみよう</h2>

<p>今回は「登録済みのUSBデバイスならログインする」というWebページを作ってみます。</p>

<p><a href="https://gyazo.com/efdd078ea499c97f4b846c271cba0866" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="https://i.gyazo.com/efdd078ea499c97f4b846c271cba0866.gif" alt="https://gyazo.com/efdd078ea499c97f4b846c271cba0866" /></a></p>

<h3>用意するもの</h3>

<ul>
<li>Chromeブラウザ</li>
<li>任意のUSBデバイス（筆者はiPhone7）</li>
</ul>

<h3>手順1：Chromeのバージョンを確認する</h3>

<p>はじめに、ChromeブラウザがWebUSB APIに対応したバージョンになっているか確認します。</p>

<p>Chromeのツールバーから［Google Chromeについて］を選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/8ea91b14-86f0-ecc1-2e25-3700fa093e79.png" alt="スクリーンショット 2017-11-22 20.21.35.png" title="スクリーンショット 2017-11-22 20.21.35.png" /></p>

<p>Chromeの情報ページが開くのでバージョンが62以上であることを確認します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/809c864a-c55d-0f09-d82f-2eb59a13291f.png" alt="スクリーンショット 2017-11-22 20.23.10.png" title="スクリーンショット 2017-11-22 20.23.10.png" /></p>

<p>基本的には自動でアップデートされているはずですが、万が一されていない場合は下記を参考にアップデートしましょう。</p>

<p>⇒ <a href="https://support.google.com/chrome/answer/95414?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Chromeを更新する</a>（Google Chrome ヘルプ）</p>

<h3>手順2：ログインページを作る</h3>

<p>WebUSB APIを設置するWebページを作ります。今回はコード共有サービス「<a href="http://codepen.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodePen</a>」からログインフォームのソースコードを利用しました。</p>

<p><img src="https://qiita-image-store.s3.amazonaws.com/0/119003/d01701d7-a934-74ea-3349-9ec138efa074.png" alt="スクリーンショット 2017-11-26 18.11.58.png" title="スクリーンショット 2017-11-26 18.11.58.png" /></p>

<p><a href="https://codepen.io/Lewitje/pen/BNNJjo?q=login%20&amp;order=popularity&amp;depth=everything&amp;show_forks=false" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Calm breeze login screen</a>（CodePen）</p>

<p>［Export］からソースコードを取得しローカルに配置します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/119003/11162f82-8510-3be3-17e6-0452e538ae1c.png" alt="スクリーンショット 2017-12-12 19.42.00.png" title="スクリーンショット 2017-12-12 19.42.00.png" /></p>

<p>今回は<strong>「Username」「Password」は不要</strong>なので、<code>index.html</code>のフォーム部分から消去しておきます。</p>

<p></p><pre class="crayon-plain-tag">&lt;form class="form"&gt;
	&lt;input type="text" placeholder="Username"&gt; // この行を消去
	&lt;input type="password" placeholder="Password"&gt; // この行を消去
	&lt;button type="submit" id="login-button"&gt;Login&lt;/button&gt;
&lt;/form&gt;</pre><p></p>

<h3>ログインのイベントを作成する</h3>

<p>LoginボタンをクリックしたらWebUSB APIのイベントが発火するよう、Submitボタンを変更します。</p>

<p><code>auth()</code>というfunctionを呼ぶようにし、記述用のJSファイルの呼び出しも追加しておきます。</p>

<p></p><pre class="crayon-plain-tag">&lt;form class="form"&gt;
		&lt;button type="button" onclick="auth()" id="login-button"&gt;Login&lt;/button&gt;
	&lt;/form&gt;
	&lt;script src="js/webusb.js"&gt;&lt;/script&gt;
&lt;/body&gt;</pre><p></p>

<p>ログイン成功時のイベント（デフォルトのJQuery）は名前つき関数にしておきます。</p>

<p></p><pre class="crayon-plain-tag">function login() {
  $('form').fadeOut(500);
  $('.wrapper').addClass('form-success');
}</pre><p></p>

<h3>USBデバイスにアクセスして識別情報を取得する</h3>

<p>認証に使用するデバイスを識別するために、［Vendor ID］, ［Product ID］, [Serial Number]を調べてみます。</p>

<p>Macの方は［システム情報］-&gt;［USB］で確認できます。</p>

<p>Windowsの方はMicroSoftの<a href="https://github.com/Microsoft/Windows-driver-samples/tree/master/usb/usbview" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">usbview</a>などを利用しましょう。
<img src="/wp-content/uploads/2017/12/4c4c20ebf1b9d2c14a27ef276ede753e-300x144.png" alt="" width="300" height="144" class="alignnone size-medium wp-image-24956" srcset="/wp-content/uploads/2017/12/4c4c20ebf1b9d2c14a27ef276ede753e-300x144.png 300w, /wp-content/uploads/2017/12/4c4c20ebf1b9d2c14a27ef276ede753e.png 640w, /wp-content/uploads/2017/12/4c4c20ebf1b9d2c14a27ef276ede753e-207x99.png 207w" sizes="(max-width: 300px) 100vw, 300px" />
※このシリアル番号は、iPhone自体のシリアル番号とは別です。</p>

<p><code>/js</code>フォルダの配下に<code>webusb.js</code>ファイルを作成し、<code>auth</code>functionを作成します。コード内には取得したVendor ID（製造元 ID）、Product ID（製品 ID）、Serial Number（シリアル番号）を追加します。</p>

<p></p><pre class="crayon-plain-tag">'use strict';

const auth = () =&gt; {
  const vendorId = XXXX; // ここにVendor ID
  const productId = XXXX; // ここにProduct ID
  const serialNumber = 'XXXXXXXX'; // ここにSerial Number
  navigator.usb.requestDevice({ 'filters': [
      { 'vendorId': vendorId, 'productId': productId }
    ]
  }).then(device =&gt; {
    if (device.serialNumber === serialNumber) {
      console.log('success!');
      login();
      return device.open;
    } else {
      console.log('false!');
      alert('認証に失敗しました');
    }
  }).catch(error =&gt; {
    console.log(error);
  });
}</pre><p></p>

<p>今回は簡易的にJSファイルに直接認証情報を書いています。</p>

<h3>ログイン機能を試してみよう</h3>

<p>登録したUSBデバイス（今回はiPhone）で試してみます。<br />
<a href="https://gyazo.com/efdd078ea499c97f4b846c271cba0866" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="https://i.gyazo.com/efdd078ea499c97f4b846c271cba0866.gif" alt="https://gyazo.com/efdd078ea499c97f4b846c271cba0866" /></a>
認証が成功しました。</p>

<p>登録していないiPhoneでも試してみます。<br />
<a href="https://gyazo.com/c7af13bc72c09579ff6604ede333a825" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="https://i.gyazo.com/c7af13bc72c09579ff6604ede333a825.gif" alt="https://gyazo.com/c7af13bc72c09579ff6604ede333a825" /></a>
認証に失敗しました。</p>

<p>これでUSBデバイスを識別することができました！</p>

<h2>まとめ</h2>

<p>今回はUSB接続したスマートフォンを利用しましたが、マウス、キーボード、フラッシュメモリなどUSBデバイスならどんなものでも利用可能です。</p>

<p>またWeb USB以外にも、WebBluetooth APIやWebNFC APIなどWeb技術を使ってハードウェアにアクセスする方法は増えています。ぜひこれからの開発に利用してみてください！</p>
]]></content:encoded>
			</item>
	</channel>
</rss>
