您的位置:首页 > 移动开发 > IOS开发

iOS 蓝牙打印小票机

2016-02-26 16:25 281 查看

蓝牙编程

最近公司新来了一部蓝牙小票机器,需要对其进行编程,所以阅读起了iOS蓝牙编程的官方文档,昨日测试成功,想写下点心得,方便以后查看。

言归正传。iOS的蓝牙框架是支持蓝牙4.0协议的。

理解iOS CoreBluetooth两个很重要的概念,Central 和 Periperal Devices

这两个概念可以用传统的模式client-server来理解,central意思是中心,其作用类似server,periperal就是外设,一般携带有数据,我们需要去其中获取数据,下图是苹果官网的例子,peripheral是心跳仪,按期作用,我们去这个外设中取心跳数据,则心跳仪的作用就类似server了,我们的手机去心跳仪中获取数据,类似client。


Peripheral如何让central知道它的存在呢? peripheral.比如上图的心跳仪,通过不断广播自己的存在,并且在广播过程中附带广告包(advertising packet),不知道这样翻译是否正确,不对请指正一下。如同好像有个设备在喊,Here~我是心跳仪器,我是心跳仪器,这是我提供的服务(广告包)。Central发现有个设备在呐喊,就说:“那我看看需不需要你提供服务,拿来我看看”。这样你就发现了这个设备,并且获取到它提供的服务。 <img
src="http://www.2cto.com/uploadfile/Collfiles/20141201/2014120109200052.png" alt="" http:="" www.2cto.com="" kf="" ware="" vc="" "="" target="_blank" class="keylink" style="border-width: 0px; padding: 0px; margin: 0px; list-style: none; color: rgb(51, 51,
51); font-family: 宋体; font-size: 14px; width: 630px; height: 88.0349344978166px;">vcHL1eK49nBlcmlwaGVyYWyjrL3T18XE473Qy/y747Goy/zM4bmptcS3/s7xo6zV4rj2cGVyaXBoZXJhbLvhu+OxqMv509C3/s7xuPjE46GjscjI59DEzPjSx8b3zOG5qcG91tZzZXJ2aWNlo6zJ6LG40MXPonNlcnZpY2XT68r9vt278cihc2VydmljZS7V4tH5xOO+zdaqtcDT0MTEvLjW1rf+zvHBy6GjCjMuyLu688Tjv8nS1LbUxOO40NDLyKS1xLf+zvG9+NDQstnX96GjscjI587Sw8e21Mr9vt278cihtcS3/s7xuNDQy8iko6zO0r7NttTV4rj2u/HIobXEt/7O8cu1o6y4+M7SxOO1xMv509C1xGNoYXJhY3RlcmlzY3Msy/nT0LXEzNjV96GjvNnJ6NXiyrG68sv8t7W72MG9uPbM2NX3o6zSu7j2ysfQxMz4yv2+3bXEY2hhcmFjdGVyaXN0aWMswe3N4tK7uPbKx9DEzPjRucGmyv2+3aOoz7mx4LXEo6mho8Tjvs2/ydLUttTG5MzY1fe9+NDQtsHQtLLZ1/ejrNXiwO+78cihstnX96Osvs3Kx7bBstnX96Gju/HIobW9ttTTpsr9vt3UtM23Cjxicj4KCr+00rvPwsC019S52c34tcS94bm5zbwKPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141201/2014120109200053.png"
alt="\">

介绍完这些概念,我们来看看实际代码应该如何填写.这里对于我的蓝牙小票机来编写的,因为我要对蓝牙小票机器进行写操作,手机是搜索peripharal的,所以手机为central,小票机为peripharal 1.首先导入这个框架 2.该框架有主要有几个类值得我们注意,CBCentralManager,也就是我们之前提到的Central,可以用来发现外设的。

?
?
上面代码这里我们创建了一个CBCentralManager,用来发现外设,当创建成功,CBCentralManager会回调代理说创建成功了,如下面代码

?
上面的代码如果这个时候如果是CBCentralManagerStatePoweredOn,代表蓝牙可用。一定要在该方法回调后去开启扫描外设,否则无反应.

3.现在可以连接扫描外设了

?
上面代码我创建了一个按钮来扫描,就不上对应的xib图片了.

这个方法如果传入的事nil,代表扫描所有外设。

?
如果你只想搜索有提供对应的服务号的外设(去peripharal 的advertising packet里匹配服务号,传入一个数组进入,对象为CBUUID,也就是Service的唯一标识符。一般我们搜索过一个nil的就会知道我们要的服务好是什么样子的了,之后编程就可以直接使用这个已知的服务好。除非你的蓝牙设备的厂家更改服务号,不过几乎不可能。

?
当你发现了一个设备,该方法会回调。peripheral代表你发现的设备,advertisementData时广告数据,rssi代表着信号强度.



从广播数据中可以看到一个服务UUIDs,因为广播数据有数量大小限制,数据比较少。不过目前我们只是发现了这个设备,假设该设备已经是我们感兴趣的设备,你可以通过[self.centralManager stopScan]来停止扫描,也可以继续扫描。

4.连接发现的外设

?
?
假设第一个是我们需要的外设,连接它。

?
当连接成功后调用该方法。这个时候我们设置该peripheral的代理我们自己,让peripheral给我们返回所有服务。

?
这个方法也是传入nil返回所有服务,如果是传入特定的服务id,只返回该服务 这里我们传入nil来返回所有服务

?
这里看到返回了两个服务,因为需要FFE0,所以让该服务返回对应的characteristics.

?
?
上面的方法是找到FEE0服务的所有特征,这里的只有一个,也就蓝牙小票机FFE0写服务的写特征. 获取到该特征。进行写服务,具体的log就不写了

?
这里我对蓝牙小票机提供的写特征进行写服务。成功.

补充: 如果该特征是可以读特征,你可以对该特征进行订阅。

[peripheral setNotifyValue:YES forCharacteristic:interestingCharacteristic];

该方法回调peripheral:didUpdateValueForCharacteristic:error:方法

?
点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: