Cách kết nối thiết bị Android với thiết bị iOS qua BLE (Bluetooth Low Energy)


82

Tôi đang cố gắng tạo một ứng dụng sử dụng API năng lượng thấp của Bluetooth mới của Android. Đối với điều này, tôi đã bắt đầu với mẫu BLE đi kèm với API cấp 18 .

Khi tôi đọc được rằng Android không thể hoạt động như một Thiết bị ngoại vi, tôi đặt điện thoại Android ở chế độ trung tâm, quét các thiết bị BLE xung quanh nó. Vì mục đích này, tôi đã thực hiện một số thử nghiệm với Nền tảng Bắc Âu mô phỏng Cảm biến tim. Mọi thứ hoạt động một cách hoàn hảo!

Sau đó, tôi thử chọn một chiếc iPhone (iOS 7 beta 4) và đặt nó ở chế độ Ngoại vi và mô phỏng cảm biến Nhịp tim như thử nghiệm trước. Ứng dụng Android có thể nhìn thấy thiết bị và kết nối với thiết bị đó. Nhưng sau khi kết nối hoạt động, 2 thiết bị sẽ ngắt kết nối với nhau trong 3-4 giây. Ngoài ra, khi tôi gọi DiscoverServices () ở phía Android, không có lệnh gọi lại nào được kích hoạt! Trong một số trường hợp, thiết bị Android nhận được sự kiện "Đã kết nối" ngay cả khi chip Bluetooth iOS đang Tắt. Điều này rất lạ. Để chứng minh điều đó, tôi đã đặt Nordic Board ở chế độ Trung tâm và tôi đã có thể kết nối chính xác với thiết bị iOS mà không gặp vấn đề gì.

Nó có thể là gì? Có một số hạn chế trên Android hoặc iOS không cho phép kết nối từ Android với iOS hoặc viceversa?

Cảm ơn.

CHỈNH SỬA: Sau một số thử nghiệm khó, tôi đã nêu ra một vấn đề trên trang AOSP. Nó có thể được kiểm tra ở đây


2
Theo tài liệu, Android DOES hỗ trợ chạy như một máy chủ (ví dụ: màn hình Nhịp tim) mặc dù các giá trị mà một người tạo ra sẽ là giả mạo. Mặt khác, không có ví dụ nào, tài liệu hướng dẫn bạn làm những điều sai trái và không có cách nào để bắt đầu quảng cáo (mặc dù tài liệu nói rằng bạn có thể làm được).
Brian Reinhold

Bạn đúng. Tôi đã tìm thấy lỗi tài liệu về BluetoothGattServer. Bạn không thể có phiên bản GattServer với phương thức getProfileProxy (như tài liệu đã nói), nhưng bạn có thể từ BluetoothManager.openGattServer (). Nó đã được báo cáo với google là một vấn đề. Dù sao, có, Android có thể hoạt động như một GattServer nhưng nó không thể quảng cáo. Nếu bạn có thể quan tâm, tôi đã thử nghiệm và sau khi đồng bộ hóa 2 thiết bị, điều khiển từ xa có thể thấy các máy chủ Gatt được hiển thị từ Android. Kiểm tra nhận xét của câu trả lời đầu tiên để xem báo cáo sự cố của tôi về câu hỏi này.
edoardotognoni

Đúng vậy, tôi cũng đã vấp phải điều đó và thêm hai xu vào vấn đề đó. Hiện mình có máy chủ Nhiệt kế không quảng cáo được nên không dùng được.
Brian Reinhold

Tôi đã mở một chuỗi gần giống với chuỗi của bạn: stackoverflow.com/questions/18410081/… Tôi sẽ theo dõi chuỗi này để biết bất kỳ giải pháp nào bạn tìm thấy.
afrederick

Đọc vấn đề Android tôi đã đăng trong phần CHỈNH SỬA của câu hỏi. Nó giải thích rõ ràng tại sao quá trình này không thành công. chúng tôi nghĩ đó là một lỗi của Android. Chủ yếu là gửi một tin nhắn không được phép qua một kênh BLE cố định. Tôi nghĩ rằng điều duy nhất chúng ta có thể làm là chờ đợi cho một thông cáo Android mới :(
edoardotognoni

Câu trả lời:


7

Thêm một bản tóm tắt để tham khảo:

Nó có thể là gì? Có một số hạn chế trên Android hoặc iOS không cho phép kết nối từ Android với iOS hoặc viceversa?

Khi kết nối với máy chủ GATT được quảng cáo là thiết bị hai chế độ (BLE và BR / EDR) bằng cách gọi connectGatt (...), cờ TRANSPORT_AUTO được thêm vào bên trong khiến Android trở thành mặc định ở chế độ BR / EDR ( liên kết ).

Có thể thực hiện các cách giải quyết sau:

  1. Mặt ngoại vi: Ngừng quảng cáo các khả năng BR / EDR bằng cách điều chỉnh các cờ thích hợp ( liên kết )
  2. Phía trung tâm: Đặt tham số truyền tải rõ ràng thành TRANSPORT_LE bằng cách gọi phiên bản ẩn của connectGatt () bằng cách sử dụng phản chiếu

Thí dụ:

public void connectToGatt(BluetoothDevice device) {    
   ...    
   Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);    
   int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);     // LE = 2, BREDR = 1, AUTO = 0    
   BluetoothGatt mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);    
   ... 
}

Chỉnh sửa 4/2016

Như Arbel Israel đã chỉ ra trong các bình luận, Google đã giới thiệu một phiên bản quá tải của connectGatt (...) cho phép xác định các phương tiện giao thông trong Android M .


Cảm ơn, rằng công trình đối với tôi, lưu ý rằng trong android M google đã thêm một tình trạng quá tải cho các phương pháp connectGatt mà phải mất một biến vận chuyển: connectGatt (Context bối cảnh, boolean AutoConnect, BluetoothGattCallback gọi lại, vận chuyển int)
arbel03

1
Ồ, cảm ơn vì gợi ý này, vì vậy cuối cùng họ đã làm được.
Dominik Gebhart

2

Tôi đã viết một ví dụ làm việc đơn giản, tương đối đơn giản và đưa nó vào mã nguồn mở trên Github: https://github.com/GitGarage . Cho đến nay nó mới chỉ được thử nghiệm với Android Nexus 9 và iPhone 5s, nhưng tôi cho rằng nó cũng sẽ hoạt động với Nexus 6 và các loại iPhone khác nhau. Cho đến nay, nó được thiết lập rõ ràng để giao tiếp giữa một Android và một iPhone, nhưng tôi cho rằng nó có thể điều chỉnh để làm được nhiều hơn thế.


2

Có thể chậm trễ một chút, nhưng có lẽ cơn đau của bạn có thể thuyên giảm một chút;)

Chúng tôi đã thử nghiệm rất nhiều với các kết nối BLE đa nền tảng (iOS <-> Android) và nhận ra rằng vẫn còn nhiều điểm không tương thích và các vấn đề kết nối. Bên cạnh sự không ổn định của Android, bạn cũng nên xem xét rằng vẫn còn, cho đến ngày nay, không có nhiều thiết bị Android thực sự hỗ trợ chế độ BLE ngoại vi.

Do đó, nếu trường hợp sử dụng của bạn hướng đến tính năng và bạn chỉ cần trao đổi dữ liệu cơ bản, tôi khuyên bạn nên xem các Khung và Thư viện có thể đạt được giao tiếp đa nền tảng cho bạn mà bạn không cần xây dựng lại từ đầu.

Ví dụ: http://p2pkit.io hoặc google lân cận

Tuyên bố từ chối trách nhiệm: Tôi làm việc cho Uepaa, phát triển p2pkit.io cho Android và iOS.



0

Thiết bị iOS luôn là thiết bị ngoại vi hoặc trung tâm nhưng thiết bị Android không thể hiếm gặp, trong trường hợp này thiết bị iOS của bạn phải là thiết bị ngoại vi và Android phải là thiết bị trung tâm Chúng ta có thể nghĩ rằng thiết bị ngoại vi là một máy chủ và trung tâm là một ứng dụng khách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.