簡體   English   中英

如何以編程方式處理BLE外設從iOS設備中刪除配對

[英]How to Programmatically Handle BLE Peripheral Removing Pairing from iOS Device

iOS應用程序以中央模式運行,BLE外圍設備(例如BLE113)具有加密的GATT特性 - 當iOS應用程序掃描並連接到外圍設備時,它會在發現加密的GATT特征時自動請求配對。

如果iOS設備和BLE外圍設備都保持配對,一切都很好。

但是,如何處理BLE外設在內部刪除所有綁定信息的情況,而不通知iOS設備它正在刪除配對鍵?

iOS CoreBluetooth命令將失敗。

有什么可以通過編程方式來解決這個問題嗎? 要么重新請求配對,要么取消配對iOS端?

iOS受藍牙限制很多 - 所以我看不到很多好的解決方案,除了檢測寫入失敗時,還要求用戶手動取消配對(這是蹩腳的)

我終於能夠解決這個了,事實證明,你甚至不需要取消配對!

我在這里寫了我的經歷:

http://www.sureshjoshi.com/embedded/bgscript-pairing-hell/和這里: http//community.silabs.com/t5/Wireless/Bonding-issues-with-BLE121/mp/163221#M10850

實質上,從固件方面,當設備發現配對不會立即發生時,您可以重新請求加密。 對於BGScript,這是相關的代碼:

event sm_bonding_fail(handle, result) 
# If bonding fails, handle it gracefully based on the following possible results:
# - 0x018B - Out of bonds (no space left, all 8 bonding slots taken)
# - 0x0205 - Authentication failure (shouldn't happen with "just works" mode, but might otherwise)
# - 0x0206 - Pin or key missing (probably local or remote device is missing the key, but not both)
# - 0x0301 - Passkey entry failed (also shouldn't happen in "just works" mode unless bonding is cancelled)
# - 0x0302 - OOB data not available (only occurs if OOB is required and not supported on both ends)
# - 0x0303 - Authentication requirements (I/O capabilities required but not supported)
# - 0x0304 - Confirm value failed (PIN entry/comparison attempted but failed)
# - 0x0305 - Pairing not supported (also occurs if bond info removed from remote device but not local module)
# - 0x0306 - Encryption key size (key size insufficient to meet security requirements)
# - 0x0307 - Command not supported (SMP command is not supported on this device)
# - 0x0308 - Unspecified reason (may occur if bond info is present remotely but not locally)
# - 0x0309 - Repeated attempts (too little time has elapsed since last pairing/security request)
# - 0x030A - Invalid parameters (bad parameters sent during pairing/bonding process)

# NOTE: The most common cases:
# - 0x018B, which means you ran out of space and must remove at least one bond in order to bond again
# - 0x0206, which typically means the pairing info was removed on the remote device but not locally
# - 0x0301, which typically means the user cancelled the pairing request or entered the wrong passkey
# - 0x0305, which is like 0x0206 but is often generated instead if the remote device is a smartphone
# - 0x0308, which typically means the pairing info was removed on the local device but not remotely
if result = $018b then
    # Only solved by removing bonds - requires the user to reset the bonds...
end if

if result = $0301 then
    # Usually solved simply by trying again
    # Seems to solve most problems on iOS
    # On Android, pairing rejected a few times if Android deleted pairing without informing device
    call sm_encrypt_start(0, 1)
end if

if result = $0305 || result = $0206 then
    # Remove local bonding info first, then the remote device needs to reconnect
    # If current_bond_handle is $ff, that means we don't have a bonding handle - so not much we can do
    if current_bond_handle != $ff then
        call sm_delete_bonding(current_bond_handle)
    end if

    # Sometimes takes a few tries
    call connection_disconnect(0)
end if

if result = $0308 then
    # Remove remote bonding info first, then the remote device needs to reconnect
    # Android can recover automatically, iOS cannot
    # Instead of disconnecting, just force a re-encryption... Usually works
    call sm_encrypt_start(0, 1)
end if
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM