2010-06-18 56 views
6

Tôi đang phát triển một ứng dụng sử dụng Bluetooth để kết nối với thiết bị và gửi/nhận dữ liệu. Tôi đang làm tất cả thử nghiệm của mình với điện thoại Nexus One.Android Bluetooth - Không thể kết nối ra

Tôi chưa bao giờ có thể thiết lập kết nối SPP (cổng nối tiếp) từ điện thoại của mình cho bất kỳ thiết bị nào. Tuy nhiên, tôi có thể kết nối từ thiết bị (máy tính xách tay của tôi) với điện thoại của tôi bằng cách sử dụng Mac tương đương PuTTY (Ngoại lệ duy nhất cho điều này là ứng dụng "Truyền tệp qua Bluetooth" từ Marketplace dường như hoạt động, nhưng tôi không 't nghĩ rằng sử dụng RFCOM/SPP ...).

tôi tiếp tục nhìn thấy thông báo này trong nhật ký LogCat tôi:

ERROR/BluetoothService.cpp(78): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) 

cũng như những:

java.io.IOException: Operation Canceled 
java.io.IOException: Software caused connection abort 

Tôi đã thử bằng cách sử dụng UUID của "00001101-0000-1000 -8000-00805F9B34FB "và tôi cũng đã thử sử dụng:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class }); 
sock = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 

phương pháp thay vì device.createRfcommSocketToServiceRecord(UUID); - không có may mắn.

Tôi đang sử dụng BluetoothChat example và các biến thể của mã đó để làm tất cả các xét nghiệm của tôi ...

Solutions hoặc gợi ý sẽ là tuyệt vời ... hay thậm chí là tốt hơn/example ít phức tạp của một số mã thử nghiệm tôi có thể chạy trên điện thoại, hoặc một kịch bản python hoặc một cái gì đó tôi có thể chạy trên máy tính của tôi để giúp gỡ lỗi?

Cảm ơn! Tôi hy vọng đây không phải là một lỗi với hệ điều hành Android, nhưng nếu nó là tôi hy vọng sẽ tìm thấy một workaround.


EDIT: Tôi cũng nên lưu ý rằng hầu hết các thiết bị hiển thị như "ghép đôi, nhưng không kết nối" trong cài đặt Bluetooth.


CHỈNH SỬA 2: Giải pháp có vẻ đơn giản là vô hiệu hóa mọi thao tác nghe Bluetooth. Xem bài trả lời của tôi để biết thêm thông tin.

+1

chủ đề đáng chú ý khác liên quan đến vấn đề này: 1) http://stackoverflow.com/questions/2268365/android-bluetooth-cross-platform-interoperability 2) http://stackoverflow.com/questions/ 2661932 3) http://groups.google.com/group/android-developers/browse_thread/thread/348c269f2ef88327/ 4) http://stackoverflow.com/questions/2660968/how-to-prevent-android -bluetooth-rfcomm-kết nối-từ-chết-ngay sau 5) http://stackoverflow.com/questions/1953888/bluetooth-rfcomm-sdp-connection-to-a-rs232-adapter-in-android – idolize

+0

bạn đã sử dụng sự phản chiếu với ý định hay bởi sự trùng hợp? Lý do tôi hỏi là, tôi tự hỏi nếu bạn sử dụng nó như là một cách để làm việc xung quanh một lỗi cụ thể trong việc thực hiện Bluetooth? Thông thường tôi sẽ nghĩ rằng người ta có thể vừa sử dụng 'BluetoothSocket bs = createRfCommSocket (...'. Cảm ơn! –

+0

@Brad - Đó là cố ý, bởi vì tôi đã thấy một số người trực tuyến gặp vấn đề với createRfcommSocketToServiceRecord mà chỉ được giải quyết bằng cách sử dụng cách giải quyết khác thường này Xem: http://stackoverflow.com/questions/2660968/how-to-prevent-android-bluetooth-rfcomm-connection-from-dying-immediately-after --and-- http://stackoverflow.com/question/2661932/problem-with-bluetooth-on-android-2-1-samsung-spica-i5700-where-pairing-works-b – idolize

Trả lời

7

Giải pháp, hóa ra, là tắt chức năng máy chủ của dịch vụ Bluetooth. Chỉ bằng cách sử dụng createRfcommSocketToServiceRecord và không bao giờ gọi listenUsingRfcommWithServiceRecord (trong ví dụ BluetoothChat, điều này có nghĩa là không bao giờ bắt đầu "AcceptThread") sự cố đã được khắc phục.

Mặc dù hai cuộc gọi này được cho là hoàn toàn tách biệt và không ảnh hưởng đến nhau (theo tài liệu Android), chỉ cần nhận xét ra listenUsingRfcommWithServiceRecord khắc phục vấn đề được cho là không liên quan của tôi.

Tôi có thể thực hiện chương trình Trò chuyện Bluetooth chưa được chỉnh sửa và sẽ không thể thiết lập kết nối gửi đến thiết bị Bluetooth bất kỳ mà tôi đã thử nghiệm (máy tính xách tay, máy tính để bàn, tai nghe, v.v.) hoàn hảo như một khách hàng.

Dù sao, tôi hy vọng điều này sẽ giúp người khác nếu họ gặp phải vấn đề tương tự. Đây phải là lỗi với hệ điều hành Android hoặc có thể là chương trình cơ sở trên Nexus One.

+0

Điều này KHÔNG làm việc cho tôi. – daker

+0

Tương tự ở đây, không hoạt động. Sử dụng cùng ví dụ và tab Galaxy S + Galaxy – Deko

+0

Vô hiệu hóa việc lắng nghe các kết nối không làm cho nó hoạt động với tôi. Làm thế nào mà thậm chí sẽ làm việc? ... Tôi nhận được vấn đề này đôi khi nhưng làm cho nó không bắt đầu chấp nhận thread làm cho nó luôn không hoạt động. – RyanCheu

1

Tôi sẽ bỏ qua lỗi stopDiscovery - điều tốt là bạn đang hủy khám phá trước khi thực hiện kết nối. Theo các tài liệu SDK:

Bởi vì khám phá là một precedure nặng cho bộ điều hợp Bluetooth, phương pháp này nên luôn luôn được gọi trước khi cố gắng kết nối với một thiết bị từ xa với connect(). Khám phá không được quản lý bởi hoạt động nhưng hoạt động như một hệ thống dịch vụ, do đó, ứng dụng phải luôn gọi hủy khám phá ngay cả khi nó không trực tiếp yêu cầu phát hiện .

Vì vậy, với điều đó, bạn có thể lấy ví dụ về Trò chuyện qua Bluetooth để hoạt động trước khi thực hiện bất kỳ sửa đổi nào đối với mã không?

Các UUID bạn muốn cho SPP/RFCOMM là:

static UUID UUID_RFCOMM_GENERIC = new UUID(0x0000110100001000L,0x800000805F9B34FBL); 

hoặc định nghĩa một cách khác (cả hai đều thực hiện được điều tương tự).

static final UUID UUID_RFCOMM_GENERIC = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
+0

Cảm ơn nhưng tôi thực sự đã sử dụng UUID mà bạn cung cấp. Tôi đã có thể làm cho ứng dụng Bluetooth Chat hoạt động nhưng chỉ khi tôi kết nối từ thiết bị (máy tính) với điện thoại chứ không phải theo cách khác. Nếu tôi cố gắng kết nối từ điện thoại với máy tính (từ bên trong menu ứng dụng) nó sẽ thử trong vài giây, sau đó nướng bánh mì như một lỗi "Kết nối không thành công" hoặc một cái gì đó. – idolize

+0

Bạn đã thêm một dịch vụ RFCOMM vào máy tính của mình một cách rõ ràng chưa? Nếu không, máy tính không có lý do để trả lời các yêu cầu RFCOMM. Cũng giống như máy tính của bạn sẽ không đáp ứng yêu cầu FTP trừ khi bạn cài đặt máy chủ FTP và mở cổng 21. –

+0

Tôi đang nhầm lẫn - bạn đang cố gắng thực hiện công việc trò chuyện qua bluetooth giữa hai điện thoại hoặc giữa điện thoại và PC? Tôi nghĩ rằng chỉ có trước đây có ý nghĩa nhưng tôi có thể không hiểu mục tiêu cuối cùng của bạn. Bạn có thể làm rõ? –

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