SDP client for myBlueUSB

Dependents:   mbed_TANK_Kinect ftusbClass

Committer:
networker
Date:
Mon Apr 04 16:45:20 2011 +0000
Revision:
0:7493bf6bb1b9
Child:
1:70ee392bcfd4
initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:7493bf6bb1b9 1 #ifndef SDP_H
networker 0:7493bf6bb1b9 2 #define SDP_H
networker 0:7493bf6bb1b9 3
networker 0:7493bf6bb1b9 4 #include <map>
networker 0:7493bf6bb1b9 5 #define OFFSET 8
networker 0:7493bf6bb1b9 6
networker 0:7493bf6bb1b9 7 class SDPManager;
networker 0:7493bf6bb1b9 8 extern SDPManager SDP;
networker 0:7493bf6bb1b9 9 typedef map<unsigned short, sdp_data*> serv_rec;
networker 0:7493bf6bb1b9 10
networker 0:7493bf6bb1b9 11 void attribHandler(serv_rec *r);
networker 0:7493bf6bb1b9 12
networker 0:7493bf6bb1b9 13 //at the moment, SDP can handle only one connection at a time
networker 0:7493bf6bb1b9 14 class SDPManager: public SocketHandler {
networker 0:7493bf6bb1b9 15 int _l2cap;
networker 0:7493bf6bb1b9 16 int sdp_socket; //at the moment the only socket
networker 0:7493bf6bb1b9 17 unsigned char l2cap_buf[100+OFFSET];
networker 0:7493bf6bb1b9 18 unsigned char* buf;
networker 0:7493bf6bb1b9 19 unsigned txid;
networker 0:7493bf6bb1b9 20 sdp_data *tree;//root of the entire service tree
networker 0:7493bf6bb1b9 21 map<unsigned, serv_rec*> services;//the set of supported services <handle, service>
networker 0:7493bf6bb1b9 22 map<unsigned, serv_rec*>::iterator index;
networker 0:7493bf6bb1b9 23 public:
networker 0:7493bf6bb1b9 24 SDPManager(): _l2cap(0), txid(1), tree(0) {
networker 0:7493bf6bb1b9 25 ErrorResponse=errorhandler;
networker 0:7493bf6bb1b9 26 ServiceSearchResponse=0;
networker 0:7493bf6bb1b9 27 ServiceAttributeResponse=attribHandler;
networker 0:7493bf6bb1b9 28 ServiceSearchAttributeResponse=0;
networker 0:7493bf6bb1b9 29 buf = l2cap_buf+OFFSET;
networker 0:7493bf6bb1b9 30 }
networker 0:7493bf6bb1b9 31
networker 0:7493bf6bb1b9 32 //Called as: Socket_Open(SOCKET_SDP, addr, callback, userdata(this))
networker 0:7493bf6bb1b9 33 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr) {
networker 0:7493bf6bb1b9 34 L2CAPAddr* ad = (L2CAPAddr*)addr;
networker 0:7493bf6bb1b9 35 if (_l2cap) {
networker 0:7493bf6bb1b9 36 printf("This SDP supports only one connection at a time\n");
networker 0:7493bf6bb1b9 37 return 0;
networker 0:7493bf6bb1b9 38 }
networker 0:7493bf6bb1b9 39 //BD_ADDR* a = &ad->bdaddr;
networker 0:7493bf6bb1b9 40 sdp_socket = sock->ID;
networker 0:7493bf6bb1b9 41 for (index = services.begin(); index != services.end(); index++)
networker 0:7493bf6bb1b9 42 delete (*index).second;
networker 0:7493bf6bb1b9 43 services.clear();
networker 0:7493bf6bb1b9 44 ad->psm = L2CAP_PSM_SDP;//open the l2cap channel
networker 0:7493bf6bb1b9 45 _l2cap = Socket_Open(SOCKET_L2CAP, addr, OnSdpRsp, this);//this is the socket between SDP and the L2CAP layer
networker 0:7493bf6bb1b9 46 if (_l2cap <= 0) {
networker 0:7493bf6bb1b9 47 printf("Opening L2CAP channel failed\n");
networker 0:7493bf6bb1b9 48 return _l2cap;
networker 0:7493bf6bb1b9 49 }
networker 0:7493bf6bb1b9 50 printf("Successfully opened L2CAP channel for SDP on socket %d\n", _l2cap);
networker 0:7493bf6bb1b9 51 return sock->ID;
networker 0:7493bf6bb1b9 52 }
networker 0:7493bf6bb1b9 53
networker 0:7493bf6bb1b9 54 virtual int Send(SocketInternal* sock, const u8* data, int len) {
networker 0:7493bf6bb1b9 55 printf("SDPManager::Send should not be called directly\n");
networker 0:7493bf6bb1b9 56 return Socket_Send(_l2cap, data, len);
networker 0:7493bf6bb1b9 57 }
networker 0:7493bf6bb1b9 58
networker 0:7493bf6bb1b9 59 virtual int Close(SocketInternal* sock) {
networker 0:7493bf6bb1b9 60 printf("SDP socket %d and L2CAP socket %d closed\n", sock->ID, _l2cap);
networker 0:7493bf6bb1b9 61 return Socket_Close(_l2cap);
networker 0:7493bf6bb1b9 62 }
networker 0:7493bf6bb1b9 63
networker 0:7493bf6bb1b9 64 virtual char* Name() {
networker 0:7493bf6bb1b9 65 return "SDPManager SocketHandler";
networker 0:7493bf6bb1b9 66 }
networker 0:7493bf6bb1b9 67
networker 0:7493bf6bb1b9 68 //this function is called when the L2CAP layer receives SDP packets (see SDPManager::Open), userdata is the sdpmanager instance
networker 0:7493bf6bb1b9 69 static void OnSdpRsp(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 0:7493bf6bb1b9 70 //this function is called when the SDP sockets receives data (see HCICallback in TestShell),
networker 0:7493bf6bb1b9 71 //currently does not happen because not forwarded from OnSdpRsp, can be used to handle multiple connections
networker 0:7493bf6bb1b9 72 static void OnSockCallback(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 0:7493bf6bb1b9 73 static void errorhandler(unsigned err);
networker 0:7493bf6bb1b9 74
networker 0:7493bf6bb1b9 75 void (*ErrorResponse)(unsigned) ;
networker 0:7493bf6bb1b9 76 void (*ServiceSearchResponse)() ;
networker 0:7493bf6bb1b9 77 void (*ServiceAttributeResponse)(serv_rec*) ;
networker 0:7493bf6bb1b9 78 void (*ServiceSearchAttributeResponse)() ;
networker 0:7493bf6bb1b9 79 int ServiceSearchRequest(sdp_data *sp, unsigned count, unsigned cs=0);
networker 0:7493bf6bb1b9 80 int ServiceAttributeRequest(unsigned handle, unsigned count, sdp_data* al, unsigned cs=0) ;
networker 0:7493bf6bb1b9 81 int ServiceSearchAttributeRequest(sdp_data *sp, unsigned count, sdp_data* al, unsigned cs=0);
networker 0:7493bf6bb1b9 82 private:
networker 0:7493bf6bb1b9 83 unsigned length(const unsigned char *el, unsigned &p);
networker 0:7493bf6bb1b9 84 unsigned getval(const unsigned char *p, int n) ;
networker 0:7493bf6bb1b9 85 unsigned parse (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 0:7493bf6bb1b9 86 int parseRsp(const unsigned char*rsp, int len) ;
networker 0:7493bf6bb1b9 87 };
networker 0:7493bf6bb1b9 88
networker 0:7493bf6bb1b9 89 #endif