代码工程的GITHUB连接:点进进入GITHUB仓库
https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi

Marvell自己实现驱动系列文章分为几篇介绍:
SDIO wifi Marvell8801/Marvell88w8801 介绍(一) ---- 芯片介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- 寄存器介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- 命令/事件/数据格式
SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- TLV
SDIO wifi Marvell8801/Marvell88w8801 介绍(六) ---- 实现初始化功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(七) ---- 实现搜索功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(八) ---- 实现STA功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(九) ---- 实现AP功能
SDIO wifi Marvell8801/Marvell88w8801 介绍(十) ---- 移植TCP/IP协议栈LWIP
SDIO wifi Marvell8801/Marvell88w8801 介绍(十一) ---- 自己编写LWIP没有的DHCP server
SDIO wifi Marvell8801/Marvell88w8801 介绍(十二) ---- MQTT介绍
SDIO wifi Marvell8801/Marvell88w8801 介绍(十三) ---- 百度云操作说明
SDIO wifi Marvell8801/Marvell88w8801 介绍(十四) ---- 上位机STA操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十五) ---- 上位机AP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十六) ---- 上位机UDP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十七) ---- 上位机TCP操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十八) ---- 上位机PING操作/代码
SDIO wifi Marvell8801/Marvell88w8801 介绍(十九) ---- 上位机云服务器(百度云)操作/代码
每篇更新打开专栏可以看到:打开Marvell8801/Marvell8801 专栏

1. 上位机照片


功能如下:
①串口配置区,默认是921600的波特率
②Wi-Fi功能开启区
③STA功能调试区
④AP功能调试区
⑤PING功能调试区
⑥TCP功能调试区
⑦UDP功能调试区
⑧云服务器调试区
⑨Debug日志区
跟AP有关的界面如下:

①要设置的热点名称,密码,如果是OPEN热点,那么密码会忽略
②是否隐藏热点,隐藏热点的的功能是虽然可以创建热点,但是不能被搜索到
③热点的加密类型,包括open/wap/wpa2,open是没有密码
④建立热点
⑤停止热点
⑥断开某一个STA的连接
⑦目前连接到这个热点的STA

2. 上位机与STM32通信格式

目前上位机跟开发板是通过串口来通信,通信格式是json,如果你没听过json,那么自行百度,跟WIFI AP相关的json格式分别如下:

1)上位机给STM32发送json的代码如下:

上位机用的c# winform,用的json库using Newtonsoft.Json,此库需要Newtonsoft.Json.dll库
发送代码如下:

private void json_construction_send(string func, string operate, string param1, string param2, string param3, string param4, string param5, string param6)
{json_commmand cmd = new json_commmand();cmd.FUNC = func;cmd.OPERATE = operate;cmd.PARAM1 = param1;cmd.PARAM2 = param2;cmd.PARAM3 = param3;cmd.PARAM4 = param4;cmd.PARAM5 = param5;cmd.PARAM6 = param6;string json_cmd = JsonConvert.SerializeObject(cmd);
#if  CONSOLE_DEBUGConsole.WriteLine(json_cmd);
#endifif (serialPort1.IsOpen){serialPort1.WriteLine(json_cmd);}
}

其中跟wifi ap相关的operate为:

string operate_wifi_start_ap = "WIFI_START_AP";
string operate_wifi_stop_ap = "WIFI_STOP_AP";
string operate_wifi_ap_disconnect_sta = "WIFI_DISCONNECT_STA";

2)STM32收到json的命令解析框架

uint8_t uart_receive_parse(uint8_t *shell_string)
{uint8_t result = HW_ERR_OK;cJSON* parse_json = cJSON_Parse((const char *)shell_string);uint8_t* func_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"FUNC"))->valuestring;uint8_t* operate_value = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"OPERATE"))->valuestring;uint8_t* para1 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM1"))->valuestring;uint8_t* para2 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM2"))->valuestring;uint8_t* para3 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM3"))->valuestring;uint8_t* para4 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM4"))->valuestring;uint8_t* para5 = (uint8_t*)((cJSON *)cJSON_GetObjectItem(parse_json,"PARAM5"))->valuestring;if(strcmp((const char *)func_value,"WIFI") == 0){if(hw_strcmp((const char *)operate_value,"WIFI_START_AP") == 0){ap_info_t ap_info;HW_DEBUG("UART PARSE DEBUG:operate WIFI_START_AP\n");hw_memset(&ap_info,0,sizeof(ap_info_t));hw_memcpy(ap_info.ssid,para1,hw_strlen((const char*)para1));ap_info.ssid_len= hw_strlen((const char*)para1);if(hw_strcmp((const char*)para3,"OPEN") == 0)ap_info.security = WIFI_SECURITY_NONE;else if(hw_strcmp((const char*)para3,"WPA") == 0){hw_memcpy(ap_info.pwd,para2,hw_strlen((const char*)para2));ap_info.pwd_len= hw_strlen((const char*)para2);ap_info.security = WIFI_SECURITY_WPA;}else if(hw_strcmp((const char*)para3,"WPA2") == 0){hw_memcpy(ap_info.pwd,para2,hw_strlen((const char*)para2));ap_info.pwd_len= hw_strlen((const char*)para2);ap_info.security = WIFI_SECURITY_WPA2;}if(hw_strcmp((const char*)para4,"HIDDEN") == 0)ap_info.broadcast_ssid = 0;elseap_info.broadcast_ssid = 1;wifi_start_ap(&ap_info);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;}if(hw_strcmp((const char *)operate_value,"WIFI_STOP_AP") == 0){HW_DEBUG("UART PARSE DEBUG:operate WIFI_STOP_AP\n");wifi_stop_ap();operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;}if(hw_strcmp((const char *)operate_value,"WIFI_DISCONNECT_STA") == 0){uint8_t index = 0;uint8_t mac_address[6] = {0};HW_DEBUG("UART PARSE DEBUG:operate WIFI_DISCONNECT_STA\n");for(index = 0; index < 6; index++)mac_address[index] = (nibble_for_char(*(para1+index*3)) << 4) | nibble_for_char(*(para1+index*3 + 1));wifi_disconnect_sta(mac_address);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;}    }if(hw_strcmp((const char *)shell_string,"shop220811498.taobao.com") == 0)HW_DEBUG("welcome to use our stm32f1 camera wifi board\n");elseHW_DEBUG("UART PARSE ERR:HW_ERR_SHELL_NO_CMD\n");result = HW_ERR_SHELL_NO_CMD;
exit:cJSON_Delete(parse_json);return result;
}

3)STM32给上位机发送json的代码如下:

uint8_t uart_send_json(uint8_t *func,uint8_t *operate,uint8_t *status,uint8_t *para1,uint8_t *para2,uint8_t *para3,uint8_t *para4,uint8_t *para5)
{uint8_t *wifi_status_string;cJSON *wifi_json_status = cJSON_CreateObject();cJSON_AddStringToObject(wifi_json_status, "FUNC", (const char*)func);cJSON_AddStringToObject(wifi_json_status, "OPERATE", (const char*)operate);cJSON_AddStringToObject(wifi_json_status, "STATUS", (const char*)status);if(para1)cJSON_AddStringToObject(wifi_json_status, "PARAM1", (const char*)para1);if(para2)cJSON_AddStringToObject(wifi_json_status, "PARAM2", (const char*)para2);if(para3)cJSON_AddStringToObject(wifi_json_status, "PARAM3", (const char*)para3);if(para4)cJSON_AddStringToObject(wifi_json_status, "PARAM4", (const char*)para4);if(para5)cJSON_AddStringToObject(wifi_json_status, "PARAM5", (const char*)para5);wifi_status_string = (uint8_t *)cJSON_Print(wifi_json_status);HW_DEBUG("%s\n",wifi_status_string);cJSON_Delete(wifi_json_status);free(wifi_status_string);return 0;
}

4)上位机接收STM32 json的代码如下

private void json_status_recv_parse(json_status status)
{#if  CONSOLE_DEBUGConsole.WriteLine("----------json_status_recv_parse-------------");Console.WriteLine("json func:" + status.FUNC);Console.WriteLine("json operate:" + status.OPERATE);Console.WriteLine("json status:" + status.STATUS);Console.WriteLine("json param1:" + status.PARAM1);Console.WriteLine("json param2:" + status.PARAM2);Console.WriteLine("json param3:" + status.PARAM3);Console.WriteLine("json param4:" + status.PARAM4);Console.WriteLine("json param5:" + status.PARAM5);Console.WriteLine("----------json_status_recv_parse  end--------");
#endifif (status.FUNC == "WIFI"){if (status.OPERATE == "WIFI_START_AP"){if (status.STATUS == "SUCCESS"){//linfo_role.Text = "AP";//linfo_status.Text = "开启热点成功";bwifi_start_ap.Enabled = false;bwifi_stop_ap.Enabled = true;bshow_ip.Enabled = false;}}if (status.OPERATE == "WIFI_AP_CON_IND"){int count = dgwifi_ap_con_result.Rows.Count;for (int index = 0; index < count - 1; index++){if (dgwifi_ap_con_result.Rows[index].Cells[0].Value.ToString() == status.PARAM1){#if  CONSOLE_DEBUGConsole.WriteLine("数据存在");
#endifreturn;}}int data_index = dgwifi_ap_con_result.Rows.Add();dgwifi_ap_con_result.Rows[data_index].Cells[0].Value = status.PARAM1;dgwifi_ap_con_result.Rows[data_index].Cells[1].Value = status.PARAM2;dgwifi_ap_con_result.Rows[data_index].Cells[2].Value = status.PARAM3;if (dgwifi_ap_con_result.Rows.Count > 0){bwifi_disconnect_sta.Enabled = true;}}if (status.OPERATE == "WIFI_AP_DISCON_RET"){int count = dgwifi_ap_con_result.Rows.Count;for (int index = 0; index < count - 1; index++){string mac = dgwifi_ap_con_result.Rows[index].Cells[1].Value.ToString();if (mac == status.PARAM1){dgwifi_ap_con_result.Rows.RemoveAt(index);}}if (dgwifi_ap_con_result.Rows.Count > 1){bwifi_disconnect_sta.Enabled = true;}else{bwifi_disconnect_sta.Enabled = false;}}}
}

3.开启热点


1)上位机给STM32发送开启热点命令

private void bwifi_start_ap_Click(object sender, EventArgs e)
{string security = "OPEN";string hidden;string ssid = tap_ssid.Text;if (ssid == ""){MessageBox.Show("请填入热点名称", "错误提示");return;}string pwd = tap_pwd.Text;if (rsec_open.Checked)security = "OPEN";else if (rsec_wap.Checked)security = "WPA";else if (rsec_wpa2.Checked)security = "WPA2";if (security != "OPEN" && (pwd == "")){MessageBox.Show("请填入热点密码", "错误提示");return;}if (cap_hidden.Checked)hidden = "HIDDEN";elsehidden = "";json_construction_send(wifi_func, operate_wifi_start_ap, ssid, pwd, security, hidden, null, null);
}

2)STM32接收到cmd执行的动作

if(hw_strcmp((const char *)operate_value,"WIFI_START_AP") == 0)
{ap_info_t ap_info;HW_DEBUG("UART PARSE DEBUG:operate WIFI_START_AP\n");hw_memset(&ap_info,0,sizeof(ap_info_t));hw_memcpy(ap_info.ssid,para1,hw_strlen((const char*)para1));ap_info.ssid_len= hw_strlen((const char*)para1);if(hw_strcmp((const char*)para3,"OPEN") == 0)ap_info.security = WIFI_SECURITY_NONE;else if(hw_strcmp((const char*)para3,"WPA") == 0){hw_memcpy(ap_info.pwd,para2,hw_strlen((const char*)para2));ap_info.pwd_len= hw_strlen((const char*)para2);ap_info.security = WIFI_SECURITY_WPA;}else if(hw_strcmp((const char*)para3,"WPA2") == 0){hw_memcpy(ap_info.pwd,para2,hw_strlen((const char*)para2));ap_info.pwd_len= hw_strlen((const char*)para2);ap_info.security = WIFI_SECURITY_WPA2;}if(hw_strcmp((const char*)para4,"HIDDEN") == 0)ap_info.broadcast_ssid = 0;elseap_info.broadcast_ssid = 1;wifi_start_ap(&ap_info);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

3)STM32给上位机发送初始化结果

void wifi_start_ap_result(uint8_t status)
{uart_send_json("WIFI","WIFI_START_AP",status==0?(uint8_t*)"SUCCESS":(uint8_t*)"FAIL",0,0,0,0,0);
}

4)上位机接收STM32初始化结果的处理

if (status.OPERATE == "WIFI_START_AP")
{if (status.STATUS == "SUCCESS"){//linfo_role.Text = "AP";//linfo_status.Text = "开启热点成功";bwifi_start_ap.Enabled = false;bwifi_stop_ap.Enabled = true;bshow_ip.Enabled = false;}
}

4.关闭热点

1)上位机给STM32发送开启热点命令

private void bwifi_stop_ap_Click(object sender, EventArgs e)
{json_construction_send(wifi_func, operate_wifi_stop_ap, null, null, null, null, null, null);bwifi_start_ap.Enabled = true;bwifi_stop_ap.Enabled = false;
}

2)STM32接收到cmd执行的动作

if(hw_strcmp((const char *)operate_value,"WIFI_STOP_AP") == 0)
{HW_DEBUG("UART PARSE DEBUG:operate WIFI_STOP_AP\n");wifi_stop_ap();operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

5. 热点把某一个设备踢掉

1)上位机给STM32发送开启热点命令

private void bwifi_disconnect_sta_Click(object sender, EventArgs e)
{if (ap_disconnect_sta == ""){MessageBox.Show("请选择要断开的STA", "错误提示");return;}json_construction_send(wifi_func, operate_wifi_ap_disconnect_sta, ap_disconnect_sta, null, null, null, null, null);ap_disconnect_sta = "";
}

2)STM32接收到cmd执行的动作

if(hw_strcmp((const char *)operate_value,"WIFI_DISCONNECT_STA") == 0)
{uint8_t index = 0;uint8_t mac_address[6] = {0};HW_DEBUG("UART PARSE DEBUG:operate WIFI_DISCONNECT_STA\n");for(index = 0; index < 6; index++)mac_address[index] = (nibble_for_char(*(para1+index*3)) << 4) | nibble_for_char(*(para1+index*3 + 1));wifi_disconnect_sta(mac_address);operate_stauts_oled_show(func_value,operate_value,"SUCCESS",0,0,0,0,0,0);goto exit;
}

6. 热点监测有设备连接

1)STM32发送连接设备信息给上位机

void wifi_ap_connect_result(uint8_t *name,uint8_t *mac,uint8_t *ip)
{uint8_t mac_str[20] = {0};sprintf((char*)mac_str,"%02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);HW_DEBUG("wifi_ap_connect_result\n");HW_DEBUG("name %s\n",name);HW_DEBUG("mac %s\n",mac_str);HW_DEBUG("ip %s\n",ip);uart_send_json("WIFI","WIFI_AP_CON_IND","SUCCESS",name,mac_str,ip,0,0);
}

2)上位机处理连接设备信息

if (status.OPERATE == "WIFI_AP_CON_IND")
{int count = dgwifi_ap_con_result.Rows.Count;for (int index = 0; index < count - 1; index++){if (dgwifi_ap_con_result.Rows[index].Cells[0].Value.ToString() == status.PARAM1){#if  CONSOLE_DEBUGConsole.WriteLine("数据存在");
#endifreturn;}}int data_index = dgwifi_ap_con_result.Rows.Add();dgwifi_ap_con_result.Rows[data_index].Cells[0].Value = status.PARAM1;dgwifi_ap_con_result.Rows[data_index].Cells[1].Value = status.PARAM2;dgwifi_ap_con_result.Rows[data_index].Cells[2].Value = status.PARAM3;if (dgwifi_ap_con_result.Rows.Count > 0){bwifi_disconnect_sta.Enabled = true;}}

7. 热点监测有设备断开

1)STM32发送断开设备信息给上位机

void wifi_ap_disconnect_result(uint8_t *mac)
{uint8_t mac_str[20] = {0};HW_DEBUG("wifi_ap_disconnect_result\n");HW_DEBUG("mac %s\n",mac_str);sprintf((char*)mac_str,"%02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);uart_send_json("WIFI","WIFI_AP_DISCON_RET","SUCCESS",mac_str,0,0,0,0);
}

2)上位机处理断开设备信息

if (status.OPERATE == "WIFI_AP_DISCON_RET")
{int count = dgwifi_ap_con_result.Rows.Count;for (int index = 0; index < count - 1; index++){string mac = dgwifi_ap_con_result.Rows[index].Cells[1].Value.ToString();if (mac == status.PARAM1){dgwifi_ap_con_result.Rows.RemoveAt(index);}}if (dgwifi_ap_con_result.Rows.Count > 1){bwifi_disconnect_sta.Enabled = true;}else{bwifi_disconnect_sta.Enabled = false;}}

STM32驱动Marvell8801介绍(十五) ---- Marvell8801开启open热点/开启wpa热点/开启wpa2热点相关推荐

  1. 【正点原子STM32连载】 第二十五章 TFTLCD(MCU屏)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  2. 【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视 ...

  3. linux route 刷新_linux基础命令介绍十五:推陈出新

    本文介绍ip.ss.journalctl和firewall-cmd,它们旨在代替linux中原有的一些命令或服务. 1.ip ip [OPTIONS] OBJECT COMMAND ip是iprout ...

  4. Linux驱动开发(十五)---如何使用内核现有驱动(显示屏)

    前文回顾 <Linux驱动开发(一)-环境搭建与hello world> <Linux驱动开发(二)-驱动与设备的分离设计> <Linux驱动开发(三)-设备树> ...

  5. 【正点原子STM32连载】 第十五章 按键输入实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视 ...

  6. STM32学习心得三十五(上):VS1053实验之RAM测试及正弦测试

    记录一下,方便以后翻阅~ 主要内容: 1) 硬件连接: 2) VS1053简介: 3) 相关实验及其代码解读. 实验功能:程序开启后,系统先进行RAM测试,再进行正弦测试,可以接耳机听到所设的单频声音 ...

  7. Linux 驱动开发 三十五:Linux 内核时钟管理

    参考: linux时间管理,时钟中断,系统节拍_u010936265的博客-CSDN博客_系统节拍时钟中断 Linux内核时钟系统和定时器实现_anonymalias的专栏-CSDN博客_linux内 ...

  8. 从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)

    这里我们肯定不是要从零开始编写网卡驱动的. 因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学. 将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研. 这里主 ...

  9. 嵌入式Linux驱动笔记(二十五)------Input子系统框架

    你好!这里是风筝的博客, 欢迎和我一起交流. 一.Input子系统概述 二.Input子系统架构 三.Input子系统工作机制 3.1 核心层(input.c) 3.1.1 input_init函数 ...

  10. STM32入门(二十五)----高级定时器

    高级定时器 定时器 高级定时器 高级定时器GPIO 高级定时器功能框图 时钟源 内部时钟源 外部时钟1 外部时钟2 内部触发输入 内部触发连接 TIM1为TIM2提供时钟 控制器 时基单元 预分频器 ...

最新文章

  1. ASP程序快速生成Excel文件
  2. rtp 多媒体流同步控制 实时传输协议 简介
  3. Nhibernate 多对多级联删除
  4. 对话框Flags的设置值
  5. 【学习笔记】ABAP OOD设计模式 - 观察者模式
  6. Jarvis OJ web(一)
  7. wxWidgets:TextCtrl示例
  8. Coriant助力Aureon部署100Gbps光纤网络
  9. 大整数算术求值 c语言 栈,用C语言实现 多位整数的四则运算,用栈,例如56*(12+20)-102/2...
  10. 大数据售前的一点感悟
  11. ios自定义控件,使UIScrollView自己处理输入时键盘遮挡控件
  12. 不用 SWIG,Go 使用 C++ 代码的方式
  13. 关闭ArcGIS9.3时 .NET Framework出现尝试读取或写入受保护的内存问题
  14. QTcpSever和QTcpSocket实现多线程客户端和服务端;
  15. 高数符号用计算机表示,请问高等数学的符号怎么在电脑上打出来
  16. dbt(data build tool) is an open source data transformation, and using Jinji templating
  17. 豌豆荚Hack Day:百宝袋负责人访谈
  18. 一种永不止步的进取精神的勤奋
  19. 在线支付系列【4】支付安全之数字签名
  20. JOL(java object layout --java 对象内存布局)

热门文章

  1. 【分享贴】I2C无法访问ATEC508A加密芯片问题
  2. Linux设备驱动-platform虚拟总线dya01
  3. Notepad++的字体设置为 Consolas 和微软雅黑混合字体转载
  4. [BZOJ3698]XWW的难题(有源汇上下界最大流+讲解)
  5. 情人节买什么礼物比较好呢?最实用的情人节礼物分享
  6. ad中按钮开关的符号_电工新手必经之路:按钮开关结构原理及安装
  7. python列表删除元素问题+指针问题进阶杂谈
  8. JS中如何阻止事件的传播
  9. HRBUST 1162 魔女【DP】
  10. 书本例子strindex函数