7

Tôi hiện đang triển khai ứng dụng iOS sử dụng CoreBluetooth để truyền dữ liệu giữa 2 thiết bị. Ví dụ, để gửi dữ liệu từ trung ương đến các thiết bị ngoại vi, tôi sử dụng mã này:Kích thước dữ liệu tối đa khi gửi dữ liệu qua BTLE trên iOS

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; 
NSLog(@"Writing data of length %d", [data length]); 
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; 

này hoạt động hoàn toàn tốt, nhưng điều này là rằng tôi đã đọc nhiều lần bây giờ mà đặc điểm có thể chuyển tối đa 20 byte một lần. Ngoài ra, khi tôi xem xét Apple's BTLE Example Code, chúng thực hiện một cơ chế chia tách dữ liệu thành các phần 20 byte. Tuy nhiên, đoạn mã trên in một cái gì đó như Writing data of length 124 - dữ liệu đến tốt ở thiết bị khác, mặc dù.

Vì vậy: Tại sao tính năng này hoạt động? Và thậm chí nhiều hơn như vậy, tôi sợ rằng điều này có thể phá vỡ tại một số điểm, đặc biệt là khi các thiết bị không phải iOS đi vào hoạt động.

+0

Devices đều iOS7 hoặc iOS6? – Rashad

+0

@Rashad iOS 7.0 và iOS 7.1.1. Và như tôi đã nói, tôi đặc biệt quan tâm nếu điều này sẽ phá vỡ với các thiết bị không phải iOS (mà tôi cần phải xem xét) – BlackWolf

+0

@BlackWolf, bạn đã tìm thấy bất kỳ câu trả lời cho câu hỏi của bạn. Tôi không thể tìm cách kiểm tra ATT_MTU cho iPhone. Trong IOS 9, có một phương thức - (NSUInteger) maximumWriteValueLengthForType: (CBCharacteristicWriteType) loại NS_AVAILABLE (NA, 9_0); , điều này cung cấp cho ATT_MTU.nhưng tôi không biết nếu MTU được đưa ra bởi phương pháp này là hợp lệ cho tất cả các phiên bản iOS. –

Trả lời

1

Tôi đang sử dụng iOS 7.1.1 và cũng thấy rằng tôi có thể gửi 132 byte đáng tin cậy từ iPhone đến iPad bằng BLE. Tôi cũng nghe nói rằng 20 byte là tối đa nhưng nó chắc chắn không có vẻ như là

+0

Thật thú vị, có vẻ như trên OS X (và các hệ thống khác, tôi giả sử) giới hạn vẫn là 20 byte – BlackWolf

+0

vậy làm thế nào có thể tăng kích thước đó nếu tôi muốn? –

+1

bạn không thể, nó là cái gì đó được xác định bởi OS + phần cứng. Bạn phải chunk dữ liệu của bạn để kích thước chunk thích hợp – BlackWolf

1

Là điểm bắt đầu cái gọi là kích thước ATT_MTU xác định số byte có thể được viết. Giá trị này được trao đổi/thương lượng giữa hai thiết bị. Thật không may, giá trị này dường như không được hiển thị trong giao diện CoreBluetooth của Apple: (

Nhưng tôi vừa mới sử dụng trình thám thính BLE và trong trường hợp của tôi là 158 byte. Nhưng sau đó lại giá trị này có thể thay đổi theo thời gian ...

Nếu bạn viết nhiều dữ liệu hơn ATT_MTU thì BlueTooth ngăn xếp có thể sử dụng một cái gọi là thủ tục Chuẩn bị-Write, nhưng không phải tất cả đống hỗ trợ đó. chưa thử nghiệm nếu Apple hỗ trợ này ...

:)

2

Tiêu chuẩn BLE yêu cầu 23 byte là ATT_MTU tối thiểu (Đơn vị truyền dẫn tối đa giao thức thuộc tính) mà tất cả các BLE devic es phải hỗ trợ. Tuy nhiên, ATT_MTU tối đa là 255 byte và đã được tăng gấp đôi lần nữa cho BLE 4.2.

BLUETOOTH SPECIFICATION Version 4.2 [Vol 3, Phần A]:

Tất cả L2CAP triển khai sẽ hỗ trợ một MTU tối thiểu là [...] 23 octet qua liên kết logic LE-U; Tuy nhiên, , một số giao thức và hồ sơ yêu cầu hỗ trợ một MTU lớn hơn .

Khi thiết lập một kết nối, cả hai thiết bị sẽ trao đổi kích thước ATT_MTU của họ, và nhỏ hơn của cả hai giá trị được sử dụng. Khi Apple bắt đầu với BLE, họ sẽ chỉ hỗ trợ tối thiểu, nhưng kể từ đó đã mở rộng kích thước có thể. Đó là lý do tại sao 124 byte của bạn hoạt động, nhưng tài liệu cũ hơn và mã mẫu sử dụng ATT_MTU nhỏ hơn nhiều.

1

Trên iOS 9 + bạn có thể sử dụng phương pháp này trên mỗi CBCentral đăng ký để xác định có bao nhiêu dữ liệu để gửi mỗi đoạn:

[central maximumUpdateValueLength]; 
+1

Không phải là nó có nghĩa là để sử dụng từ phía ngoại vi chỉ? – JustAMartin

+0

Chỉ dành cho Ngoại vi –

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