EspressifApp/EspBlufiForiOS

iPhone的加密模式问题

zhuyajing001 opened this issue · 10 comments

NSData *SetSecuritydata = [PacketCommand SetESP32ToPhoneSecurityWithSecurity:YES CheckSum:YES Sequence:self.sequence];
这个方法有什么作用?做项目的时候,连接蓝牙写不写这个方法有什么不同?

测试设备连接的时候,因为写了这个方法,收不到回信呀!有些崩溃

@zhuyajing001 你好,SetESP32ToPhoneSecurityWithSecurity这个方法是在获取到设备返回的密钥Securtkey之后调用,作用是通知设备是否设置加密模式,设置YES是使用加密方式,如果设置NO不使用加密方式,如果你在没有获取到密钥调用这个方法,设备找不到密钥会出问题的。

如果你们没有加密需求,不需要调用这个方法,如果有加密需求下面是正确的加密流程:

  1. 在demo中BLEViewController.m文件中调用setBlockOnDidUpdateNotificationStateForCharacteristic此方法获取订阅状态,当获取到状态为订阅成功时调用SendNegotiateData方法:
    [weakself SendNegotiateData];

  2. SendNegotiateData方法是发送协商加密数据包,在setBlockOnDiscoverCharacteristics方法中监听订阅通知,在获取到设备返回的数据后,调用analyseData方法进行数据解析:
    [weakself analyseData:Mutabledata];

  3. analyseData方法是解析设备返回的数据信息,数据中会返回是否有加密、是否有校验、是否有后续包、区分是数据包、控制包、异常包等等,如果是数据包时,调用GetDataPackectWithData方法:
    [self GetDataPackectWithData:decryptdata SubType:SubType];

  4. GetDataPackectWithData在这个方法中,判断SubType的状态,如果状态为(Negotiate_Data_DataSubType)说明协商加密完成
    self.Securtkey=[DH_AES GetSecurtKey:data RsaObject:self.rsaobject];
    就可以获取到设备返回的密钥Securtkey。然后去调用SetESP32ToPhoneSecurityWithSecurity方法设置加密模式。

thank you for the answer。安卓对应从安卓的demo代码中没有找到相似的代码,SetESP32ToPhoneSecurityWithSecurity这个设置加密模式的代码是只在iOS中存在吗?现在测试设备连接的时候,即使写了这个方法,连接的设备其实也正确的收到了我这里发送的信息。但是,该设备的回信手机端却没有收到!SetESP32ToPhoneSecurityWithSecurity这个方法其实是连接的设备设置加密模式发送信息,而不是手机端吗?照理说,即使连接的设备设置了加密模式,手机端也该收到一串乱码,而不是什么信息都没有收到呀!

@fanbaoying 想不通!

Android 也有的
在类BlufiClientImpl里的方法
boolean postSetSecurity(boolean ctrlEncrypted, boolean ctrlChecksum, boolean dataEncrypted, boolean dataChecksum)
这个方法是私有的,协商加密过程中会自动调用 方法:__negotiateSecurity()

@zhuyajing001 你好,请问是设备回的消息是一直都没有收到,还是收到设备回的消息解析之后,没有拿到想要的数据?
按照我发的流程,直接调用就可以的,把相应代码直接拷贝过去就可以了。

@fanbaoying
第一:经过步骤1、2、3、4此时通信还是正常的。然后去调用SetESP32ToPhoneSecurityWithSecurity方法设置加密模式。设置完加密模式后,发送了一些特定的信息给蓝牙设备。通过串口log可以肯定蓝牙接正确接收到了相关的信息。此时蓝牙需要回信给手机端,但是,手机端没有收到蓝牙的回信。
第二:如果步骤1、2、3、4步骤后不去调用SetESP32ToPhoneSecurityWithSecurity方法设置加密模式。直接给蓝牙发送了一些特定的信息。手机端就可以正常的收到蓝牙的回信。
是不是因为手机端设置了加密模式,所以对应的蓝牙端也需要设置加密模式才可以正常通信呀?

Android端加密了之后能收到回复吗?
另外App给设备发送的特定信息是自定义数据还是其他什么命令?

安卓端说是没有找到加密的代码所以没有加密,发送数据是自定义的

虽然不知道蓝牙设备需要经过怎么样的处理。但是问题已经解决了。不过,因为蓝牙端代码不是这里负责,也没有办法查看那边的代码。也就不知道这个问题最终的答案了。