我正在构建一个Android应用程序,需要通过无法访问互联网的WiFi网络进行通信.问题是,即使连接WiFi,当wifi网络上没有连接互联网时,机器人选择使用蜂窝/移动数据.
我已经阅读了许多关于该问题的帖子,其中许多涉及生根设备,但生产应用程序无法实现这一点(根设备不是一种选择).其他解决方案(如我的代码bellow)建议使用bindProcessToNetwork()哪个在我的Sony Z2上完美运行,但在我测试的其他设备上没有(所有运行6.0.1)
private void bindToNetwork() {
final ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
builder = new NetworkRequest.Builder();
//set the transport type do WIFI
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(null);
if (barCodeData.getSsid().contains("screenspace")) {
connectivityManager.bindProcessToNetwork(network);
}
} else {
//This method was deprecated in API level 23
ConnectivityManager.setProcessDefaultNetwork(null);
if (barCodeData.getSsid().contains("screenspace")) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
}
connectivityManager.unregisterNetworkCallback(this);
}
});
}
}
Run Code Online (Sandbox Code Playgroud) 我有一部Android手机,目标是将手机连接到受密码保护的wifi网络.
到目前为止我知道的步骤:
adb root
adb shell svc wifi enable
Run Code Online (Sandbox Code Playgroud)
好的甜蜜,wifi打开了.现在我需要将手机连接到需要密码的某个无线网络.我希望我可以使用adb shell命令进行连接.
有帮助吗?
我宁愿不将程序下载到设备上
mWifiManager.startScanActive()和之间有什么区别mWifiManager.startScan().和
之间有什么区别?active scanpassive scan
嗨,我正在尝试使用wifimanager api将我的应用程序连接到特定的访问点.现在我有一个我所在区域的所有接入点的列表,从这个列表中我将它们存储在一个数组中并选择要连接的接入点.但在这个阶段是剂量不连接.有人能帮我吗 .
(这是一个我正在尝试连接的开放式网络.)这是我的代码:
public void WifiConfiguration(){
try {
ScanResult networkData = getIntent().getParcelableExtra("networkData");
WifiManager wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String networkPassWord = "";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkData.SSID + "\"";
conf.BSSID = "\"" + networkData.BSSID + "\"";
conf.hiddenSSID = true;
conf.wepKeys[0] = "\"" + networkPassWord + "\"";
conf.wepTxKeyIndex = 0;
conf.status = WifiConfiguration.Status.ENABLED;
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
conf.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
conf.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
conf.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
conf.preSharedKey = "\""+ networkPassWord +"\"";
//conf.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
Log.d(TAG, "Initialising WIFI Manager");
int id = wifiManager.addNetwork(conf);
Log.d(TAG, "conf.SSID: "+conf.SSID);
Log.d(TAG, …Run Code Online (Sandbox Code Playgroud) 使用Android设备创建一个接入点(在我的情况下为Nexus 7).最终目的是将WiFly卡连接到此创建的网络,并在这些设备之间交换数据.
我知道Android版本4.2.2不允许创建一个访问点(该服务是以编程方式禁用的).这就是为什么我用CyanogenMod的ROM植入我的设备.此ROM启用此服务.
谷歌隐藏了一些类的方法WifiManager.具体来说,该方法setWifiApEnabled.这就是为什么我使用反射来调用下面代码的方法.
源代码很大!专注于方法createAccessPoint().我选择整个源代码来帮助那些想知道我是如何完成这一切的人.
public class TestAccessPoint extends Activity {
static final String TAG = "AP_TEST";
static final String SSID = "\"Awesome Access Point\"";
static final String PSK = "\"helloworld\"";
String numberOfClientsConnected;
String wifiApEnable;
String wifiApState;
WifiConfiguration wifiApConfig;
WifiManager wifiManager;
WifiConfiguration wifiConfiguration;
BroadcastReceiver receiver;
BroadcastReceiver receiverWifiDisabled;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.accesspoint_test);
textView = (TextView) findViewById(R.id.textView); …Run Code Online (Sandbox Code Playgroud) 我试图从命令行执行OSX的互联网共享,似乎没有命令,所以我试图通过将网卡转为访问点模式手动完成.我似乎无法找到有关如何在Mac上将无线网卡转为AP模式的任何信息.Linux将使用iwconfig(OSX没有),我已经监控了网络共享打开的文件,但到目前为止还没有骰子.
它看起来与wifid有关,但wifid的文档只说"不要直接调用wifid".也使用airportd命令,但它似乎没有让卡进入AP模式.必须有办法,因为互联网共享创建了一个接入点.
TL; DR:有谁知道如何从命令行打开Internet共享?
例子:
我不知道你怎么称呼这个功能,所以我试着解释一下。例如,当您将手机连接到公共 WiFi 热点/接入点时,您会收到来自操作系统的消息,要求您接受条款/条件或您需要登录才能使用连接。当您单击此消息时,它会打开/a 浏览器并启动登录页面。
他们怎么做到的?这是 https 功能吗?
更新:(1)
它被称为俘虏门户:
强制门户技术强制网络上的 HTTP 客户端在正常使用 Internet 之前查看特殊网页(通常用于身份验证)。强制门户将 Web 浏览器转变为身份验证设备。这是通过拦截大多数数据包来完成的,无论地址或端口如何,直到用户打开浏览器并尝试访问网络。届时,浏览器将被重定向到可能需要身份验证和/或付款的网页,或者只是显示可接受的使用政策并要求用户同意。强制门户用于许多 Wi-Fi 热点,也可用于控制有线访问(例如公寓、酒店房间、商务中心、“开放式”以太网插孔)。
情况:
我想用 ESP(ESP32/ESP8266)做同样的事情,因为我开发了一个可以通过 WiFi 配置的设备。当用户连接到设备并且不必先打开浏览器、输入 IP 地址等时,这将是非常用户友好的。只需一条消息,用户可以点击它,就会启动一个主页。
在 AP 模式下,我打开了 DNS 并将所有内容重定向到主页,但这不是最佳解决方案(有时也不起作用)。为了让您了解我在做什么,这里有一些代码,我的库的一部分:
bool suStartAccessPointNetwork( String sSSIDNetworkName, String sSSIDPassword,
IPAddress sStaticIpAddress,
uint16_t iDnsPort = 0,
uint8_t iTries = 20,
uint16_t iDelay = 500
)
{
WiFi.disconnect();
suSetNetworkAccessPointMode();
delay( 1000 );
WiFi.softAPConfig( sStaticIpAddress,
sStaticIpAddress,
IPAddress( 255, 255, 255, 0 )
);
SU_WIFI_AP_ESTABLISHED = WiFi.softAP( sSSIDNetworkName.c_str(), sSSIDPassword.c_str() );
if( iDnsPort > 0 ) …Run Code Online (Sandbox Code Playgroud) 我在Windows上使用本机Wifi api以编程方式执行WLAN的一些任务.但是,我的问题是它暴露了有限的功能集.我想访问提供接入点负载,通话时间等的信标帧的某些字段.哪些工具可用于执行此操作?
提前致谢!
我希望能够获取可用 AP/网络名称 (SSID) 的列表
我可能想选择一个特定的 SSID。
我的最终目标是能够检查 wifi 信号强度和质量,以便在完全失去连接之前强制重新关联到另一个 AP。
node.js实现这一目标是一个不错的选择吗?正如我在Windows 10中所了解的那样,已删除了从控制台设置托管网络的功能。相反,他们将其替换为称为“ Windows Mobile Hotspot Service”的服务。
我发现可以通过Windows 10中的设置启用它,但是有人知道是否可以通过编程方式完成吗?是来自CMD还是来自COM通话等?
access-point ×10
wifi ×7
android ×5
android-wifi ×2
networking ×2
windows ×2
adb ×1
adhoc ×1
c++ ×1
command-line ×1
frames ×1
hotspot ×1
iot ×1
macos ×1
nexus-7 ×1
node.js ×1
windows-10 ×1
wlan ×1
wpa ×1