获取wifi用户名连接热点

#include <stdint.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include "wifimng.h"
	
#define LOCAL_PORT (5050)
#define UI_WIFI_PWD_SSID_LEN (16)
static int8_t g_server_id[32] = {0};
typedef enum
{
	TRUE = 0,
	FALSE
} BOOL;
typedef enum en_PDT_UI_WIFI_CHOOSE_MODE //wifi开始时候进入的步骤
{
	PDT_UI_WIFI_SSID_PWD = 0,
	PDT_UI_WIFI_CONNECT_WIFI,
	PDT_UI_WIFI_GET_WIFI_SERVER_IP,
	PDT_UI_WIFI_CONNECT_TCP_SERVER,
	PDT_UI_WIFI_CONNECT_TCP_RECV,
	PDT_UI_WIFI_MODE_BUTTU
} PDT_UI_WIFI_CHOOSE_MODE;

typedef enum en_PDT_UI_WIFI_MSG_FLAG //wifi密码成功失败
{
	PDT_UI_WIFI_SSID_PWD_SUCCESS = 0,
	PDT_UI_WIFI_SSID_PWD_FAIL,
	PDT_UI_WIFI_SSID_PWD_NULL,
	PDT_UI_WIFI_BUTTU
} PDT_UI_WIFI_MSG_FLAG;

typedef struct hiUI_WIFI_SSID_PWD
{
	int8_t wifi_ssid[UI_WIFI_PWD_SSID_LEN];
	int8_t wifi_pwd[UI_WIFI_PWD_SSID_LEN];
} UI_WIFI_SSID_PWD;

static int32_t g_wifi_socket_fd = 0;                           //socket文件描述符




// socket 连接server
int socket_connect_server(uint8_t re_times)
{
    	uint8_t re_times_tmp = re_times;
    	struct sockaddr_in server_addr;
    	struct sockaddr_in server_addr1;
    	bzero(&server_addr, sizeof(server_addr));                     //初始化结构体
    	server_addr.sin_family = AF_INET;                             //设置地址家族
    	server_addr.sin_port = htons(LOCAL_PORT);                     //设置端口号,将主机的无符号短整形数转换成网络字节顺序
    	server_addr.sin_addr.s_addr = inet_addr((char *)g_server_id); //主机地址,将一个 ip 地址字符串转换成一个整数值;

    	printf("-----g_server_id--=%s------\n", (char *)g_server_id);

    	if (inet_pton(AF_INET, (char *)g_server_id, &server_addr1.sin_addr) <= 0) // ip地址都是null的说明是非法的,获取也没用,重新获取
    	{
        	printf("[%s] is not a valid IPaddress\n", g_server_id);
        	// exit(1);
        	return -1;
    	}

    	g_wifi_socket_fd = socket(AF_INET, SOCK_STREAM, 0); //创建socket
    	if (g_wifi_socket_fd < 0)
    	{
        	printf("---create ----socket--faile--\n");
        	return g_wifi_socket_fd;
    	}


	while (re_times_tmp--)
	{
		sleep(1);
		if (-1 == connect(g_wifi_socket_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in))) //连接server
		{
			printf("---connect ----host--faile--\n");
			continue;
		}
		else
		{
			printf("---connect ----success--\n");
			break;
		}
	}

	if(re_times_tmp == 0)
        {
                return FALSE;
        }
	int32_t ret = 0;
	int32_t err_times = 0;
	char sendline[1024] = "hahahah";
	while(1)
	{
		memset(sendline,0x0,sizeof(sendline));
		//3.增加v2x原始数据的接口
		
		//if(无数据)
		//{
			//usleep(200*1000);
			//continue;	
		//}
		//发送
		ret = write(g_wifi_socket_fd , sendline , strlen(sendline));
		if(ret < strlen(sendline))
		{
			perror("write error");
			err_times++;
			if(err_times > 3)//30次收不到数据就退出
			{
				break;
			}
			continue;
		}
		err_times = 0;
		
		
	}

    return TRUE;
}

//获取wifi地址
int pdt_ui_get_wifi_serverip(uint8_t re_times, uint8_t *wifi_server_id)
{
    uint8_t re_times_tmp = re_times;
    while (re_times_tmp--)
    {
        sleep(1);
        printf("--------------get---ipsddr-------\n");
        if (TRUE == get_gateway((char *)g_server_id))
        {
            memcpy(wifi_server_id, g_server_id, sizeof(g_server_id));
            printf("--------------get---ipsddr---success--------\n");
            return TRUE;
        }
        else if (-1 == get_gateway((char *)g_server_id))
        {
            printf("--------------get---ipsddr---faile--------\n");
            return FALSE;
        }
    }
    return re_times;
}

UI_WIFI_SSID_PWD g_wifi_information = {0};
//连接wifi,根据自己的sdk来掉取命令或api
int pdt_ui_wifi_connect(uint8_t re_times)
{


    int32_t ret = TRUE;
    uint8_t re_times_tmp = re_times;
    //HI_HAL_WIFI_Disconnect(); //断开wifi

   // memmove(&stCfg.unCfg.stStaCfg.unCfg.stSeniorCfg.stCfg.szWiFiSSID, g_wifi_information.wifi_ssid, UI_WIFI_PWD_SSID_LEN);
    //memmove(&stCfg.unCfg.stStaCfg.unCfg.stSeniorCfg.stCfg.szWiFiPWD, g_wifi_information.wifi_pwd, UI_WIFI_PWD_SSID_LEN);

    while (re_times--)
    {
        sleep(1);
        printf("-----connect=----------\n");
       // ret = HI_HAL_WIFI_Connect(&stCfg.unCfg.stStaCfg.unCfg.stSeniorCfg); //连接wifi
        if (ret != TRUE)
        {
            printf("------HI_HAL_WIFI_Scan--faile---\n");
            return ret;
        }
        else
        {
            return TRUE;
        }
        printf("------------ret=%d---\n", ret);
    }
    return re_times;
}

// 获取wifi名密码
int get_wifi_msg_from_bt(void)
{



   //用与从蓝牙获取wifi名字跟密码
#ifdef CONFIG_BLUETOOTH_ON
    uint8_t wifi_ssid_pass_status = BTMNG_NAVIGATION_STATUS_BUTT;

    hi_btmng_get_wifi_ssid_pass_status(&wifi_ssid_pass_status);//获取wifi名跟用户名成功的标志
    // printf("-----------------wifi_ssid_pass_status----=%d--\n", wifi_ssid_pass_status);
    if (wifi_ssid_pass_status == BTMNG_NAVIGATION_STATUS_WIFI_SSID_PASS_SUCCESS)//成功获取到wifi名跟密码
    {

        mcu_get_wifi_ssid_pwd(&g_wifi_information);// 1.替换为当前获取用户名,跟密码的接口
        if (strlen((char *)g_wifi_information.wifi_ssid) && strlen((char *)g_wifi_information.wifi_pwd))
        {
            return PDT_UI_WIFI_SSID_PWD_SUCCESS;//成功返回标志
        }
        else
        {
            return PDT_UI_WIFI_SSID_PWD_NULL;
        }
    }
#endif
    return PDT_UI_WIFI_SSID_PWD_FAIL;
}


/*
需要修改点
1.增加获取用户名,跟密码的接口
2.增加wifi断开,wifi连接接口
3.增加v2x原始数据的接口
4.把 CONFIG_BLUETOOTH_ON 打开
*/
//  int v2x_original_data_send(void)
  int main()
    {
        
        //1.判断wifi用户名,密码
        //2. 连接wifi
        //3.连接server
        //4.接收数据

        uint8_t start_mode_status = PDT_UI_WIFI_SSID_PWD;
        uint8_t ssid_buff[64] = {0};
        //uint8_t wifi_ssid_pas_status = BTMNG_NAVIGATION_STATUS_BUTT;

        int ret = TRUE;
        while(1)
        {

            sleep(1);
            switch (start_mode_status)
            {
                case PDT_UI_WIFI_SSID_PWD://获取用户名
                       // printf("-----------PDT_UI_WIFI_SSID_PWD------\n");
                        if (PDT_UI_WIFI_SSID_PWD_SUCCESS == get_wifi_msg_from_bt()) //密码获取成功
                        {
                            start_mode_status = PDT_UI_WIFI_CONNECT_WIFI;
                        }
                        //wifi_ssid_pas_status = BTMNG_NAVIGATION_STATUS_BUTT;//用户名跟密码成功的标志位置0

                       // hi_btmng_set_wifi_ssid_pass_success_flag(&wifi_ssid_pas_status); //蓝牙发送热点名称,密码状态
                        break;

                case PDT_UI_WIFI_CONNECT_WIFI://连接wifi
                        if (TRUE == pdt_ui_wifi_connect(10))//连接成功
                        {
                            start_mode_status = PDT_UI_WIFI_GET_WIFI_SERVER_IP;
                        }
                        else
                        {
                            start_mode_status = PDT_UI_WIFI_SSID_PWD; //设置用户名,密码
                        }
                    break;

                case PDT_UI_WIFI_GET_WIFI_SERVER_IP:         //获取wifi server地址
                        ret = pdt_ui_get_wifi_serverip(10, ssid_buff);
                        if (TRUE < ret) // 获取10次没有获取到
                        {
                            start_mode_status = PDT_UI_WIFI_CONNECT_WIFI; //  重新连接返回连接热点,地址/wifi异常
                        }
                        else if( TRUE == ret)// 获取成功
                        {
                            start_mode_status = PDT_UI_WIFI_CONNECT_TCP_RECV;
                        }
                        else if (FALSE == ret) //获取失败
                        {
                            start_mode_status = PDT_UI_WIFI_SSID_PWD;//  重新等待获wifi用户名密码
                        }
                    break;

                case PDT_UI_WIFI_CONNECT_TCP_RECV://连接tcp
                        printf("-----------PDT_UI_WIFI_CONNECT_TCP_RECV------\n");
                        socket_connect_server(10);
                        start_mode_status = PDT_UI_WIFI_SSID_PWD; //  重新等待wifi用户名
                        break;

                    default:
                    break;
            }
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值