#include <hsf.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <httpc/httpc.h>
#include "../example.h"
#include "hfnet.h"
#include "hfsys.h"
//******添加头文件 "hfnet.h" "hfsys.h"******///
#if (EXAMPLE_USE_DEMO==USER_SOCKET_DEMO)
static void SmarkLink_Ok(bool smarklinkOK);
static void Wifi_Handle();
static bool Translate_Conf_Data(unsigned char *data, short data_size);
/**********************引脚定义******************/
const int hf_gpio_fid_to_pid_map_table[HFM_MAX_FUNC_CODE]=
{
HF_M_PIN(2),//HFGPIO_F_JTAG_TCK
HF_M_PIN(3),//HFGPIO_F_JTAG_TDO
HF_M_PIN(4),//HFGPIO_F_JTAG_TDI
HF_M_PIN(5),//HFGPIO_F_JTAG_TMS
HFM_NOPIN,//HFGPIO_F_USBDP
HFM_NOPIN,//HFGPIO_F_USBDM
HF_M_PIN(39),//HFGPIO_F_UART0_TX
HF_M_PIN(40),//HFGPIO_F_UART0_RTS
HF_M_PIN(41),//HFGPIO_F_UART0_RX
HF_M_PIN(42),//HFGPIO_F_UART0_CTS
HF_M_PIN(27),//HFGPIO_F_SPI_MISO
HF_M_PIN(28),//HFGPIO_F_SPI_CLK
HF_M_PIN(29),//HFGPIO_F_SPI_CS
HF_M_PIN(30),//HFGPIO_F_SPI_MOSI
HFM_NOPIN,//HFGPIO_F_UART1_TX,
HFM_NOPIN,//HFGPIO_F_UART1_RTS,
HFM_NOPIN,//HFGPIO_F_UART1_RX,
HFM_NOPIN,//HFGPIO_F_UART1_CTS,
HF_M_PIN(43),//HFGPIO_F_NLINK
HF_M_PIN(44),//HFGPIO_F_NREADY
HF_M_PIN(45),//HFGPIO_F_NRELOAD
HF_M_PIN(7),//HFGPIO_F_SLEEP_RQ
HF_M_PIN(8),//HFGPIO_F_SLEEP_ON
HFM_NOPIN,//HFGPIO_F_RESERVE0
HFM_NOPIN,//HFGPIO_F_RESERVE1
HFM_NOPIN,//HFGPIO_F_RESERVE2
HFM_NOPIN,//HFGPIO_F_RESERVE3
HFM_NOPIN,//HFGPIO_F_RESERVE4
HFM_NOPIN,//HFGPIO_F_RESERVE5
HFM_NOPIN,//HFGPIO_F_USER_DEFINE
};
const hfat_cmd_t user_define_at_cmds_table[]=
{
{NULL,NULL,NULL,NULL} //the last item must be null
};
/*******************定义数据包的结构体************************/
typedef union _STATE_DEF
{
uint32_t d;
struct
{
uint32_t connectAp : 1;
uint32_t reserved : 31;
}b;
}STATE_TypeDef;
typedef struct stSettingInfo
{
unsigned short version;
unsigned int data;
unsigned char serverIP[4]; //服务器IP地址
unsigned short serverPort; //服务器端口号
unsigned char lanRecvIP[4]; //目的IP地址
unsigned short lanRecvPort; // 目的端口号
char mac[6];
}SETTING_INFO;
typedef struct stModelInfo
{
SETTING_INFO setting;
STATE_TypeDef state;
unsigned char lanScanIP[4];
unsigned short lanScanPort;
}MODEL_INFO;
/********************************************************//
enum
{
SETTING_INFO_VERSION = 0xABEE,
CONF_PORT = 6820,
LAN_PORT = 6810
};
MODEL_INFO info;
int g_ufd;
static bool IsScanDevice(char *recvData, const char *scanData);
//测试socket连接状态 //
static int USER_FUNC socketa_recv_callback(uint32_t event,char *data,uint32_t len,uint32_t buf_len)
{
if(event==HFNET_SOCKETA_DATA_READY)
HF_Debug(DEBUG_LEVEL_LOW,"socketa recv %d bytes data %d\n",len,buf_len);
else if(event==HFNET_SOCKETA_CONNECTED)
u_printf("socket a connected!\n");
else if(event==HFNET_SOCKETA_DISCONNECTED)
u_printf("socket a disconnected!\n");
return len;
}
//将串口接收到的数据组装成帧发送********//
static int USER_FUNC uart_recv_callback( uint32_t event,void *data,uint32_t len,uint32_t buf_len)
{
//char resetCmd[] = "reset";
//if (strcmp(resetCmd, data) == 0)
//hfsys_softreset();
//return len;
if (len > 5)
{
unsigned char *data_buffer = (unsigned char*)data;
int data_size = ((data_buffer[4]<<8)|data_buffer[3]); //设置数据位
if (data_size > len)
return len;
unsigned char type = ((unsigned char *)data)[5];
bool is_wan_data = ((type & 0x80) == 0x80);
struct sockaddr_in addr;
int addrInLen = sizeof(struct sockaddr_in);
unsigned char lanAddr[] = {192, 168, 1, 101},
wanAddr[] = {192, 168, 1, 103};
short lanPort = info.setting.lanRecvPort,
wanPort = info.setting.serverPort;
addr.sin_family = AF_INET;
addr.sin_port = is_wan_data ? htons(wanPort) : lanPort;
memcpy(&addr.sin_addr.s_addr, is_wan_data ? info.setting.serverIP : info.setting.lanRecvIP, 4);
if (data_buffer[2] != 0x05 && type == 0x0A)
{
memcpy(&addr.sin_addr.s_addr, info.lanScanIP, 4);
addr.sin_port = info.lanScanPort;
}
int sendLen = sendto(g_ufd, data, len, 0, (struct sockaddr *)(&addr),sizeof(struct sockaddr_in));
return 0;
}
return len;
}
static int USER_FUNC hfsys_event_callback( uint32_t event_id,void * param)
{
info.state.b.connectAp = (event_id == HFE_DHCP_OK);
return HF_SUCCESS;
}
/**********扫描前5个recvData是否等于scanDate,相等返回I*************/
bool IsScanDevice(char *recvData, const char *scanData)
{
int i = 0;
for (; i < 5 && recvData[i] == scanData[i]; i++);
return i == 5;
}
void scan_thread_func(void *arg)
{
int ufd_scan = socket(AF_INET, SOCK_DGRAM, 0);
hfuart_handle_t huart1 = hfuart_open(0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6830);
addr.sin_addr.s_addr= htonl(INADDR_ANY);
bind(ufd_scan, (struct sockaddr*)&addr, sizeof(addr));
const char scan_data[] = {0x24, 0x24, 0x05, 0x01, 0x00, 0x48, 0x00, 0x23, 0x23};
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
char recvData[16] = {0};
while (1)
{
recv_num = recvfrom(ufd_scan,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
if (recv_num == sizeof(scan_data) && IsScanDevice(recvData+2, scan_data+2))
{
memcpy(info.lanScanIP, (char*)&addr.sin_addr.s_addr, 4);
info.lanScanPort = addr.sin_port;
hfuart_send(huart1, recvData, recv_num, 200);
}
}
hfuart_close(huart1);
}
int USER_FUNC app_main (void)
{
time_t now=time(NULL);
HF_Debug(DEBUG_LEVEL,"[FILE DEMO]sdk version(%s),
the app_main start time is %d %s\n",
hfsys_get_sdk_version(),now,ctime(&now));
if(hfgpio_fmap_check(HFM_TYPE_LPB100)!=0)
{
while(1)
{
HF_Debug(DEBUG_ERROR,"gpio map file error\n");
msleep(1000);
}
//return 0;
}
while(!hfnet_wifi_is_active())
{
msleep(50);
}
if(hfnet_start_assis(ASSIS_PORT)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start httpd fail\n");
}
if(hfnet_start_httpd(HFTHREAD_PRIORITIES_MID)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start httpd fail\n");
}
#ifndef TEST_UART_SELECT
if(hfnet_start_uart(HFTHREAD_PRIORITIES_LOW,uart_recv_callback)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start uart fail!\n");
}
#endif
hfuflash_read(0, (char*)&info.setting, sizeof(SETTING_INFO));
if (info.setting.version != SETTING_INFO_VERSION)
{
hfuflash_erase_page(0,1);
memset(&info.setting, 0, sizeof(SETTING_INFO));
info.setting.version = SETTING_INFO_VERSION;
info.setting.data = 0x1234;
hfuflash_write(0, (char*)&info.setting, sizeof(SETTING_INFO));
}
if (hfsys_register_system_event(hfsys_event_callback)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"hfsys_register_system_event fail\n");
}
//if(hfnet_start_socketa(HFTHREAD_PRIORITIES_LOW,(hfnet_callback_t)socketa_recv_callback)!=HF_SUCCESS)
//{
//HF_Debug(DEBUG_WARN,"start socketa fail\n");
//}
//if(hfthread_create(scan_thread_func,"SCAN_THREAD",256,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
//{
//HF_Debug(DEBUG_LEVEL,"create thread fail\n");
//return 0;
//}
hfnet_set_udp_broadcast_port_valid(6810, 6830);
int reason = hfsys_get_reset_reason();
//if (1)
if ((reason & HFSYS_RESET_REASON_SMARTLINK_OK) || (reason & HFSYS_RESET_REASON_SMARTLINK_START))
{
HF_Debug(DEBUG_WARN,"HFSYS_RESET_REASON_SMARTLINK_START\n");
SmarkLink_Ok(reason & HFSYS_RESET_REASON_SMARTLINK_OK);
}
else
{
HF_Debug(DEBUG_WARN,"normal reset\n");
if(hfthread_create(Wifi_Handle,"Wifi_Handle_Thread",512,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
{
HF_Debug(DEBUG_LEVEL,"create thread fail\n");
}
//Wifi_Handle();
}
return 1;
}
void SmarkLink_Ok(bool smarklinkOK)
{
struct sockaddr_in addr;
int ufd = -1;
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
unsigned char recvData[200] = {0};
unsigned char sendUartData[200] = {0};
unsigned char ackRecvData[] = {'$', '$', 0xFE, 0x0D, 0x00, 0x08,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, '#', '#'};
unsigned char *headerData1 = ackRecvData,
*headerData2 = ackRecvData + 1,
*tailData1 = ackRecvData + sizeof(ackRecvData) - 1,
*tailData2 = ackRecvData + sizeof(ackRecvData) - 2,
recvHeaderData1 = 0,
recvHeaderData2 = 0,
recvTailData1 = 0,
recvTailData2 = 0;
hfuart_handle_t huart1 = 0;
ufd = socket(AF_INET, SOCK_DGRAM, 0);
if(ufd<0)
{
u_printf("create udp socket fail\n");
return ;
}
huart1 = hfuart_open(0);
//if (smarklinkOK)
//{
// char smarklinkOK[] = "##ab12##";
//hfuart_send(huart1, smarklinkOK, sizeof(smarklinkOK), 200);
//}
// jun add
info.state.d = 0;
//msleep(6000);
//hfat_send_cmd("AT+WANN\r\n", sizeof("AT+WANN\r\n"), recvData, 260);
addr.sin_family = AF_INET;
addr.sin_port = htons(6820);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(ufd, (struct sockaddr*)&addr, sizeof(addr));
info.state.b.connectAp = 0;
while (!info.state.b.connectAp)
msleep(10);
//if (smarklinkOK)
{
char smarklinkOK[] = "##ab12##";
hfuart_send(huart1, smarklinkOK, sizeof(smarklinkOK), 200);//2014-1-27
}
//hfat_send_cmd("AT+WANN\r\n", sizeof("AT+WANN\r\n"), recvData, 260);
while (1)
{
recv_num = recvfrom(ufd,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
memcpy(sendUartData, recvData, recv_num);
recvHeaderData1 = recvData[0];
recvHeaderData2 = recvData[1];
recvTailData1 = recvData[recv_num - 1];
recvTailData2 = recvData[recv_num - 2];
if (Translate_Conf_Data(recvData, recv_num))
{
*headerData1 = recvHeaderData1;
*headerData2 = recvHeaderData2;
*tailData1 = recvTailData1;
*tailData2 = recvTailData2;
hfuflash_erase_page(0,1);
hfuflash_write(0, (char*)&info.setting, sizeof(SETTING_INFO));
//huart1 = hfuart_open(0);
memcpy(sendUartData + recv_num, info.setting.mac, 6);
hfuart_send(huart1, sendUartData, recv_num + 6, 200);
memcpy(ackRecvData + 6, info.setting.mac, 6);
//memcpy(ackRecvData + 12, huart1, 4);
sendto(ufd, ackRecvData, sizeof(ackRecvData), 0, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
msleep(3000);
break;
}
}
close(ufd);
hfuart_close(huart1);
hfsys_softreset();
}
/******************WIFI接收信号处理************************/
void Wifi_Handle()
{
info.state.d = 0;
while (!info.state.b.connectAp)
msleep(10);
if(hfthread_create(scan_thread_func,"SCAN_THREAD",256,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
{
HF_Debug(DEBUG_LEVEL,"create thread fail\n");
}
//unsigned char connectedData[] = {0x24, 0x24, 0xae, 0x13, 0x23, 0x23};
hfuart_handle_t huart1 = hfuart_open(0);
//hfuart_send(huart1, connectedData, sizeof(connectedData), 200);
g_ufd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(LAN_PORT);
addr.sin_addr.s_addr= htonl(INADDR_ANY);
bind(g_ufd, (struct sockaddr*)&addr, sizeof(addr));
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
char recvData[512] = {0};
while (1)
{
recv_num = recvfrom(g_ufd,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
if (recv_num > 5 && ((recvData[5] & 0x80) == 0x00))
{
memcpy(info.setting.lanRecvIP, (char*)&addr.sin_addr.s_addr, 4);
info.setting.lanRecvPort = addr.sin_port;
}
hfuart_send(huart1, recvData, recv_num, 200);
}
hfuart_close(huart1);
return ;
}
static inline bool is_ip_valid(int num)
{
return num >= 0 && num <= 255;
}
/****************发送配置数据********************/
bool Translate_Conf_Data(unsigned char *data, short data_size)
{
unsigned char *UartWiFi_Cfg_TmpBuf = data;
short UartWiFi_Cfg_TmpBufLen = data_size,
UartWiFi_Cfg_DataLen = 0;
char break_loop = 0;
unsigned int UartWiFi_Cfg_lseek = 0;
while(UartWiFi_Cfg_TmpBufLen != 0 && !break_loop)
{
/*get the frame datasize*/
UartWiFi_Cfg_DataLen =((UartWiFi_Cfg_TmpBuf[4]<<8)|UartWiFi_Cfg_TmpBuf[3]);
/*get a compelete frame,check the frame is valid or not and deal with the frame.
*if all the frames are dealed with ,then break the while loop*/
if(//(UartWiFi_Cfg_TmpBuf[0] == '$')&&
//(UartWiFi_Cfg_TmpBuf[1] == '$')&&
(UartWiFi_Cfg_TmpBuf[2] == 0xfe)
&& (UartWiFi_Cfg_DataLen < UartWiFi_Cfg_TmpBufLen)
)
{
switch(UartWiFi_Cfg_TmpBuf[5])
{
case 0x03: /*config IP addr*/
{
unsigned char tmp_ip[4] = {0};
char tmp_buf[16] = {0};
memcpy(tmp_buf,&UartWiFi_Cfg_TmpBuf[6],UartWiFi_Cfg_DataLen-1);
tmp_ip[0] = atoi(strtok(tmp_buf,"."));
tmp_ip[1] = atoi(strtok(NULL,"."));
tmp_ip[2] = atoi(strtok(NULL,"."));
tmp_ip[3] = atoi(strtok(NULL,"."));
if( !is_ip_valid(tmp_ip[0])||
!is_ip_valid(tmp_ip[1])||
!is_ip_valid(tmp_ip[2])||
!is_ip_valid(tmp_ip[3]) )
{
/*ip addr is invalid,do nothing*/
}
else
{
memcpy(info.setting.serverIP, tmp_ip,4);
}
}
break;
case 0x07:
{
uint16_t tmp_server_port = 0;
memcpy(&tmp_server_port, &UartWiFi_Cfg_TmpBuf[6], 2);
info.setting.serverPort = tmp_server_port;
}
break;
case 0x10:
{
memcpy(info.setting.mac, &UartWiFi_Cfg_TmpBuf[6], 6);
}
break;
} /*end of switch*/
UartWiFi_Cfg_lseek += (UartWiFi_Cfg_DataLen +8); /*one frame length*/
UartWiFi_Cfg_TmpBufLen -= UartWiFi_Cfg_lseek;
memcpy(UartWiFi_Cfg_TmpBuf,&UartWiFi_Cfg_TmpBuf[UartWiFi_Cfg_lseek],UartWiFi_Cfg_TmpBufLen);
memset(&UartWiFi_Cfg_TmpBuf[UartWiFi_Cfg_TmpBufLen],0,data_size-UartWiFi_Cfg_TmpBufLen);
UartWiFi_Cfg_lseek = 0;
if (UartWiFi_Cfg_TmpBufLen > 0 && UartWiFi_Cfg_TmpBuf[0] == 0x00
&& UartWiFi_Cfg_TmpBuf[1] == 0x00)
break;
}/*end of if "##"*/
else
{
/*this frame is an invalid frame,do nothing ,just break the while*/
return false;
}
}/*end of while*/
return true;
}
#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <httpc/httpc.h>
#include "../example.h"
#include "hfnet.h"
#include "hfsys.h"
//******添加头文件 "hfnet.h" "hfsys.h"******///
#if (EXAMPLE_USE_DEMO==USER_SOCKET_DEMO)
static void SmarkLink_Ok(bool smarklinkOK);
static void Wifi_Handle();
static bool Translate_Conf_Data(unsigned char *data, short data_size);
/**********************引脚定义******************/
const int hf_gpio_fid_to_pid_map_table[HFM_MAX_FUNC_CODE]=
{
HF_M_PIN(2),//HFGPIO_F_JTAG_TCK
HF_M_PIN(3),//HFGPIO_F_JTAG_TDO
HF_M_PIN(4),//HFGPIO_F_JTAG_TDI
HF_M_PIN(5),//HFGPIO_F_JTAG_TMS
HFM_NOPIN,//HFGPIO_F_USBDP
HFM_NOPIN,//HFGPIO_F_USBDM
HF_M_PIN(39),//HFGPIO_F_UART0_TX
HF_M_PIN(40),//HFGPIO_F_UART0_RTS
HF_M_PIN(41),//HFGPIO_F_UART0_RX
HF_M_PIN(42),//HFGPIO_F_UART0_CTS
HF_M_PIN(27),//HFGPIO_F_SPI_MISO
HF_M_PIN(28),//HFGPIO_F_SPI_CLK
HF_M_PIN(29),//HFGPIO_F_SPI_CS
HF_M_PIN(30),//HFGPIO_F_SPI_MOSI
HFM_NOPIN,//HFGPIO_F_UART1_TX,
HFM_NOPIN,//HFGPIO_F_UART1_RTS,
HFM_NOPIN,//HFGPIO_F_UART1_RX,
HFM_NOPIN,//HFGPIO_F_UART1_CTS,
HF_M_PIN(43),//HFGPIO_F_NLINK
HF_M_PIN(44),//HFGPIO_F_NREADY
HF_M_PIN(45),//HFGPIO_F_NRELOAD
HF_M_PIN(7),//HFGPIO_F_SLEEP_RQ
HF_M_PIN(8),//HFGPIO_F_SLEEP_ON
HFM_NOPIN,//HFGPIO_F_RESERVE0
HFM_NOPIN,//HFGPIO_F_RESERVE1
HFM_NOPIN,//HFGPIO_F_RESERVE2
HFM_NOPIN,//HFGPIO_F_RESERVE3
HFM_NOPIN,//HFGPIO_F_RESERVE4
HFM_NOPIN,//HFGPIO_F_RESERVE5
HFM_NOPIN,//HFGPIO_F_USER_DEFINE
};
const hfat_cmd_t user_define_at_cmds_table[]=
{
{NULL,NULL,NULL,NULL} //the last item must be null
};
/*******************定义数据包的结构体************************/
typedef union _STATE_DEF
{
uint32_t d;
struct
{
uint32_t connectAp : 1;
uint32_t reserved : 31;
}b;
}STATE_TypeDef;
typedef struct stSettingInfo
{
unsigned short version;
unsigned int data;
unsigned char serverIP[4]; //服务器IP地址
unsigned short serverPort; //服务器端口号
unsigned char lanRecvIP[4]; //目的IP地址
unsigned short lanRecvPort; // 目的端口号
char mac[6];
}SETTING_INFO;
typedef struct stModelInfo
{
SETTING_INFO setting;
STATE_TypeDef state;
unsigned char lanScanIP[4];
unsigned short lanScanPort;
}MODEL_INFO;
/********************************************************//
enum
{
SETTING_INFO_VERSION = 0xABEE,
CONF_PORT = 6820,
LAN_PORT = 6810
};
MODEL_INFO info;
int g_ufd;
static bool IsScanDevice(char *recvData, const char *scanData);
//测试socket连接状态 //
static int USER_FUNC socketa_recv_callback(uint32_t event,char *data,uint32_t len,uint32_t buf_len)
{
if(event==HFNET_SOCKETA_DATA_READY)
HF_Debug(DEBUG_LEVEL_LOW,"socketa recv %d bytes data %d\n",len,buf_len);
else if(event==HFNET_SOCKETA_CONNECTED)
u_printf("socket a connected!\n");
else if(event==HFNET_SOCKETA_DISCONNECTED)
u_printf("socket a disconnected!\n");
return len;
}
//将串口接收到的数据组装成帧发送********//
static int USER_FUNC uart_recv_callback( uint32_t event,void *data,uint32_t len,uint32_t buf_len)
{
//char resetCmd[] = "reset";
//if (strcmp(resetCmd, data) == 0)
//hfsys_softreset();
//return len;
if (len > 5)
{
unsigned char *data_buffer = (unsigned char*)data;
int data_size = ((data_buffer[4]<<8)|data_buffer[3]); //设置数据位
if (data_size > len)
return len;
unsigned char type = ((unsigned char *)data)[5];
bool is_wan_data = ((type & 0x80) == 0x80);
struct sockaddr_in addr;
int addrInLen = sizeof(struct sockaddr_in);
unsigned char lanAddr[] = {192, 168, 1, 101},
wanAddr[] = {192, 168, 1, 103};
short lanPort = info.setting.lanRecvPort,
wanPort = info.setting.serverPort;
addr.sin_family = AF_INET;
addr.sin_port = is_wan_data ? htons(wanPort) : lanPort;
memcpy(&addr.sin_addr.s_addr, is_wan_data ? info.setting.serverIP : info.setting.lanRecvIP, 4);
if (data_buffer[2] != 0x05 && type == 0x0A)
{
memcpy(&addr.sin_addr.s_addr, info.lanScanIP, 4);
addr.sin_port = info.lanScanPort;
}
int sendLen = sendto(g_ufd, data, len, 0, (struct sockaddr *)(&addr),sizeof(struct sockaddr_in));
return 0;
}
return len;
}
static int USER_FUNC hfsys_event_callback( uint32_t event_id,void * param)
{
info.state.b.connectAp = (event_id == HFE_DHCP_OK);
return HF_SUCCESS;
}
/**********扫描前5个recvData是否等于scanDate,相等返回I*************/
bool IsScanDevice(char *recvData, const char *scanData)
{
int i = 0;
for (; i < 5 && recvData[i] == scanData[i]; i++);
return i == 5;
}
void scan_thread_func(void *arg)
{
int ufd_scan = socket(AF_INET, SOCK_DGRAM, 0);
hfuart_handle_t huart1 = hfuart_open(0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6830);
addr.sin_addr.s_addr= htonl(INADDR_ANY);
bind(ufd_scan, (struct sockaddr*)&addr, sizeof(addr));
const char scan_data[] = {0x24, 0x24, 0x05, 0x01, 0x00, 0x48, 0x00, 0x23, 0x23};
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
char recvData[16] = {0};
while (1)
{
recv_num = recvfrom(ufd_scan,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
if (recv_num == sizeof(scan_data) && IsScanDevice(recvData+2, scan_data+2))
{
memcpy(info.lanScanIP, (char*)&addr.sin_addr.s_addr, 4);
info.lanScanPort = addr.sin_port;
hfuart_send(huart1, recvData, recv_num, 200);
}
}
hfuart_close(huart1);
}
int USER_FUNC app_main (void)
{
time_t now=time(NULL);
HF_Debug(DEBUG_LEVEL,"[FILE DEMO]sdk version(%s),
the app_main start time is %d %s\n",
hfsys_get_sdk_version(),now,ctime(&now));
if(hfgpio_fmap_check(HFM_TYPE_LPB100)!=0)
{
while(1)
{
HF_Debug(DEBUG_ERROR,"gpio map file error\n");
msleep(1000);
}
//return 0;
}
while(!hfnet_wifi_is_active())
{
msleep(50);
}
if(hfnet_start_assis(ASSIS_PORT)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start httpd fail\n");
}
if(hfnet_start_httpd(HFTHREAD_PRIORITIES_MID)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start httpd fail\n");
}
#ifndef TEST_UART_SELECT
if(hfnet_start_uart(HFTHREAD_PRIORITIES_LOW,uart_recv_callback)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"start uart fail!\n");
}
#endif
hfuflash_read(0, (char*)&info.setting, sizeof(SETTING_INFO));
if (info.setting.version != SETTING_INFO_VERSION)
{
hfuflash_erase_page(0,1);
memset(&info.setting, 0, sizeof(SETTING_INFO));
info.setting.version = SETTING_INFO_VERSION;
info.setting.data = 0x1234;
hfuflash_write(0, (char*)&info.setting, sizeof(SETTING_INFO));
}
if (hfsys_register_system_event(hfsys_event_callback)!=HF_SUCCESS)
{
HF_Debug(DEBUG_WARN,"hfsys_register_system_event fail\n");
}
//if(hfnet_start_socketa(HFTHREAD_PRIORITIES_LOW,(hfnet_callback_t)socketa_recv_callback)!=HF_SUCCESS)
//{
//HF_Debug(DEBUG_WARN,"start socketa fail\n");
//}
//if(hfthread_create(scan_thread_func,"SCAN_THREAD",256,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
//{
//HF_Debug(DEBUG_LEVEL,"create thread fail\n");
//return 0;
//}
hfnet_set_udp_broadcast_port_valid(6810, 6830);
int reason = hfsys_get_reset_reason();
//if (1)
if ((reason & HFSYS_RESET_REASON_SMARTLINK_OK) || (reason & HFSYS_RESET_REASON_SMARTLINK_START))
{
HF_Debug(DEBUG_WARN,"HFSYS_RESET_REASON_SMARTLINK_START\n");
SmarkLink_Ok(reason & HFSYS_RESET_REASON_SMARTLINK_OK);
}
else
{
HF_Debug(DEBUG_WARN,"normal reset\n");
if(hfthread_create(Wifi_Handle,"Wifi_Handle_Thread",512,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
{
HF_Debug(DEBUG_LEVEL,"create thread fail\n");
}
//Wifi_Handle();
}
return 1;
}
void SmarkLink_Ok(bool smarklinkOK)
{
struct sockaddr_in addr;
int ufd = -1;
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
unsigned char recvData[200] = {0};
unsigned char sendUartData[200] = {0};
unsigned char ackRecvData[] = {'$', '$', 0xFE, 0x0D, 0x00, 0x08,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, '#', '#'};
unsigned char *headerData1 = ackRecvData,
*headerData2 = ackRecvData + 1,
*tailData1 = ackRecvData + sizeof(ackRecvData) - 1,
*tailData2 = ackRecvData + sizeof(ackRecvData) - 2,
recvHeaderData1 = 0,
recvHeaderData2 = 0,
recvTailData1 = 0,
recvTailData2 = 0;
hfuart_handle_t huart1 = 0;
ufd = socket(AF_INET, SOCK_DGRAM, 0);
if(ufd<0)
{
u_printf("create udp socket fail\n");
return ;
}
huart1 = hfuart_open(0);
//if (smarklinkOK)
//{
// char smarklinkOK[] = "##ab12##";
//hfuart_send(huart1, smarklinkOK, sizeof(smarklinkOK), 200);
//}
// jun add
info.state.d = 0;
//msleep(6000);
//hfat_send_cmd("AT+WANN\r\n", sizeof("AT+WANN\r\n"), recvData, 260);
addr.sin_family = AF_INET;
addr.sin_port = htons(6820);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(ufd, (struct sockaddr*)&addr, sizeof(addr));
info.state.b.connectAp = 0;
while (!info.state.b.connectAp)
msleep(10);
//if (smarklinkOK)
{
char smarklinkOK[] = "##ab12##";
hfuart_send(huart1, smarklinkOK, sizeof(smarklinkOK), 200);//2014-1-27
}
//hfat_send_cmd("AT+WANN\r\n", sizeof("AT+WANN\r\n"), recvData, 260);
while (1)
{
recv_num = recvfrom(ufd,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
memcpy(sendUartData, recvData, recv_num);
recvHeaderData1 = recvData[0];
recvHeaderData2 = recvData[1];
recvTailData1 = recvData[recv_num - 1];
recvTailData2 = recvData[recv_num - 2];
if (Translate_Conf_Data(recvData, recv_num))
{
*headerData1 = recvHeaderData1;
*headerData2 = recvHeaderData2;
*tailData1 = recvTailData1;
*tailData2 = recvTailData2;
hfuflash_erase_page(0,1);
hfuflash_write(0, (char*)&info.setting, sizeof(SETTING_INFO));
//huart1 = hfuart_open(0);
memcpy(sendUartData + recv_num, info.setting.mac, 6);
hfuart_send(huart1, sendUartData, recv_num + 6, 200);
memcpy(ackRecvData + 6, info.setting.mac, 6);
//memcpy(ackRecvData + 12, huart1, 4);
sendto(ufd, ackRecvData, sizeof(ackRecvData), 0, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
msleep(3000);
break;
}
}
close(ufd);
hfuart_close(huart1);
hfsys_softreset();
}
/******************WIFI接收信号处理************************/
void Wifi_Handle()
{
info.state.d = 0;
while (!info.state.b.connectAp)
msleep(10);
if(hfthread_create(scan_thread_func,"SCAN_THREAD",256,NULL, HFTHREAD_PRIORITIES_LOW,NULL,NULL)!=HF_SUCCESS)
{
HF_Debug(DEBUG_LEVEL,"create thread fail\n");
}
//unsigned char connectedData[] = {0x24, 0x24, 0xae, 0x13, 0x23, 0x23};
hfuart_handle_t huart1 = hfuart_open(0);
//hfuart_send(huart1, connectedData, sizeof(connectedData), 200);
g_ufd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(LAN_PORT);
addr.sin_addr.s_addr= htonl(INADDR_ANY);
bind(g_ufd, (struct sockaddr*)&addr, sizeof(addr));
int addrInLen = sizeof(struct sockaddr_in),
recv_num = 0;
char recvData[512] = {0};
while (1)
{
recv_num = recvfrom(g_ufd,recvData,sizeof(recvData),0,(struct sockaddr*)&addr,(socklen_t*)&addrInLen);
if (recv_num > 5 && ((recvData[5] & 0x80) == 0x00))
{
memcpy(info.setting.lanRecvIP, (char*)&addr.sin_addr.s_addr, 4);
info.setting.lanRecvPort = addr.sin_port;
}
hfuart_send(huart1, recvData, recv_num, 200);
}
hfuart_close(huart1);
return ;
}
static inline bool is_ip_valid(int num)
{
return num >= 0 && num <= 255;
}
/****************发送配置数据********************/
bool Translate_Conf_Data(unsigned char *data, short data_size)
{
unsigned char *UartWiFi_Cfg_TmpBuf = data;
short UartWiFi_Cfg_TmpBufLen = data_size,
UartWiFi_Cfg_DataLen = 0;
char break_loop = 0;
unsigned int UartWiFi_Cfg_lseek = 0;
while(UartWiFi_Cfg_TmpBufLen != 0 && !break_loop)
{
/*get the frame datasize*/
UartWiFi_Cfg_DataLen =((UartWiFi_Cfg_TmpBuf[4]<<8)|UartWiFi_Cfg_TmpBuf[3]);
/*get a compelete frame,check the frame is valid or not and deal with the frame.
*if all the frames are dealed with ,then break the while loop*/
if(//(UartWiFi_Cfg_TmpBuf[0] == '$')&&
//(UartWiFi_Cfg_TmpBuf[1] == '$')&&
(UartWiFi_Cfg_TmpBuf[2] == 0xfe)
&& (UartWiFi_Cfg_DataLen < UartWiFi_Cfg_TmpBufLen)
)
{
switch(UartWiFi_Cfg_TmpBuf[5])
{
case 0x03: /*config IP addr*/
{
unsigned char tmp_ip[4] = {0};
char tmp_buf[16] = {0};
memcpy(tmp_buf,&UartWiFi_Cfg_TmpBuf[6],UartWiFi_Cfg_DataLen-1);
tmp_ip[0] = atoi(strtok(tmp_buf,"."));
tmp_ip[1] = atoi(strtok(NULL,"."));
tmp_ip[2] = atoi(strtok(NULL,"."));
tmp_ip[3] = atoi(strtok(NULL,"."));
if( !is_ip_valid(tmp_ip[0])||
!is_ip_valid(tmp_ip[1])||
!is_ip_valid(tmp_ip[2])||
!is_ip_valid(tmp_ip[3]) )
{
/*ip addr is invalid,do nothing*/
}
else
{
memcpy(info.setting.serverIP, tmp_ip,4);
}
}
break;
case 0x07:
{
uint16_t tmp_server_port = 0;
memcpy(&tmp_server_port, &UartWiFi_Cfg_TmpBuf[6], 2);
info.setting.serverPort = tmp_server_port;
}
break;
case 0x10:
{
memcpy(info.setting.mac, &UartWiFi_Cfg_TmpBuf[6], 6);
}
break;
} /*end of switch*/
UartWiFi_Cfg_lseek += (UartWiFi_Cfg_DataLen +8); /*one frame length*/
UartWiFi_Cfg_TmpBufLen -= UartWiFi_Cfg_lseek;
memcpy(UartWiFi_Cfg_TmpBuf,&UartWiFi_Cfg_TmpBuf[UartWiFi_Cfg_lseek],UartWiFi_Cfg_TmpBufLen);
memset(&UartWiFi_Cfg_TmpBuf[UartWiFi_Cfg_TmpBufLen],0,data_size-UartWiFi_Cfg_TmpBufLen);
UartWiFi_Cfg_lseek = 0;
if (UartWiFi_Cfg_TmpBufLen > 0 && UartWiFi_Cfg_TmpBuf[0] == 0x00
&& UartWiFi_Cfg_TmpBuf[1] == 0x00)
break;
}/*end of if "##"*/
else
{
/*this frame is an invalid frame,do nothing ,just break the while*/
return false;
}
}/*end of while*/
return true;
}
#endif