该模块为7620a无线中继模块,支持自动扫描,自动拨号,支持中文ssid配置(需要编解码模块支持)
无线驱动需要增加wifi断开和连接信号发送,用于应用层处理事件。
该模块仅供参考,如有问题,可以联系我。
/*
* wisp.c
* 7620a无线中继模块,支持自动重拨,支持中文ssid
* Author:dxt1107
* Mail:destan19@126.com
* 2014.12.04
*/
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <bcmnvram.h>
#include <shutils.h>
#include <ralink.h>
#include <bcmutils.h>
#include <etioctl.h>
#include <bcmparams.h>
#include <linux/autoconf.h>
#include <signal.h>
#include "encode.h"
#define WISP_IFNAME "apcli0"
#define STAT_LINK_DOWN 0
#define STAT_LINK_UP 1
#define SIG_APCLI_LINKDOWN SIGUSR2 + 20 // 37
#define SIG_APCLI_LINKUP SIGUSR2 + 21 // 38
#define SIG_WISP_DEBUG SIGUSR2 + 22 // 39
#define SCAN_INTERVAL 3
#define CHECK_NETWORK_INTERVAL 180
#define DIAGNOSE_INTERVAL 16
static int wisp_debug = 0;
#define WDBG(fmt,args...) if (wisp_debug)\
printf("dxt1107\033[0;32;32m%s,%d "fmt"\033[m",__func__,__LINE__,##args);
struct wifi_node_t{
struct wifi_node_t * next;
char ssid[64];
char bssid[32];
char auth_mode[32];
char encrypt_type[32];
char w_mode[16];
int signal;
int channel;
};
typedef enum wifi_status
{
STATUS_INIT = 0,
STATUS_AUTH_OK,
STATUS_CONNECTED_OK,
STATUS_INTERNET_OK,
}E_WIFI_STATUS;
struct wifi_node_t * wifi_head = NULL;
struct wifi_node_t g_cur_connect_wifi;
static int g_wifi_node_count = 0;
E_WIFI_STATUS g_wifi_status = STATUS_INIT;
static void update_wifi_status(E_WIFI_STATUS status)
{
char buf[16] = {0};
if ( status < STATUS_INIT || status > STATUS_INTERNET_OK ) {
printf("error,invalid status,%d\n",status);
return;
}
g_wifi_status = status;
sprintf(buf, "%d", status);
nvram_set("wisp_status",buf);
}
void show_all_wifi_node(void)
{
if (!wisp_debug)
return;
printf("dxt1107###########begin show wifi list###############\n");
int i = 0;
struct wifi_node_t * p = wifi_head;
while ( p ) {
i++;
printf("%d ssid:%s,bssid:%s,channel:%d,mode:%s,signal:%d\n",
i, p->ssid,p->bssid,p->channel,p->auth_mode,p->signal);
p = p->next;
}
printf("dxt1107###########end show wifi list###############\n");
}
void show_one_wifi_node(struct wifi_node_t * p )
{
if ( !p )
return;
printf("dxt1107###ssid:%s,bssid:%s,channel:%d,mode:%s,signal:%d###\n",
p->ssid,p->bssid,p->channel,p->auth_mode,p->signal);
}
int add_wifi_node(struct wifi_node_t * item)
{
if ( NULL == item )
return 0;
item ->next = NULL;
if ( wifi_head == NULL ){
wifi_head = item;
}
else{
item->next = wifi_head->next;
wifi_head->next = item;
}
g_wifi_node_count ++;
return 1;
}
void del_wifi_node(struct wifi_node_t * item)
{
struct wifi_node_t * p = wifi_head;
struct wifi_node_t * prev = wifi_head;
if ( NULL == item )
return ;
if ( wifi_head == NULL ){
return ;
}
else{
while ( p ) {
if ( !strcmp ( p->bssid , item->bssid) &&
p->channel == item->channel) {
if ( NULL == prev->next )
wifi_head = NULL;
else {
prev->next = p->next;
}
g_wifi_node_count--;
WDBG("dxt1107bssid:%s,ssid:%s,channel:%d,cur_count:%d\n",\
p->bssid,p->ssid,p->channel,g_wifi_node_count);
free(p);
return;
}
prev = p;
p = p->next;
}
}
}
void clear_wifi_list(vo