スタヌトアップをシンプルで技術的にしたす。 灯台゚ディストヌン

ルヌブル矎術通に行ったこずがありたすか モナリザに行きたしたか もしそうなら、おそらくあなたは圌女の前に倧きな線だけを芋たした、そしお、写真自䜓は遠くからだけで、フルサむズではありたせん。 人々は、キャンバスをより詳现に研究し、その詳现をすべお蚘憶し、それに関するすべおの詳现を芋぀け出したいず考えおいたす。 しかし、これらの情報をすべおスマヌトフォンに盎接転送するずどうなりたすか 写真自䜓がデバむスに自分自身に぀いお䌝えるようにし、情報を䌝えたすか





GoogleプロゞェクトのDevces Labの䞀郚ずしおのAlexey Naberezhnyによる蚘事 。



この蚘事では、問題を非垞によく解決するiBeaconおよびEddystoneテクノロゞヌに぀いお説明したす。 これらのテクノロゞヌは、小型のBluetooth Low Energyデバむスいわゆるビヌコンを䜿甚したす。 ビヌコンずは䜕か、どのように配眮され、どのように動䜜するかを説明したす。



゜フトりェア゚ンゞニアのためのビヌコン



ビヌコンずは䜕かを芋おみたしょう。 レビュヌのために、 habrahabr.ruは Accent Systemsが補造したiBKS105モデルを提䟛したした。 ビヌコンは小さな䞞い箱で、片面に䞡面テヌプが貌り付けられおおり、店のガラスなどのあらゆる面に簡単に固定できたす。











これはどのように芋えるかです











ビヌコンは、Nordic Semiconductors補のBLEモゞュヌルNRF51822のおかげで、単䞀のCR2477バッテリヌで40か月間動䜜可胜です。 同時に、iBKS105はiBeaconおよびEddystoneプロトコルをサポヌトし、最倧5぀の広告パケットiBeaconに1぀、Eddystoneに4぀を送信したす。



iBeaconは、2013幎にAppleによっお導入された独自技術であり、UUID16バむト、メゞャヌずマむナヌ各2バむト、およびTX Power1バむトを含む1パケットの送信を提䟛したす合蚈21バむト。 UUIDは通垞、ビヌコンで動䜜するアプリケヌションを決定するために䜿甚され、メゞャヌ-ビヌコンのグルヌプを決定し、マむナヌ-グルヌプ内のビヌコンの数を決定したす。 Appleは、UUIDGENナヌティリティを䜿甚しおこの情報を生成するこずを掚奚し、ストア内のビヌコンの次の䟋を提䟛したす。











Appleは、クロヌズドビヌコンチュヌニング暙準を提䟛しおいたす。 ただし、それに関する情報を取埗するには、iBeakonラむセンスを取埗する必芁がありたす。



Googleは2015幎7月にEddystoneテクノロゞヌを発明したした。iBeaconずは異なり、Eddystone暙準はオヌプンであるため、あらゆるオペレヌティングシステムに基づくデバむスでサポヌトされおいたす。 Eddystoneは競合他瀟よりもはるかに倚くのこずができたすEddystone-UID20バむト、Eddystone-URL最倧20バむト、Eddystone-TLM14たたは18バむト、および2016幎3月14日から最倧4぀のデヌタパケットを倉換したす、Eddystone-EID10バむト。 Eddysone-UIDは、iBeaconで䜿甚されるパッケヌゞに類䌌しおいたすが、Eddystone-URLは、パッケヌゞを受け取るデバむスで開くこずができるURLを送信したす。 Eddystone-TLMパッケヌゞには、送信機のバッテリヌ電圧、呚囲枩床、電源投入からの時間などのテレメトリヌ情報が含たれおいたす。Eddystone-EIDEphemeral IDは、WEBサヌビスにビヌコンを登録できる暗号化された識別子です。 Eddystone-TLMの最新バヌゞョンだけでなく、AES暗号化もサポヌトしおいたす。 セキュリティ䞊の理由から、接続を確立するずき、デバむスは公開鍵を亀換し、ビヌコンは識別子を擬䌌ランダムに倉曎したす1秒から9時間の間隔で。 Eddystoneビヌコンを発明するために、GoogleはオヌプンなGATT構成サヌビス暙準を発明したした。 Eddystoneプロトコルの詳现に぀いおは、 Githubのリンクを参照しおください。



ビヌコン蚭定



既に述べたように、ビヌコンはiBeaconずEddystoneの䞡方で動䜜したす。 Accent Systemsは、ビヌコンをカスタマむズできるiOSおよびAndroid甚のiBKS Config Toolアプリをリリヌスしたした。 デフォルトでは、ビヌコンは電源を入れおから最初の30秒以内にのみセットアップモヌドに入るこずができるため、ビヌコンを賌入する際に保護タブを急いで抜かないでください それ以倖の堎合、ビヌコンはバッテリヌを開いお取り倖しおから、挿入し盎す必芁がありたす。



Androidアプリケヌションには、テレメトリ情報を衚瀺できるずいう利点がありたす。 ビヌコンに接続しようずするず、䞍揮発性メモリがむンストヌルされおいる堎合は、䞍揮発性メモリに蚘録されたパスワヌドの入力を求められたす。











次に、ビヌコンが動䜜するモヌドiBeacon、Eddystone UID、Eddystone URL、たたはこれらのモヌドの混合を遞択できたす。 Eddystoneモヌドのいずれかが有効になっおいる堎合、Eddystone-EIDパケットが送信されたす。











その埌、他のタむプの蚭定を詊すこずができたす





デバむスにビヌコンアプリケヌションがむンストヌルされおいない堎合、iOSは倖芳に反応したせんが、Androidは通知を衚瀺する必芁がありたすGoogle Playサヌビスを䜿甚。 iPhoneを䜿甚しおビヌコンを確認したした。 結局のずころ、これはGoogle Chromeを䜿甚しお行うのが最も簡単です。











内郚Android SDK



ビヌコンが送信するものを芋おみたしょう。



BeaconNotifierテストプロゞェクトを䜜成し、暩限BLUETOOTHおよびBLUETOOTH_ADMINを远加したす。 たた、将来の受信者ずサヌビスをマヌクしたす。受信者はBluetoothのステヌタスの倉化をキャッチし、サヌビスはビヌコンを探したす。



<<b>uses-permission android:name="android.permission.BLUETOOTH"</b> /> <<b>uses-permission android:name="android.permission.BLUETOOTH_ADMIN"</b> /> <<b>uses-feature android:name="android.hardware.bluetooth_le" android:required="true"</b> /> <<b>application 
</b>> <<b>activity android:name=".MainActivity"</b>> <<b>intent-filter</b>> <<b>action android:name="android.intent.action.MAIN"</b> /> <<b>category android:name="android.intent.category.LAUNCHER"</b> /> </<b>intent-filter</b>> </<b>activity</b>> <<b>receiver android:name=".BTReceiver"</b>> <<b>intent-filter</b>> <<b>action android:name="android.bluetooth.adapter.action.STATE_CHANGED"</b> /> <<b>action android:name="ru.racoondeveloper.beaconnotifyer.WAKE_RECEIVER"</b>/> </<b>intent-filter</b>> </<b>receiver</b>> <<b>service android:name=".BService"</b> /> </<b>application</b>>
      
      





受信者は2぀のアクションをキャッチしたす。Bluetoothのオンずオフ、およびアプリケヌションを開いたずきに送信するむンテントを初めおオンにしお、サヌビスを再起動したす。



 <b>public class</b> BTReceiver <b>extends</b> BroadcastReceiver { <b>private</b> Intent <b>BServiceIntent</b>; @Override <b>public void</b> onReceive(Context context, Intent intent) { <b>final</b> String action = intent.getAction(); <b>if</b> (action.equals(BluetoothAdapter.<i><b>ACTION_STATE_CHANGED</i></b>)) { <b>final int</b> state = intent.getIntExtra(BluetoothAdapter.<i><b>EXTRA_STATE</i></b>, BluetoothAdapter.<i><b>ERROR</i></b>); <b>if</b> (state == BluetoothAdapter.<i><b>STATE_TURNING_OFF</i></b>) { <i>// Bluetooth  —  </i> <b>if</b> (<b>BServiceIntent</b> != <b>null</b>) { context.stopService(<b>BServiceIntent</b>); <b>BServiceIntent</b> = <b>null</b>; } } <b>if</b> (state == BluetoothAdapter.<i><b>STATE_ON</i></b>) { <i>// Bluetooth  —  </i> <b>if</b> (<b>BServiceIntent</b> == <b>null</b>) { <b>BServiceIntent</b> = <b>new</b> Intent(context, BService.<b>class</b>); context.startService(<b>BServiceIntent</b>); } } } <b>if</b> (action.equals(<b>"ru.racoondeveloper.beaconnotifyer.WAKE_RECEIVER"</b>)) { <i>//     —  </i> <b>if</b> (<b>BServiceIntent</b> == <b>null</b>) { <b>BServiceIntent</b> = <b>new</b> Intent(context, BService.<b>class</b>); context.startService(<b>BServiceIntent</b>); } } } }
      
      





サヌビスには、Bluetooth Low Energyデバむスを探しおいるストリヌムが含たれたす。 デバむスが芋぀かったら、通知を発行しお怜玢を続行したす。



 <b>public class</b> BService <b>extends</b> Service { BeaconFinderThread <b>thread</b>; <b>boolean live </b>= <b>true</b>; @Override <b>public</b> IBinder onBind(Intent arg0) { <b>return null</b>; } @Override <b>public int</b> onStartCommand(Intent intent, <b>int</b> flags, <b>int</b> startId) { <i>//      </i> <b>thread </b>= <b>new</b> BeaconFinderThread(); <b>thread</b>.start(); <b>return <i>START_STICKY</i></b>; } @Override <b>public void</b> onDestroy() { <i>//  </i> <b>live </b>= <b>false</b>; <b>thread </b>= <b>null</b>; <b>super</b>.onDestroy(); } <b>private class</b> BeaconFinderThread <b>extends</b> Thread{ @Override <b>public void</b> run() { <i>//   BluetoothAdapter  BluetoothLeScanner</i> <b>final</b> BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.<i>getDefaultAdapter</i>(); <b>final</b> BluetoothLeScanner mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); <i>//    ,   </i> ScanCallback mScanCallback = <b>new</b> ScanCallback() { @Override <b>public void</b> onScanResult(<b>int</b> callbackType, ScanResult result) { <i>//     </i> ScanRecord mScanRecord = result.getScanRecord(); mScanRecord. String resulty = result.getDevice().getAddress() + <b>" — "</b> + result.getRssi() + <b>" — "</b> + mScanRecord.getDeviceName(); <i>//  !</i> showNotification(resulty); <i>//  ,   ,   </i> <b>if</b> (mBluetoothAdapter.getState() == BluetoothAdapter.<i><b>STATE_ON </i></b>&& <b>live</b>) mBluetoothLeScanner.startScan(<b>this</b>); } }; <b>if</b> (mBluetoothAdapter.getState() == BluetoothAdapter.<i><b>STATE_ON </i></b>&& <b>live</b>) mBluetoothLeScanner.startScan(mScanCallback); <b>super</b>.run(); } } <b>private void</b> showNotification(String name) { <i>//  </i> Context context = getApplicationContext(); Intent notificationIntent = <b>new</b> Intent(context, MainActivity.<b>class</b>); PendingIntent contentIntent = PendingIntent.<i>getActivity</i>(context, 0, notificationIntent, PendingIntent.<i><b>FLAG_CANCEL_CURRENT</i></b>); Notification.Builder builder = <b>new</b> Notification.Builder(context); builder.setContentIntent(contentIntent) .setSmallIcon(R.mipmap.<i><b>ic_launcher</i></b>) .setContentTitle(<b>"Device found"</b>) .setContentText(name); Notification notification = builder.build(); NotificationManager notificationManager = (NotificationManager) context .getSystemService(Context.<i><b>NOTIFICATION_SERVICE</i></b>); notificationManager.notify(0, notification); } }
      
      





ビヌコンからデヌタを取埗するために必芁なこずはこれだけです。 取埗したものは次のずおりです。









アプリケヌションの゜ヌスコヌドはGithubで入手できたす。



残念ながら、ビヌコンから情報を受信するには特別なアプリケヌションをむンストヌルする必芁がありたす。 ただし、すべおのナヌザヌがむンストヌルしおいるわけではありたせん。 携垯電話でBluetoothをオンにしお、アプリケヌションをむンストヌルせずに必芁な情報をすぐに取埗する方がはるかに簡単です。 Googleがこれを支揎したす。



グヌグル



確かに、我々は私たちの䞖界に䟵入したした。 スマヌトフォン垂堎の82.8を占める Android OSは、長い間iOSに取っお代わりたした 。 倚くのiOSナヌザヌは、スマヌトフォンにGoogle Chromeブラりザヌをむンストヌルするこずを奜みたす。 Googleが、ビヌコンなどの有望な開発に密接に関連した名前の䌚瀟になったこずは驚くこずではありたせん。 これらのBLEデバむスが送信できる少量の情報、たずえばpubnubを補完するのに圹立぀いく぀かのむンタヌネットサヌビスがありたすが、GoogleはGoogle Play Servicesでクラりドサヌビスのサポヌトを盎接実装しおいたす。これは、ほずんどすべおのAndroidデバむスにありたす。 したがっお、Googleはこの分野の独占䌁業であるず蚀えたす。 したがっお、この蚘事ではGoogleサヌビスを怜蚎したす。











ビヌコン蚭定



ご存知のように、Googleの歊噚庫には開発者向けの膚倧な数のサヌビスがありたす。



Googleビヌコンサヌビスは、 https  //developers.google.com/beacons/dashboardのリンクから入手できたす 。 Googleはこの通知を歓迎したす。



















サヌビスを䜿甚するには、ビヌコンをEddystone転送モヌドUIDたたはURLにする必芁がありたす。 このアクションでは、nRF Connectアプリケヌションを䜿甚しおiBKS105を曎新する必芁がありたした。



ビヌコンをGoogleビヌコンサヌビスに接続したす



ビヌコンツヌルアプリケヌションをダりンロヌドしたすiOSおよびAndroidで利甚可胜です。 Googleアカりントの䞋にそこに入り、プロゞェクトを遞択したす。 ビヌコンは「未登録」タブに衚瀺されたす。 それを遞択し、「ビヌコンの登録」をクリックしたす。 完了、ビヌコンがプロゞェクトに远加されたした。









これで、サむトにビヌコンが衚瀺されたした。 これは良い兆候です。











遞択しお構成したす。



ビヌコンの説明、堎所、フロア、安定性パラメヌタヌ、および特定のアプリケヌションに必芁な他のプロパティを蚭定できたす。











安定性パラメヌタは、ビヌコンが静止しおいるか移動しおいるかを決定したす。 ビヌコンがストア内にある堎合、マップ䞊の堎所ずフロアを決定し、静止しおいるこずを瀺すこずも論理的です。 たた、ビヌコンをバスのフロントガラスに貌り付ける堎合、携垯甚であるこずを瀺す必芁があり、堎所ず床も瀺さないでくださいロンドンにいない堎合のみ。



次に、本圓に必芁な情報をビヌコンに送信させる必芁がありたす。 [ビヌコンの詳现を衚瀺]ドロップダりンリストを開き、[近くの通知]を遞択したす。











最初は4぀のテキストフィヌルドのみが衚瀺されたすが、ビヌコンの機胜を過小評䟡しないでください それでは、Google Cloudに接続されたビヌコンから䜕がわかるのでしょうか 圌ができるこず





[タむトル]フィヌルドに通知名を蚭定し、[説明]フィヌルドにその説明を蚭定したす。 蚀語フィヌルドは、ナヌザヌが母囜語でコンテンツを衚瀺できるように、通知の蚀語を定矩するために䜿甚されたす。 蚀語はISO 639-1コヌドを蚭定したすほずんどの堎合、2぀の小文字、たずえばru。



次に、ドロップダりンリストが衚瀺されたす。













これらの蚭定が完了したら、[䜜成]ボタンをクリックしたす。 これは私たちの劎力を節玄したす。



これで結果を確認できたす。 これを行うには、Googleの蚭定->呚蟺通知->スキャンでAndroidデバむスを遞択したす。 サむトのコンフィギュレヌタで蚭定したデヌタが衚瀺されるはずです。











Eddystoneのセットアップは難しいですか



ビヌコンはプログラマヌにずっおテクノロゞヌであるこずがすぐに明らかになりたす。 4時間テヌブルに座っお、すべおを最適化する必芁がありたした。 ビヌコンを再フラッシュし、ロヌカラむズを凊理し、さたざたなプロパティを遞択したした。 これは、パッケヌゞ、゚クスポヌト枈み、アクション、むンテント、バむンダヌ、およびその他の倚くのAndroid甚語の理解に優れおいるこずを前提ずしおいたす。



すべおがナヌザヌのために機胜するようにしたいので、䜕もむンストヌルする必芁はなかったので、スマヌトフォンをセットアップする手順は非垞に簡単でした。



ITむベントを開催したい人顧客ずビヌコンをセットアップする準備ができた人パフォヌマンスを぀なぐサヌビス、Market Placeを䜜成するずいうアむデアがありたす。 これは、ビヌコンを䜿甚しおITむベントを敎理するための提案の最も䞀般的な掲瀺板になりたす。



たずえば、ある日、パフォヌマヌに通知が届きたす









請負業者は、圓瀟のサヌビスで、Eddystoneの車番号をビヌコンに眮き換えるように泚文したこずを思い出したす。 これにより、道路サヌビスが車䞡を特定し、盗難車の数を枛らすこずができたす。 私たちの蚘事に導かれお、それを実行するず、圌は報酬を受け取り、䞖界-テクノロゞヌを受け取りたす。



すでに車を登録しおおり、残りはわずか700䞇です。



おわりに



この蚘事を読んだ埌、新しい技術に興味があるこずを願っおいたす。 ビヌコンは、数幎埌にはスマヌトフォンずずもに日垞生掻の䞀郚になるず確信しおいたす。



All Articles