Tôi tự hỏi khả năng trực tiếp sử dụng Bonjour qua Bluetooth trong hệ điều hành iPhone 3.0 trở lên mà không cần sử dụng GameKit. Bất cứ ai có thể cung cấp bất kỳ ví dụ?Bonjour qua bluetooth KHÔNG CÓ Gamekit?
Trả lời
Nếu Bluetooth được bật, trên thiết bị đủ mới (3G trở lên hoặc tương đương iPod hoặc iPad) và hệ điều hành đủ mới (3.1 rõ ràng), Bonjour sẽ tự động hoạt động qua Bluetooth bằng địa chỉ liên kết cục bộ (168.254. *). Sau đó, bạn chỉ cần sử dụng TCP/UDP bình thường.
(Dưới mui xe, tôi khá chắc chắn GameKit sử dụng Bonjour-over-IP-over-Bluetooth.)
Sypposedly xuất bản/duyệt được thực hiện ở lớp Bluetooth, nhưng nếu người ta công bố một dịch vụ Bonjour và các trình duyệt khác cho nó, một kết nối IP qua Bluetooth tự động được thiết lập.
Bất kỳ ví dụ Bonjour nào cũng sẽ tự động hoạt động.
Bạn có biết dịch vụ Bluetooth nào được sử dụng không và cách người dùng có thể nói chuyện với thiết bị iOS bằng Linux, Mac hoặc thiết bị nhúng của riêng mình được trang bị chip Bluetooth? –
@ IvanVučica: Tôi tin rằng đó là Bluetooth PAN, nhưng tôi đã nghe nói rằng dịch vụ này cũng được quảng cáo qua bluetooth và PAN không được bắt đầu trừ khi cần thiết. –
Tôi đã nêu chi tiết một số quan sát của tôi ở đây: http://stackoverflow.com/questions/8070998/using-ios-gamekits-bluetooth-bonjour-with-other-platforms Tuy nhiên, tôi cần chi tiết kỹ thuật. Nó có mùi của PAN, nhưng quảng cáo theo một cách hơi khác, chỉ để làm cho nó trông giống như nó không phải là PAN. Mặc dù vậy, tôi đã không có cơ hội để đánh hơi giao thức. –
Chỉ cần thông báo dịch vụ, giống như tc. has said below:
self.netService = [[[NSNetService alloc] initWithDomain:@""
type:@"_http._tcp"
name:@""
port:8080] autorelease];
[self.netService publish];
Với iOS5, tuy nhiên, chúng ta hãy-gọi-là "Bluetooth Bonjour" bị tắt theo mặc định, vì vậy bạn phải sử dụng API C tuyên bố trong <dns_sd.h>
.
DNSServiceRef serviceRef;
DNSServiceRegister(&serviceRef, // sdRef
kDNSServiceFlagsIncludeP2P, // interfaceIndex
0, // flags
NULL, // name
"_http._tcp", // regtype
NULL, // domain
NULL, // host
1291, // port
0, // txtLen
NULL, // txtRecord
NULL, // callBack,
NULL // context
);
Đây chỉ là phần thông báo; giải quyết phức tạp hơn một chút. Tôi khuyên bạn nên xem các ví dụ sau đây từ Apple:
- SRVResolver - minh họa cách bạn có thể tra cứu dịch vụ bằng API được khai báo trong
<dns_sd.h>
. Nhắm mục tiêu OS X, nhưng bao gồm một lớp được gọi làSRVResolver
mà bạn có thể sử dụng trên iOS dễ dàng như bạn có thể sử dụng trên OS X. Để Bluetooth 5 Bluetooth P2P hoạt động, hãy cập nhật cuộc gọi tớiDNSServiceQueryRecord()
để vượt quakDNSServiceFlagsIncludeP2P
làminterfaceIndex
. (LƯU Ý! Mẫu này dường như không tồn tại trong tài liệu OS X 10.8. Tài liệu này có thể tìm thấy trong 10.6 và 10.7 docsets. Trong 10.8, có ví dụ DNSSDObjects, nhưng tôi không nhìn chính xác vào những gì nó làm.) - WiTap - miễn là bạn không thực sự quan tâm đến hỗ trợ Bluetooth trên iOS 5, chỉ cần xem ví dụ được gọi là WiTap, không chỉ thể hiện API mục tiêu-C tuyệt đẹp mà còn cách bạn có thể tạo máy chủ bằng cách sử dụng API CFSocket (trình bao bọc mỏng xung quanh các ổ cắm BSD). Bạn sẽ muốn xem xét điều này ngay cả khi bạn đang sử dụng SRVResolver để xem cách sử dụng API dựa trên C từ
<dns_sd.h>
.
Sau khi thông báo hoặc giải quyết dịch vụ, bạn sử dụng ổ cắm BSD thông thường để nghe hoặc kết nối. Khi viết một máy chủ, thậm chí bạn có thể muốn đầu tiên listen()
trên cổng 0 (không), và sau đó truy vấn cổng ngẫu nhiên có sẵn nào được gán cho bạn. Sau khi truy vấn, hãy thông báo cổng này thay vì cổng cố định. Đó chính xác là ví dụ WiTap đang làm (nhưng với CFSocket API thay vì API socket BSD).
Để biết thêm thông tin về ổ cắm BSD, chỉ cần Google tìm kiếm hướng dẫn.
Lưu ý: thông tin về iOS 5 đến từ số Technical Q&A QA1753 của Apple.
Tôi ngạc nhiên bạn đã không đề cập đến [AsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) bất cứ nơi nào .. bạn có đề nghị cho/chống lại nó ? hoặc sử dụng các API được đề cập ở trên là đủ? – abbood
@abbood: Tôi chưa sử dụng AsyncSocket. Tuy nhiên, miễn là bạn thông báo một dịch vụ như được mô tả trong câu trả lời của tôi, Hệ điều hành sẽ kích hoạt dịch vụ Bluetooth PAN có thể kết nối hai thiết bị iOS. Điều này cho phép bạn thiết lập kết nối TCP hoặc UDP qua Bluetooth thay vì chỉ WiFi hoặc GSM. Làm thế nào bạn sẽ thực sự đi về việc thiết lập nó (trực tiếp ổ cắm BSD hoặc thông qua một wrapper như AsyncSocket) - đó là thực sự không thích hợp. :-) –
Đọc bài viết này: Bonjour qua Bluetooth trên iOS 5.0 https://developer.apple.com/library/ios/#qa/qa1753/_index.html#//apple_ref/doc/uid/DTS40011315
Đây là vấn đề đã biết trong IOS 5.0 và cần được giải quyết bằng API cấp thấp hơn: DNSSDObjects.
Trong chỉnh sửa của bạn vào ngày 11 tháng 3 năm 2012, bạn đã hoàn toàn thay đổi câu hỏi. Sau khi nhận được ba câu trả lời và sau khi được liên kết từ các câu hỏi khác, đó là thực hành không tốt và làm cho nó có vẻ như là nếu những người vui lòng trả lời cho bạn đang rambling, cung cấp câu trả lời không liên quan. Thay vào đó, bạn có thể hỏi một câu hỏi MỚI không? :-) –