EN JA
SDP(3)
SDP(3) FreeBSD Library Functions Manual SDP(3)

名称

SDP_GET8, SDP_GET16, SDP_GET32, SDP_GET64, SDP_GET128, SDP_GET_UUID128, SDP_PUT8, SDP_PUT16, SDP_PUT32, SDP_PUT64, SDP_PUT128, SDP_PUT_UUID128, sdp_open, sdp_open_local, sdp_close, sdp_error, sdp_search, sdp_attr2desc, sdp_uuid2descBluetooth SDP ルーチン

ライブラリ

Bluetooth Service Discovery Protocol User Library (libsdp, -lsdp)

書式

#include < bluetooth.h>
#include < sdp.h>

SDP_GET8( b, cp);

SDP_GET16( s, cp);

SDP_GET32( l, cp);

SDP_GET64( l, cp);

SDP_GET128( l, cp);

SDP_GET_UUID128( l, cp);

SDP_PUT8( b, cp);

SDP_PUT16( s, cp);

SDP_PUT32( l, cp);

SDP_PUT64( l, cp);

SDP_PUT128( l, cp);

SDP_PUT_UUID128( l, cp);

void *
sdp_open( bdaddr_t const *l, bdaddr_t const *r);

void *
sdp_open_local( char const *control);

int32_t
sdp_close( void *xs);

int32_t
sdp_error( void *xs);

int32_t
sdp_search( void *xs, uint32_t plen, uint16_t const *pp, uint32_t alen, uint32_t const *ap, uint32_t vlen, sdp_attr_t *vp);

char const * const
sdp_attr2desc( uint16_t attr);

char const * const
sdp_uuid2desc( uint16_t uuid);

int32_t
sdp_register_service( void *xss, uint16_t uuid, bdaddr_p const bdaddr, uint8_t const *data, uint32_t datalen, uint32_t *handle);

int32_t
sdp_unregister_service( void *xss, uint32_t handle);

int32_t
sdp_change_service( void *xss, uint32_t handle, uint8_t const *data, uint32_t datalen);

解説

SDP_GET8(), SDP_GET16(), SDP_GET32(), SDP_GET64() と SDP_GET128() マクロは cp ポインタによって指されたバッファからバイト (byte), short, long, long long と 128 ビット整数 (integer) を得るために使用されます。ポインタは自動的に進められます。

SDP_PUT8(), SDP_PUT16(), SDP_PUT32(), SDP_PUT64() と SDP_PUT128() マクロは cp ポインタによって指されたバッファの中へバイト (byte), short, long, long long と 128 ビット整数 (integer) を置くために使用されます。ポインタは自動的に進められます。

SDP_GET_UUID128() と SDP_PUT_UUID128() マクロは、128 ビットの UUID を取得して、 cp ポインタによって指されたバッファ中に置くために使用されます。ポインタは自動的に進められます。

sdp_open() と sdp_open_local() 関数はそれぞれ SDP セッションについて説明する不透明な (サイズ及び形がわからない) オブジェクトへのポインタを返します。 sdp_open() 関数に渡された l 引数はソースの BD_ADDR を指すべきです。ソースの BD_ADDR が NULL であるなら、ソースアドレス NG_HCI_BDADDR_ANY が使用されます。 sdp_open() 関数に渡された r 引数は NULL でないリモート BD_ADDR を指すべきです。リモートの BD_ADDR には NG_HCI_BDADDR_ANY は指定できません。 sdp_open_local() 関数は、制御ソケットへのパスを取って、ローカル SDP サーバへの接続をオープンします。制御ソケットへのパスが NULL であるなら、デフォルトの /var/run/sdp パスが使用されます。

sdp_close() 関数は、活性の SDP セッションを終了して、SDP セッションオブジェクトを削除します。 xs パラメータは sdp_open() または sdp_open_local() で作成された有効な SDP セッションオブジェクトを指すべきです。

sdp_error() 関数は SDP セッションオブジェクト中に格納された最後のエラーを返します。 xs パラメータは sdp_open() または sdp_open_local() で作成された有効な SDP セッションオブジェクトを指すべきです。返されたエラー値は strerror(3) 関数を呼び出すことによって、人間に解読可能なメッセージに変換することができます。

sdp_search() 関数は、SDP サービス検索属性要求 (Service Search Attribute Request) を実行するために使用されます。 xs パラメータは sdp_open() または sdp_open_local() で作成された有効な SDP セッションオブジェクトを指すべきです。 pp パラメータは 1 つ以上のサービスクラス ID (Service Class ID) の配列である - サービス検索パターン (Service Search Pattern) です。配列中のサービスクラス ID (Service Class ID) の最大数は 12 です。 plen パラメータはサービス検索パターン (Service Search pattern) の長さです。 ap パラメータは 1 つ以上の SDP 属性 ID 範囲 (Attribute ID Range) の配列である - 属性 ID 範囲リスト (Attribute ID Range List) です各属性 ID 範囲 (ID Range) は 32 ビットの符号なし整数データ要素としてエンコードされます。ここで、上位 16 ビットは範囲の開始属性 ID として解釈され、下位 16 ビットは範囲の終了属性 ID として解釈されます。属性 ID 範囲位リスト (Attribute ID Ranges List) に含まれた属性 ID は任意の属性 ID 値の複製なしで昇順にリストされなければなりません。すべての属性は 0x0000-0xFFFF の範囲を指定することによって要求されるかもしれないことに注意してください。 alen パラメータは属性 ID 範囲リスト (Attribute ID Ranges List) の長さです。 SDP_ATTR_RANGE( lo, hi) マクロは属性 ID 範囲 (Attribute ID Range) を準備するために使用することができます。 vp パラメータは sdp_attr_t 構造体の配列でなければなりません。それぞれの sdp_attr_t 構造体は単一の SDP 属性を記述して、次のように定義されます:

struct sdp_attr { 
        uint16_t        flags; 
#define SDP_ATTR_OK             (0 << 0) 
#define SDP_ATTR_INVALID        (1 << 0) 
#define SDP_ATTR_TRUNCATED      (1 << 1) 
        uint16_t        attr;  /* SDP_ATTR_xxx */ 
        uint32_t        vlen;  /* value[] のバイト単位の長さ */ 
        uint8_t        *value; /* ベースポインタ */ 
}; 
typedef struct sdp_attr         sdp_attr_t; 
typedef struct sdp_attr *       sdp_attr_p;

sdp_search() 関数の呼び出し側は sdp_attr 構造体の配列を準備すると予想され、配列の各要素において、 vlenvalue の両方を設定しなければなりません。 sdp_search() 関数は属性と値、すなわち、 flags, attrvlen フィールドを設定して、それぞれの sdp_attr_t 構造体に書き込みます。属性の実際の値は value バッファ中にコピーされます。注意: 属性はそれらがサービス検索属性応答 (Service Search Attribute Response) に現れる順序で返されます。 SDP サーバは同じ記録のいくつかの属性を返すかもしれません。この場合属性の順序は次のようになります: 最初の記録のためのすべての属性、そして、2 番目の記録のためのすべての属性、等。

sdp_attr2desc() と sdp_uuid2desc() 関数は、それぞれ数値属性 ID/UUID 値を取って、それを人間に解読可能な記述に変換します。

sdp_register_service() 関数は、ローカル SDP サーバにサービスを登録するために使用されます。 xss パラメータは sdp_open_local() から取得された有効な SDP セッションオブジェクトを指すべきです。 uuid パラメータは、サービスが登録される SDP サービスクラス ID (Service Class ID) です。 bdaddr パラメータは有効な BD_ADDR を指すべきです。要求が bdaddr でローカルデバイスによって受信されたなら、サービスは通知のみ行われます。 bdaddrNG_HCI_BDADDR_ANY に設定されるなら、サービスはそれを問い合わせるどんなリモートデバイスにも通知されます。 datadatalen パラメータはサービスのためのデータのデータとサイズを指定します。成功して返れば、 sdp_register_service() は SDP のレコードハンドルで handle を投入します。このパラメータは、オプションであり、 NULL に設定することができます。

sdp_unregister_service() 関数は、ローカル SDP サーバにサービスを登録を取り消すために使用されます。 xss パラメータは sdp_open_local() から取得された有効な SDP セッションオブジェクトを指すべきです。 handle パラメータは登録を取り消されるサービスの有効な SDP レコードハンドルを含むべきです。

sdp_change_service() 関数は、ローカル SDP サーバにおける既存のサービスに関連しているデータを変更するために使用されます。 xss パラメータは sdp_open_local() から取得された有効な SDP セッションオブジェクトを指すべきです。 handle パラメータは変更されるサービスの有効な SDP レコードハンドルを含むべきです。 datadatalen パラメータはサービスのためのデータのデータとサイズを指定します。

警告

ローカル SDP サーバにサービスを登録するとき、アプリケーションは SDP セッションをオープンしたまま保たなければなりません。 SDP セッションがクローズされるなら、ローカル SDP サーバはセッションの間に登録されたすべてのサービスを削除します。アプリケーションは、同じセッションの間に登録されているなら、サービスを変更するか登録を取り消すことができます。

使用例

次の例は、 SDP_SERVICE_CLASS_SERIAL_PORT サービスのためにリモートデバイスから SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST 属性をどのように取得するかを示しています。

bdaddr_t       remote; 
uint8_t        buffer[1024]; 
void          *ss    = NULL; 
uint16_t       serv  = SDP_SERVICE_CLASS_SERIAL_PORT; 
uint32_t       attr  = SDP_ATTR_RANGE( 
                            SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST, 
                            SDP_ATTR_PROTOCOL_DESCRIPTOR_LIST); 
sdp_attr_t     proto = { SDP_ATTR_INVALID,0,sizeof(buffer),buffer }; 
 
/* ここでリモート BDADDR を取得するか/設定する */ 
 
if ((ss = sdp_open(NG_HCI_BDADDR_ANY, remote)) == NULL) 
        /* ENOMEM で終了 */ 
if (sdp_error(ss) != 0) 
        /* sdp_error(ss) で終了 */ 
 
if (sdp_search(ss, 1, &serv, 1, &attr, 1, &proto) != 0) 
        /* sdp_error(ss) で終了 */ 
 
if (proto.flags != SDP_ATTR_OK) 
        /* 終了、詳細に関しては proto.flags を参照 */ 
 
/* ここに到達したなら、私たちは proto.value に属性値を持っています */

診断

sdp_open() と sdp_open_local() の両方は、新しい SDP セッションオブジェクトのためのメモリ割り付けが失敗するなら、 NULL を返します。新しい SDP オブジェクトが作成されたなら、呼び出し側は、接続エラーがあったかどうかチェックするために sdp_error() をまだ呼び出すはずです。

sdp_search(), sdp_register_service(), sdp_unregister_service() と sdp_change_service() 関数は、エラーで 0 以外の値を返します。呼び出し側は、さらにエラーを見つけるために sdp_error() を呼び出すはずです。

作者

Maksim Yevmenkin <m_evmenkin@yahoo.com>

バグ

たぶんあるでしょう。見つけたなら、バグを報告してください。
May 27, 2005 FreeBSD