322 lines
6.8 KiB
C
322 lines
6.8 KiB
C
#include <asf.h>
|
|
#include <ctype.h>
|
|
#include "WiFi.h"
|
|
#include "Serial.h"
|
|
#include "string_func.h"
|
|
#include "utility.h"
|
|
|
|
//#define SSID // insert your wifi SSID
|
|
//#define PASSWORD // insert here your wifi network password
|
|
|
|
#ifndef SSID
|
|
#error network not defined
|
|
#endif
|
|
|
|
#ifndef PASSWORD
|
|
#error password not defined
|
|
#endif
|
|
|
|
static int cipmux = 0;
|
|
|
|
static enum State
|
|
{
|
|
STATION = 1,AP = 2,AP_STATION = 3,
|
|
} wifi_state;
|
|
|
|
|
|
void WiFi_init(void)
|
|
{
|
|
Serial_init();
|
|
WiFi_restart();
|
|
|
|
/* initialize AP mode and start TCP server */
|
|
//WiFi_set_wifi_mode(2);
|
|
//WiFi_set_IP_address("192.168.5.1");
|
|
//WiFi_set_softAP_options("HI Pedini", "",5, 0);
|
|
//WiFi_enable_multiple_connections(1);
|
|
//WiFi_create_server(3301);
|
|
|
|
/* initialize station mode, connect to router and open UDP socket */
|
|
WiFi_set_wifi_mode(1);
|
|
WiFi_join_access_point(SSID, PASSWORD);
|
|
WiFi_enable_multiple_connections(0);
|
|
WiFi_register_UDP_port(0,"0",0,1000,2);
|
|
}
|
|
|
|
/***** basic AT commands *****/
|
|
|
|
void WiFi_restart(void)
|
|
{
|
|
Serial_write("AT+RST\r\n");
|
|
Serial_find("ready\r\n");
|
|
}
|
|
|
|
void WiFi_set_baud_rate(int baud,int data_bits,int stop_bits,int parity,int flow_ctl)
|
|
{
|
|
char buf[10];
|
|
Serial_write("AT+UART_CUR=");
|
|
Serial_write(inttoa(baud,buf));
|
|
Serial_transmit(',');
|
|
Serial_write(inttoa(data_bits,buf));
|
|
Serial_transmit(',');
|
|
Serial_write(inttoa(stop_bits,buf));
|
|
Serial_transmit(',');
|
|
Serial_write(inttoa(parity,buf));
|
|
Serial_transmit(',');
|
|
Serial_write(inttoa(flow_ctl,buf));
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
/***** WiFi related commands ******/
|
|
|
|
/* set WiFi mode:
|
|
* 1 -> station mode
|
|
* 2 -> softAP mode
|
|
* 3 -> softAP + station mode
|
|
*/
|
|
void WiFi_set_wifi_mode(int mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case 1: Serial_write("AT+CWMODE_CUR=1\r\n");
|
|
wifi_state = STATION;
|
|
break;
|
|
case 2: Serial_write("AT+CWMODE_CUR=2\r\n");
|
|
wifi_state = AP;
|
|
break;
|
|
case 3: Serial_write("AT+CWMODE_CUR=3\r\n");
|
|
wifi_state = AP_STATION;
|
|
break;
|
|
}
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_list_access_points(char *list)
|
|
{
|
|
//TODO with getline (gets/fgets) like function
|
|
}
|
|
|
|
/* join access point */
|
|
void WiFi_join_access_point(const char *ssid,const char *password)
|
|
{
|
|
if (wifi_state != STATION && wifi_state != AP_STATION)
|
|
return;
|
|
Serial_write("AT+CWJAP_CUR=\"");
|
|
Serial_write(ssid);
|
|
Serial_write("\",\"");
|
|
Serial_write(password);
|
|
Serial_write("\"\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
/* quit access point */
|
|
void WiFi_quit_access_point(void)
|
|
{
|
|
Serial_write("AT+CWQAP\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
/* set options as soft access point */
|
|
void WiFi_set_softAP_options(const char *ssid,const char *password,int channel_id,int encription)
|
|
{
|
|
if (wifi_state != AP && wifi_state != AP_STATION)
|
|
return;
|
|
char buf[10];
|
|
Serial_write("AT+CWSAP_CUR=\"");
|
|
Serial_write(ssid);
|
|
Serial_write("\",\"");
|
|
Serial_write(password);
|
|
Serial_write("\",");
|
|
Serial_write(inttoa(channel_id,buf));
|
|
Serial_transmit(',');
|
|
Serial_write(inttoa(encription,buf));
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_list_stations(char *list)
|
|
{
|
|
//TODO
|
|
}
|
|
|
|
/***** TCP/IP related commands *****/
|
|
|
|
/* set transfer mode
|
|
* 0 : normal mode
|
|
* 1 : transparent mode
|
|
*/
|
|
void WiFi_set_IP_mode(int mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case 0: Serial_write("AT+CIPMODE=0\r\n");
|
|
break;
|
|
case 1: Serial_write("AT+CIPMODE=1\r\n");
|
|
break;
|
|
}
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_set_IP_address(const char *ip)
|
|
{
|
|
Serial_write("AT+CIPAP_CUR=\"");
|
|
Serial_write(ip);
|
|
Serial_write("\"");
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
/* enable multiple connections (must be 1 before starting TCP server) */
|
|
void WiFi_enable_multiple_connections(int enable)
|
|
{
|
|
if (enable)
|
|
{
|
|
Serial_write("AT+CIPMUX=1\r\n");
|
|
cipmux = 1;
|
|
}
|
|
else
|
|
{
|
|
Serial_write("AT+CIPMUX=0\r\n");
|
|
cipmux = 0;
|
|
}
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_establish_TCP_connection(int connection_id,const char *ip,int port)
|
|
{
|
|
if (cipmux == 0)
|
|
{
|
|
Serial_write("AT+CIPSTART=\"");
|
|
Serial_write("TCP");
|
|
Serial_write("\",\"");
|
|
Serial_write(ip);
|
|
Serial_write("\",");
|
|
char buf[10];
|
|
Serial_write(inttoa(port,buf));
|
|
}
|
|
else
|
|
{
|
|
Serial_write("AT+CIPSTART=");
|
|
Serial_transmit(connection_id + '0');
|
|
Serial_write(",\"");
|
|
Serial_write("TCP");
|
|
Serial_write("\",\"");
|
|
Serial_write(ip);
|
|
Serial_write("\",");
|
|
char buf[10];
|
|
Serial_write(inttoa(port,buf));
|
|
}
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_register_UDP_port(int connection_id,const char *remote_ip,int remote_port,int local_port,int mode)
|
|
{
|
|
if (cipmux == 0)
|
|
{
|
|
Serial_write("AT+CIPSTART=\"");
|
|
Serial_write("UDP");
|
|
Serial_write("\",\"");
|
|
Serial_write(remote_ip);
|
|
Serial_write("\",");
|
|
char buf[10];
|
|
Serial_write(inttoa(remote_port,buf));
|
|
Serial_write(",");
|
|
Serial_write(inttoa(local_port,buf));
|
|
Serial_write(",");
|
|
Serial_write(inttoa(mode,buf));
|
|
}
|
|
else
|
|
{
|
|
Serial_write("AT+CIPSTART=");
|
|
Serial_transmit(connection_id + '0');
|
|
Serial_write(",\"UDP\",\"");
|
|
Serial_write(remote_ip);
|
|
Serial_write("\",");
|
|
char buf[10];
|
|
Serial_write(inttoa(remote_port,buf));
|
|
Serial_write(",");
|
|
Serial_write(inttoa(local_port,buf));
|
|
Serial_write(",");
|
|
Serial_write(inttoa(mode,buf));
|
|
}
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_close_connection(int connection_id)
|
|
{
|
|
Serial_write("AT+CIPCLOSE=");
|
|
Serial_transmit(connection_id + '0');
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
/* start TCP server on port "port" (CIPMUX must be 1) */
|
|
int WiFi_create_TCP_server(int port)
|
|
{
|
|
if (cipmux == 0)
|
|
return WIFI_FAIL;
|
|
Serial_write("AT+CIPSERVER=1,");
|
|
char port_string[10];
|
|
Serial_write(inttoa(port,port_string));
|
|
Serial_write("\r\n");
|
|
Serial_find("OK\r\n");
|
|
return WIFI_SUCCESS;
|
|
}
|
|
|
|
/* stop TCP server */
|
|
void WiFi_delete_server(void)
|
|
{
|
|
Serial_write("AT+CIPSERVER=0\r\n");
|
|
Serial_find("OK\r\n");
|
|
}
|
|
|
|
void WiFi_send_data(int connection_id,const char data[])
|
|
{
|
|
Serial_write("AT+CIPSEND=");
|
|
Serial_transmit(connection_id + '0');
|
|
Serial_transmit(',');
|
|
int length = strlength(data);
|
|
char buf[10];
|
|
Serial_write(inttoa(length,buf));
|
|
Serial_write("\r\n");
|
|
Serial_find(">");
|
|
Serial_write(data);
|
|
Serial_find("SEND OK\r\n");
|
|
}
|
|
|
|
int WiFi_receive_data(char data[],int limit)
|
|
{
|
|
if (cipmux == 0)
|
|
{
|
|
if (!Serial_find_timeout("+IPD,", 100))
|
|
return 0;
|
|
int bytes_received = 0;
|
|
char c;
|
|
while (isdigit(c = Serial_receive()))
|
|
bytes_received = c - '0' + bytes_received * 10;
|
|
int i = 0;
|
|
while (--limit > 0 && i < bytes_received)
|
|
data[i++] = Serial_receive();
|
|
data[i] = '\0';
|
|
}
|
|
else
|
|
{
|
|
if (!Serial_find_timeout("+IPD,", 100))
|
|
return 0;
|
|
int connection_id = Serial_receive() - '0';
|
|
(void)Serial_receive();
|
|
int bytes_received = 0;
|
|
char c;
|
|
while (isdigit(c = Serial_receive()))
|
|
bytes_received = c - '0' + bytes_received * 10;
|
|
int i = 0;
|
|
while (--limit > 0 && i < bytes_received)
|
|
data[i++] = Serial_receive();
|
|
data[i] = '\0';
|
|
}
|
|
return 1; // return if received AND connection?
|
|
}
|