加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

嵌入式設(shè)備AP配網(wǎng)實例分享

2022/10/22
2278
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是雜燴君。上一篇筆記我們分享了嵌入式Linux單板連接飛燕物聯(lián)網(wǎng)平臺,這篇我們分享一下配網(wǎng)。

在這之前,建議閱讀往期相關(guān)筆記:

smartconfig一件配網(wǎng):嵌入式大雜燴周記第 5 期 : SmartLink

嵌入式Linux設(shè)備開啟無線AP/無線接入點:廢舊板子再利用:搭建無線調(diào)試環(huán)境!

 

下面我們來簡單分享基于阿里生活物聯(lián)網(wǎng)平臺的AP配網(wǎng)實例。

一、安裝公版手機APP

我們使用公版的手機APP進行配網(wǎng),再云平臺上簡單配置之后,可以掃碼安裝:

 

二、配置AP模式的環(huán)境

無論使用什么云平臺,平臺給我們提供的設(shè)備SDK中,都不會是完整的AP配網(wǎng)功能,比如板子如何進入AP模式,這個SDK是不管的,需要我們?nèi)ミm配。

嵌入式Linux設(shè)備,要開啟無線接入點需要準備如下四個文件:

hostapd:一個用戶態(tài)用于AP和認證服務(wù)器的守護進程。

hostapd.conf:hostapd配置文件,包含無線AP的名稱、密碼等信息。

udhcpd:dhcp撥號的服務(wù)器端。

udhcpd.conf:udhcpd配置文件,配置網(wǎng)關(guān)地址及IP地址的范圍。

 

 

具體的方法可以查看往期筆記:廢舊板子再利用:搭建無線調(diào)試環(huán)境!

二、適配AP配網(wǎng)接口

配網(wǎng)功能阿里有給我們留出接口,我們需要適配這些配網(wǎng)接口。比如我這里使用設(shè)備AP配網(wǎng),需要適配的接口如:

打開AP
int HAL_Awss_Open_Ap(const char *ssid, const char *passwd, int beacon_interval, int hide)
{
    const char *ap_ssid = ssid; /*  "linkkit-ap"; */
 char shell_cmd[SHELL_CMD_MAX_LEN] = {0};
    char ip_buf[64] = {0};

    if (1 == g_ap_conf_net_flag)
    {
        g_ap_conf_net_flag = 0;
        printf("HAL_Awss_Open_Apn");
        printf("ap_ssid = %sn", ap_ssid);
        printf("ap_ssid + 4 = %sn", ap_ssid + 4);
        // 開啟熱點
        system(SHELL_CMD_KILL_NET_PROCESS);  // 殺掉網(wǎng)卡操作相關(guān)的進程
        system(SHELL_CMD_NETCARD_DOWN);      // 禁用網(wǎng)卡
        system(SHELL_CMD_NETCARD_UP);        // 啟用網(wǎng)卡
        system(SHELL_CMD_SET_NETCARD_IP);    // 設(shè)置網(wǎng)卡IP(作為無線AP的網(wǎng)關(guān)IP)
        system(SHELL_CMD_START_UDHCPD);      // 啟動UDHCPD服務(wù)
        system(SHELL_CMD_RM_HOSTAPD_CONF_FILE);
        system(SHELL_CMD_RESET_HOSTAPD_CONF_FILE);
        snprintf(shell_cmd, sizeof(shell_cmd), SHELL_CMD_MODIFY_AP_SSID, ap_ssid + 4);
        system(shell_cmd);                   // 修改AP名稱
        system(SHELL_CMD_START_HOSTAPD);     // 啟動HOSTAPD服務(wù)

        if (strlen(ap_ssid) < sizeof(g_opened_ap)) {
            memcpy(g_opened_ap, ap_ssid, strlen(ap_ssid));
        }
    }
    else
    {
        printf("HAL_Awss_Open_Ap, g_ap_conf_net_flag = FALSEn");
    }

    return 0;
}

關(guān)閉AP

int HAL_Awss_Close_Ap()
{
    /* use nmcli commands to close the previous open Ap */
    printf("HAL_Awss_Close_Apn");
    system(SHELL_CMD_KILL_NET_PROCESS);
 system(SHELL_CMD_WLAN0_DOWN);
    return 0;
}

連接AP

int HAL_Awss_Connect_Ap(
            _IN_ uint32_t connection_timeout_ms,
            _IN_ char ssid[HAL_MAX_SSID_LEN],
            _IN_ char passwd[HAL_MAX_PASSWD_LEN],
            _IN_OPT_ enum AWSS_AUTH_TYPE auth,
            _IN_OPT_ enum AWSS_ENC_TYPE encry,
            _IN_OPT_ uint8_t bssid[ETH_ALEN],
            _IN_OPT_ uint8_t channel)
{
    char ip_buf[64] = {0};
    char shell_cmd[SHELL_CMD_MAX_LEN] = {0};

    printf("HAL_Awss_Connect_Apn");
    printf("ssid = %s, passwd = %sn", ssid, passwd);
    // 重置WiFi配置文件
    system(SHELL_CMD_RM_WIFI_CONF_FILE);
    system(SHELL_CMD_RESET_WIFI_CONF_FILE);

    // 修改WiFi名稱及密碼
    sprintf(shell_cmd, SHELL_CMD_MODIFY_WIFI_SSID, ssid);
    printf("set ssid: %sn", shell_cmd);
    system(shell_cmd);
    memset(shell_cmd, 0sizeof(shell_cmd));
    sprintf(shell_cmd, SHELL_CMD_MODIFY_WIFI_PSW, passwd);
    printf("set passwd: %sn", shell_cmd);
    system(shell_cmd);

 system(SHELL_CMD_WLAN0_UP);
 system(SHELL_CMD_RUN_WPA_SUPPLICANT);
 system(SHELL_CMD_RUN_UDHCPC);

    if (get_local_ip(g_ifname, (char*)ip_buf) > 0)
    {
        printf("robot ip = %sn", ip_buf);
        return 0;
    }

    return -1;
}

進入設(shè)備AP配網(wǎng)模式的接口:

//User can call this function to start device AP of AWSS
void living_platform_do_awss_dev_ap(void)
{
    printf("living_platform_do_awss_dev_apn");
    void* stop_smartconfig_awss_thread = NULL;
    void* dev_ap_open_thread = NULL;
    hal_os_thread_param_t hal_os_thread_param;

    memset(&hal_os_thread_param, 0sizeof(hal_os_thread_param_t));
    hal_os_thread_param.stack_size = 4096;
    hal_os_thread_param.name = "smartconfig_awss_stop";
    HAL_ThreadCreate(&stop_smartconfig_awss_thread, stop_smartconfig_awss, NULL, &hal_os_thread_param, NULL);
    memset(&hal_os_thread_param, 0sizeof(hal_os_thread_param_t));
    hal_os_thread_param.stack_size = 4096;
    hal_os_thread_param.name = "dev_ap_open";
    HAL_ThreadCreate(&dev_ap_open_thread, awss_open_dev_ap, NULL, &hal_os_thread_param, NULL);
}

為了方便測試,使用命令行輸入的字符觸發(fā)配網(wǎng)模式:

void check_input_cmd(void)
{
    if (kbhit()) 
    {
        int ch = 0;
        ch = getchar();
        switch (ch)
        {        
            case '1':
                printf("==========111111 living_platform_do_awss_dev_aprn");
                living_platform_do_awss_dev_ap();
                break;

            default:
                break;
        }
    }
}

篇幅有限,其它代碼不再貼出,測試例子完整工程可在文末獲取。

下面開始運行測試。

步驟:設(shè)備進入配網(wǎng)模式、手機APP給設(shè)備配網(wǎng)并綁定設(shè)備。

使用公版手機APP掃描配網(wǎng)二維碼進行配網(wǎng):

 

 

輸入設(shè)備即將鏈接的WiFi信息:

進入配網(wǎng)模式(我們命令行輸入命令模擬硬件進入配網(wǎng)):

連接設(shè)備熱點:

設(shè)備連接路由器、綁定過程:

設(shè)備添加成功:

 

本篇筆記代碼獲取

本篇筆記的demo可在本公眾號【嵌入式大雜燴】后臺回復(fù)關(guān)鍵詞:飛燕平臺AP配網(wǎng) ,即可獲取。

以上就是基于飛燕平臺的AP配網(wǎng)的例子分享,如果覺得文章有幫助,麻煩幫忙轉(zhuǎn)發(fā),謝謝!

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時,公眾號內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進步!