我已经在这方面工作了很长一段时间,我能够使它在所有的产品和设备中工作,除了一些运行Marshmallow及以上的三星设备.
这是流程.我有一个OBD可以通过wifi连接,一旦连接,我可以通过我的应用程序开始读取数据,通过打开一个socket/telnetclient到它的IP,它将像192.168.4.1和端口是23.这是目标.需要注意的是,该OBD没有互联网连接.
这是发生了什么.我通过连接到OBD WifiManager.现在我尝试打开一个到IP 192.168.4.1和端口的套接字23.这是代码:
import java.net.Socket;
Socket socket = new Socket("192.168.4.1", 23);
Run Code Online (Sandbox Code Playgroud)
此时如果移动数据被启用,套接字连接将尝试通过移动数据网关找到ip,因为现在wifi将不具有互联网连接,并且只有移动数据可能具有互联网连接,它将具有更高的优先级.
由于IP只能通过wifi访问,我ConnectivityManager通过以下代码指向网关openWifiPort(true):
public void openWifiPort(boolean openState){
final ConnectivityManager connectivityManager
= (ConnectivityManager) AppController.getInstance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (SDK_INT >= LOLLIPOP) {
NetworkRequest.Builder request = new NetworkRequest.Builder();
if(openState) {
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
} else {
request.addTransportType(ConnectivityManager.TYPE_MOBILE);
request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
}
connectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (SDK_INT >= LOLLIPOP && SDK_INT < M) {
//noinspection deprecation
ConnectivityManager.setProcessDefaultNetwork(network);
} else if (SDK_INT >= M) …Run Code Online (Sandbox Code Playgroud)