iOS中蓝牙与打印机连接使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS中蓝牙与打印机连接使用相关的知识,希望对你有一定的参考价值。

参考技术A 公司最近帮一家物流公司做一个员工使用的APP,需要用到蓝牙去连接设备打印运单信息,下面记录一些在对接蓝牙打印时候遇到的问题,也总结一下其他技术文章中的一些知识点供大家参考,网上也有别人做好的第三方BabyBluetooth,这个第三方也可以在我们找的几种设备上正常打印,同学们可以去看看这个怎么使用,有问题的地方希望大家提出来。

1、服务(services):蓝牙外设对外广播的时候一定会有一个服务,有些时候也可以是有多个服务,服务下面包含一些特性,服务可以理解成一个模块的窗口;
2、特征(characteristic):特征存在于服务下面的,一个服务下面可以有多个特征,特征可以理解成具体实现功能的窗口,一般的特性都会有value,也就是特征值,是特征和外界交互的最小单位;
3、UUID:蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。

1、导入苹果系统蓝牙框架<CoreBluetooth/CoreBluetooth.h>

2、遵循两个蓝牙框架相关的协议<CBCentralManagerDelegate,CBPeripheralDelegate>

3、新建两个实例属性,一个特征属性
@property (nonatomic, strong) CBCentralManager *centralManager; //中心管理者
@property (nonatomic, strong) CBPeripheral *peripheral; //连接到的外设
@property (nonatomic, strong) CBCharacteristic *characteristic; //特征

4、实例化CBCentralManager对象进行蓝牙管理
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()]; //创建实例进行蓝牙管理

在实例化该对象之后,就会触发下面这个必须实现的代理方法,否则在实例化之后会闪退,在该方法里面也可以获取到蓝牙的状态,可以在此处提示用户去打开蓝牙

客户的需求里面有下次进入该界面自动连接设备的功能,开始做的时候是实例化之后马上开始连接之前的设备,但是总是连接不上。实际上等这个回调函数调用之后就可以连接了,包括去搜索也是一样,如果大家操作相关功能之后没有效果,可能是这个函数还没调用的原因,怎么连接之前的设备一会会讲到。

5.扫描蓝牙设备(根据SERVICE_UUID来扫描外设,如果不设置则扫描所有蓝牙设备)

执行扫描动作之后,如果扫描到外设了,就会自动回调下面的协议方法

6.连接外围设备

连接外围设备,中心管理者连接外设成功,如果连接成功就会回调这个协议方法

/** 连接失败的回调 */

/** 断开连接 */

7、获取外围设备服务和特征
peripheral调用discoverServices方法之后,在下面的回调函数中发现服务

peripheral调用查询对应服务下面的特征之后,会在下面的回调函数中返回

到现在打印所需要的所有内容都获取到了,就可以往打印机发送数据了

8、从外围设备读取数据
凡是从蓝牙传过来的数据都要经过这个回调,简单的说这个方法就是你拿数据的唯一方法,你可以判断是否 从外围设备读数据

9、向蓝牙设备写数据

这里说明怎么连接上一次或者之前连接的设备,可以保存之前设备的标识,进入App之后通过这个标识实例化服务来进行链接;通过这种方式不行的同学可以试试保存这个标识,下次进入的时候后台扫描设备,判断那个设备的标识和存储的一样,连接表示一样的那个...

关于蓝牙打印的知识暂时分享到这里,下面贴出参考的文章
蓝牙的连接和数据的读写

Android开发之蓝牙连接打印机

代码很简单,直接一个布局文件和一个activity。需要的朋友可以直接将这两部分粘贴复制到项目中即可。

技术分享

Activity部分:

package com.anhua.bluetooth;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.UUID;
import com.example.imooc_weixinfragment.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class BluetoothActivity extends Activity implements OnClickListener {

    private ListView unbondDevices = null;
    private ListView bondDevices = null;
    private Context context = null;
    private BluetoothAdapter bluetoothAdapter = BluetoothAdapter
            .getDefaultAdapter();
    private ArrayList<BluetoothDevice> unbondDeviceslist = null; // 用于存放未配对蓝牙设备
    private ArrayList<BluetoothDevice> bondDeviceslist = null;// 用于存放已配对蓝牙设备
    private ListView unbondDevicesListView = null;
    private ListView bondDevicesListView = null;
    private Button searchDevices;// 搜索蓝牙设备Button
    private TextView deviceName;// 蓝牙设备的名字
    private TextView connectState = null;//蓝牙设备连接状态
    private String address;// 蓝牙地址
    private ImageView returnButton;
    private boolean isConnection = false;
    private BluetoothDevice devices = null;
    private static BluetoothSocket bluetoothSocket = null;
    private static final UUID uuid = UUID
            .fromString("00001101-0000-1000-8000-00805F9B34FB");
    private static OutputStream outputStream = null;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.context = this;
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.bluetooth_layout);
        unbondDeviceslist = new ArrayList<BluetoothDevice>();
        bondDeviceslist = new ArrayList<BluetoothDevice>();
        this.initIntentFilter();
        initView();
        init();
    }

    private void init() {
        deviceName=(TextView) findViewById(R.id.device_name);
        connectState=(TextView) findViewById(R.id.connect_state);
        unbondDevices = (ListView) this.findViewById(R.id.unbondDevices);
        bondDevices = (ListView) this.findViewById(R.id.bondDevices);
        searchDevices = (Button) this.findViewById(R.id.searchDevices);
        unbondDevicesListView = (ListView) findViewById(R.id.unbondDevices);
        bondDevicesListView = (ListView) findViewById(R.id.bondDevices);
        returnButton = (ImageView) this.findViewById(R.id.return_Bluetooth_btn);
        this.setSearchDevices(searchDevices);
        searchDevices.setOnClickListener(this);
        returnButton.setOnClickListener(this);
    }

    public void setSearchDevices(Button searchDevices) {
        this.searchDevices = searchDevices;
    }

    /**
     * 初始化界面
     */
    public void initView() {

        if (this.isOpen()) {
            System.out.println("蓝牙有开!");
        }
        if (!this.isOpen()) {
            System.out.println("蓝牙没开!");
            this.searchDevices.setEnabled(false);
        }
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        this.disconnect();
        super.onDestroy();
    }

    /**
     * 添加已绑定蓝牙设备到ListView
     */
    private void addBondDevicesToListView() {
        ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
        int count = this.bondDeviceslist.size();
        System.out.println("已绑定设备数量:" + count);
        for (int i = 0; i < count; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("deviceName", this.bondDeviceslist.get(i).getName());
            data.add(map);// 把item项的数据加到data中
        }
        String[] from = { "deviceName" };
        int[] to = { R.id.device_name };
        SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data,
                R.layout.bonddevice_item, from, to);
        // 把适配器装载到listView中
        this.bondDevicesListView.setAdapter(simpleAdapter);

        this.bondDevicesListView
                .setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {
                        deviceName.setVisibility(View.VISIBLE);
                        connectState.setVisibility(View.VISIBLE);
                        BluetoothDevice device = bondDeviceslist.get(arg2);
                        address = device.getAddress();// 获取蓝牙地址
                        devices=bluetoothAdapter.getRemoteDevice(address);
                        
                        deviceName.setText(getDeviceName());
                        // 一上来就先连接蓝牙设备
                        boolean flag = connect();
                        if (flag == false) {
                            // 连接失败
                            connectState.setText("连接失败!");
                        } else {
                            // 连接成功
                            connectState.setText("连接成功!");
                        }
                    }
                });
    }

    /**
     * 添加未绑定蓝牙设备到ListView
     */
    private void addUnbondDevicesToListView() {
        ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
        int count = this.unbondDeviceslist.size();
        System.out.println("未绑定设备数量:" + count);
        for (int i = 0; i < count; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("deviceName", this.unbondDeviceslist.get(i).getName());
            data.add(map);// 把item项的数据加到data中
        }
        String[] from = { "deviceName" };
        int[] to = { R.id.undevice_name };
        SimpleAdapter simpleAdapter = new SimpleAdapter(this.context, data,
                R.layout.unbonddevice_item, from, to);

        // 把适配器装载到listView中
        unbondDevicesListView.setAdapter(simpleAdapter);

        // 为每个item绑定监听,用于设备间的配对
        unbondDevicesListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                try {
                    Method createBondMethod = BluetoothDevice.class
                            .getMethod("createBond");
                    createBondMethod.invoke(unbondDeviceslist.get(arg2));
                    // 将绑定好的设备添加的已绑定list集合
                    bondDeviceslist.add(unbondDeviceslist.get(arg2));
                    // 将绑定好的设备从未绑定list集合中移除
                    unbondDeviceslist.remove(arg2);
                    addBondDevicesToListView();
                    addUnbondDevicesToListView();
                } catch (Exception e) {
                    Toast.makeText(context, "配对失败!", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }

    private void initIntentFilter() {
        // 设置广播信息过滤
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
        intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
        // 注册广播接收器,接收并处理搜索结果
        context.registerReceiver(receiver, intentFilter);

    }

    /**
     * 打开蓝牙
     */
    public void openBluetooth(Activity activity) {
        Intent enableBtIntent = new Intent(
                BluetoothAdapter.ACTION_REQUEST_ENABLE);
        activity.startActivityForResult(enableBtIntent, 1);

    }

    /**
     * 关闭蓝牙
     */
    public void closeBluetooth() {
        this.bluetoothAdapter.disable();
    }

    /**
     * 判断蓝牙是否打开
     * 
     * @return boolean
     */
    public boolean isOpen() {
        return this.bluetoothAdapter.isEnabled();

    }

    /**
     * 搜索蓝牙设备
     */
    public void searchDevices() {
        this.bondDeviceslist.clear();
        this.unbondDeviceslist.clear();

        // 寻找蓝牙设备,android会将查找到的设备以广播形式发出去
        this.bluetoothAdapter.startDiscovery();
    }

    /**
     * 添加未绑定蓝牙设备到list集合
     * 
     * @param device
     */
    public void addUnbondDevices(BluetoothDevice device) {
        System.out.println("未绑定设备名称:" + device.getName());
        if (!this.unbondDeviceslist.contains(device)) {
            this.unbondDeviceslist.add(device);
        }
    }

    /**
     * 添加已绑定蓝牙设备到list集合
     * 
     * @param device
     */
    public void addBandDevices(BluetoothDevice device) {
        System.out.println("已绑定设备名称:" + device.getName());
        if (!this.bondDeviceslist.contains(device)) {
            this.bondDeviceslist.add(device);
        }
    }

    /**
     * 蓝牙广播接收器
     */
    private BroadcastReceiver receiver = new BroadcastReceiver() {

        ProgressDialog progressDialog = null;

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (device.getBondState() == BluetoothDevice.BOND_BONDED) {
                    addBandDevices(device);
                } else {
                    addUnbondDevices(device);
                }
            } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
                progressDialog = ProgressDialog.show(context, "请稍等...",
                        "搜索蓝牙设备中...", true);

            } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED
                    .equals(action)) {
                System.out.println("设备搜索完毕");
                progressDialog.dismiss();

                addUnbondDevicesToListView();
                addBondDevicesToListView();
            }
        }
    };
    /**
     * 获取设备名称
     * 
     * @return String
     */
    public String getDeviceName() {
        return devices.getName();
    }
    /**
     * 连接蓝牙设备
     */
    public boolean connect() {
        if (!this.isConnection) {
            try {
                bluetoothSocket = this.devices
                        .createRfcommSocketToServiceRecord(uuid);
                bluetoothSocket.connect();
                outputStream = bluetoothSocket.getOutputStream();
                this.isConnection = true;
                if (this.bluetoothAdapter.isDiscovering()) {
                    System.out.println("关闭适配器!");
                    this.bluetoothAdapter.isDiscovering();
                }
            } catch (Exception e) {
                Toast.makeText(this.context, "连接失败!", 1).show();
                return false;
            }
            Toast.makeText(this.context, this.devices.getName() + "连接成功!",
                    Toast.LENGTH_SHORT).show();
            return true;
        } else {
            return true;
        }
    }
    /**
     * 断开蓝牙设备连接
     */
    public static void disconnect() {
        System.out.println("断开蓝牙设备连接");
        try {
            bluetoothSocket.close();
            outputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.searchDevices:
            this.searchDevices();
            break;
        case R.id.return_Bluetooth_btn:
            finish();
            break;
        default:
            break;
        }
    }
}

布局文件部分:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/index"
    tools:context=".BluetoothActivity" >

    <LinearLayout
        android:id="@+id/openBluetooth_tb"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:background="#24cf5f"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/return_Bluetooth_btn"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:layout_gravity="center"
            android:layout_weight="5"
            android:src="@drawable/back"/>

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="44dp"
            android:layout_weight="1"
            android:gravity="center"
            android:paddingRight="40dp"
            android:text="@string/titie_activity_conn_blue_list"
            android:textColor="#FFFFFF"
            android:textSize="30px" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/openBluetooth_tb"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <TextView
                android:visibility="gone"
                android:id="@+id/device_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="名称"
                android:textAppearance="?android:attr/textAppearanceLarge" />

            <TextView
                android:visibility="gone"
                android:id="@+id/connect_state"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="42dp"
                android:text="状态"
                android:textAppearance="?android:attr/textAppearanceLarge" />
        </LinearLayout>

        <Button
            android:id="@+id/searchDevices"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="搜索设备" />
         <View
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/searchDevices"
        android:background="@android:color/darker_gray" />
        
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="未配对设备" />

        <ListView
            android:id="@+id/unbondDevices"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
          <View
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:layout_alignParentLeft="true"
        android:background="@android:color/darker_gray" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="190dp"
        android:orientation="vertical" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="已配对设备" />

        <ListView
            android:id="@+id/bondDevices"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/linearLayout1" >
        </ListView>
    </LinearLayout>
    </LinearLayout>

</RelativeLayout>

通过以上两部分就可以实现连接蓝牙打印机的功能。

以上是关于iOS中蓝牙与打印机连接使用的主要内容,如果未能解决你的问题,请参考以下文章

Android开发之蓝牙连接打印机

Android pad 连接蓝牙打印机Gprinter---实现蓝牙打印功能

Android使用蓝牙连接adb调试App

hp蓝牙键盘怎么连接电脑?

android adb 支持蓝牙连接吗

uniapp实现蓝牙小票打印功能