Test version of BlueUSB stack. Includes SDP and RFCOMM. As Client it allows to connect to my fischertechnik TX Controller. As Server it echo\\\\\\\'s characters to Putty. PIN=1234

Dependencies:   mbed myUSBHost AvailableMemory

Dependents:   mbed_TANK_Kinect myBlueUSB_ros ftusbClass

Committer:
networker
Date:
Fri Jul 01 09:16:00 2011 +0000
Revision:
13:327622e38551
made some improvements to get massstorage functioning

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 13:327622e38551 1 #ifndef SDP_H
networker 13:327622e38551 2 #define SDP_H
networker 13:327622e38551 3 #include "AvailableMemory.h"
networker 13:327622e38551 4 #include "sdp_data.h"
networker 13:327622e38551 5 #include <map>
networker 13:327622e38551 6 #define OFFSET 8
networker 13:327622e38551 7
networker 13:327622e38551 8 class SDPManager;
networker 13:327622e38551 9 extern SDPManager SDP;
networker 13:327622e38551 10 typedef map<unsigned short, sdp_data*> serv_rec;
networker 13:327622e38551 11
networker 13:327622e38551 12 void attribHandler(serv_rec *r);
networker 13:327622e38551 13 unsigned parseUUID(const u8* data, int len, unsigned &p);
networker 13:327622e38551 14 unsigned length(const unsigned char *el, unsigned &p);
networker 13:327622e38551 15 unsigned getval(const unsigned char *p, int n) ;
networker 13:327622e38551 16 void errorhandler(unsigned err);//default error handler
networker 13:327622e38551 17
networker 13:327622e38551 18
networker 13:327622e38551 19 class SDPHandler: public SocketHandler {
networker 13:327622e38551 20 // int _l2cap;
networker 13:327622e38551 21 int sdp_socket;
networker 13:327622e38551 22 unsigned char l2cap_buf[100+OFFSET];
networker 13:327622e38551 23 unsigned char* buf;
networker 13:327622e38551 24 unsigned txid;
networker 13:327622e38551 25 unsigned char contState[17];//maximum size, in practive it is 3
networker 13:327622e38551 26 unsigned char *contBuf;
networker 13:327622e38551 27 unsigned byteCount;
networker 13:327622e38551 28 int _state;
networker 13:327622e38551 29 sdp_data *tree;//root of the entire service tree
networker 13:327622e38551 30 map<unsigned, serv_rec*> services;//the set of supported services <handle, service>
networker 13:327622e38551 31 map<unsigned, serv_rec*>::iterator index;
networker 13:327622e38551 32 //server properties
networker 13:327622e38551 33 // static map<unsigned, serv_rec*> server;
networker 13:327622e38551 34 // static int serverSock;
networker 13:327622e38551 35 public:
networker 13:327622e38551 36 SDPHandler();
networker 13:327622e38551 37 void Clear();
networker 13:327622e38551 38 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr);
networker 13:327622e38551 39 // virtual int Accept(SocketInternal *sock, int scid, int rxid); //called indirectly from BTDevice::Control
networker 13:327622e38551 40 virtual int Send(SocketInternal* sock, const u8* data, int len);
networker 13:327622e38551 41 virtual int Close(SocketInternal* sock);
networker 13:327622e38551 42 virtual char* Name() {
networker 13:327622e38551 43 return "SDPHandler SocketHandler";
networker 13:327622e38551 44 }
networker 13:327622e38551 45 void OnSdpRsp(const u8* data, int len);
networker 13:327622e38551 46 static void OnSdpRsp(int socket, SocketState state, const u8* data, int len, void* userData);
networker 13:327622e38551 47
networker 13:327622e38551 48 //this function is called when the SDP sockets receives data (see HCICallback in TestShell),
networker 13:327622e38551 49 //currently does not happen because not forwarded from OnSdpRsp, can be used to handle multiple connections
networker 13:327622e38551 50 static void OnSockCallback(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 13:327622e38551 51 //The SDP server is stateless hence can be static
networker 13:327622e38551 52 // static void SDPServer(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 13:327622e38551 53
networker 13:327622e38551 54 void (*ErrorResponse)(unsigned) ;
networker 13:327622e38551 55 void (*ServiceSearchResponse)() ;
networker 13:327622e38551 56 void (*ServiceAttributeResponse)(serv_rec*) ;
networker 13:327622e38551 57 void (*ServiceSearchAttributeResponse)() ;
networker 13:327622e38551 58 int ServiceSearchRequest(sdp_data *sp, unsigned count, unsigned cs=0);
networker 13:327622e38551 59 int ServiceAttributeRequest(unsigned handle, unsigned count, sdp_data* al, unsigned cs=0) ;
networker 13:327622e38551 60 int ServiceSearchAttributeRequest(sdp_data *sp, unsigned count, sdp_data* al, unsigned cs=0);
networker 13:327622e38551 61 //server
networker 13:327622e38551 62 // static int ServiceSearchAttributeReply(unsigned rxid, sdp_data* al, unsigned count, unsigned cs=0);
networker 13:327622e38551 63 private:
networker 13:327622e38551 64 // static unsigned length(const unsigned char *el, unsigned &p);
networker 13:327622e38551 65 // static unsigned getval(const unsigned char *p, int n) ;
networker 13:327622e38551 66 // static unsigned parseUUID(const u8* data, int len, unsigned &p);
networker 13:327622e38551 67 unsigned parse (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 13:327622e38551 68 unsigned parseLight (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 13:327622e38551 69 int parseRsp(const unsigned char*rsp, int len) ;
networker 13:327622e38551 70 void append(const unsigned char*rsp, int len) ;
networker 13:327622e38551 71 void freeBuf();
networker 13:327622e38551 72 };
networker 13:327622e38551 73 /*
networker 13:327622e38551 74 class SDPClient: public SDPHandler {
networker 13:327622e38551 75 };
networker 13:327622e38551 76
networker 13:327622e38551 77 class SDPServer: public SDPHandler {
networker 13:327622e38551 78 };
networker 13:327622e38551 79 */
networker 13:327622e38551 80 class SDPManager: public SocketHandler {
networker 13:327622e38551 81 map<int, SDPHandler*> handlers;
networker 13:327622e38551 82 //server properties
networker 13:327622e38551 83 // SDPHandler *Server;
networker 13:327622e38551 84 static map<unsigned, serv_rec*> server;
networker 13:327622e38551 85 static int serverSock;
networker 13:327622e38551 86 bool once;
networker 13:327622e38551 87 public:
networker 13:327622e38551 88 SDPManager() {
networker 13:327622e38551 89 once = true;
networker 13:327622e38551 90 }
networker 13:327622e38551 91 virtual int Open(SocketInternal* sock, SocketAddrHdr* addr) {
networker 13:327622e38551 92 printf("SDPManager::Open(sock (ID=%d, type=%d), addr): should not be called\n", sock->ID, sock->Type);
networker 13:327622e38551 93 return sock->ID;//((SDPHandler*)sock->userData)->Open(sock, addr);
networker 13:327622e38551 94 }
networker 13:327622e38551 95 int Open(SocketAddrHdr* addr) {
networker 13:327622e38551 96 L2CAPAddr* ad = (L2CAPAddr*)addr;
networker 13:327622e38551 97 ad->psm = L2CAP_PSM_SDP;//open the l2cap channel
networker 13:327622e38551 98 SDPHandler *h = new SDPHandler;
networker 13:327622e38551 99 int s = Socket_Open(SOCKET_L2CAP, addr, &SDPHandler::OnSdpRsp, h);
networker 13:327622e38551 100 handlers[s] = h;
networker 13:327622e38551 101 return s;
networker 13:327622e38551 102 }
networker 13:327622e38551 103 virtual int Accept(SocketInternal *sock, int scid, int rxid) { //called indirectly from BTDevice::Control
networker 13:327622e38551 104 if (once) {
networker 13:327622e38551 105 once = false;
networker 13:327622e38551 106 buildServer();//build the DB on the first connection
networker 13:327622e38551 107 }
networker 13:327622e38551 108 //sock is registered as an SDP sock but we use it as an L2CAP sock
networker 13:327622e38551 109 //type=SDP
networker 13:327622e38551 110 //userData = BTDevice
networker 13:327622e38551 111 //Internal = L2CAPSocket
networker 13:327622e38551 112 BTDevice *l2cap = (BTDevice*)sock->userData;
networker 13:327622e38551 113 //sock->dcid = scid
networker 13:327622e38551 114 //sock->scid = something based on sock->ID
networker 13:327622e38551 115 serverSock = sock->ID;
networker 13:327622e38551 116 printf("Invoking accept on %p (%s) for sock %d and scid=%d\n", l2cap, l2cap->Name(), sock->ID, scid);
networker 13:327622e38551 117 return l2cap->Accept(sock, scid, rxid);
networker 13:327622e38551 118 }
networker 13:327622e38551 119 virtual int Send(SocketInternal* sock, const u8* data, int len) {//called by the server
networker 13:327622e38551 120 BTDevice *l2cap = (BTDevice*)sock->userData;
networker 13:327622e38551 121 return l2cap->Send(sock, data, len);
networker 13:327622e38551 122 }
networker 13:327622e38551 123 virtual int Close(SocketInternal* sock) {
networker 13:327622e38551 124 printf("SDPManager::Close() closing socket %d\n", sock->ID);
networker 13:327622e38551 125 SDPHandler *h = handlers[sock->ID];
networker 13:327622e38551 126 int retval = h->Close(sock);
networker 13:327622e38551 127 delete h;
networker 13:327622e38551 128 handlers[sock->ID] = 0;
networker 13:327622e38551 129 return retval;
networker 13:327622e38551 130 }
networker 13:327622e38551 131 void Destroy(int s) {
networker 13:327622e38551 132 printf("Deleting handler for socket %d\n", s);
networker 13:327622e38551 133 delete handlers[s];
networker 13:327622e38551 134 handlers[s] = 0;
networker 13:327622e38551 135 }
networker 13:327622e38551 136 virtual char* Name() {
networker 13:327622e38551 137 return "SDPManager SocketHandler";
networker 13:327622e38551 138 }
networker 13:327622e38551 139 //void OnSdpRsp(const u8* data, int len);
networker 13:327622e38551 140 static void OnSdpRsp(int socket, SocketState state, const u8* data, int len, void* userData) {
networker 13:327622e38551 141 printf("SDPManager::OnSdpRsp(socket %d, state %d, len %d)\n", socket, state, len);
networker 13:327622e38551 142 }
networker 13:327622e38551 143 //The SDP server is (almost) stateless hence can be static
networker 13:327622e38551 144 static void SDPServer(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 13:327622e38551 145 static void match(bool elig[], unsigned uuid);
networker 13:327622e38551 146 static bool isInList(unsigned short id, const unsigned char* list, int end);
networker 13:327622e38551 147 static void addToReply(sdp_data *svc, serv_rec *list, const unsigned char* att, int end);
networker 13:327622e38551 148 static int findUUID(unsigned h, unsigned uuid);
networker 13:327622e38551 149 void buildServer();
networker 13:327622e38551 150 static int ServiceSearchReply(unsigned rxid, unsigned *handles, unsigned count, unsigned cs=0);
networker 13:327622e38551 151 static int ServiceAttributeReply(unsigned rxid, sdp_data* al, unsigned count, unsigned cs=0);
networker 13:327622e38551 152 static int ServiceSearchAttributeReply(unsigned rxid, sdp_data* al, unsigned count, unsigned cs=0);
networker 13:327622e38551 153 /*
networker 13:327622e38551 154 //this function is called when the SDP sockets receives data (see HCICallback in TestShell),
networker 13:327622e38551 155 //currently does not happen because not forwarded from OnSdpRsp, can be used to handle multiple connections
networker 13:327622e38551 156 static void OnSockCallback(int socket, SocketState state, const u8* data, int len, void* userData) ;
networker 13:327622e38551 157
networker 13:327622e38551 158 static void errorhandler(unsigned err);
networker 13:327622e38551 159
networker 13:327622e38551 160 void (*ErrorResponse)(unsigned) ;
networker 13:327622e38551 161 void (*ServiceSearchResponse)() ;
networker 13:327622e38551 162 void (*ServiceAttributeResponse)(serv_rec*) ;
networker 13:327622e38551 163 void (*ServiceSearchAttributeResponse)() ;
networker 13:327622e38551 164 int ServiceSearchRequest(sdp_data *sp, unsigned count, unsigned cs=0);
networker 13:327622e38551 165 int ServiceAttributeRequest(unsigned handle, unsigned count, sdp_data* al, unsigned cs=0) ;
networker 13:327622e38551 166 int ServiceSearchAttributeRequest(sdp_data *sp, unsigned count, sdp_data* al, unsigned cs=0);
networker 13:327622e38551 167 //server
networker 13:327622e38551 168 private:
networker 13:327622e38551 169 static unsigned length(const unsigned char *el, unsigned &p);
networker 13:327622e38551 170 static unsigned getval(const unsigned char *p, int n) ;
networker 13:327622e38551 171 static unsigned parseUUID(const u8* data, int len, unsigned &p);
networker 13:327622e38551 172 static void addAttrib(unsigned h, unsigned short id, sdp_data *attrib);
networker 13:327622e38551 173 static void addIndex(unsigned h, unsigned uuid);
networker 13:327622e38551 174 static int findUUID(unsigned h, unsigned uuid);
networker 13:327622e38551 175 static void match(bool elig[], unsigned uuid);
networker 13:327622e38551 176 static bool isInList(unsigned short id, const unsigned char* list, int end);
networker 13:327622e38551 177 void buildServer();
networker 13:327622e38551 178 unsigned parse (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 13:327622e38551 179 unsigned parseLight (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ;
networker 13:327622e38551 180 int parseRsp(const unsigned char*rsp, int len) ;
networker 13:327622e38551 181 void append(const unsigned char*rsp, int len) ;
networker 13:327622e38551 182 void freeBuf();
networker 13:327622e38551 183 */
networker 13:327622e38551 184 };
networker 13:327622e38551 185
networker 13:327622e38551 186 #endif