大家好,我是雜燴君。上一篇筆記我們分享了嵌入式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),需要適配的接口如:
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, 0, sizeof(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, 0, sizeof(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, 0, sizeof(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ā),謝謝!