美文网首页蓝牙iOS 开发 iOS Developer
IOS蓝牙4.0(BLE)开发(四)

IOS蓝牙4.0(BLE)开发(四)

作者: 在海边的人 | 来源:发表于2016-09-18 10:52 被阅读2787次

          BLE的中心模式的流程在前三篇文章中已经介绍完毕了,这篇文章主要是将开发过程中我个人遇到的一些需要注意的地方,还有一些其他可能会出现的问题,分享给大家。虽然不全面但是还是希望能够给大家起到一定的参考作用,以后再遇到新的问题还会不断的持续更新。大家也可以将自己的已经解决的或者是没解决的问题留言一下,大家可以一起做个交流,共同进步!

    还是顺着这个流程往下说:

    问题一:搜索不到蓝牙。

          一般情况下很少会发生搜索不到蓝牙的这种情况的。。。。如果真有那么先用lightblue测试排除硬件问题,然后仔细检查代码吧骚年。。。一般代码逻辑没问题的话。首先检查在扫描蓝牙设备的时候是否设置了过滤条件,这个过滤条件是不是设置的有问题。其次再看是否是我们已经搜索到了,而是我们没有正确的去显示我们搜索到的设备名字。

    问题二:连接不上蓝牙设备。

          这个问题很完蛋了,都搜索到了为啥连接上不上呢,这时候最容易暴躁了,但是稳住不要慌。

           1.当出现连接不上蓝牙设备的时候,如果没有打印报错信息。我们同样还是可以用lightblue先排除硬件问题,然后仔细检查一下代码。首先检查我们连接的时候是不是做了一些安全措施,这里一定要做一些安全措施,保证传入peripheral不能为空,还有就是传入的这个peripheral一定要有有效的信息,检查一下有没有设置代理啊等等。

         2. 还有一种情况是有报错信息的,比如说:打印报错didFailToConnectPeripheral:Error Domain=CBErrorDomain Code=0 "Unknown error." UserInfo={NSLocalizedDescription=Unknown error.}

    这种情况如果代码仔细检查过没有问题的话,那么就是你跟设备离得太远了,或者就是硬件的信号强度比较弱,一般靠近点,再次进行连接尝试。这只是其中的一种报错方式,还有一些其他的这里没有记录到,如果可以的话,以后会更新。

    问题三:外设名字的显示问题。

          蓝牙设备有本身的名字和广播名字之分。我们一般都会让其显示它的广播名字,因为这个可以设置,以便于我们区分是那个蓝牙设备:

    我们可以在搜索到设备的回调方法中获取到蓝牙的广播名称,也就是LocalName

    -(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{}

    这个方法中有一个参数的advertisementData这是一个字典,我们可以从中获取到广播信息

    {  kCBAdvDataIsConnectable = 1;

    kCBAdvDataLocalName = SimpleBLEPeripheral;//这个就是蓝牙设备的广播名字

    kCBAdvDataServiceUUIDs =(FFF0);

    kCBAdvDataTxPowerLevel = 0;

    }

    这个方法中还有另外一个参数RSSI:这里可以得到信号强度,这是一个负值,要是需要计算距离的话,这是需要根据具体的硬件来进行测试,再来确定计算公式的,网上也可以搜索到一些方法,可以搜索参考。


    接下来说一下数据交互过程中可能出现的问题:

    问题四:出现程序崩溃错误。

    reason: 'Invalid parameter not satisfying: characteristic != nil’。不满足特征值不能为空的条件。

          这种错误会出现在你写入数据的时候。

          这种错误绝对是你没有扫描到服务和特征,你就直接向某个特征里边写入数据了,或者是发送命令。连接上设备之后,没有搜索到服务和特征的原因有很多,所以还要最大程度的避免这种崩溃,我是这么处理的,只有我搜索到需要的特征值的时候我才发出一个通知,告诉需要写入数据的地方,现在写入是安全的,比如说我们让按钮变为可点击,或者输入框变为可输入等等措施,来达到安全写入的目的。

    问题五:出现打印报错。

    :Reading is not permitted  读取是不被允许的。

    这个错误一般出现在你读取数据,或者订阅数据收取失败的时候。

    第一种情况好解决:那就是你写如数据的这个特征的属性只有写入没有读的属性,这个时候就是你特征用错了,更换使用正确的读写特征就好了。

    第二种情况就是:如果你确定用的这个特征是正确的那么你就看一下是不是在和硬件通讯前,需要发一些握手数据,比如先发一个12345678的密码啊,什么的。问一下硬件那边。一般都是这里出了问题,所以说交互的时候出现问题什么的,一定要仔细阅读硬件给你的说明文档啊!

          在BLE开发中可能会碰到各种各样的崩溃报错的问题,只靠我一个来把这些错误全部犯一遍,这也不可能实现,即使可能这也会是一个很长的时间,所以还是靠大家的力量尽可能的多收集一些问题,集中在一起,给大家做一个参考。还是那句话,少走弯路,共同进步!

    相关文章

      网友评论

      • 在路上浅谈管理:,,大佬,,问你一下,,连接连接上,连接时间比较长的情况下,,比如说,连接半天之后,,硬件和手机大约4米左右的距离,信号大概就已经是-85左右了,但是很容易断开连接,,,断了就又连到,,就一直这样子,断了,又连,断了又连,,,看了代码这边断了,,错误信息也只是说断开了,没什么有用的提示信息,,就是容易断,,
        在路上浅谈管理:@在海边的人 我们的连接现在只是在连接的那一瞬间写值给硬件来更新参数,以后就不会在写值给硬件,,正常连接,,都是硬件会不断的隔几秒钟发数据过来,这样子都是正常连接着,,就是连接时间比较久的话,,容易断,,距离远一点,,也容易断,,如果代码有问题,软件也不会连接这么久啊,,
        在海边的人:@飞哥Andy 确认自己代码没问题的话。这种情况很有可能是硬件质量不过关。。
      • tree_73a4:/BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreBluetooth/CoreBluetooth-352.1/CoreBluetooth/CBPeripheral.m:375
      • 管饱饱:我们硬件兄弟说连上就能写入 但是我写入报错了Reading is not permitted.。。。表示蛋疼
        管饱饱:@Just丶搜搜 谢谢啊 问题解决了 我的硬件兄弟告诉我 要匹配他那个uuid 我没匹配好 直接循环了一个能写入的就个那写了 所以报了错
        Just丶搜搜:那你的硬件兄弟有没有给你要写入的特征配置允许写入?如果不允许写入是会报这个错误的
      • 赤子知心:遇到的问题都与到了
      • CoderMrGuo:楼主辛苦有demo分享一下么
        CoderMrGuo:@在海边的人 因为我之前也没弄过,今天对着博主博文敲的,回来看看你整理的
        在海边的人:@CoderMrGuo 现在一直在做项目,还没有整理出来。实在是不好意思,等有时间搞一个出来。

      本文标题:IOS蓝牙4.0(BLE)开发(四)

      本文链接:https://www.haomeiwen.com/subject/tdgwettx.html