Revert "Merge branch 'master' of http://git.wslink.cn/Embed/SmartOS"

This reverts commit a53379c89a, reversing
changes made to 7e367ed9aa.

# Conflicts:
#	Board/Pandora.cpp
This commit is contained in:
大石头X2 2017-02-14 10:31:26 +08:00
parent be55364584
commit 135a736a9a
18 changed files with 357 additions and 557 deletions

View File

@ -19,6 +19,7 @@
#include "App\FlushPort.h"
AP0103* AP0103::Current = nullptr;
static TokenClient* Client = nullptr; // 令牌客户端
AP0103::AP0103()
{
@ -28,9 +29,7 @@ AP0103::AP0103()
ButtonPins.Add(PE9);
ButtonPins.Add(PA1);
Host = nullptr;
HostAP = nullptr;
Client = nullptr;
AlarmObj = nullptr;
Nrf = nullptr;
Server = nullptr;
@ -127,84 +126,68 @@ void AP0103::InitButtons(const Delegate2<InputPort&, bool>& press)
NetworkInterface* AP0103::Create5500()
{
debug_printf("\r\nW5500::Create \r\n");
auto tc = TinyConfig::Create();
W5500 * host = nullptr;
W5500 * net = nullptr;
if(tc->HardVer >=5)
host = new W5500(Spi1, PE7, PB2);
net = new W5500(Spi1, PE7, PB2);
else
host = new W5500(Spi1, PE8, PE7);
net = new W5500(Spi1, PE8, PE7);
if(!net->Open())
{
delete net;
return nullptr;
}
return host;
net->EnableDNS();
net->EnableDHCP();
return net;
}
NetworkInterface* AP0103::Create8266(bool apOnly)
{
auto host = new Esp8266(COM4, P0, P0);
auto esp = new Esp8266(COM4, P0, P0);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
return host;
return esp;
}
void AP0103::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
// 需要使用本地连接
//client->UseLocal();
Client = tc;
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
// 如果若干分钟后仍然没有打开令牌客户端,则重启系统
Sys.AddTask(
[](void* p) {
auto& client = *(TokenClient*)p;
if (!client.Opened)
{
debug_printf("联网超时,准备重启系统!\r\n\r\n");
Sys.Reboot();
}
},
client, 8 * 60 * 1000, -1, "check connet net");
InitAlarm();
}
void AP0103::Register(int index, IDataPort& dp)
@ -215,35 +198,14 @@ void AP0103::Register(int index, IDataPort& dp)
ds.Register(index, dp);
}
/*
使
5500线
线
DHCP/DNS
Host
Host为空 AP/STA_AP
8266
Host为空
Host
else STA_AP
= AP
*/
void OnInitNet(void* param)
{
auto& bsp = *(AP0103*)param;
// 检查是否连接网线
auto host = (W5500*)bsp.Create5500();
// 软路由的DHCP要求很严格必须先把自己IP设为0
host->IP = IPAddress::Any();
host->Open();
host->EnableDNS();
host->EnableDHCP();
bsp.Host = host;
bsp.Create5500();
bsp.Create8266(false);
Client->Open();
}
void AP0103::InitNet()
@ -251,6 +213,35 @@ void AP0103::InitNet()
Sys.AddTask(OnInitNet, this, 0, -1, "InitNet");
}
static void OnAlarm(AlarmItem& item)
{
// 1长度n + 1类型 + 1偏移 + (n-2)数据
auto bs = item.GetData();
debug_printf("OnAlarm ");
bs.Show(true);
if(bs[1] == 0x06)
{
auto client = Client;
client->Store.Write(bs[2], bs.Sub(3, bs[0] - 2));
// 主动上报状态
client->ReportAsync(bs[2], bs[0] - 2);
}
}
void AP0103::InitAlarm()
{
if (!Client)return;
if (!AlarmObj) AlarmObj = new Alarm();
Client->Register("Policy/AlarmSet", &Alarm::Set, AlarmObj);
Client->Register("Policy/AlarmGet", &Alarm::Get, AlarmObj);
AlarmObj->OnAlarm = OnAlarm;
AlarmObj->Start();
}
/******************************** Tiny *******************************/
@ -372,7 +363,7 @@ void AP0103::OnLongPress(InputPort* port, bool down)
debug_printf("Press P%c%d Time=%d ms\r\n", _PIN_NAME(port->_Pin), port->PressTime);
ushort time = port->PressTime;
auto client = AP0103::Current->Client;
auto client = Client;
if (time >= 5000 && time < 10000)
{
if(client) client->Reset("按键重置");

View File

@ -5,7 +5,6 @@
#include "Net\ITransport.h"
#include "Net\Socket.h"
#include "TokenNet\TokenClient.h"
#include "TinyNet\TinyServer.h"
#include "TokenNet\GateWay.h"
@ -25,17 +24,13 @@ public:
List<OutputPort*> Outputs;
List<InputPort*> Inputs;
NetworkInterface* Host; // 网络主机
NetworkInterface* HostAP; // 网络主机
TokenClient* Client; // 令牌客户端
ITransport* Nrf; // NRF24L01传输口
TinyServer* Server; // TinyServer服务
Gateway* _GateWay; // 网关
// ProxyFactory* ProxyFac; // 透传管理器
// Alarm* AlarmObj;
Alarm* AlarmObj;
AP0103();
@ -56,6 +51,7 @@ public:
void InitClient();
void InitNet();
void InitAlarm();
// 打开NRF24L01
ITransport* Create2401();

View File

@ -19,6 +19,7 @@
#include "App\FlushPort.h"
AP0104* AP0104::Current = nullptr;
static TokenClient* Client = nullptr; // 令牌客户端
AP0104::AP0104()
{
@ -28,9 +29,7 @@ AP0104::AP0104()
ButtonPins.Add(PE9);
ButtonPins.Add(PA1);
Host = nullptr;
HostAP = nullptr;
Client = nullptr;
AlarmObj = nullptr;
Nrf = nullptr;
Server = nullptr;
@ -128,66 +127,61 @@ NetworkInterface* AP0104::Create5500()
{
debug_printf("\r\nW5500::Create \r\n");
auto host = new W5500(Spi1, PE7, PB2);
auto net = new W5500(Spi1, PE7, PB2);
if(!net->Open())
{
delete net;
return nullptr;
}
return host;
net->EnableDNS();
net->EnableDHCP();
return net;
}
NetworkInterface* AP0104::Create8266(bool apOnly)
{
auto host = new Esp8266(COM4, P0, P0);
auto esp = new Esp8266(COM4, P0, P0);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
return host;
return esp;
}
void AP0104::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
// 需要使用本地连接
//client->UseLocal();
Client = tc;
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
InitAlarm();
}
void AP0104::Register(int index, IDataPort& dp)
@ -198,56 +192,14 @@ void AP0104::Register(int index, IDataPort& dp)
ds.Register(index, dp);
}
/*
使
5500线
线
DHCP/DNS
Host
Host为空 AP/STA_AP
8266
Host为空
Host
else STA_AP
= AP
*/
void OnInitNet(void* param)
{
auto& bsp = *(AP0104*)param;
// 检查是否连接网线
auto host = (W5500*)bsp.Create5500();
// 软路由的DHCP要求很严格必须先把自己IP设为0
host->IP = IPAddress::Any();
if (host->Open())
{
host->EnableDNS();
host->EnableDHCP();
bsp.Host = host;
}
else
{
delete host;
}
bsp.Create5500();
bsp.Create8266(false);
// 没有接网线需要完整WiFi通道
if (!bsp.Host)
{
auto esp = (WiFiInterface*)bsp.Create8266(false);
if (esp)
{
// 未组网时主机留空仅保留AP主机
bool join = esp->SSID && *esp->SSID;
if (join && esp->IsStation())
bsp.Host = esp;
else
bsp.HostAP = esp;
}
}
Client->Open();
}
void AP0104::InitNet()
@ -255,6 +207,35 @@ void AP0104::InitNet()
Sys.AddTask(OnInitNet, this, 0, -1, "InitNet");
}
static void OnAlarm(AlarmItem& item)
{
// 1长度n + 1类型 + 1偏移 + (n-2)数据
auto bs = item.GetData();
debug_printf("OnAlarm ");
bs.Show(true);
if(bs[1] == 0x06)
{
auto client = Client;
client->Store.Write(bs[2], bs.Sub(3, bs[0] - 2));
// 主动上报状态
client->ReportAsync(bs[2], bs[0] - 2);
}
}
void AP0104::InitAlarm()
{
if (!Client)return;
if (!AlarmObj) AlarmObj = new Alarm();
Client->Register("Policy/AlarmSet", &Alarm::Set, AlarmObj);
Client->Register("Policy/AlarmGet", &Alarm::Get, AlarmObj);
AlarmObj->OnAlarm = OnAlarm;
AlarmObj->Start();
}
/******************************** Tiny *******************************/
@ -374,7 +355,7 @@ void AP0104::OnLongPress(InputPort* port, bool down)
debug_printf("Press P%c%d Time=%d ms\r\n", _PIN_NAME(port->_Pin), port->PressTime);
ushort time = port->PressTime;
auto client = AP0104::Current->Client;
auto client = Client;
if (time >= 5000 && time < 10000)
{
if(client) client->Reset("按键重置");

View File

@ -5,7 +5,6 @@
#include "Net\ITransport.h"
#include "Net\Socket.h"
#include "TokenNet\TokenClient.h"
#include "TinyNet\TinyServer.h"
#include "TokenNet\GateWay.h"
@ -25,17 +24,13 @@ public:
List<OutputPort*> Outputs;
List<InputPort*> Inputs;
NetworkInterface* Host; // 网络主机
NetworkInterface* HostAP; // 网络主机
TokenClient* Client; // 令牌客户端
ITransport* Nrf; // NRF24L01传输口
TinyServer* Server; // TinyServer服务
Gateway* _GateWay; // 网关
// ProxyFactory* ProxyFac; // 透传管理器
// Alarm* AlarmObj;
Alarm* AlarmObj;
AP0104();
// 设置系统参数
@ -55,6 +50,7 @@ public:
void InitClient();
void InitNet();
void InitAlarm();
// 打开NRF24L01
ITransport* Create2401();

View File

@ -28,8 +28,7 @@ AP0801::AP0801()
LedPins.Add(PE15);
ButtonPins.Add(PE13);
ButtonPins.Add(PE14);
Host = nullptr;
HostAP = nullptr;
Client = nullptr;
ProxyFac = nullptr;
AlarmObj = nullptr;
@ -130,9 +129,6 @@ NetworkInterface* AP0801::Create5500()
debug_printf("\r\nW5500::Create \r\n");
auto net = new W5500(Spi2, PE1, PD13);
// 必须先把自己IP设为0否则本地IP段与路由器不一致时将得不到分配
//net->IP = IPAddress::Any();
if(!net->Open())
{
delete net;
@ -184,33 +180,13 @@ void AP0801::InitClient()
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto tc = new TokenClient();
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = tc;
tc->MaxNotActive = 480000;
InitAlarm();
// 重启
tc->Register("Gateway/Restart", &TokenClient::InvokeRestart, tc);
// 重置
tc->Register("Gateway/Reset", &TokenClient::InvokeReset, tc);
// 设置远程地址
tc->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, tc);
// 获取远程配置信息
tc->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, tc);
// 获取所有Invoke命令
tc->Register("Api/All", &TokenClient::InvokeGetAllApi, tc);
if (Data && Size > 0)
{
auto& ds = tc->Store;
ds.Data.Set(Data, Size);
}
tc->UseLocal();
//tc->Open();
}
void AP0801::Register(uint offset, IDataPort& dp)
@ -289,7 +265,7 @@ void AP0801::InitAlarm()
{
if (!Client)return;
if (!AlarmObj)AlarmObj = new Alarm();
if (!AlarmObj) AlarmObj = new Alarm();
Client->Register("Policy/AlarmSet", &Alarm::Set, AlarmObj);
Client->Register("Policy/AlarmGet", &Alarm::Get, AlarmObj);
@ -380,32 +356,6 @@ void AP0801::OnLongPress(InputPort* port, bool down)
}
}
/*
使
5500线
线
DHCP
Host
Host为空 AP/STA_AP
8266
Host为空
Host
else STA_AP
= AP
8266
STA/STA_AP
SSID != null
JoinWiFi
else
= AP
AP/STA_AP
SetAP
*/
/*
NRF24L01+ (SPI3) | W5500 (SPI2) | TOUCH (SPI3)
NSS | NSS | PD6 NSS

View File

@ -5,8 +5,6 @@
#include "Net\ITransport.h"
#include "Net\Socket.h"
//#include "TokenNet\TokenClient.h"
//#include "Message\ProxyFactory.h"
#include "App\Alarm.h"
// 阿波罗0801/0802
@ -21,8 +19,6 @@ public:
List<OutputPort*> Outputs;
List<InputPort*> Inputs;
NetworkInterface* Host; // 网络主机
NetworkInterface* HostAP; // 网络主机
Alarm* AlarmObj;
AP0801();
@ -43,7 +39,6 @@ public:
void InitLeds();
void InitButtons(const Delegate2<InputPort&, bool>& press);
// void InitPort();
// 打开以太网W5500
NetworkInterface* Create5500();

View File

@ -20,8 +20,6 @@ static TokenClient* Client = nullptr; // 令牌客户端
AP0802::AP0802()
{
Host = nullptr;
HostAP = nullptr;
Client = nullptr;
Data = nullptr;
@ -162,33 +160,45 @@ NetworkInterface* AP0802::Create5500()
{
debug_printf("\r\nW5500::Create \r\n");
auto host = new W5500(Spi2, PE1, PD13);
auto net = new W5500(Spi2, PE1, PD13);
if(!net->Open())
{
delete net;
return nullptr;
}
return host;
net->EnableDNS();
net->EnableDHCP();
return net;
}
NetworkInterface* AP0802::Create8266(bool apOnly)
{
auto host = new Esp8266(COM4, PE0, PD3);
auto esp = new Esp8266(COM4, PE0, PD3);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
host->WorkMode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
esp->WorkMode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
return host;
return esp;
}
/******************************** Token ********************************/
@ -197,35 +207,17 @@ void AP0802::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = tc;
// 需要使用本地连接
//client->UseLocal();
//配置闹钟
InitAlarm();
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
}
void AP0802::Register(int index, IDataPort& dp)
@ -236,56 +228,14 @@ void AP0802::Register(int index, IDataPort& dp)
ds.Register(index, dp);
}
/*
使
5500线
线
DHCP/DNS
Host
Host为空 AP/STA_AP
8266
Host为空
Host
else STA_AP
= AP
*/
void OnInitNet(void* param)
{
auto& bsp = *(AP0802*)param;
// 检查是否连接网线
auto host = (W5500*)bsp.Create5500();
// 软路由的DHCP要求很严格必须先把自己IP设为0
host->IP = IPAddress::Any();
if (host->Open())
{
host->EnableDNS();
host->EnableDHCP();
bsp.Host = host;
}
else
{
delete host;
}
bsp.Create5500();
bsp.Create8266(false);
// 没有接网线需要完整WiFi通道
if (!bsp.Host)
{
auto esp = (WiFiInterface*)bsp.Create8266(false);
if (esp)
{
// 未组网时主机留空仅保留AP主机
bool join = esp->SSID && *esp->SSID;
if (join && esp->IsStation())
bsp.Host = esp;
else
bsp.HostAP = esp;
}
}
Client->Open();
}
void AP0802::InitNet()
@ -375,32 +325,6 @@ void AP0802::OnLongPress(InputPort* port, bool down)
}
}
/*
使
5500线
线
DHCP
Host
Host为空 AP/STA_AP
8266
Host为空
Host
else STA_AP
= AP
8266
STA/STA_AP
SSID != null
JoinWiFi
else
= AP
AP/STA_AP
SetAP
*/
/*
NRF24L01+ (SPI3) | W5500 (SPI2)
NSS | NSS

View File

@ -25,8 +25,6 @@ public:
List<OutputPort*> Outputs;
List<InputPort*> Inputs;
NetworkInterface* Host; // 网络主机
NetworkInterface* HostAP; // 网络主机
byte HardwareVer;
AP0802();

View File

@ -94,29 +94,33 @@ void IOK026X::InitLeds()
}
}
NetworkInterface* IOK026X::CreateNet()
NetworkInterface* IOK026X::Create8266()
{
auto host = new Esp8266(COM2, PB2, PA1);
auto esp = new Esp8266(COM2, PB2, PA1);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
Client->Register("GetAPs", &Esp8266::GetAPs, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
Client->Register("GetAPs", &Esp8266::GetAPs, esp);
return host;
return esp;
}
/******************************** Token ********************************/
@ -125,43 +129,17 @@ void IOK026X::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
Client = tc;
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
// 如果若干分钟后仍然没有打开令牌客户端,则重启系统
Sys.AddTask(
[](void* p) {
auto & bsp = *(IOK026X*)p;
auto & client = *bsp.Client;
if (!client.Opened)
{
debug_printf("联网超时准备重启Esp\r\n\r\n");
// Sys.Reboot();
auto port = dynamic_cast<Esp8266*>(bsp.Host);
port->Close();
Sys.Sleep(1000);
port->Open();
}
},
this, 8 * 60 * 1000, -1, "联网检查");
InitAlarm();
}
void IOK026X::Register(int index, IDataPort& dp)
@ -174,7 +152,7 @@ void IOK026X::Register(int index, IDataPort& dp)
void IOK026X::InitNet()
{
Host = CreateNet();
Host = Create8266();
}
static void OnAlarm(AlarmItem& item)

View File

@ -35,7 +35,7 @@ public:
byte LedStat(byte showmode);
NetworkInterface* CreateNet();
NetworkInterface* Create8266();
void InitClient();
void InitNet();

View File

@ -95,27 +95,30 @@ void IOK027X::InitLeds()
NetworkInterface* IOK027X::Create8266(Pin power)
{
auto host = new Esp8266(COM2, power, PA1);
auto esp = new Esp8266(COM2, power, PA1);
// 初次需要指定模式 否则为 Wire
//auto host = new Esp8266(COM4, PE2, PD3);
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
Client->Register("GetAPs", &Esp8266::GetAPs, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
Client->Register("GetAPs", &Esp8266::GetAPs, esp);
return host;
return esp;
}
/******************************** Token ********************************/
@ -124,26 +127,17 @@ void IOK027X::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
Client = tc;
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
InitAlarm();
}
void IOK027X::Register(int index, IDataPort& dp)

View File

@ -116,27 +116,27 @@ void IOK0612::InitButtons(const Delegate2<InputPort&, bool>& press)
NetworkInterface* IOK0612::Create8266()
{
// auto host = new Esp8266(COM2, PB2, PA1); // 触摸开关的
auto host = new Esp8266(COM2, PB12, PA1);
// auto esp = new Esp8266(COM2, PB2, PA1); // 触摸开关的
auto esp = new Esp8266(COM2, PB12, PA1);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
host->Open();
esp->Open();
return host;
return esp;
}
/******************************** Token ********************************/
@ -145,32 +145,17 @@ void IOK0612::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
Client = tc;
InitAlarm();
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
}
void IOK0612::Register(int index, IDataPort& dp)

View File

@ -116,27 +116,31 @@ void NH3_0317::InitButtons(const Delegate2<InputPort&, bool>& press)
NetworkInterface* NH3_0317::Create8266()
{
// auto host = new Esp8266(COM2, PB2, PA1); // 触摸开关的
auto host = new Esp8266(COM3, P0, PA5);
// auto esp = new Esp8266(COM2, PB2, PA1); // 触摸开关的
auto esp = new Esp8266(COM3, P0, PA5);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
//if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
//if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
}
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
if(!esp->Open())
{
delete esp;
return nullptr;
}
host->Open();
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
return host;
return esp;
}
/******************************** Token ********************************/
@ -151,30 +155,17 @@ void NH3_0317::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
client->UseLocal();
Client = client;
Client->MaxNotActive = 480000;
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
if (Data && Size > 0)
{
auto& ds = Client->Store;
ds.Data.Set(Data, Size);
}
Client = tc;
InitAlarm();
}
void NH3_0317::Register(int index, IDataPort& dp)

View File

@ -13,13 +13,13 @@
#include "Device\RTC.h"
PA0903* PA0903::Current = nullptr;
static TokenClient* Client = nullptr; // 令牌客户端
PA0903::PA0903()
{
LedPins.Add(PB1);
LedPins.Add(PB14);
Host = nullptr;
Client = nullptr;
ProxyFac = nullptr;
AlarmObj = nullptr;
@ -90,33 +90,45 @@ NetworkInterface* PA0903::Create5500()
{
debug_printf("\r\nW5500::Create \r\n");
auto host = new W5500(Spi1, PA8, PA0);
auto net = new W5500(Spi1, PA8, PA0);
if(!net->Open())
{
delete net;
return nullptr;
}
return host;
net->EnableDNS();
net->EnableDHCP();
return net;
}
NetworkInterface* PA0903::Create8266()
{
auto host = new Esp8266(COM4, PE2, PD3);
auto esp = new Esp8266(COM4, PE2, PD3);
// 初次需要指定模式 否则为 Wire
bool join = host->SSID && *host->SSID;
// host->Mode = NetworkType::Station;
// if (!join) host->Mode = NetworkType::AP;
bool join = esp->SSID && *esp->SSID;
// esp->Mode = NetworkType::Station;
// if (!join) esp->Mode = NetworkType::AP;
if (!join)
{
*host->SSID = "WSWL";
*host->Pass = "12345678";
*esp->SSID = "WSWL";
*esp->Pass = "12345678";
host->Mode = NetworkType::STA_AP;
host->WorkMode = NetworkType::STA_AP;
esp->Mode = NetworkType::STA_AP;
esp->WorkMode = NetworkType::STA_AP;
}
//Sys.AddTask(SetWiFiTask, this, 0, -1, "SetWiFi");
Client->Register("SetWiFi", &Esp8266::SetWiFi, host);
Client->Register("GetWiFi", &Esp8266::GetWiFi, host);
host->Open();
if(!esp->Open())
{
delete esp;
return nullptr;
}
return host;
Client->Register("SetWiFi", &Esp8266::SetWiFi, esp);
Client->Register("GetWiFi", &Esp8266::GetWiFi, esp);
return esp;
}
/******************************** Token ********************************/
@ -125,25 +137,17 @@ void PA0903::InitClient()
{
if (Client) return;
auto tk = TokenConfig::Current;
// 初始化令牌网
auto tk = TokenConfig::Create("smart.wslink.cn", NetType::Udp, 33333, 3377);
// 创建客户端
auto client = new TokenClient();
client->Cfg = tk;
auto tc = TokenClient::CreateFast(Buffer(Data, Size));
tc->Cfg = tk;
tc->MaxNotActive = 8 * 60 * 1000;
Client = client;
Client = tc;
InitAlarm();
// 重启
Client->Register("Gateway/Restart", &TokenClient::InvokeRestart, Client);
// 重置
Client->Register("Gateway/Reset", &TokenClient::InvokeReset, Client);
// 设置远程地址
Client->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, Client);
// 获取远程配置信息
Client->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, Client);
// 获取所有Ivoke命令
Client->Register("Api/All", &TokenClient::InvokeGetAllApi, Client);
}
void PA0903::Register(int index, IDataPort& dp)
@ -154,22 +158,20 @@ void PA0903::Register(int index, IDataPort& dp)
ds.Register(index, dp);
}
//void OnInitNet(void* param)
//{
// auto& bsp = *(PA0903*)param;
//
// /*// 检查是否连接网线
// auto host = (W5500*)bsp.Create5500();
// // 软路由的DHCP要求很严格必须先把自己IP设为0
// host->IP = IPAddress::Any();
//
// host->EnableDNS();
// host->EnableDHCP();
// bsp.Host = host;*/
//
//
//
//}
void OnInitNet(void* param)
{
auto& bsp = *(PA0903*)param;
bsp.Create5500();
bsp.Create8266();
Client->Open();
}
void PA0903::InitNet()
{
Sys.AddTask(OnInitNet, this, 0, -1, "InitNet");
}
void PA0903::InitProxy()
{
@ -196,7 +198,7 @@ static void OnAlarm(AlarmItem& item)
if (bs[1] == 0x06)
{
auto client = PA0903::Current->Client;
auto client = Client;
client->Store.Write(bs[2], bs.Sub(3, bs[0] - 2));
// 主动上报状态
@ -216,13 +218,6 @@ void PA0903::InitAlarm()
AlarmObj->Start();
}
void PA0903::InitNet()
{
Create5500();
Create8266();
Client->Open();
}
void PA0903::Restore()
{
if (Client) Client->Reset("按键重置");

View File

@ -6,7 +6,6 @@
#include "Net\Socket.h"
#include "Device\RTC.h"
#include "TokenNet\TokenClient.h"
#include "Message\ProxyFactory.h"
#include "App\Alarm.h"
@ -23,9 +22,6 @@ public:
List<OutputPort*> Outputs;
List<InputPort*> Inputs;
NetworkInterface* Host; // 网络主机
//NetworkInterface* HostAP; // 网络主机
TokenClient* Client; // 令牌客户端
ProxyFactory* ProxyFac; // 透传管理器
Alarm* AlarmObj;

View File

@ -365,9 +365,7 @@ void W5500::Init(Spi* spi, Pin irq, Pin rst)
Irq.Pull = InputPort::UP;
//Irq.Mode = InputPort::Rising;
Irq.HardEvent = true;
//Irq.Set(irq);
Irq.Init(irq, true);
//if(!Irq.Register(OnIRQ, this)) Irq.HardEvent = false;
Irq.Press.Bind(&W5500::OnIRQ, this);
Irq.UsePress();
}
@ -507,7 +505,7 @@ bool W5500::OnLink(uint retry)
// 为解决芯片有时候无法接收数据的问题,需要守护任务辅助
if(!TaskID)
{
int time = (Irq.Empty() || !Irq.HardEvent) ? 10 : 500;
int time = (Irq.Empty() || !Irq.HardEvent) ? 10 : -1;
TaskID = Sys.AddTask([](void* p){ ((W5500*)p)->OnIRQ(); }, this, time, time, "W5500中断");
auto task = Task::Get(TaskID);
task->MaxDeepth = 2; // 以太网允许重入,因为有时候在接收里面等待下一次接收

View File

@ -193,7 +193,7 @@ void TokenClient::CheckNet()
// 在该接口上创建控制器
if(!flag)
{
debug_printf("TokenClient::CheckNet %s 创建本地监听\r\n", nis[k]->Name);
debug_printf("TokenClient::CheckNet %s 创建本地监听 ", nis[k]->Name);
NetUri uri(NetType::Udp, IPAddress::Broadcast(), Cfg->Port);
auto ctrl = AddControl(*this, nis[k], uri, Cfg->Port);
@ -201,6 +201,12 @@ void TokenClient::CheckNet()
{
ctrl->Received = _LocalReceive;
ctrl->Open();
debug_printf("成功\r\n");
}
else
{
debug_printf("失败\r\n");
}
}
}
@ -1121,6 +1127,29 @@ void TokenClient::Register(cstring action, InvokeHandler handler, void* param)
}
}
// 快速建立令牌客户端注册默认Api
TokenClient* TokenClient::CreateFast(const Buffer& store)
{
auto tc = new TokenClient();
// 重启
tc->Register("Gateway/Restart", &TokenClient::InvokeRestart, tc);
// 重置
tc->Register("Gateway/Reset", &TokenClient::InvokeReset, tc);
// 设置远程地址
tc->Register("Gateway/SetRemote", &TokenClient::InvokeSetRemote, tc);
// 获取远程配置信息
tc->Register("Gateway/GetRemote", &TokenClient::InvokeGetRemote, tc);
// 获取所有Invoke命令
tc->Register("Api/All", &TokenClient::InvokeGetAllApi, tc);
if(store.Length()) tc->Store.Data.Set(store.GetBuffer(), store.Length());
tc->UseLocal();
return tc;
}
bool TokenClient::InvokeRestart(void * param, const Pair& args, Stream& result)
{

View File

@ -91,12 +91,15 @@ public:
static TokenClient* Current;
// 快速建立令牌客户端注册默认Api
static TokenClient* CreateFast(const Buffer& store);
// 重启,重置
static bool InvokeRestart(void * param, const Pair& args, Stream& result);
static bool InvokeReset(void * param, const Pair& args, Stream& result);
//设置远程服务器地址
// 设置远程服务器地址
static bool InvokeSetRemote(void * param, const Pair& args, Stream& result);
//获取远程服务器地址
// 获取远程服务器地址
static bool InvokeGetRemote(void * param, const Pair& args, Stream& result);
// 获取所有API
static bool InvokeGetAllApi(void * param, const Pair& args, Stream& result);