SDP client for myBlueUSB

Dependents:   mbed_TANK_Kinect ftusbClass

Committer:
networker
Date:
Wed Apr 06 18:09:20 2011 +0000
Revision:
1:70ee392bcfd4
Parent:
0:7493bf6bb1b9
Child:
2:d5a27b2d2e08
Added support for continuation PDUs. Still some issues with handling multiple services.

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 1:70ee392bcfd4 3 #include "AvailableMemory.h"
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 1:70ee392bcfd4 20 unsigned char contState[17];//maximum size, in practive it is 3
networker 1:70ee392bcfd4 21 unsigned char *contBuf;
networker 1:70ee392bcfd4 22 unsigned byteCount;
networker 1:70ee392bcfd4 23 int _state;
networker 0:7493bf6bb1b9 24 sdp_data *tree;//root of the entire service tree
networker 0:7493bf6bb1b9 25 map<unsigned, serv_rec*> services;//the set of supported services <handle, service>
networker 0:7493bf6bb1b9 26 map<unsigned, serv_rec*>::iterator index;
networker 0:7493bf6bb1b9 27 public:
networker 0:7493bf6bb1b9 28 SDPManager(): _l2cap(0), txid(1), tree(0) {
networker 0:7493bf6bb1b9 29 ErrorResponse=errorhandler;
networker 0:7493bf6bb1b9 30 ServiceSearchResponse=0;
networker 0:7493bf6bb1b9 31 ServiceAttributeResponse=attribHandler;
networker 0:7493bf6bb1b9 32 ServiceSearchAttributeResponse=0;
networker 0:7493bf6bb1b9 33 buf = l2cap_buf+OFFSET;
networker 1:70ee392bcfd4 34 contBuf = 0;
networker 1:70ee392bcfd4 35 byteCount = 0;
networker 1:70ee392bcfd4 36 contState[0] = 0;
networker 1:70ee392bcfd4 37 _state = 0;
networker 0:7493bf6bb1b9 38 }
networker 0:7493bf6bb1b9 39
networker 0:7493bf6bb1b9 40 //Called as: Socket_Open(SOCKET_SDP, addr, callback, userdata(this))
networker 0:7493bf6bb1b9 41 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr) {
networker 0:7493bf6bb1b9 42 L2CAPAddr* ad = (L2CAPAddr*)addr;
networker 0:7493bf6bb1b9 43 if (_l2cap) {
networker 0:7493bf6bb1b9 44 printf("This SDP supports only one connection at a time\n");
networker 0:7493bf6bb1b9 45 return 0;
networker 1:70ee392bcfd4 46 }
networker 0:7493bf6bb1b9 47 //BD_ADDR* a = &ad->bdaddr;
networker 0:7493bf6bb1b9 48 sdp_socket = sock->ID;
networker 0:7493bf6bb1b9 49 for (index = services.begin(); index != services.end(); index++)
networker 0:7493bf6bb1b9 50 delete (*index).second;
networker 0:7493bf6bb1b9 51 services.clear();
networker 0:7493bf6bb1b9 52 ad->psm = L2CAP_PSM_SDP;//open the l2cap channel
networker 0:7493bf6bb1b9 53 _l2cap = Socket_Open(SOCKET_L2CAP, addr, OnSdpRsp, this);//this is the socket between SDP and the L2CAP layer
networker 0:7493bf6bb1b9 54 if (_l2cap <= 0) {
networker 0:7493bf6bb1b9 55 printf("Opening L2CAP channel failed\n");
networker 0:7493bf6bb1b9 56 return _l2cap;
networker 0:7493bf6bb1b9 57 }
networker 0:7493bf6bb1b9 58 printf("Successfully opened L2CAP channel for SDP on socket %d\n", _l2cap);
networker 0:7493bf6bb1b9 59 return sock->ID;
networker 0:7493bf6bb1b9 60 }
networker 0:7493bf6bb1b9 61
networker 0:7493bf6bb1b9 62 virtual int Send(SocketInternal* sock, const u8* data, int len) {
networker 0:7493bf6bb1b9 63 printf("SDPManager::Send should not be called directly\n");
networker 0:7493bf6bb1b9 64 return Socket_Send(_l2cap, data, len);
networker 0:7493bf6bb1b9 65 }
networker 0:7493bf6bb1b9 66
networker 0:7493bf6bb1b9 67 virtual int Close(SocketInternal* sock) {
networker 0:7493bf6bb1b9 68 printf("SDP socket %d and L2CAP socket %d closed\n", sock->ID, _l2cap);
networker 0:7493bf6bb1b9 69 return Socket_Close(_l2cap);
networker 0:7493bf6bb1b9 70 }
networker 0:7493bf6bb1b9 71
networker 0:7493bf6bb1b9 72 virtual char* Name() {
networker 0:7493bf6bb1b9 73 return "SDPManager SocketHandler";
networker 0:7493bf6bb1b9 74 }
networker 0:7493bf6bb1b9 75
networker 1:70ee392bcfd4 76 void OnSdpRsp(const u8* data, int len);
networker 0:7493bf6bb1b9 77 //this function is called when the L2CAP layer receives SDP packets (see SDPManager::Open), userdata is the sdpmanager instance
networker 1:70ee392bcfd4 78 static void OnSdpRsp(int socket, SocketState state, const u8* data, int len, void* userData) {
networker 1:70ee392bcfd4 79 printf("\x1B[%dm", 35);
networker 1:70ee392bcfd4 80 printf("OnSdpRsp(socket=%d, state=%d, len=%d)\n", socket, state, len);
networker 1:70ee392bcfd4 81 // printf("OnSdpRsp(socket=%d, state=%d, len=%d, freemem=%d)\n", socket, state, len, AvailableMemory(1));
networker 1:70ee392bcfd4 82 SDPManager *self = (SDPManager*)userData;
networker 1:70ee392bcfd4 83 if (state == SocketState_Open){
networker 1:70ee392bcfd4 84 self->OnSdpRsp(data, len);
networker 1:70ee392bcfd4 85 }
networker 1:70ee392bcfd4 86 printf("\x1B[%dm", 0);
networker 1:70ee392bcfd4 87 }
networker 1:70ee392bcfd4 88
networker 0:7493bf6bb1b9 89 //this function is called when the SDP sockets receives data (see HCICallback in TestShell),
networker 0:7493bf6bb1b9 90 //currently does not happen because not forwarded from OnSdpRsp, can be used to handle multiple connections
networker 0:7493bf6bb1b9 91 static void OnSockCallback(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 0:7493bf6bb1b9 92 static void errorhandler(unsigned err);
networker 0:7493bf6bb1b9 93
networker 0:7493bf6bb1b9 94 void (*ErrorResponse)(unsigned) ;
networker 0:7493bf6bb1b9 95 void (*ServiceSearchResponse)() ;
networker 0:7493bf6bb1b9 96 void (*ServiceAttributeResponse)(serv_rec*) ;
networker 0:7493bf6bb1b9 97 void (*ServiceSearchAttributeResponse)() ;
networker 0:7493bf6bb1b9 98 int ServiceSearchRequest(sdp_data *sp, unsigned count, unsigned cs=0);
networker 0:7493bf6bb1b9 99 int ServiceAttributeRequest(unsigned handle, unsigned count, sdp_data* al, unsigned cs=0) ;
networker 0:7493bf6bb1b9 100 int ServiceSearchAttributeRequest(sdp_data *sp, unsigned count, sdp_data* al, unsigned cs=0);
networker 0:7493bf6bb1b9 101 private:
networker 0:7493bf6bb1b9 102 unsigned length(const unsigned char *el, unsigned &p);
networker 0:7493bf6bb1b9 103 unsigned getval(const unsigned char *p, int n) ;
networker 0:7493bf6bb1b9 104 unsigned parse (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 1:70ee392bcfd4 105 unsigned parseLight (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 0:7493bf6bb1b9 106 int parseRsp(const unsigned char*rsp, int len) ;
networker 1:70ee392bcfd4 107 void append(const unsigned char*rsp, int len) ;
networker 1:70ee392bcfd4 108 void freeBuf();
networker 0:7493bf6bb1b9 109 };
networker 0:7493bf6bb1b9 110
networker 0:7493bf6bb1b9 111 #endif