2013-05-09 59 views
30

sự khác biệt giữa hai cách dưới đây kết nối với một thiết bị bluetooth là gì:sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket

1)

UUID uuid = UUID.fromString(Values.SPP_UUID); //Standard SerialPortService ID 
mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid); 

2)

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
mmSocket = (BluetoothSocket) m.invoke(mmDevice, 1); 

tôi tìm ra đầu tiên cách không thể làm việc mọi lúc, đôi khi nó sẽ hoạt động, nhưng sau khi tôi đóng thiết bị bluetooth, nó sẽ không hoạt động trở lại. Cách thứ hai luôn hoạt động tốt. Tôi biết nó chỉ là mở một kênh để giao tiếp với bluetooth, nhưng tôi không biết làm thế nào nó có thể làm điều đó để kết nối với một thiết bị bluetooth mà không cần sử dụng uuid?

+0

Có ai biết gì về câu hỏi này không? Tôi thực sự cần các bạn giúp đỡ. – CodeAlien

+0

Từ quét qua tài liệu, có vẻ như createRfCommSocket cung cấp cho bạn nhiều điều khiển hơn và các trường tinker với –

Trả lời

40

Hãy suy nghĩ về nó một chút giống như sự khác biệt giữa việc mở kết nối TCP đến cổng bạn chỉ định theo số và mở một cổng vào cổng mà bạn tra cứu theo tên từ /etc/services.

createRfcommSocketToServiceRecord đưa UUID bạn vượt qua và sử dụng SDP để quyết định kênh radio nào sẽ sử dụng cho kết nối. Nó cũng kiểm tra để đảm bảo rằng một máy chủ đang nghe trên thiết bị đầu cuối từ xa, với cùng UUID. Bằng cách này, đó là cách đáng tin cậy nhất để có được kết nối: nó sẽ luôn sử dụng đúng kênh và nếu mở kết nối thành công, bạn biết điều gì đó ở đầu kia có thể hiểu giao thức của bạn.

Ngược lại, createRfcommSocket chỉ kết nối với kênh bạn nói. Không có cách nào để biết liệu có bất cứ điều gì đang lắng nghe trên thiết bị đầu cuối từ xa không: bạn chỉ biết thiết bị ở đó. Ngoài ra, lựa chọn kênh radio của bạn có thể hoàn toàn không phù hợp. Đó là lý do tại sao chức năng này không được xuất bản trong API và chức năng khác được ưu tiên.

createRfcommSocket có thể xuất hiện lúc đầu đáng tin cậy hơn, nhưng đó là vì nó không kiểm tra sự hiện diện của người nghe tại điểm cuối khác: nó bỏ qua một số trường hợp lỗi. Điều này có thể không sao cho thử nghiệm, nhưng không sử dụng cho hệ thống sản xuất, bởi vì thường người dùng sẽ quên khởi động máy chủ ở điểm cuối khác và ứng dụng của bạn sẽ thất bại theo những cách khó hiểu.

Tất nhiên, vì createRfcommSocket không được xuất bản trong API, bạn không đảm bảo rằng nó sẽ tiếp tục hoạt động ở tất cả các bản phát hành trong tương lai của Android.

+12

Đó là thông tin tuyệt vời. Nhưng, thật không may, nhiều thiết bị BT chỉ đơn giản là không làm việc với createRfcommSocketToServiceRecord vì vậy chúng tôi buộc phải sử dụng createRf commSocket ... – pstoppani

+0

@ Tôi không còn chắc chắn những gì tôi đã nêu ở đây. Có vẻ như ai đó đã xóa nó. –

+0

@BrianReinhold Ồ, nếu bạn không thể nhớ nó không thể rất quan trọng. –

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