2016-06-09 16 views
10

Tôi đã viết một ứng dụng đang kích hoạt điện thoại thông minh gắn kết qx của Sony qua wifi. Tuy nhiên tôi cần phải chuyển hình ảnh ra khỏi điện thoại qua mạng cục bộ khác trong thời gian thực. Kể từ khi thẻ wifi đang được sử dụng cho kết nối qx tôi cần để có thể sử dụng ethernet qua usb để chuyển hình ảnh ra khỏi điện thoại. Các yêu cầu Http sẽ được sử dụng để kích hoạt camera và gửi ảnh ra khỏi điện thoại.Sử dụng nhiều giao diện mạng trong một ứng dụng

Có thể trong một ứng dụng Android trên điện thoại có hai giao diện mạng được thiết lập để chỉ định cho một số yêu cầu http nhất định sử dụng một giao diện mạng và cho người khác sử dụng giao diện mạng khác không? Điều này cần phải được thực hiện thông qua các bảng định tuyến, không phải java?

Điện thoại tôi đang sử dụng là nexus bắt nguồn từ 6p.

Cập nhật:

Hiện nay, tôi đã có thể để có được một bộ chuyển đổi Ethernet làm việc với các thiết bị (Nexus 6P). Thiết bị được kết nối với mạng cục bộ qua Ethernet. Khi giao diện Wi-Fi tắt, tôi có thể ping tất cả các thiết bị trên mạng cục bộ mà thiết bị được kết nối với qua Ethernet. Tuy nhiên, tôi không thể truy cập máy chủ web (Không sử dụng DNS) của bất kỳ thiết bị nào trên mạng đó (mà tôi biết chúng đang chạy), tức là Http thông qua ứng dụng trình duyệt. Các nexus 6p được kết nối với mạng qua Ethernet thông qua một trạm Ubiquiti. Điều này có vẻ là một vấn đề định tuyến.

Tôi có thể chia sẻ kết nối (giao diện USB) và sử dụng Wi-Fi trong một ứng dụng, nhờ đó tôi tin rằng có thể sử dụng Ethernet và Wi-Fi.

Update2:

Sau khi thử nghiệm nhiều hơn, nó có vẻ là rằng nó là một vấn đề cho phép. Vì khi tôi ping mạng, thiết bị được kết nối với qua Ethernet mà không cần chạy đầu tiên su trong thiết bị đầu cuối mạng không tồn tại. Tuy nhiên, khi tôi chạy su thì ping, tôi có thể ping mạng. Vì vậy, có vẻ như ứng dụng của tôi cần có quyền superuser trước khi truy cập Ethernet. Tôi đã cấp quyền truy cập superuser, nhưng không có gì thay đổi. Tôi đọc rằng chỉ cần chạy su là không đủ từ một trong các nhận xét trong số post này. Điều này là do su chỉ sinh ra một vỏ gốc chết. Điều này cũng giải thích tại sao tôi không thể truy cập bất kỳ máy chủ web nào trên mạng này thông qua ứng dụng trình duyệt. Có thể cấp quyền truy cập ứng dụng của tôi vào giao diện Ethernet khi thực hiện các cuộc gọi HTTP như cung cấp quyền truy cập root HttpURLConnection, nếu điều đó có ý nghĩa gì không (chạy su không hoạt động)? Có vẻ như chắc chắn là một giải pháp vì HttpURLConnection có thể thực hiện cuộc gọi qua giao diện chia sẻ kết nối USB (Nexus 6P gọi nó là rndis0).

Cập nhật 3:

Tôi tìm thấy trực tuyến here, mà tôi có thể làm cho ứng dụng của mình một ứng dụng hệ thống (nghĩ điều này có thể cấp quyền truy cập eth0 ứng dụng). Tôi vừa chuyển ứng dụng của mình sang /system/app rồi khởi động lại. Tuy nhiên, điều này dường như không cung cấp cho các ứng dụng đặc quyền nữa (do đó không giải quyết được vấn đề), hoặc có cái gì khác cần thiết để làm cho hệ thống ứng dụng hơn là chỉ sao chép nó vào /system/app.

Cập nhật 4:

Vì vậy, tôi đã có thể để có được Ethernet làm việc trên tất cả các ứng dụng mà không cần quyền root! Dường như nó chỉ hoạt động trên DHCP và không thích kết nối tĩnh mà tôi đang sử dụng. Nó hoạt động với Wi-Fi được kích hoạt, tuy nhiên, tôi không thể liên lạc với bất kỳ thiết bị nào trên mạng Wi-Fi khi Ethernet được bật. Có cách nào để giái quyết vấn đề này không?Nó có liên quan đến việc thiết lập hai cổng mặc định không?

Trả lời

2

Vì bạn đã lập trình trong Nexus 6P, bạn có thể thử sử dụng API mới được thêm vào ConnectivityManager để chọn ethernet làm kết nối mạng ưa thích cho quy trình của mình.

Vì tôi không thể xây dựng môi trường tương tự như môi trường của bạn, tôi không chắc liệu nó có hoạt động hay không. Nó chỉ là một giải pháp được đề xuất, hoàn toàn không được kiểm tra và xác minh.

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
Network etherNetwork = null; 
for (Network network : connectivityManager.getAllNetworks()) { 
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 
    if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) { 
     etherNetwork = network; 
    } 
} 
Network boundNetwork = connectivityManager.getBoundNetworkForProcess(); 
if (boundNetwork != null) { 
    NetworkInfo boundNetworkInfo = connectivityManager.getNetworkInfo(boundNetwork); 
    if (boundNetworkInfo.getType() != ConnectivityManager.TYPE_ETHERNET) { 
     if (etherNetwork != null) { 
      connectivityManager.bindProcessToNetwork(etherNetwork); 
     } 
    } 
} 
+0

Vì vậy, tôi đã thử phương pháp này. 'connectionManager.getAllNetworks()' dường như chỉ trả lại giao diện Wi-Fi (length = 1), khi tôi có Ethernet và Wi-Fi, và nó không trả về gì khi chỉ có Ethernet đang bật (length = 0). Thiết bị rõ ràng có giao diện kể từ khi chạy 'ifconfig' trả về' eth0' làm giao diện và tôi có thể ping các thiết bị như tôi đã nói ở trên. Tôi thậm chí đã thử di chuyển ứng dụng của mình sang ứng dụng hệ thống. Tuy nhiên, tôi cảm thấy như tôi đã bỏ lỡ một bước khi tạo hệ thống ứng dụng vì việc di chuyển nó sang '/ system/app' dường như hoàn toàn không làm gì cả. – dylan7

+0

Chuyển sang root, sửa đổi người dùng và chủ nhóm của APK thành root. sau đó thay đổi quyền của APK thành 644. 'su',' chown root.root/system/app/your.apk', 'chmod 644/system/app/your.apk'. Sau đó, có thể có quyền truy cập thiết bị eth0 trong mã của bạn. – alijandro

+0

Nếu bạn cho rằng có sự cố khi tạo ứng dụng hệ thống, hãy kiểm tra logcat. Bạn sẽ nhận được một lỗi cho phép khi ứng dụng cố gắng chạy các lệnh shell. – ekilic

0

Hầu hết các hộp tv android đều có thể sử dụng wifi và ethernet cùng nhau. Trong thiết bị của tôi, tôi có thể bật ethernet từ đường dẫn này --- Cài đặt -> Khác ...> Ethernet --- Nhưng thiết bị của bạn sẽ không có menu như tôi hiểu. Vì vậy, bạn nên làm cho một ứng dụng để làm điều đó. Ứng dụng này cần truy cập một số tài nguyên hệ thống cụ thể để thiết bị của bạn cần được root hoặc ứng dụng cần phải ký bằng chữ ký hệ thống. Chủ đề này cũng có thể giúp bạn link

+0

Dường như Nexus 6P không có quyền truy cập vào 'getSystemService (" ethernet ")' như được sử dụng trong bài đăng bạn đã liên kết. – dylan7

0

Chỉ cần giải thích thêm một chút về cách giải quyết vấn đề này.

Sử dụng câu trả lời của @ alijandro tôi có thể chuyển đổi qua lại giữa Ethernet và Wi-Fi trong một ứng dụng. Đối với một số lý do cho Ethernet để làm việc nó yêu cầu cổng mạng để cung cấp địa chỉ DHCP, không tĩnh. Sau đó, kể từ bindProcessToNetwork, được sử dụng trong câu trả lời của @ alijandro là mỗi quá trình, tôi quyết định chia liên lạc với máy ảnh QX thành một Service chạy trong một quy trình riêng biệt. Ứng dụng chính (một quy trình khác) sẽ đăng hình ảnh qua Ethernet lên mạng cục bộ. Tôi đã thành công có thể liên lạc với các thiết bị trên mạng cục bộ thông qua HTTP qua Ethernet trong khi đồng thời kích hoạt QX qua Wi-Fi. Hiện tại, tôi đã sử dụng Messenger để giao tiếp bằng cách sử dụng IPC để thông báo cho QX kích hoạt Service những phương thức cần gọi.

Các vấn đề liên quan