1.1.1. WiFi控制
RokidOS 将一些常用 WiFi 控制函数已经封装成接口,并提供通用API方便开发者进行扩展。
STATION 模式API
现有基本上所有的 Linux 内核嵌入式 WiFi 设备都支持 wpa_supplicant 进行 WiFi STATION 模式的管理和配置。所以 RokidOS 也是将 WiFi 控制封装成 wpa_supplicant 控制接口。第三方开发者也可以移植到其他依赖于 wpa_supplicant 控制的第三方设备中。代码相关路径位于 robot/external/wpa_ctrl,常用接口如下:
// connect network ssid : net->ssid psk: net->psk key :net->key_mgmt
int wifi_join_network(struct wifi_network *net);
// join network need reset dhcp
void dhcp_reset();
// save current ssid psk config to wpa_supplicant.conf
int wifi_save_network();
// get current ap signal
int wifi_get_signal(int *sig);
// get current wifi status
int wifi_get_status(int *status);
// get wifi ap list , must after scan
int wifi_get_scan_result(struct wifi_scan_list *list);
// get current net status by ping taobao
int network_get_status(int *status);
// get list network , return num:1 have configed
int wifi_get_listnetwork(int *num);
// trigger wifi scan
int wifi_scan();
// get wpa_supplicant monitor socket
int wifi_connect_moni_socket(const char * path);
// get monitor socket data
int wifi_ctrl_recv(char *reply, int *reply_len);
// close monitor socket
void wifi_monitor_release();
// disable network id
int wifi_disable_network(int *id);
// disable all network
int wifi_disable_all_network();
同时我们提供了一个通用接口,上述所有接口均是通过这个接口来实现的。
// current supplicant cmd
enum {
WIFI_COMMAND_SCAN,
WIFI_COMMAND_ADDNETWORK,
WIFI_COMMAND_SETNETWORK_SSID,
WIFI_COMMAND_SETNETWORK_PSK,
WIFI_COMMAND_SETNETWORK_KEYMETH,
WIFI_COMMAND_ENABLENETWORK,
WIFI_COMMAND_SELECTNETWORK,
WIFI_COMMAND_RECONFIGURE,
WIFI_COMMAND_REATTACH,
WIFI_COMMAND_GET_STATUS,
WIFI_COMMAND_GET_SIGNAL,
WIFI_COMMAND_SAVECONFIG,
WIFI_COMMAND_SCAN_R,
WIFI_COMMAND_LISTNETWORK,
}WIFI_COMMAND;
int wifi_send_command(int cmd, void *value, int val_len, void *res, int res_len);
AP模式API
对于目前支持 RokidOS 的几款官方开发板,采用的 WiFi 模组是“博通”公司的 AP6255 芯片,“博通”公司的 wifi 芯片 AP 与 STATION 切换需要对网卡驱动进行卸载重装,所以配网方式不建议使用 AP 模式配网,这会造成多次 WiFi 模式的切换,耗时可能比较严重。不过给出以下方法,开发者可以自行配置,进入 AP 模式。
首先,buildroot 需要增加 dnsmasq 的软件包。如果配置对应的 config 文件, 以 A113 来讲,对应路径是: buildroot/configs/banban_m_a113_release_defconfig。
BR2_PACKAGE_DNSMASQ=y
BR2_PACKAGE_DNSMASQ_TFTP=y
BR2_PACKAGE_DNSMASQ_DHCP=y
如果需要进入 AP 模式,需要依次执行以下命令,对应的 hostapd 和 dnsmasq 没有提供对应的 systemd service 服务文件,开发者如果需要添加,可以参考我们的 supplicant.service 服务进行配置。
# 关闭 wpa_supplicant 服务和 wifimonitor 服务
systemctl stop supplicant
systemctl stop wifimonitor
# 卸载 WiFi 驱动
rmmod dhd
# 把 WiFi 驱动加载成 AP 模式
multi_wifi_load_driver ap 1
# 构造 WiFi AP 参数,其中 ssid 和 wpa_passphrase 分别对应 SSID 和 密码, 例如此配置文件对应的 SSID 是 rokid,密码是 rokidos_psk
echo "interface=wlan0
driver=nl80211
ctrl_interface=/var/run/hostapd
ssid=rokid
channel=6
ieee80211n=1
ieee80211ac=1
hw_mode=g
hw_mode=a
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=rokidos_psk
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP" > /etc/hostapd_temp.conf
# 启动 hostapd (AP 管理软件)
hostapd -B /etc/hostapd_temp.conf
# 配置网卡的 IP 地址
ifconfig wlan0 192.168.2.1
# 启动 dns 和 dhcp 服务, 其中注意 IP 参数要与 IP 地址相对应
dnsmasq -iwlan0 --dhcp-option=3,192.168.2.1 --dhcp-range=192.168.2.50,192.168.2.200,12h -p100
配网
RokidOS 配套的开发板支持 WiFi 连接 internet ,系统提供了一些控制 WiFi 连接的接口,配网业务及网络监控服务。设备第一次连接网络需要第三方设备发送 WiFi 相关信息如 SSID , PSK 和加密方式到设备,第一次联网方式支持如下方式: