Init repo

This commit is contained in:
Votre Nom 2017-08-30 10:48:11 +04:00
commit f37f200792
31 changed files with 1341 additions and 0 deletions

18
GEOLOC/app/Makefile Normal file
View file

@ -0,0 +1,18 @@
all: app.o
app.o:
ifeq ($(TARGET),ANCHOR)
$(MAKE) -C ./anchor
cp anchor/app.o ./
else
$(CC) -c ./mobile/app.c -o ./app.o
endif
$(CC) -c frame.c -o frame.o
ld -r app.o frame.o -o app_tmp.o
mv app_tmp.o $@
.PHONY: clean
clean:
-rm ./app.o ./frame.o

View file

@ -0,0 +1,22 @@
all: app.o
app.o: socket.o app_tmp.o records.o
ld -r $^ -o $@
-rm app_tmp.o
socket.o:
$(MAKE) -C ./socket
cp socket/socket.o ./
records.o:records.c
$(CC) -c $^ -o $@
app_tmp.o:app.c
$(CC) -c $^ -o $@
.PHONY: clean
clean:
$(MAKE) clean -C ./socket
-rm ./*.o

83
GEOLOC/app/anchor/app.c Normal file
View file

@ -0,0 +1,83 @@
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include "app.h"
#include "../frame.h"
#include <pthread.h>
#include "../../lib/gps.h"
#include "socket/com.h"
#include "records.h"
//extern struct NMEA_GGA NmeaGgaFrame;
pthread_mutex_t mutex_NmeaGgaFrame; // Mutex for thread that use MASTER_IP
void runApp(Config config){
// Hello msg
printf("\n|Starting gateway application|\n\n");
// Start GW communication
startGWCom();
// Ensure we are in standby mode and apply configuration
config.mode=MODE_STDBY;
applyMode(config);
applyConfig(config);
config.mode=MODE_RX;
applyMode(config);
pthread_t frameHandlerThread;
printf("Wait for packet...\n");
while(1){
if(digitalRead(0x7)==1){
// Build parameters
Frame frame=pullFrame();
int rssi=fetchRSSI();
void *param;
param=malloc(sizeof(Frame)+sizeof(int));
*((Frame *)param)=frame;
*((int *)(param+sizeof(Frame)))=rssi;
// Run thread
pthread_create(&frameHandlerThread, NULL, handleMessage, param);
config.mode=MODE_STDBY;
applyMode(config);
config.mode=MODE_RX;
applyMode(config);
}
}
pthread_join(frameHandlerThread,NULL);
}
void *handleMessage(void *args){
// Fetch parameters
Frame frame=*((Frame *)args);
int rssi=*((int *)(args+sizeof(Frame)));
// Print informations
printf("Packet receive !!!\n\n");
printf("Frame info :\nId : %d\nStamp : %d\nData 1-6 : %d %d %d %d %d %d\nRSSI : %d\n\n",
frame.id, frame.stamp,
frame.data[0],frame.data[1],frame.data[2],frame.data[3],frame.data[4],frame.data[5],
rssi);
GWFrame masterFrame;
masterFrame.slaveID=ANCHOR_ID;
pthread_mutex_lock(& mutex_NmeaGgaFrame);
masterFrame.ggaFrame=getNMEA_GGAFrame();
pthread_mutex_unlock(& mutex_NmeaGgaFrame);
masterFrame.frame=frame;
masterFrame.rssi=rssi;
if(!IS_MASTER){
sendDataToMaster(masterFrame);
}
else{
saveFrame(masterFrame);
}
}

17
GEOLOC/app/anchor/app.h Normal file
View file

@ -0,0 +1,17 @@
#ifndef app_h
#define app_h
#include "../frame.h"
#include "../../lib/config.h"
/**
* Run the application
*/
void runApp(Config config);
/**
* Used to handle received frame from mobile
*/
void *handleMessage(void *args);
#endif

View file

@ -0,0 +1,51 @@
#include "records.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
void saveFrame(GWFrame frame){
// Create records dir if not exists
mkdir(RECORDS_DIR,0777);
// // Build string
char idStr[50];
sprintf(idStr,"/anchor_%d", frame.slaveID);
char filePath[200];
filePath[0]='\0';
strcat(filePath, RECORDS_DIR);
strcat(filePath, idStr);
// // Save in file
FILE *file;
short writeHeader=0;
pthread_mutex_lock (& mutex_file);
if(access( filePath, F_OK ) == -1){
writeHeader=1;
}
file=fopen(filePath,"a+");
if(file!=NULL){
if(writeHeader){
fprintf(file,"GWID,GPSSTATE,LatDeg,LatMin,LatSec,LatDir,LonDeg,LonMin,LonSec,LonDir,turtleID,rssi\n");
}
fprintf(file,"%d,%d,%d,%d,%f,%d,%d,%d,%f,%d,%d,%d\n",
frame.slaveID,
frame.ggaFrame.state,
frame.ggaFrame.latDeg,
frame.ggaFrame.latMin,
frame.ggaFrame.latSec,
frame.ggaFrame.latDir,
frame.ggaFrame.lonDeg,
frame.ggaFrame.lonMin,
frame.ggaFrame.lonSec,
frame.ggaFrame.lonDir,
frame.frame.id,
frame.rssi);
fclose(file);
}
else{
printf("Failed to open file %s.\n",filePath);
}
pthread_mutex_unlock (& mutex_file);
}

View file

@ -0,0 +1,17 @@
#ifndef records_h
#define records_h
#include <pthread.h>
#include "socket/gwframe.h"
#define RECORDS_DIR "./records"
// Mutex for thread writing in same file
pthread_mutex_t mutex_file;
/**
* Save GWFrame into file
*/
void saveFrame(GWFrame frame);
#endif

View file

@ -0,0 +1,15 @@
all:socket.o
socket.o: clientTCP.c serverTCP.c clientBC.c serverBC.c com.c
$(CC) -c clientTCP.c
$(CC) -c serverTCP.c
$(CC) -c clientBC.c
$(CC) -c serverBC.c
$(CC) -c com.c
ld -r ./*.o -o $@
.PHONY: clean
clean:
-rm ./*.o

View file

@ -0,0 +1,45 @@
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include <unistd.h>
#include<arpa/inet.h> //inet_addr
#include "com.h"
void rcvIPFromMaster()
{
int socketID;
struct sockaddr_in SockAddr;
int allowBC=1;
socketID=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
setsockopt(socketID,SOL_SOCKET,SO_BROADCAST,(void*) &allowBC,sizeof(allowBC));
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(DATA_PORT);
SockAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
int binded=bind(socketID,(struct sockaddr *) &SockAddr,sizeof(SockAddr));
if(binded<0){
puts("Failed to bind socket for receiving IP from master.");
close(socketID);
}
else{
listen(socketID,3);
socklen_t src_addr_len=sizeof(SockAddr);
char buffer[MASTER_IP_SIZE];
memset(buffer, 0x0,MASTER_IP_SIZE);
recvfrom(socketID,buffer,sizeof(buffer),0,(struct sockaddr*)&SockAddr,&src_addr_len);
close(socketID);
puts(buffer);
pthread_mutex_lock(&mutex_master_ip);
memset(MASTER_IP, 0x0,MASTER_IP_SIZE);
memcpy(MASTER_IP, buffer,MASTER_IP_SIZE);
pthread_mutex_unlock(&mutex_master_ip);
}
}

View file

@ -0,0 +1,46 @@
#include<stdio.h>
#include<string.h> //strlen
#include <stdlib.h>
#include<sys/socket.h>
#include <unistd.h>
#include<arpa/inet.h> //inet_addr
#include "com.h"
void sendDataToMaster(GWFrame frame){
int socket_desc;
struct sockaddr_in server;
socket_desc=socket(AF_INET, SOCK_STREAM,0);
char message[1000]="GET / HTTP/1.1\r\n\r\n";
char serverReply[2000];
if(socket_desc==-1){
puts("Failed to create socket.");
}
else{
// Configure server
pthread_mutex_lock(&mutex_master_ip);
server.sin_addr.s_addr = inet_addr(MASTER_IP);
pthread_mutex_unlock(&mutex_master_ip);
server.sin_family = AF_INET;
server.sin_port = htons(DATA_PORT);
if(connect(socket_desc,(struct sockaddr *)&server, sizeof(server))<0){
puts("Failed to connect to server");
}
else{
puts("Socket connected");
if(send(socket_desc, &frame, sizeof(GWFrame),0)<0){
puts("Failed to send message.");
}
puts("Data send !");
if(recv(socket_desc, serverReply,2000,0)<0){
puts("Timeout");
}
puts(serverReply);
}
close(socket_desc);
}
}

View file

@ -0,0 +1,44 @@
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include "com.h"
#include "../records.h"
static void *rcvIPFromMasterThread(void *args){
while(1){
rcvIPFromMaster();
puts("Master IP receive !");
//delay(IP_SEND_INTERVAL/2); // Add delay to free cpu resources
}
}
static void *sendIPToSlaveThread(void *args){
while(1){
puts("Send Master IP to slave...");
sendIPToSlave();
delay(IP_SEND_INTERVAL); // Wait five minutes
}
}
static void *rcvDataFromSlaveThread(void *args){
while(1){
GWFrame frame;
frame=rcvDataFromSlave();
puts("Frame receive from a slave !");
saveFrame(frame);
}
}
void startGWCom(){
#if IS_MASTER != 0
pthread_t sendIPThread, rcvDataThread;
pthread_create(&sendIPThread, NULL, sendIPToSlaveThread, NULL);
pthread_create(&rcvDataThread, NULL, rcvDataFromSlaveThread, NULL);
#else
pthread_t rcvIPThread;
pthread_create(&rcvIPThread, NULL, rcvIPFromMasterThread, NULL);
#endif
}

View file

@ -0,0 +1,40 @@
#ifndef com_h
#define com_h
#include "gwframe.h"
#define IP_SEND_INTERVAL 300000
#define DATA_PORT 8888
#define IFACE "wlan0"
#define MASTER_IP_SIZE 100 // Buffer size for IP address char
char MASTER_IP[MASTER_IP_SIZE]; // Master IP (global variable)
pthread_mutex_t mutex_master_ip; // Mutex for thread that use MASTER_IP
/**
* Init GW communication
*/
void startGWCom();
/**
* Send GW frame to master GW
*/
void sendDataToMaster(GWFrame frame);
/**
* Start master GW slave frame receiver server
*/
GWFrame rcvDataFromSlave();
/**
* Start slave ip reveiver server
*/
void rcvIPFromMaster();
/**
* Send master ip to slaves (broadcast UDP)
*/
void sendIPToSlave();
#endif

View file

@ -0,0 +1,16 @@
#ifndef gwframe_h
#define gwframe_h
#include "../../frame.h"
#include "../../../lib/gps.h"
typedef struct GWFrame GWFrame;
struct GWFrame {
short slaveID;
struct NMEA_GGA ggaFrame;
int rssi;
Frame frame;
};
#endif

View file

@ -0,0 +1,51 @@
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include <net/if.h>
#include "com.h"
#include <unistd.h>
#include <sys/ioctl.h>
#include<arpa/inet.h> //inet_addr
static char *getIp(){
int fd;
struct ifreq ifr;
char iface[] = IFACE;
fd = socket(AF_INET, SOCK_DGRAM, 0);
//Type of address to retrieve - IPv4 IP address
ifr.ifr_addr.sa_family = AF_INET;
//Copy the interface name in the ifreq structure
strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
return(inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr));
}
void sendIPToSlave()
{
int socketID;
struct sockaddr_in SockAddr;
int allowBC=1;
socketID=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
setsockopt(socketID,SOL_SOCKET,SO_BROADCAST,(void*) &allowBC,sizeof(allowBC));
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(DATA_PORT);
SockAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
char *addr;
addr=getIp();
sendto(socketID,addr,strlen(addr),0,(struct sockaddr*)&SockAddr, sizeof(SockAddr));
}

View file

@ -0,0 +1,61 @@
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include <unistd.h>
#include<arpa/inet.h> //inet_addr
#include "com.h"
#include "./gwframe.h"
#include "../records.h"
int serverTCP_socket_desc=-1;
GWFrame rcvDataFromSlave(){
if(serverTCP_socket_desc==-1){
// Create socket
serverTCP_socket_desc=socket(AF_INET, SOCK_STREAM,0);
if(serverTCP_socket_desc==-1){
puts("Failed to create socket");
exit(1);
}
struct sockaddr_in listen_addr;
listen_addr.sin_family = AF_INET;
listen_addr.sin_addr.s_addr = INADDR_ANY;
listen_addr.sin_port = htons(DATA_PORT);
int binded=bind(serverTCP_socket_desc,(struct sockaddr *) &listen_addr,sizeof(listen_addr));
if(binded<0){
puts("Failed to bind, trying until it work...");
while(binded<0){
binded=bind(serverTCP_socket_desc,(struct sockaddr *) &listen_addr,sizeof(listen_addr));
sleep(1);
}
puts("Bind succeed !");
}
listen(serverTCP_socket_desc,3);
}
int client,len;
struct sockaddr_in client_addr;
client=accept(serverTCP_socket_desc, (struct sockaddr *)&client_addr, (socklen_t*)&len);
if(client<0){
close(serverTCP_socket_desc);
serverTCP_socket_desc=-1;
puts("Acceptation failed");
}
else{
GWFrame frame;
recv(client, &frame, sizeof(GWFrame),0);
char msg[100]="Données bien reçus par la gateway maitre.";
write(client, msg,strlen(msg));
close(client);
return(frame);
}
}

22
GEOLOC/app/frame.c Normal file
View file

@ -0,0 +1,22 @@
#include "frame.h"
void pushFrame(Frame frame){
writeReg(REG_FIFO, frame.id);
writeReg(REG_FIFO, frame.stamp);
int i;
for(i=0;i<FRAME_DATA_SIZE;i++){
writeReg(REG_FIFO,frame.data[i]);
}
}
Frame pullFrame(){
Frame frame;
frame.id=readReg(REG_FIFO);
frame.stamp=readReg(REG_FIFO);
int i;
for(i=0;i<FRAME_DATA_SIZE;i++){
frame.data[i]=readReg(REG_FIFO);
}
return(frame);
}

21
GEOLOC/app/frame.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef frame_h
#define frame_h
#define FRAME_SIZE 10
#define FRAME_DATA_SIZE 8
#include "../lib/types.h"
#include "../lib/dragino.h"
#include "../lib/config.h"
typedef struct Frame Frame;
struct Frame {
byte id;
byte stamp;
byte data[FRAME_DATA_SIZE];
};
void pushFrame(Frame frame);
Frame pullFrame();
#endif

84
GEOLOC/app/mobile/app.c Normal file
View file

@ -0,0 +1,84 @@
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "app.h"
#include "../frame.h"
#include <string.h>
#include "../../lib/gps.h"
#include <unistd.h>
extern struct NMEA_GGA NmeaGgaFrame;
void runApp(Config config){
// Hello msg
printf("\n|Starting mobile application|\n\n");
// Ensure we are in standby mode and apply configuration
config.mode=MODE_STDBY;
applyMode(config);
applyConfig(config);
// Write frame on sx1276
Frame frame;
frame.id=234;
frame.stamp=81;
frame.data[0]=76;
frame.data[1]=17;
frame.data[2]=16;
frame.data[3]=87;
frame.data[4]=12;
frame.data[5]=106;
pushFrame(frame);
config.mode=MODE_TX;
applyMode(config); // Send frame
// Wait for frame to be sending
while(1){
if(digitalRead(0x7)==1){
printf("Packet send !!!\n\n");
config.mode=MODE_STDBY;
applyMode(config);
saveGPSPosition();
delay(2000);
// Write frame on sx1276
pushFrame(frame);
config.mode=MODE_TX;
applyMode(config); // Send frame
}
}
}
void saveGPSPosition(){
// Fetch GPS position
NmeaGgaFrame=getNMEA_GGAFrame();
// Save in file
FILE *file;
char filePath[]="gps.csv";
short writeHeader=0;
if(access( filePath, F_OK ) == -1){
writeHeader=1;
}
file=fopen(filePath,"a+");
if(file!=NULL){
if(writeHeader){
fprintf(file,"GPSSTATE,LatDeg,LatMin,LatSec,LatDir,LonDeg,LonMin,LonSec,LonDir\n");
}
fprintf(file,"%d,%d,%d,%f,%d,%d,%d,%f,%d\n",
NmeaGgaFrame.state,
NmeaGgaFrame.latDeg,
NmeaGgaFrame.latMin,
NmeaGgaFrame.latSec,
NmeaGgaFrame.latDir,
NmeaGgaFrame.lonDeg,
NmeaGgaFrame.lonMin,
NmeaGgaFrame.lonSec,
NmeaGgaFrame.lonDir);
fclose(file);
}
else{
printf("Failed to open file %s.\n",filePath);
}
}

16
GEOLOC/app/mobile/app.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef app_h
#define app_h
#include "../../lib/config.h"
/**
* Run the application
*/
void runApp(Config config);
/**
* Save the GPS position
*/
void saveGPSPosition();
#endif