Android 蓝牙编程的基本步骤:
获取蓝牙适配器BluetoothAdapter blueadapter=BluetoothAdaptergetDefaultAdapter();
如果BluetoothAdapter 为null,说明android手机没有蓝牙模块。
判断蓝牙模块是否开启,blueadapterisEnabled() true表示已经开启,false表示蓝牙并没启用。
启动配置蓝牙可见模式,即进入可配对模式Intent in=new Intent(BluetoothAdapterACTION_REQUEST_DISCOVERABLE);
inputExtra(BluetoothAdapterEXTRA_DISCOVERABLE_DURATION, 200);
startActivity(in); ,200就表示200秒。
获取蓝牙适配器中已经配对的设备Set<BluetoothDevice> device=blueadaptergetBondedDevices();
还需要在androidManifestxml中声明蓝牙的权限
<uses-permission android:name="androidpermissionBLUETOOTH" />
<uses-permission android:name="androidpermissionBLUETOOTH_ADMIN" />
接下来就是根据自己的需求对BluetoothAdapter 的 *** 作了。
使用BluetoothAdapter类提供的方法getRemoteDevice 创建BluetoothDevice实例。
提醒一句,BluetoothAdapter实例应使用 BluetoothAdaptergetDefaultAdapter ()静态方法获取。
以下摘译自android文档。
public BluetoothDevice getRemoteDevice (String address)
Since: API Level 5
Get a BluetoothDevice object for the given Bluetooth hardware address
Valid Bluetooth hardware addresses must be upper case, in a format such as "00:11:22:33:AA:BB" The helper checkBluetoothAddress(String) is available to validate a Bluetooth address
通过指定的硬件地址获取BluetoothDevice对象。有效的蓝牙硬件地址必须是形如"00:11:22:33:AA:BB"的大写字符串。可使用辅助方法checkBluetoothAddress(String)校验地址(格式)的有效性。
A BluetoothDevice will always be returned for a valid hardware address, even if this adapter has never seen that device
如地址有效则一个对应的BluetoothDevice对象被返回,即使适配器并未发现该设备。
Parameters 参数
address valid Bluetooth MAC address 有效的蓝牙MAC地址
Throws
IllegalArgumentException if address is invalid
上一篇 主要介绍了部分ESC/POS指令集,包括一些常用的排版指令,打印位图指令等。另外,还介绍了将转换成点阵图的方法。在这篇文章中,将主要介绍通过蓝牙和Socket连接打印机,发送打印指令相关知识。这里将用到 CoreBluetoothframework 和 CocoaAsyncSocket 。
蓝牙是一种支持设备间短距离通讯的无线电技术。iOS系统中,有四个框架支持蓝牙链接:
CoreBluetooth框架有两个核心概念,central(中心)和 peripheral(外设),它们分别有自己对应的API;这里显然是手机作为central,蓝牙打印机作为peripheral;
设置代理后,会回调此方法,确认蓝牙状态,当状态为 CBCentralManagerStatePoweredOn 才能去扫描设备,蓝牙状态变化时,也会回调此方法
调用此方法开始扫描外设
注意:第一个参数指定一个 CBUUID 对象数组,每个对象表示外围设备正在通告的服务的通用唯一标识符(UUID)。此时,仅返回公布这些服务的外设。当参数为 nil ,则返回所有已发现的外设,而不管其支持的服务是什么。
当扫描到40外设后会回调此方法,这里包含设备的相关信息,如名称、UUID、信号强度等;
调用此方法连接外设
[selfcentralManager connectPeripheral:peripheral options:nil];
注意:第一个参数是要连接的外设。第二个参数 options 是可选的 NSDictionary ,系统定义了一下三个键,它们的值都是NSNumber (Boolean);默认为NO。当设置为YES,则应用进入后台或者被挂起后,系统会用Alert通知蓝牙外设的状态变化,效果是这样
连接成功或失败,都有对应的回调方法
连接成功后设置代理 peripheraldelegate = self ,调用 [peripheral discoverServices:nil]; 寻找外设内的服务。这里的参数是一个存放 CBUUID 对象的数组,用于发现特定的服务。当传nil时,表示发现外设内所有的服务。发现服务后系统会回调下面的方法:
发现服务后,调用 [peripheral discoverCharacteristics:nil forService:service]; 去发现服务中包含的特征。和上面几个方法一样,第一个参数用于发现指定的特征。为nil时,表示发现服务的所有特征。
当扫描到写入特征时,保存,用于写入数据。
写入数据,我们只需要调用方法
这里的 selfperipheral 就是连接的外设, selfcharacteristicInfo 就是之前保存的写入特征;这里最好使用 CBCharacteristicPropertyWrite 特征,并且 type 选择 CBCharacteristicWriteWithResponse 。当写入数据成功后,系统会通过下面这个方法通知我们:
由于蓝牙设备每次可写入的数据量是有限制的,因此,我们需要将之前拼接的打印数据进行拆分,分批发送给打印机
这里的 MAX_CHARACTERISTIC_VALUE_SIZE 是个宏定义,表示每次发送的数据长度,经笔者测试,当 MAX_CHARACTERISTIC_VALUE_SIZE = 20 时,打印文字是正常速度。但打印的速度非常慢, 应该在硬件允许的范围内,每次发尽量多的数据。 不同品牌型号的打印机,这个参数是不同的,笔者的蓝牙打印机该值最多到140。超出后会出现无法打印问题。 最后笔者将该值定为 MAX_CHARACTERISTIC_VALUE_SIZE = 120 ,测试了公司几台打印机都没有问题。
另外iOS9以后增加了方法 maximumWriteValueLengthForType: 可以获取写入特诊的最大写入数据量,但经笔者测试,对于部分打印机(比如我们公司的)是不准确的,因此,不要太依赖此方法,最好还是自己取一个合适的值。
注意:每个打印机都有一个缓冲区,缓冲区的大小视品牌型号有所不同。打印机的打印速度有限,如果我们瞬间发送大量的数据给打印机,会造成打印机缓冲区满。缓冲区满后,如继续写入,可能会出现数据丢失,打印乱码。
这里使用 CocoaAsyncSocket 开源框架,与打印机进行 Socket 连接。 CocoaAsyncSocket 中主要包含两个类:
这里我们只用到 GCDAsyncSocket ,因此只需要将 GCDAsyncSocketh 和 GCDAsyncSocketm 两个文件导入项目。
注意:手机和打印机必须在同一局域网下,设置到打印机的host和port。
连接成功后会通过代理回调
Timeout为负,表示不设置超时时间。这里的data就是 上一篇 中拼接的打印数据。
写入完成后回调
断开连接有以下几种方法
连接断开后回调
读取到数据会回调
网口打印机一般都支持状态查询,查询指令如下:
可以通过 上一篇 介绍指令拼接方法,查询打印机的状态。
本篇只是简单介绍了,通过蓝牙和Socket连接打印机的方法。虽然可以初步完成连接和打印,但是,在真正的项目中使用还是远远不够的。这里还有很多情况需要考虑,比如连接断开、打印机异常、打印机缓冲区满、打印机缺纸等。我们可以针对自身的业务情况,进行相应的处理。
Core Bluetooth Programming Guide
Getting the pixel data from a CGImage object
Core Bluetooth Programming Guide
以上就是关于android怎么来判断蓝牙开、关的状态求代码全部的内容,包括:android怎么来判断蓝牙开、关的状态求代码、android bluetooth已知了bluetoothDevice的mac地址 怎么得到bluetoothDevice、iOS开发之蓝牙/Socket链接小票打印机(二)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)