1.WIFI的STA和AP是什么?
AP(Access Point)无线接入点
AP是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
STA(Station)站点
STA也可以理解为终端的意思,每一个连接到无线网络中的终端(例如笔记本电脑,手机等其他可以联网的设备)都可以成为一个STA站点。
SSID(Service Set Identifier)服务集标识符
每个无线AP都应该有一个SSID用于识别,就是通常所说的WIFI名
BSSID(Basic Service Set Identifier)基本服务集标识符
每一个网络设备都有其用于识别的物理地址,这个东西就是MAC地址。一般在出厂后会有一个默认MAC,可更改。MAC地址作为设备识别的标识符。BSSID是针对STA而言。对于STA来说,获取到AP接入点的MAC地址就是BSSID。
例如:某个AP释放一个名为A的WIFI热点,同一区域内另一个AP也释放一个名为A的WIFI热点,当手机连接A热点时,如何辨别连接的是哪个AP呢?此时就要用到BSSID。一般情况下BSSID可以理解为无线路由器的MAC地址,通过查看手机连接WIFI的MAC地址即可知道连接的是哪个AP。
ESSID(Extended Service Set Identifier)扩展服务集标识符
ESSID是一个比较抽象的概念,它实际上和SSID相同,只是如果有好几个AP热点名字相同,此时就相当于把这个SSID扩大了,这几个AP共同的名字就叫ESSID。
例如:某个AP释放一个名为A的WIFI热点,同一区域内另一个AP也释放一个名为A的WIFI热点,那么A就是ESSID。
2.AP的相关配置
typedef struct {
uint8_t ssid[WIFI_MAX_LENGTH_OF_SSID]; /**< The SSID of the AP. */
uint8_t ssid_length; /**< The length of the SSID. */
uint8_t password[WIFI_LENGTH_PASSPHRASE]; /**< The password of the AP. */
uint8_t password_length; /**< The length of the password. */
wifi_auth_mode_t auth_mode; /**< The authentication mode. */
wifi_encrypt_type_t encrypt_type; /**< The encryption mode. */
uint8_t channel; /**< The channel. */
uint8_t bandwidth; /**< The bandwidth that is either #WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_20MHZ or #WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_40MHZ. */
wifi_bandwidth_ext_t bandwidth_ext; /**< The bandwidth extension. It is only applicable when the bandwidth is set to #WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_40MHZ. */
} wifi_ap_config_t;
ssid
生成的热点名称,最大32字节
ssid_length
生成的热点名称长度
password
无线热点的连接密码,最大64字节
password_length
密码长度
auth_mode
认证模式。
typedef enum {
WIFI_AUTH_MODE_OPEN = 0, /**< Open mode. */
WIFI_AUTH_MODE_SHARED, /**< Not supported. */
WIFI_AUTH_MODE_AUTO_WEP, /**< Not supported. */
WIFI_AUTH_MODE_WPA, /**< Not supported. */
WIFI_AUTH_MODE_WPA_PSK, /**< WPA_PSK. */
WIFI_AUTH_MODE_WPA_None, /**< Not supported. */
WIFI_AUTH_MODE_WPA2, /**< Not supported. */
WIFI_AUTH_MODE_WPA2_PSK, /**< WPA2_PSK. */
WIFI_AUTH_MODE_WPA_WPA2, /**< Not supported. */
WIFI_AUTH_MODE_WPA_PSK_WPA2_PSK, /**< Mixture mode. */
WIFI_AUTH_MODE_WPA3, /**< Not supported. */
WIFI_AUTH_MODE_WPA3_PSK, /**< WPA3_PSK. */
WIFI_AUTH_MODE_WPA2_WPA3, /**< Not supported. */
WIFI_AUTH_MODE_WPA2_PSK_WPA3_PSK, /**< Mixture mode. */
WIFI_AUTH_MODE_MAX,
} wifi_auth_mode_t;
WIFI_AUTH_MODE_OPEN
开放模式,不需要输入密码即可连接。任何人都可以连接到无线热点并使用网络
WEP(Wired Equivalent Privacy)有线等效加密
最基本的加密技术。手机、笔记本电脑、AP拥有相同的网络密钥,才能解读互相传递的数据。密钥分为64bits及128bits两种。最多可设定四组不同的密钥。当用户端进入WLAN前必须输入正确的密钥才能进行连接。
WEP加密方法很脆弱。网络上每个客户或者计算机都是用了相同的保密字,这种方法使网络偷听者能刺探到密钥,偷走数据并且在网络上造成混乱。
WPA(WIFI Protected Access)保护无线电脑安全系统
由WIFI联盟所提供的无线安全标准,分为家用WPA-PSK(Pre-Shared Key)与企业用的WPA-Enterprise版本。
WPA-PSK
为了堵塞WEP的漏洞而发展的加密技术,使用方法与WEP相似。AP与STA必须设定相同的KEY才可以连入网络。但进入WLAN时长更长词组或子串作为网络金钥。并且WPA-PSK运用了TKIP(Temporal Key Integrity Protocol)技术,因此比WEP难被破解而更加安全。
WPA-PSK通过为每个客户分配唯一的密钥而工作,但需要给雇员密码以便登录系统。这样,外部的人可通过他们享用网络资源。如果希望修改密码(建议每隔一段时间修改密码以防止偷听者解码),可以到每台电脑前去输入新的密码。
WPA-Enterprise
采用IEEE 802.1x则需要有另一台储存无线使用者账户数据的RADIUS (Remote Authentication Dial-In User Service)服务器,当笔记型计算机连入无线基地台时,无线基地台会要求使用者输入账号密码、或是自动向笔记型计算机索取储存在计算机硬盘的使用者数字凭证,然后向RADIUS服务器确认使用者的身分。而用来加密无线封包的加密金钥(Key),也是在认证的过程中自动产生,并且每一次联机所产生的金钥都不同(专业术语称为Session Key),因此非常难被破解。
用用户名和密码安全登陆网络后,每个客户会自动得到一个唯一的密钥,密钥很长并且每隔一段时间就会被更新。这样wi-Fi监听者就不能获取足够的数据包来解码密钥。即使一个密钥因为某种原因被解码了,富于经验的黑客有可能发现新的密钥,但是加密锁已经变了。
一但应用了WPA-Enterprise,不像WPA-PSK那样,雇员将不会知道密码。这样,外部的人就不能通过他们享用网络资源。WPA-Enterprise还可以节约你大量的时间;你无需花费大量的时间去人工更换客户的密码。
WPA2
WPA2顾名思义就是WPA的加强版,也就是IEEE 802.11i无线网络标准。同样有家用的PSK版本与企业的IEEE 802.1x版本。WPA2与WPA的差别在于,它使用更安全的加密技术AES (Advanced Encryption Standard),因此比WPA更难被破解、更安全。
WPA3
WPA3,它将会取代WPA2。新标准为每个用户使用192比特加密和单独加密。Wi-Fi联盟还称,WPA3将缓解由弱密码造成的安全问题,并简化无显示接口设备的设置流程。
encrypt_type
加密模式
typedef enum {
WIFI_ENCRYPT_TYPE_WEP_ENABLED = 0, /**< WEP encryption type. */
WIFI_ENCRYPT_TYPE_ENCRYPT1_ENABLED = WIFI_ENCRYPT_TYPE_WEP_ENABLED, /**< WEP encryption type. */
WIFI_ENCRYPT_TYPE_WEP_DISABLED = 1, /**< No encryption. */
WIFI_ENCRYPT_TYPE_ENCRYPT_DISABLED = WIFI_ENCRYPT_TYPE_WEP_DISABLED, /**< No encryption. */
WIFI_ENCRYPT_TYPE_WEP_KEY_ABSENT = 2, /**< Not supported. */
WIFI_ENCRYPT_TYPE_ENCRYPT_KEY_ABSENT = WIFI_ENCRYPT_TYPE_WEP_KEY_ABSENT, /**< Not supported. */
WIFI_ENCRYPT_TYPE_WEP_NOT_SUPPORTED = 3, /**< Not supported. */
WIFI_ENCRYPT_TYPE_ENCRYPT_NOT_SUPPORTED = WIFI_ENCRYPT_TYPE_WEP_NOT_SUPPORTED, /**< Not supported. */
WIFI_ENCRYPT_TYPE_TKIP_ENABLED = 4, /**< TKIP encryption. */
WIFI_ENCRYPT_TYPE_ENCRYPT2_ENABLED = WIFI_ENCRYPT_TYPE_TKIP_ENABLED, /**< TKIP encryption. */
WIFI_ENCRYPT_TYPE_AES_ENABLED = 6, /**< AES encryption. */
WIFI_ENCRYPT_TYPE_ENCRYPT3_ENABLED = WIFI_ENCRYPT_TYPE_AES_ENABLED, /**< AES encryption. */
WIFI_ENCRYPT_TYPE_AES_KEY_ABSENT = 7, /**< Not supported. */
WIFI_ENCRYPT_TYPE_TKIP_AES_MIX = 8, /**< TKIP or AES mix. */
WIFI_ENCRYPT_TYPE_ENCRYPT4_ENABLED = WIFI_ENCRYPT_TYPE_TKIP_AES_MIX, /**< TKIP or AES mix. */
WIFI_ENCRYPT_TYPE_TKIP_AES_KEY_ABSENT = 9, /**< Not supported. */
WIFI_ENCRYPT_TYPE_GROUP_WEP40_ENABLED = 10, /**< Not supported. */
WIFI_ENCRYPT_TYPE_GROUP_WEP104_ENABLED = 11, /**< Not supported. */
#ifdef WAPI_SUPPORT
WIFI_ENCRYPT_TYPE_ENCRYPT_SMS4_ENABLED, /**< WPI SMS4 support. */
#endif /* WAPI_SUPPORT */
} wifi_encrypt_type_t;
WIFI_ENCRYPT_TYPE_ENCRYPT1_ENABLED
WEP加密方式
WIFI_ENCRYPT_TYPE_ENCRYPT2_ENABLED
TKIP加密方式
WIFI_ENCRYPT_TYPE_ENCRYPT3_ENABLED
AES加密方式
WIFI_ENCRYPT_TYPE_ENCRYPT4_ENABLED
TKIP+AES加密方式
channel
信道,也成为通道或频段,是以无线信号作为传输载体的数据信号传送通道。
2.4G频段的工作频率为2.4-2.4835GHz,这83.5MHz频带划分为13个信道,各信道中心频率相差5MHz,向上向下分别扩展11MHz,信道带宽22MHz。中国采用欧洲/ETSI标准,使用1-13信道,如图所示:
相近无线路由器采用相同或重叠信道会形成信道竞争关系,相互影响无线链路质量,为了有效避免信道重叠造成的相互干扰,相近无线路由器应选择互不重叠的信道工作,如(1、6、11),(1、7、13)等,但无线路由器并非只能工作在这些信道。
bandwidth
带宽。可选20M和40M
/**@brief Specifies 20MHz bandwidth in the 2.4GHz band.
*/
#define WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_20MHZ (0x00)
/**@brief Specifies 40MHz bandwidth in the 2.4GHz band.
*/
#define WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_40MHZ (0x01)
/**@brief Specifies 20MHz | 40MHz bandwidth in the 2.4GHz band.
*/
#define WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_2040MHZ (WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_20MHZ|WIFI_IOT_COMMAND_CONFIG_BANDWIDTH_40MHZ)
bandwidth_ext
带宽扩展参数,只有40M时生效。
typedef enum {
WIFI_BANDWIDTH_EXT_40MHZ_UP, /**< 40MHz up. */
WIFI_BANDWIDTH_EXT_40MHZ_BELOW /**< 40MHz below. */
} wifi_bandwidth_ext_t;
3.STA的相关配置
typedef struct {
uint8_t ssid[WIFI_MAX_LENGTH_OF_SSID]; /**< The SSID of the target AP. */
uint8_t ssid_length; /**< The length of the SSID. */
uint8_t bssid_present; /**< The BSSID is present if it is set to 1. Otherwise, it is set to 0. */
uint8_t bssid[WIFI_MAC_ADDRESS_LENGTH]; /**< The MAC address of the target AP. */
uint8_t password[WIFI_LENGTH_PASSPHRASE]; /**< The password of the target AP. */
uint8_t password_length; /**< The length of the password. If the length is 64, the password is regarded as PMK. */
} wifi_sta_config_t;
ssid
要连接的热点名称,最大32字节
ssid_length
连接的热点名称长度
bssid_present
BSSID是否有效
bssid
BSSID内容,最大6字节
password
连接密码,最大64字节
password_length
密码长度
4.实例
配置 AP为开放模式
wifi_config_t config = {0};
config.opmode = WIFI_MODE_AP_ONLY;
strcpy((char *)config.ap_config.ssid, "MTK_SOFT_AP");
config.ap_config.ssid_length = strlen((char *)config.ap_config.ssid);
config.ap_config.auth_mode = WIFI_AUTH_MODE_OPEN;
config.ap_config.encrypt_type = WIFI_ENCRYPT_TYPE_WEP_DISABLED;
config.ap_config.channel = 6;
wifi_init(&config, NULL);
或
wifi_config_set_opmode(WIFI_MODE_AP_ONLY);
wifi_config_set_ssid(WIFI_PORT_AP, "MTK_SOFT_AP", strlen("MTK_SOFT_AP"));
wifi_config_set_security_mode(WIFI_PORT_AP, WIFI_AUTH_MODE_OPEN,
WIFI_ENCRYPT_TYPE_WEP_DISABLED);
wifi_config_set_channel(WIFI_PORT_AP, 6);
wifi_config_reload_setting();
配置AP为WPA2PSK模式
wifi_config_t config = {0};
config.opmode = WIFI_MODE_AP_ONLY;
strcpy((char *)config.ap_config.ssid, "MTK_SOFT_AP");
config.ap_config.ssid_length = strlen("MTK_SOFT_AP");
config.ap_config.auth_mode = WIFI_AUTH_MODE_WPA2_PSK;
config.ap_config.encrypt_type = WIFI_ENCRYPT_TYPE_AES_ENABLED;
strcpy((char *)config.ap_config.password, "12345678");
config.ap_config.password_length = strlen("12345678");
config.ap_config.channel = 6;
wifi_init(&config, NULL);
或
wifi_config_set_opmode(WIFI_MODE_AP_ONLY);
wifi_config_set_ssid(WIFI_PORT_AP, "MTK_SOFT_AP", strlen("MTK_SOFT_AP"));
wifi_config_set_security_mode(WIFI_PORT_AP, WIFI_AUTH_MODE_WPA2_PSK,
WIFI_ENCRYPT_TYPE_AES_KEY_ENABLED);
wifi_config_set_wpa_psk_key(WIFI_PORT_AP, "12345678", strlen("12345678"));
wifi_config_set_channel(WIFI_PORT_AP, 6);
wifi_config_reload_setting();
配置AP为WEP开放模式
wifi_config_t config = {0};
wifi_config_ext_t config_ext = {0};
config.opmode = WIFI_MODE_AP_ONLY;
strcpy((char *)config.ap_config.ssid, "MTK_SOFT_AP");
config.ap_config.ssid_length = strlen("MTK_SOFT_AP");
config.ap_config.auth_mode = WIFI_AUTH_MODE_OPEN;
config.ap_config.encrypt_type = WIFI_ENCRYPT_TYPE_WEP_ENABLED;
strcpy((char *)config.ap_config.password, "1234567890");
config.ap_config.password_length = strlen("1234567890");
config.ap_config.channel = 6;
config_ext.ap_wep_key_index_present = 1;
config_ext.ap_wep_key_index = 0;
wifi_init(&config, &config_ext);
或
wifi_wep_key_t keys = {{{0}}};
uint8_t key_id = 0; //0~3
char *key_string = "1234567890";
uint8_t length = strlen(key_string);
if (key_id < 4) {
keys.wep_key_length[key_id] = length;
os_memcpy(&keys.wep_key[key_id], key_string, length);
}
wifi_config_set_opmode(WIFI_MODE_AP_ONLY);
wifi_config_set_ssid(WIFI_PORT_AP, "MTK_SOFT_AP", strlen("MTK_SOFT_AP"));
wifi_config_set_security_mode(WIFI_PORT_AP, WIFI_AUTH_MODE_OPEN,
WIFI_ENCRYPT_TYPE_WEP_ENABLED);
wifi_config_set_wep_key(WIFI_PORT_AP, &keys);
wifi_config_set_channel(WIFI_PORT_AP, 4);
wifi_config_reload_setting();