×
Namespaces

Variants
Actions

广播蓝牙服务

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

兼容于
平台: S60 3rd Edition, MR
S60 3rd Edition (initial release)

平台安全性
能力: LocalServices

文章
关键词: RSdpDatabase
翻译:
hoolee
最后由 hamishwillee 在 06 Aug 2012 编辑
  • 详细描述

RSdp提供一个到Service Discovery Database的会话session。它可以用来生成到数据库功能的子会话。客户端必须在使

RSdpDatabase子会话访问数据库时生成并连接到一个会话。


RSdpDatabase是一个SDP的子会话,通过它服务可以记录,它们的属性可以被添加,删除或更新。


下列示例代码展示了如何广播一个客户端蓝牙服务(KBT_serviceID 0x10ff),如何发现特殊服务的范例在这里 Archived:Discovering Bluetooth services using Symbian C++ 可以找到。


监听蓝牙连接可以在这里找到Archived:Establishing a Bluetooth connection using Symbian C++CMyServiceAdvertiser::StartAdvertiserL(TInt aChannel)中的频道数目参数可以在这里找到。


MMP文件

需要下列能力和链接库

CAPABILITY LocalServices
LIBRARY sdpagent.lib
LIBRARY sdpdatabase.lib


头文件

#include <btsdp.h>
#include <bt_sock.h>
 
// The service id that identifies the service. This id will be
// used when advertising the service and discovering the service.
#define KBT_serviceID 0x10ff
 
// Service name and description for our service
_LIT(KBTServiceName, "BTpmp");
_LIT(KBTServiceDesc, "BTpmp");
 
// Service discovery protocol session
RSdp iSdp;
 
// Service discovery database (sdp)
RSdpDatabase iSdpDB;
 
// Service record
TSdpServRecordHandle iRecord;
 
// Service record state
TInt iRecordState;


源文件

void CMyServiceAdvertiser::StartAdvertiserL(TInt aChannel)
{
// Open sdp session
User::LeaveIfError(iSdp.Connect());
// Open sdp database session
User::LeaveIfError(iSdpDB.Open(iSdp));
 
// Create a record of the correct service class
TUUID serviceUUID(KBT_serviceID);
iSdpDB.CreateServiceRecordL(serviceUUID, iRecord);
 
// Add a protocol to the record
CSdpAttrValueDES* protocolDescriptorList = CSdpAttrValueDES::NewDESL(NULL);
CleanupStack::PushL(protocolDescriptorList);
 
TBuf8<1> channel;
channel.Append((TChar)aChannel);
 
// Create protocol list for our service
protocolDescriptorList
->StartListL() // list of protocols required for this method
->BuildDESL()
->StartListL()
->BuildUUIDL(KL2CAP)
->EndListL()
 
->BuildDESL()
->StartListL()
->BuildUUIDL(KRFCOMM)
->BuildUintL(channel)
->EndListL()
->EndListL();
 
// Set protocol list to the record
iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdProtocolDescriptorList,
*protocolDescriptorList);
CleanupStack::PopAndDestroy(protocolDescriptorList);
 
// Add a name to the record
iSdpDB.UpdateAttributeL(iRecord,
KSdpAttrIdBasePrimaryLanguage +
KSdpAttrIdOffsetServiceName,
KBTServiceName);
 
// Add a description to the record
iSdpDB.UpdateAttributeL(iRecord,
KSdpAttrIdBasePrimaryLanguage +
KSdpAttrIdOffsetServiceDescription,
KBTServiceDesc);
 
// Set service available
UpdateAvailabilityL(ETrue);
}


设置广播服务的可用性,service discovery database上的服务记录将依此更新:

void CMyServiceAdvertiser::UpdateAvailabilityL(TBool aAvailable)
{
TInt state = aAvailable ? 0xFF : 0x00;
 
// Set availability
iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdServiceAvailability, state);
 
// Mark record changed
iSdpDB.UpdateAttributeL(iRecord, KSdpAttrIdServiceRecordState,
++iRecordState);
}


停止广播服务

void CMyServiceAdvertiser::StopAdvertiserL()
{
if ( iRecord!=NULL )
{
// Delete record from service discovery database
iSdpDB.DeleteRecordL(iRecord);
 
// Close sdp and sdp db sessions
iSdpDB.Close();
iSdp.Close();
iRecord=NULL;
}
}
This page was last modified on 6 August 2012, at 10:37.
261 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×