iOS蓝牙开发小计
<p>不同设备连接同一个蓝牙设备,获取到的它的唯一标志是不一样的CBUUID</p><p>蓝牙重连后,特征值对象会改变,原来的特征值对象就不生效了,需要重新保存</p>
<p>蓝牙的命令发送和数据接收应该遵循发送后处理接收,接收后再次发送的原则,否则容易出现请求之后返回结果错误的问题</p>
<p>通知提醒功能:</p>
<p>手机只设置开关,实现iOS的消息通知,手表等移动穿戴设备需要自行通过ANCS技术来实现(手机广播了一个特征值,通过这个特征值往外发送消息通知)</p>
<p>链接蓝牙操作流程:</p>
<p>1.开启蓝牙开关</p>
<p>2.搜索设备,通过回调找到要链接的设备(已链接过设备需要通过设备的UUID获取)</p>
<div class="cnblogs_code">
<pre>CBPeripheral *peripheral = initWithUUIDString:peripheralUUID]]].firstObject;</pre>
</div>
<p>3.连接设备,链接设备成功后,设置CBPeripheral的代理(接收读写状态消息等),发现服务</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置设备代理</span>
<span style="color: rgba(0, 0, 0, 1)"> ;
;</span></pre>
</div>
<p>4.发现服务后,发现服务下面的特征值</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> (CBService *service <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> peripheral.services)
{
;
}</span></pre>
</div>
<p>4.发现特征值后,通过蓝牙硬件开发商给到的UUID获取保存需要的读/写/广播特征值,同时开启对特征值数据的读写监听,需要获取通知数据的,还要开启通知(所有特征值发现完之后,应该执行蓝牙设备要求的授权绑定等指令操作)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">for</span> (CBCharacteristic *characteristic <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> service.characteristics) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> () {
;
;
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> () {
;
;
}
}</span></pre>
</div>
<div class="cnblogs_code">
<pre>;</pre>
</div>
<p>5.所有获取到数据的代理函数如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">#pragma</span> mark -- 接收到数据回调
- (<span style="color: rgba(0, 0, 255, 1)">void</span>)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error </pre>
</div>
<p>6.写数据结束后状态回调</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">#pragma</span> mark -- 写入数据回调
- (<span style="color: rgba(0, 0, 255, 1)">void</span>)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error</pre>
</div>
<p>写入数据可能失败,可能没有回调,所以不能一直等待回调之后继续下一步写入,应设置超时默认已完成或已失败</p>
<p>7.每次读取到的数据可能来自不同的特征值,需要根据设备特性,灵活的组合结果数据(如同步操作时,可能是1.发起请求,2.A返回同步操作反馈,3.接着B返回同步数据,4.一天数据同步完成结束后又需要手机反馈同步状态给蓝牙设备,接着蓝牙设备吐出数据或反馈同步已完成)</p>
<p>8.如果出现了断连需要重连时,蓝牙外设/服务/特征值均不需要重新赋值(压根没变),但是需要重新开启一段 连接设备->发现服务->发现特征值监听特征值数据的过程(3.4),全部完成之后,即可以开心的发接数据了,如果缺少一环,则是会无法接受到数据反馈</p><br><br>
来源:https://www.cnblogs.com/yuxiaoyiyou/p/12841844.html
頁:
[1]