我正在尝试使用运行嵌入式linux的设备创建TCP / IP连接,我正在使用Android的USB绑定在Android设备和嵌入式Linux设备之间建立以太网连接,我修改了嵌入式linux设备,支持RNDIS设备驱动。
Android和嵌入式linux设备工作正常,以太网连接成功建立,我可以从嵌入式linux ping到android设备,反之亦然。
在我的android应用程序中,我创建了一个简单的服务来与嵌入式linux设备建立TCP / IP连接,当我尝试连接时出现问题我收到了以下错误:
02-17 13:53:13.300: E/TCP Client(2576): C: Connecting...
02-17 13:53:13.310: E/TCP Client(2576): C: Error
02-17 13:53:13.310: E/TCP Client(2576): java.net.SocketException: socket failed: EACCES (Permission denied)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.IoBridge.socket(IoBridge.java:583)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.Socket.startupSocket(Socket.java:559)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.Socket.<init>(Socket.java:225)
02-17 13:53:13.310: E/TCP Client(2576): at com.example.service.TCPClientThread.run(TCPClientThread.java:75)
02-17 13:53:13.310: E/TCP Client(2576): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.Posix.socket(Native Method)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.IoBridge.socket(IoBridge.java:568)
02-17 13:53:13.310: E/TCP Client(2576): ... 4 more
我已将配置文件配置如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dea600"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/example"
android:label="@string/appName" >
<activity
android:name="com.example.gui.mainActivity"
android:configChanges="orientation|screenSize"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.Light.DarkActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.example.service.TCPClientService"
android:isolatedProcess="true"
android:label="TCP Client Service"
android:process=":TCPClientService" >
</service>
<receiver
android:name="com.example.service.TCPStartClientService"
android:enabled="true"
android:exported="true"
android:process=":StartTCPService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
最重要的是如果我使用Android VM(Genymotion)我能够连接并且正常工作,但是当我尝试在真实设备上使用它时,我得到了错误。
提前感谢您的任何评论。
编辑:
这是我用来创建绑定的代码,我使用的是端口6540,IP是192.168.42.130
public void run() {
try {
//here you must put your computer's IP address.
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
Log.e("TCP Client", "C: Connecting...");
//create a socket to make the connection with the server
Connection = new Socket(serverAddr, SERVERPORT);
Log.e("TCP Client", "C: Connected...");
// Output Stream
OutStream = new DataOutputStream((OutputStream)Connection.getOutputStream());
// Input stream
InStream = new DataInputStream((InputStream)Connection.getInputStream());
while (ThreadStatus) {
try {
String message = myReadStream(InStream);
if (message.length() > 0) {
Log.e("TCP Client", "Received message ... " + message);
if (mMessageListener != null){
mMessageListener.messageReceived(message);
}
}
} catch (Exception e) {
ThreadStatus = false;
Log.e("TCP Client", "S: Error", e);
}
}
} catch (Exception e) {
Log.e("TCP Client", "C: Error", e);
} finally {
try {
Connection.close();
OutStream.close();
InStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (mConnectionEndListener != null){
mConnectionEndListener.notifyConnectionEnd();
}
}
我相信当我尝试创建套接字时会发生错误(连接=新套接字(serverAddr,SERVERPORT); )。
答案 0 :(得分:2)
机器人:isolatedProcess
如果设置为true,则此服务将在与系统其余部分隔离的特殊进程下运行,并且没有自己的权限。与它的唯一通信是通过Service API(绑定和启动)。
答案 1 :(得分:0)
我找到了这个问题的解决方法,我将TCP客户端从服务更改为主应用程序内的异步任务,我不明白为什么它在Genymotion模拟器上工作但它根本没有用使用服务时的真实设备。
答案 2 :(得分:0)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />