基于lwip协议的socket编程-ap配网

基于lwip协议的socket编程-ap配网

wifi芯片工作模式ap模式和station模式,ap配网,简而言之,我们的设备工作再ap模式,提供给其他设备连接后,可通过http请求将我们设备需要连接wifi的ssid和password传递给我们设备,比如页面登录192.168.1.1(设备ip地址),从设备获取http请求,获取当前设备扫描到的可用网络,设备将数据嵌入到页面信息中。
实现ap配网,设备必须支持tcpip协议栈,可以通过socket编程,实现同一局域网络中不同设备的通信。

1.设置wifi工作在ap模式

wifi_ap_start(wifi_softap, 3);

2.创建一个任务处理ap配网

xTaskCreate(ll_a1_tcp_task, LL_TCP_NAME, LL_TCP_STACKSIZE / ((uint32_t)sizeof(StackType_t)), NULL, LL_TCP_TASK_PRIO, NULL);

3.socket监听http端口(代码已经删减)

void ll_a1_tcp_task(void *param)
{
	fd_set readset;
    int c;
    int ret;
    int rlen;
    struct sockaddr_in addr;
    char srv_buf[3548] = {0};
	int s;
//填充地址结构
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = lwip_htons(80);  //监听http端口
    addr.sin_addr.s_addr = lwip_htonl(0.0.0.0); //接收当前局域网络中所有http数据

//创建套接字
    s = lwip_socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0) {
        printf("TCP server create failed\r\n");
        goto done;
    }
    
//绑定地址结构
    ret = lwip_bind(s, (struct sockaddr *)&addr, sizeof(addr));
    if (ret < 0) {
        printf("TCP server bind failed\r\n");
        goto clean;
    }
    
//设置监听
    ret = lwip_listen(s, 0);
    if (ret < 0) {
        printf("TCP server listen failed\r\n");
        goto clean;
    }
	
	 while(1) {
        socklen_t sockaddr_len = sizeof(addr);
        
//等待请求建立连接,阻塞等待
        c = lwip_accept(s, (struct sockaddr *)&addr, &sockaddr_len);
        if (c < 0) {
            printf("TCP server accept error\r\n");
            break; 
        }
        printf("TCP server waiting for data...\r\n");
		memset(srv_buf, 0, sizeof(srv_buf));
		
//建立连接后,提取数据
        rlen = lwip_read(c, srv_buf, sizeof(srv_buf) - 1);
        
//这里可以通过解析http中的数据,做不同操做,如下是一段伪代码帮助理解
        解析函数();
        if(获取wifi信息请求)
        {
        	//返回带有设备扫描可连接wifi信息
        }
        else if(有ssid or password)
        {
         	//发送获取信息成功
		}
		else if(无ssid password)
		{
			//发送获取信息失败
		}
    }
    lwip_close(c);
    lwip_close(s);
}

代码实现部分很简单,主要要注意返回数据是都是一个简单的html文件,注意html功能的实现以及要把html封装成字符串后通过socket传输。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值