基于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传输。