# 請問如何同時啟用 STA 與 AP Mode 呢? (RTL8722DM)

**URL:** <https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767>\
**Category:** WiFi\
**Tags:** 中文, rtl872xd\
**Created:** [September 6, 2021, 9:25am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767 "2021-09-06T09:25:22Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![David\_Xiao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/david_xiao/32/626_2.png) [@David\_Xiao](https://forum.amebaiot.com/u/David_Xiao)\
**Post date:** [September 6, 2021, 9:25am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/1 "2021-09-06T09:25:22Z")

</div>

Hi，我想於 RTL8722DM 同時啟用 AP 與 STA  
但是實際情況會如下：  
AP、STA 單獨啟動 =\> 正常  
AP and STA 同時啟動 =\> 先啟動者會斷開連線， 剩下後啟動者  
請問要怎麼做才能讓 AP 與 STA 模式同時啟用呢?

編譯器為 Arduino IDE  
以下是我使用的 Code  
#include \<WiFi.h\>

char ap\_ssid = “yourNetwork”; //Set the AP’s SSID  
char ap\_pass = “Password”; //Set the AP’s password

char channel = “1”; //Set the AP’s channel  
int ap\_status = WL\_IDLE\_STATUS; //Set the Wifi radio’s status  
int sta\_status = WL\_IDLE\_STATUS; //Set the Wifi radio’s status

char sta\_ssid = “yourNetwork”; //Set the STA’s SSID  
char sta\_pass = “Password”; //Set the STA’s password

int ssid\_status = 0; //Set SSID status, 1 hidden, 0 not hidden

void setup() {  
//Initialize serial and wait for port to open:  
Serial.begin(115200);  
while (!Serial) {  
; // wait for serial port to connect. Needed for native USB port only  
}

```auto
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);
}

// attempt to start AP:
while (ap_status != WL_CONNECTED) {
    Serial.print("Attempting to start AP with SSID: ");
    Serial.println(ap_ssid);
    ap_status = WiFi.apbegin(ap_ssid, ap_pass, channel, ssid_status);
    delay(5000);
}
Serial.print("AP Status: ");
Serial.println(ap_status);

// attempt to start STA:
while (sta_status != WL_CONNECTED) {
    Serial.print("Attempting to start AP with SSID: ");
    Serial.println(sta_ssid);
    sta_status = WiFi.begin(sta_ssid, sta_pass);
    delay(5000);
}
Serial.print("STA Status: ");
Serial.println(sta_status);

```

}

void loop() {  
//  
}

---

<div class="post-metadata">

**Author:** ![xidameng](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/xidameng/32/18_2.png) [@xidameng](https://forum.amebaiot.com/u/xidameng)\
**Post date:** [September 7, 2021, 2:30am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/2 "2021-09-07T02:30:56Z")

</div>

Hi @David_Xiao

請查看下面的code

> <https://github.com/ambiot/ambd_arduino/blob/109a977ba91a0612f35c473c1ee64d652008e282/Arduino_package/hardware/cores/arduino/wifi_drv.cpp#L316>

如果要AP和STA同時開啓，需要將這一行的參數改成下面的macro：

`RTW_MODE_STA_AP`

更多訊息可以在下面找到：

> <https://github.com/ambiot/ambd_arduino/blob/master/Arduino_package/hardware/system/component/common/drivers/wlan/realtek/include/wifi_constants.h>

---

<div class="post-metadata">

**Author:** ![David\_Xiao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/david_xiao/32/626_2.png) [@David\_Xiao](https://forum.amebaiot.com/u/David_Xiao)\
**Post date:** [September 7, 2021, 9:26am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/3 "2021-09-07T09:26:56Z")

</div>

您好，非常感謝您的幫忙  
但是有些問題想要請教您  
問題1：修改 macro 後，先啟動 STA(WiFi.begin) 後，啟動 AP (WiFi.apbegin)，原本連線到的 STA 會斷開連線，我嘗試修改 wifi\_drv.cpp 的RTW\_MODE\_STA → RTW\_MODE\_STA\_AP，但依然無法改善

問題2：先啟動 AP (WiFi.apbegin) 後，啟動 STA(WiFi.begin) ，AP的 SSID 可以搜尋的到，STA 也無中斷連線，但是 Print 出現的 code 顯示 AP 錯誤：LwIP\_DHCP: dhcp stop，ERROR: Start AP timeout  
手機嘗試連線時，則出現：無法加入網路，若您的網路安全性由WiFi 位址所管理，您可能需要關閉"專用WIFI 位址" 或修改您的網路設定

問題3：今日嘗試連線 5 GHz 的網路，但是無法連線上，想詢問您要如何使用 WiFi.h 的 Function 進行設定呢？

不好意思，再麻煩您協助指教了

---

<div class="post-metadata">

**Author:** ![xidameng](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/xidameng/32/18_2.png) [@xidameng](https://forum.amebaiot.com/u/xidameng)\
**Post date:** [September 8, 2021, 4:37pm UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/4 "2021-09-08T16:37:13Z")

</div>

當你使用wifi begin的時候，你就用到了下面的function，這裏是默認只支持STA模式的，看這裏

> <https://github.com/ambiot/ambd_arduino/blob/109a977ba91a0612f35c473c1ee64d652008e282/Arduino_package/hardware/cores/arduino/wifi_drv.cpp#L74>

你可以試著用上面的方法改一下，但是這不是最好的解決方法，最好的還是可以創建一個新的API來調整WiFi的模式參數

---

<div class="post-metadata">

**Author:** ![David\_Xiao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/david_xiao/32/626_2.png) [@David\_Xiao](https://forum.amebaiot.com/u/David_Xiao)\
**Post date:** [September 10, 2021, 7:32am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/5 "2021-09-10T07:32:32Z")

</div>

您好，我嘗試創建 Function 來測試  
STA 連線的同時，AP 的顯示也出現了  
但是點選 AP 名稱連線時，則顯示無法連線

附件為我模仿原有 Code 創建的 Function  
WiFi.cpp  
//----------------------New----------------------//  
int WiFiClass::repeaterBegin(char\* ap\_ssid, char\* ap\_password, char\* ap\_channel, uint8\_t ap\_hidden\_ssid, char\* sta\_ssid, const char\* sta\_passphrase)  
{  
uint8\_t status = WL\_IDLE\_STATUS;  
WiFiDrv::repeaterInit();

```
status = WiFiDrv::apRepeaterSetting(ap_ssid, strlen(ap_ssid), ap_password, strlen(ap_password), ap_channel);
printf("AP : %d\n", status);

status = WiFiDrv::staRepeaterSetting(sta_ssid, strlen(sta_ssid), sta_passphrase, strlen(sta_passphrase));
printf("STA : %d\n", status);

WiFiDrv::repeaterDriverRun(ap_hidden_ssid);

return status;

```

}  
//----------------------New----------------------//

wifi\_drv.cpp  
//----------------------New----------------------//  
int8\_t WiFiDrv::apRepeaterSetting(char\* ssid, uint8\_t ssid\_len, const char \*passphrase, uint8\_t len, const char \*channel)  
{  
int ret = WL\_SUCCESS;

```
//SSID Cheak
ap.ssid.len = ssid_len;

if (ap.ssid.len > 32) {
    printf("Error: SSID length can't exceed 32\n\r");
    ret = WL_FAILURE;
}
strcpy((char *)ap.ssid.val, (char*)ssid);

if (ap.ssid.val[0] == 0) {
    printf("Error: SSID can't be empty\n\r");
    ret = WL_FAILURE;
}

//Password Cheak
strcpy((char *)password, (char*)passphrase);
ap.password = password;
ap.password_len = len;
if (ap.password_len <= 0) {
    printf("Error: Password can't be empty\n\r");
    ret = WL_FAILURE;
}

ap.security_type = RTW_SECURITY_WPA2_AES_PSK;

//Channel
ap.channel = (unsigned char) atoi((const char *)channel);
	
return ret;

```

}

int8\_t WiFiDrv::staRepeaterSetting(char\* ssid, uint8\_t ssid\_len, const char \*passphrase, const uint8\_t len)  
{  
int ret = WL\_SUCCESS;

```
memset(wifi.bssid.octet, 0, ETH_ALEN);
memcpy(wifi.ssid.val, ssid, ssid_len);
wifi.ssid.len = ssid_len;

if(wifi.ssid.len <= 0){
	printf("Error: SSID can't be empty\n\r");
    ret = WL_FAILURE;
}

memset(password, 0, sizeof(password));
memcpy(password, passphrase, len);

wifi.password = password;
wifi.password_len = len;

if(wifi.password_len <= 0){
	printf("Error: Password can't be empty\n\r");
    ret = WL_FAILURE;
}

wifi.security_type = RTW_SECURITY_WPA2_AES_PSK;
wifi.key_id = 0;

return ret;

//
uint8_t dhcp_result;
ret = wifi_connect((char*)wifi.ssid.val, wifi.security_type, (char*)wifi.password, wifi.ssid.len, wifi.password_len, wifi.key_id, NULL);

if (ret == RTW_SUCCESS) {
	dhcp_result = LwIP_DHCP(0, DHCP_START);
    if (dhcp_result == DHCP_ADDRESS_ASSIGNED) {
        return WL_SUCCESS;
    } else {
        wifi_disconnect();
        return WL_FAILURE;
    }
}

return ret;

```

}

int8\_t apRepeaterActivate(uint8\_t hidden\_ssid)  
{   
int timeout = 20;  
int ret = WL\_SUCCESS;

```
printf("\n\rStarting AP ...");

if (hidden_ssid == 1) {
    ret = wifi_start_ap_with_hidden_ssid((char*)ap.ssid.val, ap.security_type, (char*)ap.password, ap.ssid.len, ap.password_len, ap.channel);
} else {
    ret = wifi_start_ap((char*)ap.ssid.val, ap.security_type, (char*)ap.password, ap.ssid.len, ap.password_len, ap.channel);
}

if(ret < 0) {
    printf("\n\rERROR: Operation failed!");
    ret = WL_FAILURE;
}

while (1) {
    char essid[33];

    if (wext_get_ssid(WLAN1_NAME, ((unsigned char *)essid)) > 0) {
        if (strcmp(((const char *)essid), ((const char *)ap.ssid.val)) == 0) {
            printf("\n\r%s started\n", ap.ssid.val);
            ret = WL_SUCCESS;
            break;
        }
    }

    if (timeout == 0) {
        printf("\n\rERROR: Start AP timeout!");
        ret = WL_FAILURE;
        break;
    }

    vTaskDelay(1 * configTICK_RATE_HZ);
    timeout --;
}
return ret;

```

}

int8\_t staRepeaterActivate()  
{  
int ret;  
uint8\_t dhcp\_result;

```
ret = wifi_connect((char*)wifi.ssid.val, wifi.security_type, (char*)wifi.password, wifi.ssid.len, wifi.password_len, wifi.key_id, NULL);

if (ret == RTW_SUCCESS) {
	dhcp_result = LwIP_DHCP(0, DHCP_START);
    if (dhcp_result == DHCP_ADDRESS_ASSIGNED) {
        return WL_SUCCESS;
    } else {
        wifi_disconnect();
        return WL_FAILURE;
    }
}

return ret;

```

}

void WiFiDrv::repeaterDriverRun(uint8\_t hidden\_ssid)  
{   
struct netif \*pnetif = &xnetif[0];  
wifi\_mode = RTW\_MODE\_STA\_AP;

```
if (init_wlan == false) {
	printf("init_wlan : false\n\r");	
    init_wlan = true;
    LwIP_Init();
	wifi_on(RTW_MODE_STA_AP);	
	staRepeaterActivate();		
	apRepeaterActivate(hidden_ssid);
	dhcps_init(pnetif);		
} else if(init_wlan == true){
	printf("init_wlan : true\n\r");		
	dhcps_deinit();
	wifi_off();
	vTaskDelay(20);
	wifi_on(RTW_MODE_STA_AP);
	staRepeaterActivate();
	apRepeaterActivate(hidden_ssid);
    dhcps_init(pnetif);
}

```

}

void WiFiDrv::repeaterInit()  
{  
init\_wifi\_struct();  
}  
//----------------------New----------------------//

再麻煩您協助解惑了

---

<div class="post-metadata">

**Author:** ![xidameng](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/xidameng/32/18_2.png) [@xidameng](https://forum.amebaiot.com/u/xidameng)\
**Post date:** [September 14, 2021, 10:42am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/6 "2021-09-14T10:42:54Z")

</div>

hi @David_Xiao  
看來你是想要做wifi repeater，這樣子的話，或許你直接看在standard SDK裏面已有的wifi repeater示例會比較好，因爲這個功能在arduino SDK是暫時還沒有支援的。

這個示例在GCC環境下編譯后一樣是可以用在RTL8722DM的

> **[ambd\_sdk/component/common/example/wlan\_repeater at master · ambiot/ambd\_sdk](https://github.com/ambiot/ambd_sdk/tree/master/component/common/example/wlan_repeater)**
>
> master/component/common/example/wlan\_repeater

這邊有完整的過程解釋：

> <https://github.com/ambiot/ambd_sdk/blob/02af0516a1ab59a3df7cb563e875340a8560a294/component/common/example/wlan_repeater/example_wlan_repeater.c#L30>

---

<div class="post-metadata">

**Author:** ![David\_Xiao](https://sea2.discourse-cdn.com/flex016/user_avatar/forum.amebaiot.com/david_xiao/32/626_2.png) [@David\_Xiao](https://forum.amebaiot.com/u/David_Xiao)\
**Post date:** [September 16, 2021, 12:10am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/7 "2021-09-16T00:10:53Z")

</div>

Hi @xidameng  
wifi repeater 是由朋友告訴我的名稱  
但並不確定 AP 與 STA 模式同時啟用是否為這個稱呼  
我想要製作的是類似 ESP32 - “AP與STA模式” 同時存在的功能  
並以此為基底製作 Wifi Mesh 的功能  
非常感謝您的耐心指導，我會嘗試看看的

---

<div class="post-metadata">

**Author:** ![Sky](https://avatars.discourse-cdn.com/v4/letter/s/f4b2a3/32.png) [@Sky](https://forum.amebaiot.com/u/Sky)\
**Post date:** [February 13, 2023, 9:37am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/8 "2023-02-13T09:37:32Z")

</div>

@xidameng 您好！请问 STA 和 AP 同时开启的话，必须在同一信道吗？支不支持 STA 和 AP 在不同信道的情况？比如 STA 在信道 1，AP 在信道 6

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [February 14, 2023, 5:22am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/9 "2023-02-14T05:22:09Z")

</div>

STA 和 AP 是必须在同一信道，因为无线通讯硬件只有一个。

---

<div class="post-metadata">

**Author:** ![Sky](https://avatars.discourse-cdn.com/v4/letter/s/f4b2a3/32.png) [@Sky](https://forum.amebaiot.com/u/Sky)\
**Post date:** [February 14, 2023, 5:29am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/10 "2023-02-14T05:29:47Z")

</div>

@wyy RTL8710BN 也是吗？STA 和 AP 必须同一个信道？

---

<div class="post-metadata">

**Author:** ![wyy](https://avatars.discourse-cdn.com/v4/letter/w/bc8723/32.png) [@wyy](https://forum.amebaiot.com/u/wyy)\
**Post date:** [February 14, 2023, 5:37am UTC](https://forum.amebaiot.com/t/sta-ap-mode-rtl8722dm/767/11 "2023-02-14T05:37:17Z")

</div>

应该是，这些芯片都只有一个无线通讯硬件
