STM32驱动Marvell8801介绍(十五) ---- Marvell8801开启open热点/开启wpa热点/开启wpa2热点
代碼工程的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庫
發送代碼如下:
其中跟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热点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高精度气体压力控制中TESCOM ER5
- 下一篇: 搜狗输入法