Bluetooth LE tidak begitu menakutkan, atau Bagaimana meningkatkan pengalaman pengguna tanpa banyak usaha

Baru-baru ini, tim kami membuat dan menerapkan fungsi mentransfer uang melalui udara menggunakan teknologi Bluetooth LE. Saya ingin memberi tahu Anda bagaimana kami melakukannya dan apa yang Apple berikan kepada kami dari alat-alatnya. Banyak pengembang berpikir bahwa Bluetooth itu sulit, karena itu protokol yang agak rendah, dan tidak banyak ahli di dalamnya. Tetapi semuanya tidak begitu menakutkan, dan pada kenyataannya, menggunakan fungsi ini sangat sederhana! Dan fungsi-fungsi yang dapat diimplementasikan menggunakan Bluetooth LE tentu menarik dan selanjutnya akan menyoroti aplikasi Anda di antara para pesaing.



Pertama mari kita pahami teknologi apa itu dan apa bedanya dengan Bluetooth klasik.

Apa itu Bluetooth LE?


Mengapa pengembang Bluetooth menamai teknologi ini yaitu Low Energy? Lagi pula, dengan setiap versi Bluetooth baru, konsumsi daya sudah berkali-kali lebih rendah. Jawabannya ada pada baterai ini.


Diameternya hanya 2 cm, dan kapasitasnya sekitar 220 mA * h. Ketika para insinyur mengembangkan Bluetooth LE, mereka ingin perangkat dengan baterai seperti itu berfungsi selama beberapa tahun. Dan mereka berhasil! Perangkat Bluetooth LE dengan baterai seperti itu dapat bekerja selama satu tahun. Berapa banyak dari Anda yang masih mematikan Bluetooth di telepon dengan cara lama untuk menghemat energi, seperti yang Anda lakukan pada tahun 2000? Sia-sia Anda melakukan ini - penghematannya akan kurang dari 10 detik ponsel per hari. Dan Anda menonaktifkan fungsi yang sangat besar, seperti Handoff, AirDrop, dan lainnya.

Apa yang dicapai para insinyur dengan mengembangkan Bluetooth LE? Sudahkah mereka memperbaiki protokol klasik? Membuatnya lebih hemat energi? Hanya mengoptimalkan semua proses? Tidak. Mereka benar-benar mendesain ulang arsitektur tumpukan Bluetooth dan mencapai fakta bahwa sekarang, untuk dapat dilihat oleh semua perangkat lain, Anda perlu lebih sedikit waktu untuk mengudara dan menempati saluran. Pada gilirannya, ini memungkinkan penghematan konsumsi energi yang baik. Dan dengan arsitektur baru, setiap perangkat baru sekarang dapat distandarisasi, berkat pengembang dari seluruh dunia dapat berkomunikasi dengan perangkat dan, oleh karena itu, dengan mudah menulis aplikasi baru untuk mengelolanya. Selain itu, prinsip penemuan-diri tertanam dalam arsitektur: saat menyambungkan ke perangkat, Anda tidak perlu memasukkan kode PIN apa pun, dan jika aplikasi Anda dapat berkomunikasi dengan perangkat ini, koneksi memerlukan hitungan milidetik.

  • Lebih sedikit waktu mengudara.
  • Konsumsi daya lebih sedikit.
  • Arsitektur baru.
  • Mengurangi waktu koneksi.

Bagaimana para insinyur dapat membuat lompatan besar dalam efisiensi energi?

Frekuensinya tetap sama: 2,4 GHz, tidak bersertifikat dan gratis untuk digunakan di banyak negara. Tetapi penundaan koneksi menjadi kurang: 15-30 ms, bukannya 100 ms dengan Bluetooth klasik. Jarak kerja tetap sama - 100 m Interval transmisi tidak kuat, tetapi berubah - bukannya 0,625 ms, menjadi 3 ms.

Tetapi karena ini, konsumsi energi tidak dapat dikurangi sepuluh kali lipat. Tentu saja, ada sesuatu yang harus diderita. Dan ini kecepatannya: alih-alih 24 Mbps, itu menjadi 0,27 Mbps. Anda mungkin akan mengatakan bahwa ini adalah kecepatan konyol untuk 2018.

Di mana Bluetooth LE digunakan?




Teknologi ini tidak muda, ini pertama kali muncul di iPhone 4s. Dan sudah berhasil menaklukkan banyak daerah. Bluetooth LE digunakan di semua perangkat rumah pintar dan elektronik yang dapat dipakai. Sekarang bahkan ada keripik seukuran biji kopi.



Dan bagaimana teknologi ini diterapkan dalam perangkat lunak?

Karena Apple adalah yang pertama mengintegrasikan Bluetooth ke dalam perangkat mereka dan mulai menggunakannya, sekarang mereka telah membuat kemajuan yang baik dan teknologi terintegrasi ke dalam ekosistem mereka. Dan sekarang Anda dapat memenuhi teknologi ini dalam layanan seperti AirDrop, Perangkat mulai cepat, Bagikan kata sandi, Handoff. Dan bahkan notifikasi di arloji dibuat melalui Bluetooth LE. Selain itu, Apple telah membuat dokumentasi yang tersedia untuk umum tentang cara memastikan bahwa pemberitahuan dari semua aplikasi datang ke perangkat Anda sendiri. Apa peran perangkat dalam Bluetooth LE?



Brodcaster. Mengirim pesan ke semua orang di dekatnya, Anda tidak dapat terhubung ke perangkat ini. Dengan prinsip ini, iBeacons dan pekerjaan navigasi dalam ruangan.

Pengamat. Mendengarkan apa yang terjadi di sekitar, dan hanya menerima data dari pesan publik. Tidak membuat koneksi.

Tetapi dengan Central dan Periferal lebih menarik. Mengapa mereka tidak disebut hanya Server-Client? Logikanya, dilihat dari namanya. Tapi tidak.

Karena Periferal sebenarnya bertindak sebagai server. Ini adalah perangkat periferal yang mengonsumsi lebih sedikit daya dan terhubung ke Central yang lebih kuat. Periferal dapat memberi tahu Anda bahwa lokasinya dekat dan layanan apa yang dimilikinya. Hanya satu perangkat yang dapat terhubung, dan Periferal memiliki beberapa data. Dan Central dapat memindai udara untuk mencari perangkat, mengirim permintaan koneksi, terhubung ke sejumlah perangkat, dapat membaca, menulis, dan berlangganan data dari Peripheral.

Apa yang kita sebagai pengembang punya akses ke dalam ekosistem Apple?

Apa yang tersedia untuk kita?


iOS / Mac OS:

  • Periferal dan Tengah.
  • Mode latar belakang.
  • Pemulihan kondisi.
  • Interval koneksi 15 ms.

watchOS / tvOS:

  • watchOS 4+ / tvOS 9+.
  • Hanya di pusat.
  • Maksimal dua koneksi.
  • Apple watch series 2+ / AppleTv 4+.
  • Shutdown saat memasuki latar belakang.
  • Interval koneksi 30 ms.

Perbedaan yang paling penting adalah interval koneksi. Apa pengaruhnya? Untuk menjawab pertanyaan ini, Anda harus terlebih dahulu memahami cara kerja protokol LE Bluetooth dan mengapa perbedaan kecil dalam nilai absolut sangat penting.

Bagaimana protokolnya bekerja


Bagaimana proses pencarian dan koneksi?

Periferal mengumumkan kehadirannya pada frekuensi interval iklan, paketnya sangat kecil dan hanya berisi beberapa pengidentifikasi layanan yang disediakan oleh perangkat, serta nama perangkat. Intervalnya bisa sangat besar dan dapat bervariasi tergantung pada status perangkat saat ini, mode hemat daya dan pengaturan lainnya. Apple menyarankan pengembang perangkat eksternal untuk mengikat panjang interval ke accelerometer: tingkatkan interval jika perangkat tidak digunakan, dan ketika itu aktif, kurangi untuk menemukan perangkat dengan cepat. Interval iklan tidak berkorelasi dengan interval koneksi dan ditentukan oleh perangkat itu sendiri, tergantung pada konsumsi daya dan pengaturannya. Ini tidak dapat diakses dan tidak diketahui oleh kita di ekosistem Apple, itu sepenuhnya dikendalikan oleh sistem.



Setelah kami menemukan perangkat, kami mengirim permintaan koneksi, dan di sini interval koneksi memasuki adegan - waktu setelah mana perangkat kedua dapat menanggapi permintaan tersebut. Tapi ini saat menghubungkan, tetapi apa yang terjadi saat membaca / menulis?



Interval koneksi juga muncul ketika membaca data - menguranginya 2 kali meningkatkan kecepatan transfer data. Tetapi Anda perlu memahami bahwa jika kedua perangkat tidak mendukung interval yang sama, maka maksimumnya akan dipilih.

Mari kita lihat apa paket informasi yang melewati Periferal.

MTU (unit transmisi maksimum) dari paket tersebut ditentukan selama proses koneksi dan bervariasi dari perangkat ke perangkat dan tergantung pada sistem operasi. Dalam protokol versi 4.0, MTU sekitar 30, dan ukuran muatan tidak melebihi 20 byte. Dalam versi 4.2, semuanya telah berubah, sekarang Anda dapat mentransfer sekitar 520 byte. Namun, sayangnya, hanya perangkat yang lebih muda dari iPhone 5s yang mendukung versi protokol ini. Ukuran overhead, terlepas dari ukuran MTU, adalah 7 byte: ini termasuk header ATT dan L2CAP. Dengan catatan, secara umum, situasi serupa.



Hanya ada dua mode: dengan jawab dan tanpa. Mode tidak dijawab secara signifikan mempercepat transfer data, karena tidak ada interval menunggu sebelum perekaman berikutnya. Tetapi mode ini tidak selalu tersedia, tidak di semua perangkat dan tidak di semua sistem. Akses ke mode perekaman ini mungkin dibatasi oleh sistem itu sendiri, karena dianggap kurang hemat energi. Di iOS, ada metode di mana Anda dapat memeriksa sebelum merekam apakah mode ini tersedia.

Sekarang mari kita lihat protokolnya.



Protokol terdiri dari 5 level. Lapisan aplikasi adalah logika Anda, dijelaskan di atas CoreBluetooth. GATT (Generic Attributes Layer) digunakan untuk bertukar layanan dan karakteristik yang ada di perangkat. ATT (Attributes Layer) digunakan untuk mengelola karakteristik Anda dan mentransfer data Anda. L2CAP adalah protokol pertukaran data tingkat rendah. Controller adalah chip BT itu sendiri.

Anda mungkin bertanya apa itu GATT dan bagaimana kami bisa bekerja dengannya?

GATT terdiri dari fitur dan layanan. Karakteristik adalah objek tempat data Anda disimpan, seperti variabel. Dan layanan adalah grup di mana karakteristik Anda berada, seperti namespace. Layanan memiliki nama - UUID, Anda memilihnya sendiri. Suatu layanan dapat berisi layanan tambahan.



Karakteristik juga memiliki UUID sendiri - pada kenyataannya, sebuah nama. Nilai karakteristiknya adalah NSData, di sini Anda dapat merekam dan menyimpan data. Deskriptor adalah deskripsi karakteristik Anda, Anda dapat menggambarkan data apa yang Anda harapkan dalam karakteristik ini, atau apa artinya. Ada banyak deskriptor dalam protokol Bluetooth, tetapi sejauh ini hanya dua yang tersedia pada sistem Apple: deskripsi manusia dan format data. Ada juga Izin untuk fitur Anda:



Mari kita coba sendiri


Kami punya ide untuk memungkinkan untuk mentransfer uang melalui udara tanpa memerlukan apa pun dari penerima. Bayangkan, Anda bingung dengan tugas yang sangat menarik, menulis kode yang sempurna, dan di sini seorang rekan menyarankan untuk minum kopi. Dan Anda sangat bersemangat tentang tugas yang tidak bisa Anda hilangkan, dan memintanya untuk membelikan Anda secangkir cappuccino lezat. Dia membawakanmu kopi, dan kau harus mengembalikan uang itu padanya. Anda dapat menerjemahkan berdasarkan nomor telepon, ini berfungsi dengan baik. Tapi ini situasi yang canggung - Anda tidak tahu nomornya. Nah, seperti ini, Anda sudah bekerja selama tiga tahun, tetapi Anda belum bertukar nomor :)

Oleh karena itu, kami memutuskan untuk memungkinkan transfer uang kepada mereka yang berada di dekatnya, tanpa memasukkan data pengguna apa pun. Seperti di AirDrop. Cukup pilih pengguna dan kirim jumlah yang dia butuhkan. Mari kita lihat apa yang kita butuhkan untuk ini.



PUSH mapping


Kami membutuhkan pengirim:

  1. Saya dapat menemukan semua perangkat yang ada di dekatnya dan mendukung layanan kami.
  2. Saya bisa membaca detailnya.
  3. Dan dia bisa mengirim pesan kepada penerima bahwa dia berhasil mengiriminya uang.

Penerima, pada gilirannya, harus dapat memberi tahu pengirim lain bahwa ia memiliki layanan dengan data yang diperlukan, dan dapat menerima pesan dari pengirim. Saya pikir itu tidak layak menggambarkan bagaimana proses mentransfer uang dengan detail di bank kami terjadi. Sekarang mari kita coba implementasikan ini.

Pertama, Anda perlu mencari nama-nama layanan dan karakteristik kami. Seperti yang saya katakan, ini adalah UUID. Kami cukup membuatnya dan menyimpannya di Periferal dan Pusat sehingga keduanya sama di kedua perangkat.



Anda bebas menggunakan UUID apa pun, kecuali yang berakhir seperti ini: XXXXXXXX- 0000-1000-8000-00805F9B34FB - undang-undang tersebut dicadangkan untuk perusahaan yang berbeda. Anda sendiri dapat membeli nomor tersebut dan tidak ada yang akan menggunakannya. Biayanya $ 2500.

Selanjutnya, kita perlu membuat manajer: satu untuk mentransfer dana, yang lain untuk menerima. Anda hanya perlu menentukan delegasi. Kami akan mengirimkan Central, menerima Peripheral. Kami menciptakan keduanya, karena pengirim dan penerima dapat menjadi satu orang pada waktu yang berbeda.



Sekarang kita perlu memungkinkannya untuk mendeteksi penerima dan menuliskan rincian penerima dalam karakteristik kita.



Pertama, buat layanan. Kami akan mendaftarkan UUID dan menunjukkan bahwa UUID itu primer - yaitu, layanan ini yang utama untuk perangkat ini. Contoh yang bagus: monitor detak jantung, yang mana detak jantung saat ini akan menjadi layanan utama, dan status baterai adalah informasi sekunder.

Selanjutnya, kami membuat dua karakteristik: satu untuk membaca detail penerima, yang kedua untuk menulis sehingga penerima dapat belajar tentang mengirim uang. Kami mendaftarkan mereka di layanan kami, kemudian menambahkannya ke manajer, memulai penemuan dan menunjukkan UUID layanan sehingga semua perangkat yang berada di dekatnya dapat mengetahui tentang layanan kami sebelum menghubungkannya. Data ini ditempatkan dalam paket yang dikirim Pusat selama siaran.

Penerima siap, lanjutkan ke pengirim. Jalankan pencarian dan hubungkan.



Ketika Anda mengaktifkan manajer, kami mulai mencari perangkat dengan layanan kami. Ketika kami menemukannya, kami mendapatkannya dalam metode delegasi dan segera terhubung. Penting: Anda perlu mempertahankan tautan yang kuat ke semua Periferal tempat Anda bekerja, jika tidak mereka akan bocor.



Setelah koneksi berhasil, kami mengkonfigurasi delegasi yang akan bekerja dengan perangkat ini, dan kami mendapatkan layanan yang kami butuhkan dari perangkat.



Kami telah berhasil terhubung ke penerima, sekarang Anda harus membaca detailnya.

Setelah terhubung, kami telah meminta semua layanan dari perangkat. Dan setelah menerimanya, metode delegasi akan dipanggil, yang akan mencantumkan semua layanan yang tersedia di perangkat ini. Kami menemukan yang tepat dan meminta karakteristiknya. Hasilnya dapat ditemukan oleh UUID dalam metode delegasi, yang menyimpan data untuk diterjemahkan. Kami mencoba membacanya, dan kami mendapatkan yang diinginkan lagi dalam metode delegasi. Semua layanan, karakteristik, dan nilainya di-cache oleh sistem, sehingga tidak perlu meminta mereka nanti setiap kali.



Itu saja, kami mengirim uang untuk kopi, saatnya menunjukkan kepada penerima pemberitahuan yang indah sehingga ia menunggu rubel di akunnya. Untuk melakukan ini, Anda perlu menerapkan proses pengiriman pesan.

Kami mendapatkan karakteristik yang kami butuhkan dari pengirim, dalam hal ini kami mengambilnya dari nilai yang disimpan. Tetapi sebelum itu, Anda harus mendapatkannya dari perangkat, seperti yang kami lakukan sebelumnya. Dan kemudian cukup tulis data dengan karakteristik yang diinginkan.

Setelah itu, di perangkat lain, kami mendapatkan permintaan tulis dalam metode delegasi. Di sini Anda dapat membaca data yang dikirimkan kepada Anda, merespons kesalahan apa pun, misalnya, tidak ada akses, atau karakteristik ini tidak ada. Semuanya akan berfungsi, tetapi hanya jika kedua perangkat dihidupkan dan aplikasi aktif. Dan kita harus bekerja di latar belakang!



Apple memungkinkan Anda untuk menggunakan Bluetooth di latar belakang. Untuk melakukan ini, Anda perlu menunjukkan di info.plist kunci dalam mode mana yang ingin kita gunakan, di Peripheral atau Central.



Selanjutnya, di manajer, Anda perlu menentukan kunci pemulihan dan membuat metode delegasi. Sekarang mode latar belakang tersedia untuk kita. Jika aplikasi tertidur atau dibongkar dari memori, maka ketika Anda menemukan Periferal yang diinginkan atau ketika Central terhubung, itu akan bangun dan manajer akan dipulihkan dengan kunci Anda.



Semuanya baik-baik saja, siap dirilis. Tapi di sini desainer datang berlari ke kami dan berkata: "Kami ingin memasukkan foto pengguna sehingga lebih mudah bagi mereka untuk menemukan satu sama lain." Apa yang harus dilakukan Dalam karakteristik kami, Anda dapat menulis hanya sekitar 500 byte, tetapi pada beberapa perangkat secara umum 20 :(



Pergi lebih dalam


Untuk mengatasi masalah ini, kami harus melangkah lebih dalam.



Sekarang kami berbicara dengan perangkat di tingkat GATT / ATT. Tetapi di iOS 11, kami memiliki akses ke protokol L2CAP. Namun, dalam hal ini, Anda harus mengurus sendiri transfer data. Paket dikirim dengan MTU 2 Kb, tidak perlu menyandikan ulang apa pun, NSStream biasa diterapkan. Kecepatan data hingga 394 Kbps, menurut Apple.

Misalkan Anda mentransfer data apa pun dari layanan Anda dari Periferal ke Pusat dalam bentuk karakteristik normal. Dan saya butuh untuk membuka saluran. Anda membukanya di Periferal, sebagai imbalannya Anda mendapatkan PSM - ini adalah jumlah saluran yang dapat Anda hubungkan, dan Anda perlu mentransfernya ke Central menggunakan karakteristik yang sama. Jumlahnya dinamis, sistem itu sendiri memilih PSM mana yang akan dibuka saat ini. Setelah transfer, Anda sudah dapat terhubung ke Periferal di Pusat dan bertukar data dalam format yang nyaman bagi Anda. Mari kita lihat bagaimana melakukan ini.

Pertama, buka port terenkripsi pada Peripheral. Anda dapat melakukannya tanpa enkripsi, maka ini akan sedikit mempercepat transfer.



Selanjutnya, dalam metode delegasi, kami mendapatkan PSM dan mengirimkannya ke perangkat lain.



Setelah menghubungkan perangkat lain, kita akan dipanggil metode di mana kita bisa mendapatkan NSStream yang kita butuhkan untuk transmisi dari saluran.



Pusat bahkan lebih mudah, kami hanya terhubung ke saluran dengan nomor yang diinginkan ...



... dan setelah itu kita mendapatkan aliran yang kita butuhkan. Di dalamnya Anda benar-benar dapat mentransfer data apa pun dalam berbagai ukuran, dan membangun protokol Anda di atas L2CAP. Jadi kami menyadari transfer foto penerima.



Tetapi ada jebakan, di mana melakukannya tanpa mereka.

Perangkap


Mari kita lihat perangkap saat bekerja di latar belakang. Karena peran Periferal dan Pusat tersedia untuk Anda, Anda mungkin berpikir. bahwa di latar belakang Anda dapat menentukan perangkat mana yang terdekat di latar belakang dan mana yang aktif. Secara teori, memang seharusnya begitu, tetapi Apple memperkenalkan batasan: ponsel yang ada di latar belakang, baik Tengah atau Periferal, tidak tersedia untuk ponsel lain yang juga ada di latar belakang. Selain itu, ponsel yang ada di latar belakang tidak terlihat dari perangkat non-iOS.Mari kita lihat mengapa ini terjadi.

Ketika perangkat Anda aktif, ia akan mengirim paket siaran reguler, yang mungkin berisi nama perangkat dan daftar layanan. yang disediakan perangkat ini. Dan data melimpah adalah semua yang tidak sesuai.



, , overflow-. , iOS- , β€” . , . Apple overflow-, , , . , , , , , , .



, , . - :

CoreBluetooth[WARNING] Unknown error: 124 

Yang terburuk adalah tidak ada metode delegasi yang dipanggil, kami bahkan tidak bisa mengalahkan kesalahan ini untuk pengguna. Hanya pesan di log - dan diam, semuanya membeku. Tidak ada perubahan besar yang dibuat, jadi kami mulai memutar kembali komitmen. Dan mereka menemukan bahwa mereka pernah mengoptimalkan kode dan mengubah cara penulisan data. Masalahnya adalah bahwa tidak semua klien diperbarui, sehingga kesalahan ini terjadi.

 .write != .writeWithoutResponse 

Kami, senang bahwa kami telah memperbaiki segalanya, berlari untuk mengujinya, dan mereka segera kembali kepada kami: β€œFoto mode Anda tidak berfungsi. Mereka semua kekurangan muatan. ” Kami mulai mencoba, dan memang benar bahwa kadang-kadang, pada perangkat yang berbeda, foto yang rusak datang pada waktu yang berbeda. Mereka mulai mencari alasan.

Dan lagi-lagi mereka melihat kesalahan sebelumnya. Segera mengira itu dalam versi yang berbeda. Tetapi setelah penghapusan lengkap versi lama dari semua perangkat uji, kesalahan masih terjadi. Kami sedih ...

 CoreBluetooth[WARNING] Unknown error: 722 CoreBluetooth[WARNING] Unknown error: 249 CoreBluetooth[WARNING] Unknown error: 312 

Kami mulai mencari alat debugging. Hal pertama yang kami temui adalah Apple Bluetooth Explorer. Program yang kuat, dapat melakukan banyak hal, tetapi untuk debugging protokol Bluetooth LE, ada satu tab kecil dengan pencarian perangkat dan mendapatkan karakteristik. Dan kami perlu menganalisis L2CAP.

Kemudian mereka menemukan LightBlue Explorer. Itu ternyata menjadi program yang cukup baik, meskipun dengan desain dari iOS 7. Ini dapat melakukan hal yang sama seperti Bluetooth Explorer, dan juga tahu cara berlangganan spesifikasi. Dan itu bekerja lebih stabil. Semuanya baik-baik saja, tetapi sekali lagi tanpa L2CAP.

Dan kemudian kami teringat sniffer WireShark yang terkenal.

Ternyata dia akrab dengan Bluetooth LE: dia bisa membaca L2CAP, tetapi hanya di bawah Windows. Meskipun tidak menakutkan bahwa kami tidak akan menemukan Windows atau sesuatu. Minus terbesar - program hanya bekerja dengan perangkat tertentu. Artinya, Anda harus menemukan perangkat di suatu tempat di toko resmi. Dan Anda sendiri mengerti bahwa perusahaan besar tidak akan menyetujui pembelian perangkat yang tidak dapat dipahami di pasar loak. Kami bahkan mulai menjelajahi toko online luar negeri.

Tetapi di sini mereka menemukan program PacketLogger di Alat Xcode Tambahan. Ini memungkinkan Anda untuk menonton lalu lintas yang terjadi pada perangkat OS X. Mengapa tidak menulis ulang MoneyDrop kami di bawah OS X? Kami sudah memiliki perpustakaan terpisah. Kami baru saja mengganti UIImage dengan NSImage, semuanya dimulai setelah 10 menit.



Akhirnya, kita bisa membaca paket yang dipertukarkan antar perangkat. Segera menjadi jelas bahwa pada saat pengiriman data melalui L2CAP salah satu karakteristik dicatat. Dan karena fakta bahwa saluran itu benar-benar sibuk dengan transfer foto, iOS mengabaikan rekaman tersebut, dan pengirimnya setelah diabaikan memecah saluran. Setelah memperbaiki masalah dengan transfer foto tidak.



Itu saja, terima kasih sudah membaca :)

Tautan yang bermanfaat


WWDC / CoreBluetooth:


Bluetooth


YouTube

  • Arrow Electronics β†’ Seri Bluetooth Low Energy

Source: https://habr.com/ru/post/id452278/


All Articles