Tìm hiu công ngh Bluetooth và viết ng dng minh ha
socket L2CAP, “port” s dng là Protocol/Service Multiplexer (PSM) , đối vi
Bluetooth Socket RFCOMM thì “port” s dng là server chanel.
+ Hàm Connect() được s dng :
void RSocket::Connect(TSockAddr& anAddr,
TRequestStatus &aRequest)
Tham s : anAddr : địa ch socket ca thiết b.
aRequetStatus : Cha mã li tr v.
Địa ch ca socket được th hin bi lp TBTSockAddr vn kế tha t
lp TSockAddr. Mi thiết b Bluetooth có mt địa ch 48 bit được th hin bi
lp TBTDevAddr, lp TBTSockAddr có hàm SetBTAddr() dùng để gán địa ch
thiết b Bluetooth cho đối tượng ca lp này và hàm SetPort() để chn mt
Channel c th.
void SetBTAddr(const TBTDevAddr& aRemote);
void SetPort(TUint aPort);
Mi client phi có các thành phn sau:
SocketServer (RSocketServ): Dùng để giao tiếp vi socket server ca thiết b.
SendingSocket: Dùng để kết ni, nhn và gi d liu đến server socket
Đon code sau mô t vic thc hin kết ni :
RSocketServ SocketServer;
TInt err;
err = SocketServer.Connect();
User::LeaveIfError(err);
RSocket SendingSocket;
err = SendingSocket.Open(SocketServer,
KBTAddrFamily,
KSockStream,
KRFCOMM);
User::LeaveIfError(err);
TBTSockAddr addr;
Đào Quý Thái An – Trn Th M Hnh 185
Tìm hiu công ngh Bluetooth và viết ng dng minh ha
TRequestStatus status;
addr.SetBTAddr(…);
addr.SetPort(…);
SendingSocket.Connect(addr, status);
// Nhn và gi d liu đây .....
7.4.4. Trao đổi d liu thông qua Bluetooth socket :
Sau khi thiết lp kết ni thành công, vic nhn và gi d liu vi
Bluetooth socket cũng tương t như vi bt kì loi socket nào khác trên
Symbian (IrDA socket, Internet socket).
* Để nhn d liu ta có th dùng các hàm Read(), Recv() , hoc
ReceiveOneOrMore().:
- void Read( TDes8& aDesc,TRequestStatus& aStatus );
- void Recv( TDes8& aDesc,
TUint flags,
TRequestStatus& aStatus);
- void Recv( TDes8& aDesc,
TUint flags,
TRequestStatus& aStatus,
TSockXfrLength& aLen);
- void RecvOneOrMore( TDes8& aDesc,
TUint flags,
TRequestStatus& aStatus,
TSockXfrLength& aLen);
Trong đó:
+ TDes8& aDesc : buffer cha d liu nhn được.
+ TRequestStatus& aStatus : Sau khi hàm kết thúc, biến này cha mã li tr v.
Nếu không có li, giá tr ca aStatus là KerrNone.
+ TUint flags : các thông tin v Protocol, I/O.
Đào Quý Thái An – Trn Th M Hnh 186
Tìm hiu công ngh Bluetooth và viết ng dng minh ha
+ TsockXfrLength& aLen : Chiu dài d liu nhn được.
* Để gi d liu, ta dùng hàm Write():
+ void Write(const TDesC8& aDesc, TRequestStatus& aStatus);
+ void Send(const TDesC8& aDesc,
TUint someFlags,
TRequestStatus& aStatus);
+ void Send(const TDesC8& aDesc,
TUint someFlags,
TRequestStatus& aStatus,
TSockXfrLength& aLen);
Trong đó:
+ TDesC8& aDesc : D liu cn gi đi.
+ TResquestStatus& aStatus : Sau khi hàm kết thúc, mã li được
tr v qua bin này.
+ TUint flags : các thông tin v Protocol, I/O.
+ TsockXfrLength& aLen : Chiu dài d liu gi đi.
7.5. Bluetooth Service Discovery Database:
Mi dch v Bluetooth được lưu trong mt record trong SDP database,
nh đó, các thiết b khác có th biết được trên thiết b Bluetooth đó có nhng
dch v nào. Bluetooth Service Discovery Database cho phép các dch v trên
ni b thiết b có th đưa các đặc tính ca nó vào trong Bluetooth Service
Database, nh đó, các thiết b Bluetooth khác có th phát hin được là dch v
đó được h tr trên thiết b đó.
7.5.1. Kết ni vào Bluetooth Service Discovery Database :
Để có th s dng Service Discovery Database, client phi thc hin các
bước sau :
Đào Quý Thái An – Trn Th M Hnh 187
Tìm hiu công ngh Bluetooth và viết ng dng minh ha
+ To mt phiên làm vic (session) vi đối tượng database RSdp m
mt kết ni
+ To ra mt phiên làm vic con (subsession) ti đối tượng Database
RsdpDatabase và m kết ni. Mt client có th có nhiu phiên làm vic con
đồng thi.
+ Đóng subsession và session khi đã s dng xong.
Đon code sau minh ha cách thc kết ni ti Service Database :
//1. To và m mt phiên làm vic đến database
RSdp sdp;
User::LeaveIfError(sdp.Connect());
// 2. Create and open a subsession
RSdpDatabase sdpSubSession;
User::LeaveIfError(sdpSubSession.Open(sdp));
...
// 3. Đóng các kêt ni đã m.
sdpSubSession.Close();
sdp.Close();
7.5.2. Đăng kí mt dch v vào Service Database :
Sau khi Service Discovery Database được m ra, mt service record có
th được to ra. Vic đó được thc hin bng vic cung cp mt giá tr UUID
(Bluetooth Universally Unique Identifier) cho lp dch v (service class) ca
record. Service class có th là mt giá tr UUID hoc mt list các giá tr UUID
dng DES.
Các bước đăng kí mt dch v vào Database :
+ To ra mt record dch v trng thuc đối tượng
TSdpServRecordHandle, là handle ca mt service record.
+ Nếu thuc tính ca service class là mt giá tr đơn UUID, to ra và
thiết lp mt đối tượng TUUID. Nếu thuc tính ca service class là mt danh
Đào Quý Thái An – Trn Th M Hnh 188
Tìm hiu công ngh Bluetooth và viết ng dng minh ha
sách các giá tr UUID, to ra mt đối tượng danh sách thuc tính thuc lp
CSdpAttrValueDES hoc lp CSdpAttrValueDEA , và gi hàm
MsdpElementBuilder::BuildUUIDL() đối vi tng thuc tính để đưa vào danh
sách thuc tính.
+ Gi hàm RSdpDatabase::CreateServiceRecordL() trong mt
subsession đã m. Hàm tr v mt handle tr ti service record mi to.
* Đon code sau mt t cách to mt service record vi mt đối tượng
dch v đơn (single service class) :
/* Gi s sdpSession là mt phiên làm vic vi đối tượng Database đã được
m thành công, sdpsubsession : phiên làm vic con */
// 1. To ra mt Record Handle trng
TSdpServRecordHandle recordHandle = 0;
// 2.To ra đối tượng service class đơn và thiết lp giá tr ca nó
TUUID uuid(0x20000);
// 3. Đưa record mi to vào Database .
sdpSubSession.CreateServiceRecordL(uuid, recordHandle);
* Đối vi danh sách thuc tính, ta dùng hàm StartListL() để báo hiu
vic bt đầu thao tác vi list, hàm BuildxxxL() để thêm d liu vào danh sách,
tùy vào loi d liu mà s dng các hàm BuildxxxL() khác nhau, như hàm
BuildURLL(), BuildDESL(), BuildIntL(), BuildUUIDL()....., Sau đó, ta dùng
hàm EndList() để đóng danh sách li.
* Gi s ng dng cn đưa vào service record mt thuc tính là danh
sách các giao thc (protocol) mà ng dng h tr, đon chương trình sau minh
ha vic to mt danh sách gm 2 protocol. Protocol đầu tiên là L2CAP.
Protocol th 2 là RFCOMM kèm theo mt s nguyên đại din cho kênh truyn
(channel), và đưa vào Database.
/ /1. To ra mt record handle trng :
TSdpServRecordHandle recordhandle =0;
Đào Quý Thái An – Trn Th M Hnh 189