UniSaSA  1.0
C Gateway
ipClientConnector.c
1 #include "ipClientConnector.h"
2 #include <stdlib.h>
3 //socket:
4 //#include <sys/types.h>
5 #include <sys/socket.h>
6 //#include <errno.h>
7 #include <netinet/in.h>
8 #include <netdb.h>
9 #include <string.h>
10 #include <unistd.h>
11 
12 #define CREATE_TCP 0
13 #define CREATE_UDP 1
14 
15 //global variables
16 int _socket = -1;
17 unsigned char _ip[UNISASA_SIZE_IPV4];
18 
19 union {
20  unsigned int integer;
21  unsigned char byte[256];
22 } converter;
23 
24 void copyArray(unsigned char* src,unsigned char *dest,unsigned int len)
25 {
26  int i=0;
27  for(i=0;i<len;i++)
28  dest[i]=src[i];
29 }
30 
31 unsigned int discoverySockTCPImpl (discoveredDevice_t *devs)
32 {
33 
34  unsigned char message[256];
35 
36  message[0]= DISCOVERY;
37  send(_socket,message,1,0);
38 
39  /*
40  * 1 byte sizeAddr 1 byte
41  * sizeAddr | addr | sizeIOMsg | ...
42  * (A) (B) (C)
43  *
44  * 1 byte sizeIDSen sizeIDSen 2 byte 1 byte 1 byte
45  * | sizeIDSen | num Sens | ID Sen | type Sen | size Out | type Out|
46  * (D) (E) (F) (G) (H) (I)
47  *
48  * 1 byte sizeIDAct sizeIDAct 2 byte 1 byte 1 byte
49  * | sizeIDAct | num Acts | ID Act | type Act | size In | type In |
50  * (J) (K) (L) (M) (N) (O)
51  */
52 
53 
54  recv(_socket,message,1,0); // (A) must be UNISASA_SIZE_IPV4, ipvUNISASA_SIZE_IPV4
55  unsigned int sizeAddress = message[0];
56 
57  recv(_socket,message,sizeAddress,0); // (B)
58  //copyArray(message,dev[0].address.byte,sizeAddress);
59  //Use filedescriptor no IP
60  devs[0].address.integer=_socket;
61 
62  recv(_socket,message,1,0); // (C)
63  devs[0].sizeIODevice=message[0];
64 
65  recv(_socket,message,1,0); // (D)
66  devs[0].sizeIDSensor=message[0];
67 
68  recv(_socket,message,devs[0].sizeIDSensor,0); // (E)
69  converter.integer=0;
70  copyArray(message,converter.byte,devs[0].sizeIDSensor);
71  devs[0].numSensors=converter.integer;
72 
73  unsigned int s=0;
74  for(s=0;s<devs[0].numSensors;s++)
75  {
76  recv(_socket,message,devs[0].sizeIDSensor,0); // (F)
77  converter.integer=0;
78  copyArray(message,converter.byte,devs[0].sizeIDSensor);
79  devs[0].sensors[s].ID.integer=converter.integer;
80 
81  recv(_socket,message,SIZE_TYPE_SENSOR,0); // (G)
82  converter.integer=0;
83  copyArray(message,converter.byte,SIZE_TYPE_SENSOR);
84  devs[0].sensors[s].typeSensor.integer=converter.integer;
85 
86  recv(_socket,message,1,0); // (H)
87  devs[0].sensors[s].sizeOutput=message[0];
88 
89  recv(_socket,message,1,0); //(I)
90  devs[0].sensors[s].typeOutput=message[0];
91  }
92 
93  recv(_socket,message,1,0); // (J)
94  devs[0].sizeIDActuator=message[0];
95 
96  recv(_socket,message,devs[0].sizeIDActuator,0); // (K)
97  converter.integer=0;
98  copyArray(message,converter.byte,devs[0].sizeIDActuator);
99  devs[0].numActuators=converter.integer;
100 
101  unsigned int a=0;
102  for(a=0;a<devs[0].numActuators;a++)
103  {
104  recv(_socket,message,devs[0].sizeIDSensor,0); // (L)
105  converter.integer=0;
106  copyArray(message,converter.byte,devs[0].sizeIDSensor);
107  devs[0].sensors[a].ID.integer=converter.integer;
108 
109  recv(_socket,message,SIZE_TYPE_SENSOR,0); // (M)
110  converter.integer=0;
111  copyArray(message,converter.byte,SIZE_TYPE_SENSOR);
112  devs[0].sensors[a].typeSensor.integer=converter.integer;
113 
114  recv(_socket,message,1,0); // (N)
115  devs[0].sensors[a].sizeOutput=message[0];
116 
117  recv(_socket,message,1,0); //(O)
118  devs[0].sensors[a].typeOutput=message[0];
119  }
120 
121  return 1;
122 
123 }
124 
125 int checkDeviceSockTCPImpl ( unsigned char* addr)
126 {
127  unsigned int ad = (addr[0] << 8) + addr[1];
128  int check=0;
129  if(ad == 35 || ad == 5 || ad == 500)
130  check=1;
131  return check;
132 }
133 
134 void msgToDeviceSockTCPImpl (unsigned char* addr, unsigned char sizeData, unsigned char* data)
135 {
136  unsigned char msg[256];
137 
138  converter.integer=0;
139  copyArray(addr,converter.byte,UNISASA_SIZE_IPV4);
140  unsigned int sockInt = converter.integer;
141  msg[0] = MSG_TO_DEVICE;
142  send(sockInt,msg,SIZE_OPERATION,0);
143  send(sockInt,data,sizeData,0);
144 }
145 
146 void msgAndAnswerToDeviceSockTCPImpl (unsigned char* addr, unsigned char sizeReqAns, unsigned char* request, unsigned char* answer)
147 {
148  unsigned char msg[256];
149 
150  converter.integer=0;
151  copyArray(addr,converter.byte,UNISASA_SIZE_IPV4);
152  unsigned int sockInt = converter.integer;
153  msg[0] = MSG_AND_ANSWER_TO_DEVICE;
154  send(sockInt,msg,SIZE_OPERATION,0);
155  send(sockInt,request,sizeReqAns,0);
156 
157  recv(sockInt,answer,sizeReqAns,0);
158 }
159 
160 void getSensorValueSockTCPImpl (unsigned char* addr, unsigned char sizeIDSen, unsigned char* IDSen, unsigned char sizeValue, unsigned char* value)
161 {
162  unsigned char msg[256];
163 
164  converter.integer=0;
165  copyArray(addr,converter.byte,UNISASA_SIZE_IPV4);
166  unsigned int sockInt = converter.integer;
167  msg[0] = GET_SENSOR_VALUE;
168  send(sockInt,msg,SIZE_OPERATION,0);
169  send(sockInt,IDSen,sizeIDSen,0);
170 
171  recv(sockInt,value,sizeValue,0);
172 }
173 
174 void setActuatorValueSockTCPImpl (unsigned char* addr, unsigned char sizeIDAct,unsigned char* IDAct, unsigned char sizeValue ,unsigned char* value)
175 {
176  unsigned char msg[256];
177 
178  converter.integer=0;
179  copyArray(addr,converter.byte,UNISASA_SIZE_IPV4);
180  unsigned int sockInt = converter.integer;
181  msg[0] = GET_SENSOR_VALUE;
182  send(sockInt,msg,SIZE_OPERATION,0);
183  send(sockInt,IDAct,sizeIDAct,0);
184  send(sockInt,value,sizeValue,0);
185 }
186 
187 
188 connectorInterface_t createSocketClientConnector(const char *IP, unsigned int port, int typeSocket)
189 {
190 
191  struct sockaddr_in temp;
192  struct hostent *h;
193 
194  //Address Type
195  temp.sin_family=AF_INET;
196  temp.sin_port=htons(port);
197  h=gethostbyname(IP);
198  if (h==0)
199  {
200  //printf("Gethostbyname failed\n");
201  exit(1);
202  }
203  bcopy(h->h_addr,&temp.sin_addr,h->h_length);
204 
205  if(typeSocket == CREATE_TCP)
206  _socket=socket(AF_INET,SOCK_STREAM,0);
207  else // CREATE_UDP
208  _socket=socket(AF_INET,SOCK_DGRAM,0);
209 
210 
211  connect(_socket, (struct sockaddr*) &temp, sizeof(temp));
212 
213 
215 
216  conn.name = "SocketTCPConnector";
217  conn.sizeAddress = sizeof(int);
218  conn.discovery = discoverySockTCPImpl;
219  conn.checkDevice = checkDeviceSockTCPImpl;
220  conn.msgToDevice = msgToDeviceSockTCPImpl;
221  conn.msgAndAnswerToDevice = msgAndAnswerToDeviceSockTCPImpl;
222  conn.getSensorValue = getSensorValueSockTCPImpl;
223  conn.setActuatorValue = setActuatorValueSockTCPImpl;
224 
225  return conn;
226 }
227 
228 connectorInterface_t createSocketClientTCPConnector(const char *IP, unsigned int port)
229 {
230  return createSocketClientConnector(IP,port,CREATE_TCP);
231 }
232 
233 connectorInterface_t createSocketClientUDPConnector(const char *IP, unsigned int port)
234 {
235  return createSocketClientConnector(IP,port,CREATE_UDP);
236 }
237