WiFi无需连接路由器就可以建立本地监听

This commit is contained in:
大石头X2 2017-02-10 12:11:45 +08:00
parent 48c958cced
commit b0634ae511
3 changed files with 77 additions and 47 deletions

View File

@ -27,7 +27,7 @@ struct NetConfig
/*char SSID[32];
char Pass[32];*/
char Data[4 * (32 - 7)];
char Data[4 * (32 - 7)]; // 扩展数据,给各接口保存自定义数据
};
NetworkInterface::NetworkInterface()
@ -113,6 +113,36 @@ void NetworkInterface::OnLoop()
}
}
Socket* NetworkInterface::CreateClient(const NetUri& uri)
{
if(!Active()) return nullptr;
auto socket = CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
}
return socket;
}
Socket* NetworkInterface::CreateRemote(const NetUri& uri)
{
if(!Active()) return nullptr;
auto socket = CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = IP;
socket->Remote.Address = uri.Address;
socket->Remote.Port = uri.Port;
socket->Server = uri.Host;
}
return socket;
}
void NetworkInterface::InitConfig()
{
IPAddress defip(192, 168, 1, 1);
@ -121,20 +151,21 @@ void NetworkInterface::InitConfig()
IP = defip;
byte first = Sys.ID[0];
if(first <= 1 || first >= 254) first = 2;
IP[3] = first;
IP[3] = first;
Mask = IPAddress(255, 255, 255, 0);
Gateway = defip;
Mask = IPAddress(255, 255, 255, 0);
Gateway = defip;
// 修改为双DNS方案避免单点故障。默认使用阿里和百度公共DNS。
DNSServer = IPAddress(223, 5, 5, 5);
DNSServer2 = IPAddress(180, 76, 76, 76);
auto& mac = Mac;
auto& mac = Mac;
// 随机Mac前2个字节取自ASCII最后4个字节取自后三个ID
//mac[0] = 'W'; mac[1] = 'S';
// 第一个字节最低位为1表示组播地址所以第一个字节必须是偶数
mac[0] = 'N'; mac[1] = 'X';
mac[0] = 'N';
mac[1] = 'X';
for(int i=0; i< 4; i++)
mac[2 + i] = Sys.ID[3 - i];
@ -150,31 +181,32 @@ void NetworkInterface::InitConfig()
bool NetworkInterface::LoadConfig()
{
if(!Config::Current) return false;
auto cfg = Config::Current;
if(!cfg) return false;
NetConfig nc;
Buffer bs(&nc, sizeof(nc));
if(!Config::Current->Get(Name, bs)) return false;
auto nc = (NetConfig*)cfg->Get(Name);
if(!nc) return false;
debug_printf("%s::Load %d 字节\r\n", Name, sizeof(nc));
debug_printf("%s::Load %d 字节\r\n", Name, sizeof(NetConfig));
IP = nc.IP;
Mask = nc.Mask;
Mac = nc.Mac;
Mode = (NetworkType)nc.Mode;
IP = nc->IP;
Mask = nc->Mask;
Mac = nc->Mac;
Mode = (NetworkType)nc->Mode;
DNSServer = nc.DNSServer;
DNSServer2 = nc.DNSServer2;
Gateway = nc.Gateway;
DNSServer = nc->DNSServer;
DNSServer2 = nc->DNSServer2;
Gateway = nc->Gateway;
OnLoadConfig(Buffer(nc.Data, sizeof(nc.Data)));
OnLoadConfig(Buffer(nc->Data, sizeof(nc->Data)));
return true;
}
bool NetworkInterface::SaveConfig() const
{
if(!Config::Current) return false;
auto cfg = Config::Current;
if(!cfg) return false;
NetConfig nc;
nc.IP = IP.Value;
@ -193,7 +225,7 @@ bool NetworkInterface::SaveConfig() const
debug_printf("%s::Save %d 字节\r\n", Name, sizeof(nc));
Buffer bs(&nc, sizeof(nc));
return Config::Current->Set(Name, bs);
return cfg->Set(Name, bs);
}
void NetworkInterface::ShowConfig() const
@ -267,6 +299,21 @@ bool WiFiInterface::IsAP() const
return Mode == NetworkType::AP || Mode == NetworkType::STA_AP;
}
Socket* WiFiInterface::CreateClient(const NetUri& uri)
{
// WiFi无需连接路由器就可以建立本地监听
if(!Opened) return nullptr;
auto socket = CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
}
return socket;
}
void WiFiInterface::OnInitConfig()
{
if(!SSID)

View File

@ -69,6 +69,8 @@ public:
void ShowConfig() const;
virtual Socket* CreateSocket(NetType type) = 0;
Socket* CreateClient(const NetUri& uri);
Socket* CreateRemote(const NetUri& uri);
// DNS解析。默认仅支持字符串IP地址解析
virtual IPAddress QueryDNS(const String& domain);
@ -116,6 +118,9 @@ public:
bool IsStation() const;
bool IsAP() const;
// WiFi无需连接路由器就可以建立本地监听
Socket* CreateClient(const NetUri& uri);
protected:
// 保存和加载网络配置
virtual void OnInitConfig();

View File

@ -16,18 +16,8 @@ Socket* Socket::CreateClient(const NetUri& uri)
auto& list = NetworkInterface::All;
for(int i=0; i < list.Count(); i++)
{
auto ni = list[i];
if(ni->Active())
{
auto socket = ni->CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = uri.Address;
socket->Local.Port = uri.Port;
return socket;
}
}
auto socket = list[i]->CreateClient(uri);
if(socket) return socket;
}
return nullptr;
@ -38,20 +28,8 @@ Socket* Socket::CreateRemote(const NetUri& uri)
auto& list = NetworkInterface::All;
for(int i=0; i < list.Count(); i++)
{
auto ni = list[i];
if(ni && ni->Active())
{
auto socket = ni->CreateSocket(uri.Type);
if(socket)
{
socket->Local.Address = ni->IP;
socket->Remote.Address = uri.Address;
socket->Remote.Port = uri.Port;
socket->Server = uri.Host;
return socket;
}
}
auto socket = list[i]->CreateRemote(uri);
if(socket) return socket;
}
return nullptr;