BluetoothデバイスのGATT特性の読み取り

こんにちは、habrauzers!



iOS + OSX用のAIRアプリケーションでBluetooth LEを操作するためのANEライブラリに取り組んでいるときに、情報を交換するための独自のサービスと機能に加えて、bluetoothデバイスには標準のものがあります。 これらの特性から情報を読み取る方法に関する記事。 私はすぐにブルートゥースとそれに関連するすべてのものの大通ではないことを言わなければなりません、そして私にとってはそれはすべて新しいです:)行きましょう...





OSXデバイスのサービスと機能



Macbookのサービスと機能をスキャンすると、次のサービスが表示されました。





継続サービス



継続性サービスは、Appleによって接続されたデバイス間でデータを転送するために使用されます。詳細については、 www.apple.com / en / ios / whats-new / continuityをご覧ください 。 送信されたデータの形式を理解する時間があれば、これについては別の投稿を書きます。



サービス180A(デバイス情報)



180Aサービス(デバイス情報)を検討してください。 このサービスは、 GATTプロファイルの一部です。 GATTサービスのページを開き、識別子180Aでサービスを見つけます。 使用可能なリストは、さまざまな特性を示しています。



具体的には、私のデバイスは2つの利用可能な特性のみを示しました。



GATT特性のページを開くと、 2A29など、uuidに必要な特性が見つかります。 説明では、特性には1つのフィールドがあり、 utf8s形式であると記述されています。



つまり、次の方法でAIRアプリケーションの値を読み取ることができます。

var bytes:ByteArray = ...; var string:String = bytes.readUTFBytes(bytes.bytesAvailable);
      
      





私の場合、値は次のとおりです。

 2A29 - Apple Inc 2A24 - MacBookPro10,2
      
      





これらの特性により、すべてがシンプルでした。



iOSデバイスのサービスと機能



次に、iOSデバイスをスキャンして、提供されるデータを見てみましょう。 私のiPhoneは次のサービスを見せてくれました。





サービス7905F431-B5CE-4E99-A40F-4B1E122D00D0、これはApple通知センターサービスです。詳細はdeveloper.apple.com/library/ios/documentation/CoreBluetooth/Reference/AppleNotificationCenterServiceSpecification/Specification/Specification.htmlです。 時間がありますので、データ形式を把握し、Appleデバイスのbluetoothサービスの操作に関する別の投稿を書きます。



サービス180F(バッテリーサービス)



180Fサービスはバッテリー情報です。 このサービスには、単一の特性2A19があり 、その説明には、特性に単一のuint8形式フィールドがあることが記載されています。



この情報は、次のようなAIRアプリケーションで読むことができます。

 var bytes:ByteArray = ...; var level:int = bytes.readByte();
      
      





デバイスのバッテリーレベルに対応する0〜100の値を取得します。



サービス1805(現在のタイムサービス)



サービス1805の説明からわかるように、これは現在の時刻に関する情報です。 私のiOSデバイスは、このサービスの2つの特徴のみを示しました。





機能2A0F(現地時間情報)



特性2A0Fには2つのフィールドがあります。





最初のタイムゾーンフィールドの説明を開き、1つのsint8形式フィールドが含まれていることを確認します



2A0Fサービスの2番目のフィールドは夏時間 -夏時間に関する情報、形式: uint8です。



したがって、AIRアプリケーションで2A0F特性を読み取るには、次のコードを使用します。

 var bytes:ByteArray = ...; var timeZoneValue:int = bytes.readByte(); //  Time Zone var dstValue:int = bytes.readUnsignedByte(); //  Daylight Saving Time
      
      





私の場合、値は次のとおりです。

 TimeZone: 12 Daylight Saving Time: 0
      
      





TimeZoneフィールドの値12は、XMLファイルによると、タイムゾーンUTC + 3:00に対応しています。

XMLのタイムゾーンのリスト
 <?xml version="1.0" encoding="UTF-8"?> <!-- Copyright 2011 Bluetooth SIG, Inc. All rights reserved. --> <Characteristic xsi:noNamespaceSchemaLocation="http://schemas.bluetooth.org/Documents/characteristic.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Time Zone" type="org.bluetooth.characteristic.time_zone" uuid="2A0E"> <InformativeText> </InformativeText> <Value> <Field name="Time Zone"> <Requirement>Mandatory</Requirement> <Format>sint8</Format> <Minimum>-48</Minimum> <Maximum>56</Maximum> <Enumerations> <Enumeration key="-48" value="UTC-12:00" /> <Enumeration key="-44" value="UTC-11:00" /> <Enumeration key="-40" value="UTC-10:00" /> <Enumeration key="-38" value="UTC-9:30" /> <Enumeration key="-36" value="UTC-9:00" /> <Enumeration key="-32" value="UTC-8:00" /> <Enumeration key="-28" value="UTC-7:00" /> <Enumeration key="-24" value="UTC-6:00" /> <Enumeration key="-20" value="UTC-5:00" /> <Enumeration key="-18" value="UTC-4:30" /> <Enumeration key="-16" value="UTC-4:00" /> <Enumeration key="-14" value="UTC-3:30" /> <Enumeration key="-12" value="UTC-3:00" /> <Enumeration key="-8" value="UTC-2:00" /> <Enumeration key="-4" value="UTC-1:00" /> <Enumeration key="0" value="UTC+0:00" /> <Enumeration key="4" value="UTC+1:00" /> <Enumeration key="8" value="UTC+2:00" /> <Enumeration key="12" value="UTC+3:00" /> <Enumeration key="14" value="UTC+3:30" /> <Enumeration key="16" value="UTC+4:00" /> <Enumeration key="18" value="UTC+4:30" /> <Enumeration key="20" value="UTC+5:00" /> <Enumeration key="22" value="UTC+5:30" /> <Enumeration key="23" value="UTC+5:45" /> <Enumeration key="24" value="UTC+6:00" /> <Enumeration key="26" value="UTC+6:30" /> <Enumeration key="28" value="UTC+7:00" /> <Enumeration key="32" value="UTC+8:00" /> <Enumeration key="35" value="UTC+8:45" /> <Enumeration key="36" value="UTC+9:00" /> <Enumeration key="38" value="UTC+9:30" /> <Enumeration key="40" value="UTC+10:00" /> <Enumeration key="42" value="UTC+10:30" /> <Enumeration key="44" value="UTC+11:00" /> <Enumeration key="46" value="UTC+11:30" /> <Enumeration key="48" value="UTC+12:00" /> <Enumeration key="51" value="UTC+12:45" /> <Enumeration key="52" value="UTC+13:00" /> <Enumeration key="56" value="UTC+14:00" /> </Enumerations> <AdditionalValues> <Enumeration key="-128" value="time zone offset is not known"/> </AdditionalValues> </Field> </Value> </Characteristic>
      
      







ダウンロードは、フィールド名の反対側にある[ダウンロード/表示 ]ボタンをクリックして、[ タイムゾーン ] フィールドの説明で実行できます。



機能2A2B(現在の時刻)



2A2B特性は、デバイスの現在の時刻を表し、複数レベルのフィールドのネストがあり、それらの説明と形式を自分で理解できます。 デバイスの現在の時刻に関する完全な情報を読み取るためのコードのみを提供します。

 var bytes:ByteArray = ...; bytes.endian = Endian.LITTLE_ENDIAN; // var year:int = b.readUnsignedShort(); //  var month:int = b.readUnsignedByte(); //  (  1) var day:int = b.readUnsignedByte(); //  (  1) var hours:int = b.readUnsignedByte(); //  var minutes:int = b.readUnsignedByte(); //  var seconds:int = b.readUnsignedByte(); //  // var dayOfWeek:int = b.readUnsignedByte(); //   (  0) var fraction:int = b.readUnsignedByte(); //  var adjustReason:int = b.readUnsignedByte(); // ???
      
      







ここにはいくつかの重要なポイントがあります。

最初:すべてのGATT仕様の注意事項:

 The fields in the above table are in the order of LSO to MSO. Where LSO = Least Significant Octet and MSO = Most Significant Octet.
      
      





これは、ByteArrayでは下位バイトが最初に来ることを意味します。AIRでは、これはendianプロパティを使用して指定できます。

 bytes.endian = Endian.LITTLE_ENDIAN;
      
      







2番目:説明からわかるように、 小数フィールドは1/256秒です。 ミリ秒を取得するには、コードを記述します。

 var milliseconds:int = Math.floor(fraction/256*1000);
      
      







そして3番目: Adjust Reasonが何であるかまだ理解できませんでした。 誰が知っている-情報を共有する:)。



参照:






All Articles