⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daemon.c

📁 嵌入式无线网络实验中
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>#include <sys/socket.h>#include <time.h>#include <sys/param.h>#include <sys/types.h>#include <sys/time.h>#include "daemon.h"#include <drvpriv.h>#include "wireless_copy.h"unsigned char essid[32];unsigned char old_essid[32];extern int print_scanning_info(FILE *pFile, int skfd, char *ifname);static void init_daemon(void){	int pid;	int i;		if(pid=fork())	exit(0);	else if(pid<0)	exit(1);	setsid();	if(pid=fork())	exit(0);	else if(pid<0)	exit(1);	chdir("/tmp/yaffs");	umask(0);	return;}static int mystrcmp(char *s, char *t){	while(*s!='\0' && *t!='\0' && *s==*t)	{		++s;		++t;	}	if(*s=='\0' || *t=='\0')		return 0;	else		return -1;}static int daemon_drv_get_scan_results(FILE *pFile, struct wpa_scan_result *results, size_t max_size){	struct iwreq pstWrq;
	int  ret = 0;	int i,ioctl_sock,level,curr_i,first_come;	char cmd[255];        struct iwdrv_priv_oid iw_p;	ioctl_sock = socket(PF_INET,SOCK_DGRAM,0);	//更新level	//system("/tmp/yaffs/iwlist2 eth1 scan");	print_scanning_info(pFile, ioctl_sock, "eth1");		ioctl(ioctl_sock, SIOCSIWSCAN, &pstWrq);
		memset(cmd, 0, sizeof(cmd));
	memset(results, 0, max_size * sizeof(struct wpa_scan_result));
	
        iw_p.priv_id = HEOCGIWDPSCRES;
        iw_p.length = max_size * sizeof(struct wpa_scan_result);
        iw_p.pointer = (caddr_t)results;

	memset(&pstWrq, 0, sizeof(pstWrq));
	strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ);

        pstWrq.u.data.pointer = (caddr_t)&iw_p;
	pstWrq.u.data.length = max_size * sizeof(struct wpa_scan_result) + sizeof(struct iwdrv_priv_oid);	
	if (ioctl(ioctl_sock, HEOCDRIVPRIV, &pstWrq) < 0) {
		//perror("ioctl error HEOCDRIVPRIV!");
		ret = -1;
	}
	
	ret = iw_p.flags;	fprintf(pFile, "ret = %d\n", ret);	//根据scan结果确定连接对象	first_come = 0;	curr_i = -1;	for(i=0;i<ret;i++)	{		if(mystrcmp((char *)((struct wpa_scan_result *)(results + i)->ssid),"njdt-")!=0 && mystrcmp((char *)((struct wpa_scan_result *)(results + i)->ssid),"NJDT-")!=0)			continue;		//fprintf(pFile, "%d >> bssid = %s\n", i+1, (struct wpa_scan_result *)(results + i)->bssid);		fprintf(pFile, "%d >> ssid = %s\n", i+1, (struct wpa_scan_result *)(results + i)->ssid);		//fprintf(pFile, "%d >> wpa_ie = %s\n", i+1, (struct wpa_scan_result *)(results + i)->wpa_ie);		//fprintf(pFile, "%d >> rsn_ie = %s\n", i+1, (struct wpa_scan_result *)(results + i)->rsn_ie);		//fprintf(pFile, "%d >> freq = %d\n", i+1, (struct wpa_scan_result *)(results + i)->freq);		//fprintf(pFile, "%d >> caps = %d\n", i+1, (struct wpa_scan_result *)(results + i)->caps);		//fprintf(pFile, "%d >> qual = %d\n", i+1, (struct wpa_scan_result *)(results + i)->qual);		//fprintf(pFile, "%d >> noise = %d\n", i+1, (struct wpa_scan_result *)(results + i)->noise);		fprintf(pFile, "%d >> level = %d\n", i+1, (struct wpa_scan_result *)(results + i)->level);		if((int)((struct wpa_scan_result *)(results + i)->level) > level || first_come == 0)		{			first_come = 1;			level = (int)(struct wpa_scan_result *)(results + i)->level;			curr_i = i;		}	}	if(curr_i == -1)//未检测到njdt的sta		return ret;	memcpy(essid, (struct wpa_scan_result *)(results + curr_i)->ssid, 32);	fprintf(pFile, "%d >> selected ssid = %s\n", i+1, essid);	//get old essid	memset(&pstWrq, 0, sizeof(pstWrq));
	strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ);	pstWrq.u.essid.pointer = (caddr_t)old_essid;	pstWrq.u.essid.length = 32;	pstWrq.u.essid.flags = 0;	ioctl(ioctl_sock, SIOCGIWESSID, &pstWrq);	fprintf(pFile, "haha ** old_essid = %s\n", old_essid);	if(strcmp(essid, old_essid)!=0)	{		//struct timeval tv;		//struct timezone tz;		//strcpy(cmd, "iwconfig eth1 essid ");		//strcat(cmd, essid);		//gettimeofday(&tv, &tz);		//fprintf(pFile, "before ** tv_sec = %d\n", tv.tv_sec);		//fprintf(pFile, "before ** tv_usec = %d\n", tv.tv_usec);		//system(cmd);		//gettimeofday(&tv, &tz);		//连接sta		//set new essid		memset(&pstWrq, 0, sizeof(pstWrq));
		strncpy(pstWrq.ifr_name, "eth1", IFNAMSIZ);		pstWrq.u.essid.pointer = (caddr_t)essid;		pstWrq.u.essid.length = strlen(essid)+1;		pstWrq.u.essid.flags = 1;		ioctl(ioctl_sock, SIOCSIWESSID, &pstWrq);		//fprintf(pFile, "after ** tv_sec = %d\n", tv.tv_sec);		//fprintf(pFile, "after ** tv_usec = %d\n", tv.tv_usec);	}	close(ioctl_sock);
	return ret;
}static int daemon_get_scan_results()
{
#define SCAN_AP_LIMIT 16
	struct wpa_scan_result *results, *tmp;
	int num;        FILE *pFile;	pFile = fopen("/tmp/yaffs/log.txt","at");
	results = malloc(SCAN_AP_LIMIT * sizeof(struct wpa_scan_result));
	if (results == NULL) {
		fprintf(pFile, "Failed to allocate memory for scan results");
		return -1;
	}

	num = daemon_drv_get_scan_results(pFile, results, SCAN_AP_LIMIT);	fprintf(pFile, "Scan results num: %d\n", num);
	if (num < 0) {
		fprintf(pFile, "Failed to get scan results");
		free(results);
		return -1;
	}
	if (num > SCAN_AP_LIMIT) {
		fprintf(pFile, "Not enough room for all APs (%d < %d)", num, SCAN_AP_LIMIT);
		num = SCAN_AP_LIMIT;
	}

	fclose(pFile);

	return 0;
}static int eth1_detect(){	char buff[256];	FILE *fh;	fh = fopen("/proc/net/wireless","r");	if(fh != NULL)	{		fgets(buff, sizeof(buff), fh);		fgets(buff, sizeof(buff), fh);		while(fgets(buff, sizeof(buff), fh))		{			if(strstr(buff, "eth1") != 0)			{				fclose(fh);				return 1;			}		}		fclose(fh);	}	return 0;}main(){	init_daemon();	while(eth1_detect() == 0)	{		sleep(50);	}	system("iwconfig eth1 mode ad-hoc");	while(1)	{		//开始处理sta切换		daemon_get_scan_results();		sleep(10);		//usleep(1000000);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -