2011-08-02 35 views
9

Tôi đã tìm kiếm trên Internet và chưa thấy bất kỳ thứ gì trong cách thực hiện chính xác việc ghép nối OOB. Tôi đã hy vọng ai đó ở đây có thể chỉ cho tôi một số mã ví dụ để giúp tôi. Ví dụ trò chuyện trong trang web dành cho nhà phát triển Android đã không thực sự đi sâu vào loại gọt này.Bluetooth "out of band" (OOB) ghép nối trên Android?

Về cơ bản, tôi có một máy tính bảng Android mà tôi muốn ghép nối một cách an toàn với thiết bị, được viết bằng C++, không có cơ chế hiển thị/IO được tích hợp sẵn. Máy tính bảng được ghép nối sẽ hoạt động như giao diện GUI/IO và tôi sẽ gửi lại tin nhắn và thứ tư qua Bluetooth. Vì vậy, tôi muốn ghép nối an toàn cho máy tính bảng với từng thiết bị thông qua lược đồ phân tách OOB.

Tôi hiểu khái niệm về OOB nhưng tôi gặp khó khăn trong việc tìm kiếm các phương thức thích hợp để gọi khi tìm kiếm trên trang web android.developers.com cho mã máy khách Android của tôi. Ngoài ra khi nhìn vào các công cụ bluez tôi không thể tìm thấy nhiều để đi trên cho máy chủ viết C++ của tôi.

Trường hợp sử dụng cơ bản là người dùng sẽ kết nối máy tính bảng với thiết bị thông qua kết nối USB. Kết nối USB sẽ tạo thuận lợi cho việc truyền các phím/địa chỉ mac cho mỗi thiết bị và sau đó sử dụng thông tin đó kết nối bluetooth với nhau.

Tôi có thể tìm ra phần USB nhưng khi tôi có các khóa và thông tin cần thiết trên máy khách và máy chủ, tôi dường như không theo dõi các phương pháp đúng để gọi cả hai đầu thành công và bảo mật.

Tôi đã có một khách hàng/máy chủ nói chuyện qua một kết nối không an toàn vì vậy thực sự phần duy nhất tôi gặp khó khăn là thực sự ghép nối trên cả hai đầu. Khi tôi đã ghép nối, tôi có thể sử dụng secureRFComm để thực hiện tất cả thông điệp trong tương lai của mình.

Nhờ bất kỳ ai có thể trợ giúp!

Trả lời

2

Không có API công khai nào được bật và đồng bộ hóa để cho phép ghép nối OOB. Có thể nnly nếu bạn có thể hoặc sẵn sàng sửa đổi ngăn xếp BlueZ cơ bản để lộ các móc nối OOB với ứng dụng. (Nhiệm vụ không tầm thường)

Bạn đang sử dụng cơ chế OOB nào? NFC?

+0

Cảm ơn bạn đã trả lời Dennis. Cách tôi hình dung sự bắt tay xảy ra là người dùng sẽ kết nối máy tính bảng với thiết bị thông qua kết nối USB. Kết nối USB sẽ tạo thuận lợi cho việc truyền các phím/địa chỉ mac cho mỗi thiết bị.Có địa chỉ MAC của mỗi thiết bị, tôi có thể ghép nối bluetooth với nhau theo cách thiết thực với các phím chính xác. Điều này dường như là sự kết hợp của OOB. Đây là công việc tùy chỉnh chứ không phải ứng dụng được lên kế hoạch cho thị trường Android. Vì vậy, nếu đây không phải là cách chính xác để xử lý loại ghép nối sau đó tôi mở để đề xuất thiết kế. – Brian

+0

Tôi tìm kiếm tài liệu android một số chi tiết và tìm thấy một số phương pháp được liệt kê là @hide có vẻ hữu ích. Một phương pháp như vậy là "createBondOutofBand". Đây có phải là một cái gì đó tôi có thể gọi thông qua sự phản ánh hoặc là có thay đổi ngăn xếp BlueZ sill cần thiết? Tôi cũng vẫn không chắc chắn về cách xử lý này trên máy chủ mà không phải là android. Bằng cách xử lý tôi có nghĩa là phương pháp tôi cần phải gọi vào BlueZ mà sẽ cho phép các máy chủ cặp OOB. Cảm ơn vì bất kì sự giúp đỡ! – Brian

+0

@Brian: Việc ghép nối OOB yêu cầu giá trị Hash và Randomizer từ mỗi HCI Bluetooth (bạn cũng có thể thực hiện xác thực một chiều nếu chỉ một bên có thể gửi dữ liệu, nhưng đây không phải là trường hợp ở đây). Tôi cho rằng bạn sẽ nhận được các giá trị của bạn từ phía Android bằng cách sử dụng ['readOutOfBandData'] (http://www.androidjavadoc.com/2.3/android/bluetooth/BluetoothAdapter.html#readOutOfBandData%28%29), nhưng tôi không ' t phát triển cho android, vì vậy không thể xác minh bất cứ điều gì. – Hasturkun

10

Tôi đã giải quyết được vấn đề 95% nhưng tôi đã đánh một khối đường nhỏ. Trước tiên, tôi sẽ cập nhật bài đăng này với câu trả lời cụ thể hơn cho câu hỏi gốc và đăng câu hỏi của tôi ở cuối câu hỏi.

Tóm lại, nhiệm vụ của tôi là sử dụng ghép nối dải (oob) để ghép nối an toàn một máy tính bảng Android bằng Honeycomb 3.2 với bảng beagle thông qua USB. Tôi không thể đăng mã cụ thể, nhưng tôi sẽ cung cấp cho bạn tất cả các bước cần thiết để hoàn thành công việc này.

Trên bảng beagle, tôi có ngăn xếp bluez 4.96 được cài đặt với plugin dbusoob được cài đặt. Để xác nhận điều này được thiết lập chính xác cài đặt 2 dongle Bluetooth trên bảng beagle và chạy mã kiểm tra OOB được tìm thấy trong kho lưu trữ bluez trong thư mục kiểm tra. Đây là một kịch bản python. Kịch bản sẽ ghép thành công 2 dongle Bluetooth, nếu không phải bluez có thể không được thiết lập chính xác.

Để nhận thông tin liên lạc USB với máy tính bảng hoạt động, bạn cần phải cài đặt mtpfs và mtp-tools. Chúng được sử dụng để gắn kết máy tính bảng của bạn. Họ cách tôi giải quyết nhận được thông tin OOB giữa 2 thiết bị được gắn máy tính bảng trên bảng beagle. Sau khi gắn máy tính bảng và beagle hội đồng quản trị có thể viết ra một tập tin với các thông tin cần thiết.

Trên OOB bên android không được hỗ trợ trong API công khai để mọi thứ trở nên phức tạp. Tôi tin rằng điều này là do Honeycomb 3.2 không có một ngăn xếp bluez chính thức hỗ trợ liên kết OOB, nhưng Google có một số loại thực thi được mã hóa.Tôi tin rằng điều này bởi vì nếu bạn nhìn vào mã nguồn gừng cho các lớp Bluetooth Adaptor và Bluetooth Device, bạn có thể thấy các phương thức OOB có sẵn nhưng không được hiển thị thông qua API được ghi lại.

Các phương pháp này vẫn được công khai để bạn có thể gọi chúng qua phản ánh. Sử dụng sự phản chiếu, bạn cũng có thể nhận được tất cả các chữ ký của phương thức trong một lớp. Đây là cách tôi đã tìm ra phương pháp mà tôi đã có sẵn cho tôi.

Hãy coi chừng dù nhiều tài liệu không được ghi lại và không rõ ràng những gì một số người làm. Những điều quan trọng cần lưu ý là readOutOfBandData() trong lớp bộ điều hợp và setDeviceOutOfandData() trong lớp thiết bị.

Một hình ảnh xác thực khác mà bạn có thể gặp phải là khi bạn ghi dữ liệu oob của mình vào tệp trên máy tính bảng để đọc bảng beagle. Vì android sử dụng mtp, bạn phải lập chỉ mục tệp của mình sau khi được ghi vào bộ nhớ sdcard nội bộ. Để giải quyết vấn đề này, bạn cần sử dụng lớp MediaScannerConnection và phương thức scanFile().

Hy vọng rằng điều trên sẽ giúp bất kỳ ai khác có cùng vấn đề này.

Bây giờ, theo câu hỏi của tôi. Tôi có ứng dụng Android của tôi làm việc tuyệt vời và mã bảng beagle của tôi là ví dụ testOOB được cập nhật để có một đầu đọc thông tin OOB từ một tệp. Bây giờ vấn đề tôi thấy là khi thực hiện tất cả mọi người nhìn thấy nhau tuyệt vời, nhưng trên máy tính bảng tôi vẫn nhận được một thông báo yêu cầu nếu tôi muốn ghép nối với thiết bị xyz. Không có khóa hoặc số. Nó chỉ yêu cầu "Ghép nối với thiết bị XYZ" hoặc một cái gì đó dọc theo những dòng đó.

Nếu tôi nhấn "cặp", tất cả được ghép nối từ góc nhìn của máy tính bảng, NHƯNG kịch bản lệnh python trả về giá trị ngắt không thành công. Tập lệnh python trên bảng beagle đang gọi phương thức thực tế để thực hiện liên kết giữa các thiết bị. Ngay cả khi tôi có android khởi tạo cuộc gọi createBond, tôi cũng thấy kết quả tương tự. Tôi có thể đảm bảo rằng tôi đã đặt dữ liệu OOB bắt buộc trên cả hai đầu trước khi cố gắng ghép nối trong cả hai trường hợp sao cho dường như không phải vậy.

Vì vậy, vấn đề của tôi là tôi đang hy vọng ai đó có thể giúp tôi với là:

1) Tại sao tôi thậm chí nhận được một tin nhắn trên android nếu dữ liệu OOB được trao đổi đúng cách? Có cuộc gọi nào khác mà tôi đang bỏ lỡ không và cuối cùng thì sao?

2) Tại sao kịch bản lệnh băn khoăn của bảng beagle trả lại lỗi không thành công ngay cả khi tôi nhấn "popup" hiển thị trên máy tính bảng. Màn hình máy tính bảng và blues đều hiển thị các thiết bị được ghép nối. Một lần nữa tôi đang nghiêng về phía ý tưởng rằng tôi đang thiếu cái gì đó.

Nhờ ai có thể giúp :)

EDIT:

Để thêm thông tin ở đây là sản phẩm logcat:

D/UIBluetooth(4363): !!!!!! Start Bond !!!!!! 
D/BluetoothService(1703): Setting out of band data for: 00:02:76:24:C2:8F:[-37, -1, 65, -42, -121, -75, -60, -4, -47, -86, -88, 14, 64, 83, 16, 96]:[-112, 34, 121, -97, 15, -54, -83, - 
93, 104, -83, -124, -25, 89, 114, 66, 62] 
D/BluetoothBondState(1703): 00:02:76:24:C2:8F bond state 10 -> 11 (0) 
D/UIBluetooth(4363): createOobBond Successful 
V/BluetoothEventManager(2174): Received android.bluetooth.device.action.BOND_STATE_CHANGED 
D/BluetoothEventLoop(1703): Property Changed: Devices : 1 
D/BluetoothEventLoop(1703): Device property changed: 00:02:76:24:C2:8F property: Connected value: true 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 

Hai dòng cuối cùng dường như được kích hoạt popup trên Android để ghép nối/Hủy với Thiết bị trong câu hỏi. Tôi muốn Android biết chỉ là liên kết tự động và thậm chí không hỏi. Tôi có thể bỏ lỡ một cuộc gọi hoặc làm điều gì đó không đúng thứ tự cho tất cả những gì tôi biết. Điều cuối cùng tôi làm trong mã của tôi là tạo ra liên kết mà dường như là nơi rõ ràng để làm điều đó ....

Cảm ơn bạn đã đề xuất!

+2

Bạn có thể đăng nguồn của mình ở đâu đó không? Tôi đã làm việc trên một cái gì đó rất giống với điều này nhưng tôi đã không nhận được rất xa. –

+0

có thể bạn vui lòng đăng nguồn của mình – shreyashirday

+0

Xin chào, bạn đã đưa ra giải pháp cho vấn đề này chưa? Tôi nghĩ nhiều người đang đấu tranh với điều này. – ymerdrengene

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