Можно ли создать точку доступа Wi-Fi с устройства Android, используя его соединение Wi-Fi, а не данные сотовой связи?
Без помощи какого-либо стороннего приложения (например, Netshare), изменив какой-либо код в настройках приложения?
Примечание.
У меня AOSP 7.0, поэтому вопрос о корневом устройстве не стоит.
Я не знаю какого-либо простого инструмента, кроме приложений для Android (которые используют Wi-Fi Direct), которые позволили бы одновременно использовать Wi-Fi и точку доступа. Также это не стандартная функция, представленная в пользовательских ПЗУ до сих пор (AFAIK). Однако вы можете сделать это вручную, если вам удобно использовать командную строку. Но это НЕ возможно без рута.
Устройство должно поддерживать драйвер nl80211
Все новые устройства с чипсетом Qualcomm MSM поддерживают этот AFAIK, например, Xiaomi Redmi Note 4 (mido), построенный на MSM8953 .
Ядро также должно поддерживать этот драйвер. Подтвердить:
~# zcat /proc/config.gz | grep CONFIG_CFG80211
CONFIG_CFG80211=y
~# lshw | grep wireless=
configuration: broadcast=yes driver=wcnss_wlan multicast=yes wireless=Qcom:802.11n
Устройство должно поддерживать managed
режим и AP
режим одновременно.
~# iw phy | grep -iA2 'valid interface combinations'
valid interface combinations:
* #{ managed } <= 3, #{ IBSS, AP } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 1
Это означает, что ваш беспроводной чип поддерживает создание не более 3 интерфейсов, один из которых может быть в AP
режиме, а другие в режиме managed
или , и поддерживается P2P
не более 1 канала . Если значение канала равно 2, вы можете использовать оба интерфейса на разных каналах. Однако рекомендуется использовать один и тот же канал, чтобы избежать помех.
Стандартный интерфейс wi-fi на Android-устройствах (обычно wlan0
) всегда работает в managed
режиме. Мы собираемся создать виртуальный беспроводной интерфейс, который будет работать в AP
режиме.
Инструменты Linux: iw
, ip
, iptables
, hostapd
, и dnsmasq
т.д.
Вы также можете использовать wpa_supplicant
вместо hostapd
с немного другой конфигурацией.
Обычно эти бинарники идут в комплекте с Android. Однако Google и поставщики внесли модификации, чтобы эти инструменты соответствовали потребностям Android. Поэтому они могут не вести себя как стандартные инструменты Linux, и в редких случаях вам может потребоваться скомпилировать их из исходного кода.
Беспроводные инструменты должны быть достаточно новыми, чтобы иметь поддержку драйвера nl80211
.
Для простоты использования я суммировал все шаги в сценарии оболочки с краткими пояснениями. Вы можете поместить это в свой $PATH, например, /system/bin/android_ap
и выполнить его напрямую: ~# android_ap start
. Пользовательская плитка быстрых настроек также может быть создана для простоты использования.
#!/system/bin/sh
set -e
#set -x
[ "$(id -u)" != 0 ] && echo 'Not running as root!' && exit
SSID=MyAP # set this to your desired string (avoid spaces and non-ascii characters)
PASSCODE=foobarfoobar # set this to your desired string (8 to 63 characters)
WIFI_INTERFACE=wlan0 # set this according to your device (lshw | grep -A10 Wireless | grep 'logical name')
SUBNET=192.168.42 # must be different than WIFI_INTERFACE
AP_INTERFACE=${WIFI_INTERFACE}-AP
IP=${SUBNET}.1
DIR=/data/local/tmp/$AP_INTERFACE
USAGE()
{
echo 'Usage:'
printf '\t%s\n' "$(basename "$0") start|stop"
exit
}
STOP() {
# hope there are no other instances of same daemons
pkill -15 hostapd dnsmasq
# remove iptables rules
iptables -D INPUT -i $AP_INTERFACE -p udp -m udp --dport 67 -j ACCEPT
iptables -t nat -D POSTROUTING -s ${SUBNET}.0/24 ! -o $AP_INTERFACE -j MASQUERADE
iptables -D FORWARD -i $AP_INTERFACE -s ${IP}/24 -j ACCEPT
iptables -D FORWARD -i $WIFI_INTERFACE -d ${SUBNET}.0/24 -j ACCEPT
# delete AP interface
ip link show | grep "${AP_INTERFACE}:" && iw $AP_INTERFACE del
rm -rf $DIR
} >/dev/null 2>&1
CHECKS()
{
for binary in iw ip iptables hostapd dnsmasq; do
which $binary >/dev/null && continue
exit
done
# this check is necessary if need to use single channel
if iw dev $WIFI_INTERFACE link | grep -q '^Not connected'
then
echo 'First connect to Wi-Fi for internet sharing.'
exit
fi
if ! iw phy | grep -iqE '{.*managed.*AP.*}' && ! iw phy | grep -iqE '{.*AP.*managed.*}'
then
echo 'AP mode not supported.'
exit
fi
}
CREATE_AP()
{
if ! iw dev $WIFI_INTERFACE interface add $AP_INTERFACE type __ap
then
echo "Couldn't create AP." # :(
exit
fi
}
FIND_CHANNEL()
{
# find what channel wi-fi is using
CHANNEL="$(iw $WIFI_INTERFACE scan | grep -C5 "$(iw $WIFI_INTERFACE link | grep SSID | cut -d: -f2-)" | grep -i channel | tail -c3)"
if [ -z "$CHANNEL" ]
then
echo "Couldn't find channel info. Are you are connected to Wi-Fi?"
STOP
exit
fi
# if more than 1 channels are supported, use any frequency
[ ! -z "$CHANNEL" ] || CHANNEL=11
}
ADD_IP_ROUTE()
{
# activate the interface and add IP
ip link set up dev $AP_INTERFACE
ip addr add ${IP}/24 broadcast ${SUBNET}.255 dev $AP_INTERFACE
# routing table 97 needs to be put necessarily on Android
# because in main table, route for $WIFI_INTERFACE takes priority (ip route show)
# and all traffic goes there ignoring $AP_INTERFACE
ip route add ${SUBNET}.0/24 dev $AP_INTERFACE table 97
}
HOSTAPD_CONFIG()
{
mkdir -p "$DIR"
cat <<-EOF >$DIR/hostapd.conf
# network name
ssid=$SSID
# network interface to listen on
interface=$AP_INTERFACE
# wi-fi driver
driver=nl80211
# WLAN channel to use
channel=$CHANNEL
# ser operation mode, what frequency to use
hw_mode=g
# enforce Wireless Protected Access (WPA)
wpa=2
# passphrase to use for protected access
wpa_passphrase=$PASSCODE
# WPA protocol
wpa_key_mgmt=WPA-PSK
EOF
# you can tune other parameters such as mtu, beacon_int, ieee80211n, wowlan_triggers (if supported)
# for better performace and options such as *_pairwise for better security
}
INTERNET_SHARE()
{
# allow IP forwarding
echo 1 >/proc/sys/net/ipv4/ip_forward
# route and allow forwrding through firewall
iptables -t nat -I POSTROUTING -s ${SUBNET}.0/24 ! -o $AP_INTERFACE -j MASQUERADE
iptables -I FORWARD -i $AP_INTERFACE -s ${IP}/24 -j ACCEPT
iptables -I FORWARD -i $WIFI_INTERFACE -d ${SUBNET}.0/24 -j ACCEPT
}
DHCP_SERVER()
{
# configuration
cat <<-EOF >$DIR/dnsmasq.conf
# we dont want DNS server, only DHCP
port=0
# only listen on AP interface
interface=$AP_INTERFACE
listen-address=$IP
#bind-interfaces
# range of IPs to make available to wlan devices andwhen to renew IP
dhcp-range=$IP,${SUBNET}.254,24h
# where to save leases
dhcp-leasefile=$DIR/dnsmasq.leases
# set default gateway
dhcp-option-force=option:router,$IP
# add OpenDNS servers for DNS lookup to announce
dhcp-option-force=option:dns-server,208.67.220.220,208.67.222.222
#dhcp-option-force=option:mtu,1500
# respond to a client who is requesting from a different IP broadcast subnet
# or requesting an out of range / occupied IP
# or requesting an IP from expired lease of previous sessions
# or obtained from some other server which is offline now
dhcp-authoritative
# don't look for any hosts file and resolv file
no-hosts
no-resolv
EOF
# open listening port
iptables -I INPUT -i $AP_INTERFACE -p udp -m udp --dport 67 -j ACCEPT
# start dhcp server
dnsmasq -C $DIR/dnsmasq.conf
}
if [ "$1" = stop ]
then
STOP || true
exit
fi
[ "$1" = start ] || USAGE
# basic check
CHECKS
# stop running instances
STOP || true
# create virtual wireless interface
CREATE_AP
# find channed already used ny wi-fi
FIND_CHANNEL
# configre newly created interface
ADD_IP_ROUTE
# configure acces point daemon
HOSTAPD_CONFIG
# start hostapd
hostapd -B $DIR/hostapd.conf
# share internet from Wi-Fi to AP
INTERNET_SHARE
# run a dhcp server to assign IP's dynamically
# otherwise assign a static IP to connected device in subnet range (2 to 254)
DHCP_SERVER
echo Done.
set -x
и посмотрите, какая команда выдает ошибку. // Да, ты можешь. Но я этого не сделал. Я предпочитаю init
услуги.В Google Play есть приложение под названием VPN Hopspot — Tethering/Wi-Fi Repeater , оно открыто на GitHub здесь . Должен работать на самых последних устройствах Android на базе Snapdragon SoC (требуется рут).
Отказ от ответственности: я не связан с этим приложением.
Вы не можете просто сделать это без рута. Но вы можете использовать модем USB и BlueTooth, используя сеть Wi-Fi. Я бы предложил использовать модем BlueTooth, если вы хотите поделиться Интернетом на других телефонах, потому что делать все это, чтобы одновременно использовать Wi-Fi и точку доступа, беспорядок.
Иззи
Рэй Фосс