手机蓝牙app开发教程(android蓝牙开发,PC端模拟串口接收字符,该如何编程)

2026-04-19 13:18:01 5

手机蓝牙app开发教程(android蓝牙开发,PC端模拟串口接收字符,该如何编程)

本篇文章给大家谈谈手机蓝牙app开发教程,以及android蓝牙开发,PC端模拟串口接收字符,该如何编程对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文目录

android蓝牙开发,PC端模拟串口接收字符,该如何编程

您好,android蓝牙这方面还是很好搞的,因为大家的方式都是差不多的。先说说如何开启蓝牙设备和设置可见时间:
private void search() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
if (!adapter.isEnabled()) {
adapter.enable();
}
Intent enable = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enable.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); //3600为蓝牙设备可见时间
startActivity(enable);
Intent searchIntent = new Intent(this, ComminuteActivity.class);
startActivity(searchIntent);
}
首先,需要获得一个BluetoothAdapter,可以通过getDefaultAdapter()获得系统默认的蓝牙适配器,当然我们也可以自己指定,但这个真心没有必要,至少我是不需要的。然后我们检查手机的蓝牙是否打开,如果没有,通过enable()方法打开。接着我们再设置手机蓝牙设备的可见,可见时间可以自定义。

完成这些必要的设置后,我们就可以正式开始与蓝牙模块进行通信了:
public class ComminuteActivity extends Activity {
private BluetoothReceiver receiver;
private BluetoothAdapter bluetoothAdapter;
private List《String》 devices;
private List《BluetoothDevice》 deviceList;
private Bluetooth client;
private final String lockName = "BOLUTEK";
private String message = "000001";
private ListView listView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search_layout);
listView = (ListView) this.findViewById(R.id.list);
deviceList = new ArrayList《BluetoothDevice》();
devices = new ArrayList《String》();
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.startDiscovery();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
receiver = new BluetoothReceiver();
registerReceiver(receiver, filter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView《?》 parent, View view, int position, long id) {
setContentView(R.layout.connect_layout);
BluetoothDevice device = deviceList.get(position);
client = new Bluetooth(device, handler);
try {
client.connect(message);
} catch (Exception e) {
Log.e("TAG", e.toString());
}
}
});
}
@Override
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case Bluetooth.CONNECT_FAILED:
Toast.makeText(ComminuteActivity.this, "连接失败", Toast.LENGTH_LONG).show();
try {
client.connect(message);
} catch (Exception e) {
Log.e("TAG", e.toString());
}
break;
case Bluetooth.CONNECT_SUCCESS:
Toast.makeText(ComminuteActivity.this, "连接成功", Toast.LENGTH_LONG).show();
break;
case Bluetooth.READ_FAILED:
Toast.makeText(ComminuteActivity.this, "读取失败", Toast.LENGTH_LONG).show();
break;
case Bluetooth.WRITE_FAILED:
Toast.makeText(ComminuteActivity.this, "写入失败", Toast.LENGTH_LONG).show();
break;
case Bluetooth.DATA:
Toast.makeText(ComminuteActivity.this, msg.arg1 + "", Toast.LENGTH_LONG).show();
break;
}
}
};
private class BluetoothReceiver extends BroadcastReceiver {
@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 (isLock(device)) {
devices.add(device.getName());
}
deviceList.add(device);
}
showDevices();
}
}
private boolean isLock(BluetoothDevice device) {
boolean isLockName = (device.getName()).equals(lockName);
boolean isSingleDevice = devices.indexOf(device.getName()) == -1;
return isLockName && isSingleDevice;
}
private void showDevices() {
ArrayAdapter《String》 adapter = new ArrayAdapter《String》(this, android.R.layout.simple_list_item_1,
devices);
listView.setAdapter(adapter);
}
}

微信小程序蓝牙教程--完整版亲测

#使用mpvue 开发小程序过程中 简单介绍一下微信小程序蓝牙连接过程

#在蓝牙连接的过程中部分api需要加定时器延时1秒到2秒左右再执行,原因为何不知道,小程序有这样的要求

#1.首先是要初始化蓝牙:openBluetoothAdapter()

```js

if (wx.openBluetoothAdapter) {

wx.openBluetoothAdapter({

        success: function(res) {

            /* 获取本机的蓝牙状态 */

            setTimeout(() =》 {

                getBluetoothAdapterState()

            }, 1000)

        },

        fail: function(err) {

            // 初始化失败

        }

    })

    } else {    

    }

```

#2.检测本机蓝牙是否可用:

#  要在上述的初始化蓝牙成功之后回调里调用

```js

getBluetoothAdapterState() {

    var that= this;

    that.toastTitle= ’检查蓝牙状态’

wx.getBluetoothAdapterState({

        success: function(res) {

startBluetoothDevicesDiscovery()

},

        fail(res) {

            console.log(res)

}

})

}

```

#3. 开始搜索蓝牙设备:

```js

startBluetoothDevicesDiscovery() {

    var that= this;

    setTimeout(() =》 {

wx.startBluetoothDevicesDiscovery({

            success: function(res) {

/* 获取蓝牙设备列表 */

                that.getBluetoothDevices()

},

            fail(res) {

}

})

}, 1000)

}

```

#4. 获取搜索到的蓝牙设备列表

# /* that.deviceName 是获取到的蓝牙设备的名称, 因为蓝牙设备在安卓和苹果手机上搜到的蓝牙地址显示是不一样的,所以根据设备名称匹配蓝牙*/

```js

getBluetoothDevices() {

    var that= this;

    setTimeout(() =》 {

wx.getBluetoothDevices({

            services: ,

            allowDuplicatesKey: false,

            interval: 0,

            success: function(res) {

                if (res.devices.length》 0) {

                    if (JSON.stringify(res.devices).indexOf(that.deviceName) !== -1) {

                        for (let i = 0; i 《 res.devices.length; i++) {

                            if (that.deviceName === res.devices.name) {

/* 根据指定的蓝牙设备名称匹配到deviceId */

                                that.deviceId = that.devices.deviceId;

                                setTimeout(() =》 {

                                    that.connectTO();

}, 2000);

};

};

} else {

}

} else {

}

},

            fail(res) {

                console.log(res, ’获取蓝牙设备列表失败=====’)

}

})

}, 2000)

},

```

#5.连接蓝牙

# 匹配到的蓝牙设备ID 发送连接蓝牙的请求, 连接成功之后 应该断开蓝牙搜索的api,然后去获取所连接蓝牙设备的service服务

```js

connectTO() {

wx.createBLEConnection({

        deviceId: deviceId,

        success: function(res) {

            that.connectedDeviceId = deviceId;

/* 4.获取连接设备的service服务 */

that.getBLEDeviceServices();

wx.stopBluetoothDevicesDiscovery({

                success: function(res) {

                    console.log(res, ’停止搜索’)

},

                fail(res) {

}

})

},

        fail: function(res) {

}

})

}

```

#6. 获取蓝牙设备的service服务,获取的serviceId有多个要试着连接最终确定哪个是稳定版本的service 获取服务完后获取设备特征值

```js

getBLEDeviceServices() {

    setTimeout(() =》 {

wx.getBLEDeviceServices({

            deviceId: that.connectedDeviceId,

            success: function(res) {

                that.services= res.services

/* 获取连接设备的所有特征值 */

that.getBLEDeviceCharacteristics()

},

            fail: (res) =》 {

}

})

}, 2000)

},

```

#7.获取蓝牙设备特征值

# 获取到的特征值有多个,最后要用的事能读,能写,能监听的那个值的uuid作为特征值id,

```js

getBLEDeviceCharacteristics() {

            setTimeout(() =》 {

wx.getBLEDeviceCharacteristics({

                    deviceId: connectedDeviceId,

                    serviceId: services.uuid,

                    success: function(res) {

                        for (var i = 0; i 《 res.characteristics.length; i++) {

                            if ((res.characteristics.properties.indicate) &&

                                (res.characteristics.properties.write)) {

                                console.log(res.characteristics.uuid, ’蓝牙特征值 ==========’)

/* 获取蓝牙特征值 */

                                that.notifyCharacteristicsId = res.characteristics.uuid

// 启用低功耗蓝牙设备特征值变化时的 notify 功能

that.notifyBLECharacteristicValueChange()

}

}

},

                    fail: function(res) {

}

})

}, 1000)

},

```

#8.启动notify 蓝牙监听功能 然后使用 wx.onBLECharacteristicValueChange用来监听蓝牙设备传递数据

#接收到的数据和发送的数据必须是二级制数据, 页面展示的时候需要进行转换

```js

notifyBLECharacteristicValueChange() { // 启用低功耗蓝牙设备特征值变化时的 notify 功能

            var that= this;

            console.log(’6.启用低功耗蓝牙设备特征值变化时的 notify 功能’)

wx.notifyBLECharacteristicValueChange({

                state: true,

                deviceId: that.connectedDeviceId,

                serviceId: that.notifyServicweId,

                characteristicId: that.notifyCharacteristicsId,

                complete(res) {

/*用来监听手机蓝牙设备的数据变化*/

wx.onBLECharacteristicValueChange(function(res) {

/**/

                        that.balanceData += that.buf2string(res.value)

                        that.hexstr += that.receiveData(res.value)

})

},

                fail(res) {

                    console.log(res, ’启用低功耗蓝牙设备监听失败’)

                    that.measuringTip(res)

}

})

},

/*转换成需要的格式*/

buf2string(buffer) {

                    var arr = Array.prototype.map.call(new Uint8Array(buffer), x =》 x)

                    return arr.map((char, i) =》 {

                        return String.fromCharCode(char);

                    }).join(’’);

},

receiveData(buf) {

return this.hexCharCodeToStr(this.ab2hex(buf))

},

/*转成二进制*/

ab2hex (buffer) {

              var hexArr = Array.prototype.map.call(

                  new Uint8Array(buffer), function (bit) {

                      return (’00’ + bit.toString(16)).slice(-2)

}

)

              return hexArr.join(’’)

},

/*转成可展会的文字*/

hexCharCodeToStr(hexCharCodeStr) {

              var trimedStr = hexCharCodeStr.trim();

              var rawStr = trimedStr.substr(0, 2).toLowerCase() === ’0x’ ? trimedStr.substr(2) : trimedStr;

              var len = rawStr.length;

              var curCharCode;

              var resultStr= ;

              for (var i = 0; i 《 len; i = i+ 2) {

                  curCharCode = parseInt(rawStr.substr(i, 2), 16);

                  resultStr.push(String.fromCharCode(curCharCode));

}

              return resultStr.join(’’);

},

```

# 向蓝牙设备发送数据

```js

sendData(str) {

    let that= this;

    let dataBuffer = new ArrayBuffer(str.length)

    let dataView = new DataView(dataBuffer)

    for (var i = 0; i 《 str.length; i++) {

        dataView.setUint8(i, str.charAt(i).charCodeAt())

}

    let dataHex = that.ab2hex(dataBuffer);

    this.writeDatas = that.hexCharCodeToStr(dataHex);

wx.writeBLECharacteristicValue({

        deviceId: that.connectedDeviceId,

        serviceId: that.notifyServicweId,

        characteristicId: that.notifyCharacteristicsId,

        value: dataBuffer,

        success: function (res) {

            console.log(’发送的数据:’ + that.writeDatas)

            console.log(’message发送成功’)

},

        fail: function (res) {

},

        complete: function (res) {

}

})

},

```

# 当不需要连接蓝牙了后就要关闭蓝牙,并关闭蓝牙模块

```js

// 断开设备连接

closeConnect() {

if (that.connectedDeviceId) {

wx.closeBLEConnection({

            deviceId: that.connectedDeviceId,

            success: function(res) {

that.closeBluetoothAdapter()

},

            fail(res) {

}

})

} else {

that.closeBluetoothAdapter()

}

},

// 关闭蓝牙模块

closeBluetoothAdapter() {

wx.closeBluetoothAdapter({

        success: function(res) {

},

        fail: function(err) {

}

})

},

```

#在向蓝牙设备传递数据和接收数据的过程中,并未使用到read的API 不知道有没有潜在的问题,目前线上运行为发现任何的问题

#今天的蓝牙使用心得到此结束,谢谢

iOS蓝牙开发:蓝牙的连接和数据的读写

       蓝牙开发说简单也简单,说不简单也有点难,开发人员在首次开发蓝牙前首先需要搞清楚蓝牙开发的概念,还要了解掌握蓝牙开发的一整套流程,这样才能快速上手开发蓝牙。

      蓝牙开发分为两种模式:管理者模式和中心者模式。管理者模式基本很少用到,相当于iPhone手机作为外设,自己创建服务和特性,然后用其他设备连接iPhone手机;中心者模式一般是大部分情况下都会使用的,使用中心者模式开发相当于iPhone手机作为主机,连接蓝牙外设,下面介绍蓝牙开发的例子就是使用的中心者模式来讲解的。

在这里我还是要推荐下我自己建的iOS开发学习群:680565220,群里都是学ios开发的,如果你正在学习ios ,我欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018最新的iOS进阶资料和高级开发教程

一、关于蓝牙开发的一些重要的理论概念:

1、服务(services):蓝牙外设对外广播的时候一定会有一个服务,有些时候也可以是有多个服务,服务下面包含一些特性,服务可以理解成一个模块的窗口;

2、特征(characteristic):特征存在于服务下面的,一个服务下面可以有多个特征,特征可以理解成具体实现功能的窗口,一般的特性都会有value,也就是特征值,是特征和外界交互的最小单位;

      3、UUID:蓝牙上的唯一标示符,为了区分不同服务和特征,就用UUID来表示。

二、蓝牙连接的主要步骤

     1、创建一个CBCentralManager实例来进行蓝牙管理;

     2、搜索扫描外围设备;

     3、连接外围设备;

     4、获得外围设备的服务;

     5、获得服务的特征;

     6、从外围设备读取数据;

     7、给外围设备发送(写入)数据。

三、蓝牙连接和数据读写的具体步骤

     1、导入苹果系统蓝牙框架

#import

     2、遵循两个蓝牙框架相关的协议
     3、新建两个实例属性,一个特征属性

@property (nonatomic, strong) CBCentralManager *centralManager; //中心管理者

@property (nonatomic, strong) CBPeripheral *peripheral; //连接到的外设

@property (nonatomic, strong) CBCharacteristic *characteristic; //特征

     4、初始化CBCentralManager,进行蓝牙管理

- (void)viewDidLoad {

;

self.centralManager = ;     //创建实例进行蓝牙管理

}

 //若中心管理者初始化之后 就会触发下面这个代理方法 该代理方法是用来判断手机蓝牙的状态的

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {

// 蓝牙可用,开始扫描外设

if (central.state == CBManagerStatePoweredOn) {

NSLog(@"蓝牙可用");

//在中心管理者成功开启之后再进行一些操作

//搜索扫描外设

// 根据SERVICE_UUID来扫描外设,如果不设置SERVICE_UUID,则扫描所有蓝牙设备

// ;

;

}

if(central.state == CBManagerStateUnsupported) {

NSLog(@"该设备不支持蓝牙");

}

if (central.state == CBManagerStatePoweredOff) {

NSLog(@"蓝牙已关闭");

}

if (central.state == CBManagerStateUnknown) {

NSLog(@"蓝牙当前状态不明确");

}

if (central.state == CBManagerStateUnauthorized) {

NSLog(@"蓝牙未被授权");

}

}

      5、搜索外围设备

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

/** 发现符合要求的外设,回调 */

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

NSLog(@"%@====",peripheral.name);

//根据外设名字有选择性的筛选连接蓝牙设备

if () {

//在这里对外设携带的广播数据进行进一步的处理

if () {

//如果数组中包含了就不再添加

return;

}

//添加到外设名字数组中

;

//标记外设,让它的生命周期与控制器的一致

self.peripheral = peripheral;

// 可以根据外设名字来过滤外设

// ;

}

// 连接外设

// ;

}

    6、连接外围设备

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

/** 连接成功 */

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{

//连接成功之后,可以进行服务和特性的发现。 停止中心管理设备的扫描动作,要不然在你和已经连接好的外设进行数据沟通时,如果又有一个外设进行广播且符合你的连接条件,那么你的iOS设备也会去连接这个设备(因为iOS BLE4.0是支持一对多连接的),导致数据的混乱。

//停止扫描动作

;

// 设置外设的代理

peripheral.delegate = self;

// 根据UUID来寻找服务

// ;

//外设发现服务,传nil代表不过滤,一次性读出外设的所有服务

;

NSLog(@"%s, line = %d, %@=连接成功", __FUNCTION__, __LINE__, peripheral.name);

}

//外设连接失败

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

- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {

NSLog(@"%s, line = %d, %@=连接失败", __FUNCTION__, __LINE__, peripheral.name);

}

//丢失连接 掉线

/** 断开连接 */

- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(nullable NSError *)error {

NSLog(@"%s, line = %d, %@=断开连接", __FUNCTION__, __LINE__, peripheral.name);

// 断开连接可以设置重新连接

;

}

    7、获取外围设备服务和特征

/** 发现服务 */

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {

// 遍历出外设中所有的服务

for (CBService *service in peripheral.services) {

// NSLog(@"所有的服务:%@",service);

}

// 这里仅有一个服务,所以直接获取

CBService *service = peripheral.services.lastObject;

// 根据UUID寻找服务中的特征

// ;

// ;

;

}

    8、从外围设备读取数据

// 更新特征的value的时候会调用 (凡是从蓝牙传过来的数据都要经过这个回调,简单的说这个方法就是你拿数据的唯一方法) 你可以判断是否 从外围设备读数据

/** 接收到数据回调 */

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {

// if (characteristic == @"你要的特征的UUID或者是你已经找到的特征") {

// //characteristic.value就是你要的数据

// }

if (){

NSData *data = characteristic.value;

NSString *value = ;

// NSLog(@"characteristic(读取到的): %@, data : %@, value : %@", characteristic, data, value);

}

// 拿到外设发送过来的数据

// NSData *data = characteristic.value;

// self.textFild.text = ;

}

    9、向外围设备发送(写入)数据

//这个方法你可以放在button的响应里面,也可以在找到特征的时候就写入,具体看你业务需求怎么用

//;//第一个参数是已连接的蓝牙设备; 第二个参数是要写入到哪个特征; 第三个参数是通过此响应记录是否成功写入 需要注意的是特征的属性是否支持写数据

/** 写入数据回调 */

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error {

/*

typedef NS_OPTIONS(NSUInteger, CBCharacteristicProperties) {

CBCharacteristicPropertyBroadcast = 0x01,

CBCharacteristicPropertyRead = 0x02,

CBCharacteristicPropertyWriteWithoutResponse = 0x04,

CBCharacteristicPropertyWrite = 0x08,

CBCharacteristicPropertyNotify = 0x10,

CBCharacteristicPropertyIndicate = 0x20,

CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40,

CBCharacteristicPropertyExtendedProperties = 0x80,

CBCharacteristicPropertyNotifyEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x100,

CBCharacteristicPropertyIndicateEncryptionRequired NS_ENUM_AVAILABLE(NA, 6_0) = 0x200

};

打印出特征的权限(characteristic.properties),可以看到有很多种,这是一个NS_OPTIONS的枚举,可以是多个值

常见的又read,write,noitfy,indicate.知道这几个基本够用了,前俩是读写权限,后俩都是通知,俩不同的通知方式

*/

// NSLog(@"%s, line = %d, char.pro = %d", __FUNCTION__, __LINE__, characteristic.properties);

// 此时由于枚举属性是NS_OPTIONS,所以一个枚举可能对应多个类型,所以判断不能用 = ,而应该用包含&

NSLog(@"write value success(写入成功) : %@", characteristic);

}

    10、具体调用给蓝牙外设写入数据方法,这里的例子是以按钮点击事件里面来调用处理

//发送按钮点击事件

- (void)sendClick {

if (!self.characteristic) {

return;

}

_tempValue = ;

_timeValue = ;

NSString *ttData = ;

// NSString *aaa = ;

// 用NSData类型来写入

// NSData *data = ;

NSData *data = ;

// NSData *data = ;

// 根据上面的特征self.characteristic来写入数据

;

如何使用Android蓝牙开发

Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输。本文档描述了怎样利用android平台提供的蓝牙API去实现蓝压设备之间的通信。蓝牙具有point-to-point 和 multipoint两种连接功能。
使用蓝牙API,可以做到:
* 搜索蓝牙设备
* 从本地的Bluetooth adapter中查询已经配对的设备
* 建立RFCOMM通道
* 通过service discovery连接到其它设备
* 在设备之间传输数据
* 管理多个连接
基础知识
本文档介绍了如何使用Android的蓝牙API来完成的四个必要的主要任务,使用蓝牙进行设备通信,主要包含四个部分:蓝牙设置、搜索设备(配对的或可见的)、连接、传输数据。
所有的蓝牙API在android.bluetooth包中。实现这些功能主要需要下面这几个类和接口:
BluetoothAdapter
代表本地蓝牙适配器(蓝牙发射器),是所有蓝牙交互的入口。通过它可以搜索其它蓝牙设备,查询已经配对的设备列表,通过已知的MAC地址创建BluetoothDevice,创建BluetoothServerSocket监听来自其它设备的通信。
BluetoothDevice
代表了一个远端的蓝牙设备, 使用它请求远端蓝牙设备连接或者获取 远端蓝牙设备的名称、地址、种类和绑定状态。 (其信息是封装在 bluetoothsocket 中) 。
BluetoothSocket
代表了一个蓝牙套接字的接口(类似于 tcp 中的套接字) ,他是应用程 序通过输入、输出流与其他蓝牙设备通信的连接点。
BluetoothServerSocket
代表打开服务连接来监听可能到来的连接请求 (属于 server 端) , 为了连接两个蓝牙设备必须有一个设备作为服务器打开一个服务套接字。 当远端设备发起连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个 bluetoothsocket。
BluetoothClass
描述了一个设备的特性(profile)或该设备上的蓝牙大致可以提供哪些服务(service),但不可信。比如,设备是一个电话、计算机或手持设备;设备可以提供audio/telephony服务等。可以用它来进行一些UI上的提示。
BluetoothProfile
BluetoothHeadset
提供手机使用蓝牙耳机的支持。这既包括蓝牙耳机和免提(V1.5)模式。
BluetoothA2dp
定义高品质的音频,可以从一个设备传输到另一个蓝牙连接。 “A2DP的”代表高级音频分配模式。
BluetoothHealth
代表了医疗设备配置代理控制的蓝牙服务
BluetoothHealthCallback
一个抽象类,使用实现BluetoothHealth回调。你必须扩展这个类并实现回调方法接收更新应用程序的注册状态和蓝牙通道状态的变化。
BluetoothHealthAppConfiguration
代表一个应用程序的配置,蓝牙医疗第三方应用注册与远程蓝牙医疗设备交流。
BluetoothProfile.ServiceListener
当他们已经连接到或从服务断开时通知BluetoothProfile IPX的客户时一个接口(即运行一个特定的配置文件,内部服务)。
蓝牙权限
为了在你的应用中使用蓝牙功能,至少要在AndroidManifest.xml中声明两个权限:BLUETOOTH(任何蓝牙相关API都要使用这个权限) 和 BLUETOOTH_ADMIN(设备搜索、蓝牙设置等)。
为了执行蓝牙通信,例如连接请求,接收连接和传送数据都必须有BLUETOOTH权限。
必须要求BLUETOOTH_ADMIN的权限来启动设备发现或操纵蓝牙设置。大多数应用程序都需要这个权限能力,发现当地的蓝牙设备。此权限授予其他的能力不应该使用,除非应用程序是一个“电源管理”,将根据用户要求修改的蓝牙设置
注释:要请求BLUETOOTH_ADMIN的话,必须要先有BLUETOOTH。
在你的应用manifest 文件中声明蓝牙权限。例如:
《manifest ... 》
《uses-permission android:name="android.permission.BLUETOOTH" /》
...
《/manifest》
通过查看《uses-permission》资料来声明应用权限获取更多的信息。
蓝牙设置
在你的应用通过蓝牙进行通信之前,你需要确认设备是否支持蓝牙,如果支持,确信它被打开。
如果不支持,则不能使用蓝牙功能。如果支持蓝牙,但不能够使用,你刚要在你的应用中请求使用蓝牙。这个要两步完成,使用BluetoothAdapter。

如何开始蓝牙软件开发(蓝牙app开发教程)

蓝牙是一套通讯标准,你上面说的配置、协议都是蓝牙协议的一部分,协议内部的术语而已,某些部分能改某些不能,简单来说,如果你拿到一个芯片,芯片厂商会给你一些软件固件,这些固件里面就实现了蓝牙相关的(你上面说的)配置和协议等。

蓝牙怎么连接苹果手机

1、打开蓝牙耳机的开机键。
2、随后在苹果手机桌面点开“设置”图标,在选项里打开蓝牙。
3、蓝牙处于打开状态后手机屏幕右上角出现“蓝牙”标识,“蓝牙”选项下方则出现可连接的蓝牙设备及其状态。
4、点击要连接的蓝牙耳机,成功后显示为“连接”即可。
扩展
蓝牙(BLUETOOTH),是1998年推出的一种新的无线传输方式,实际上就是取代数据电缆的短距离无线通信技术,通过低带宽电波实现点对点,或点对多点连接之间的信息交流。这种网络模式也被称为私人空间网络(PAN,PersonalAreaNetwork),是以多个微网络或精致的蓝牙主控器/附属器构建的迷你网络为基础的,每个微网络由8个主动装置和255个附属装置构成,而多个微网络连接起来又形成了扩大网,从而方便、快速地实现各类设备之间的通信。它是实现语音和数据无线传输的开放性规范,是一种低成本、短距离的无线连接技术。
技术特点:蓝牙技术的特点包括:采用跳频技术,抗信号衰落;采用快跳频和短分组技术,减少同频干扰,保证传输的可靠性;采用前向纠错编码技术,减少远距离传输时的随机噪声影响;使用2.4GHz的ISM频段,无须申请许可证;采用FM调制方式,降低设备的复杂性。该技术的传输速率设计为1MHz,以时分方式进行全双工通信,其基带协议是电路交换和分组交换的组合。一个跳频频率发送一个同步分组,每个分组占用一个时隙,也可扩展到5个时隙。蓝牙技术支持1个异步数据通道或3个并发的同步话音通道,或1个同时传送异步数据和同步话音的通道。每一个话音通道支持64kb/s的同步话音;异步通道支持最大速率为721kb/s、反向应答速率为57.6kb/s的非对称连接,或者是432.6kb/s的对称连接。

如何使用android原生BLE蓝牙进行操作

之前的涉及的物联网项目中使用的: BLE 低功耗蓝牙(蓝牙4.0), 支持android 4.3以上的手机
主从关系: BLE低功耗蓝牙只能做从端设备 ,一个蓝牙主端设备,可同时与7个蓝牙从端设备进行通讯

1)低功耗
低功耗的原理:
1\低功耗蓝牙仅使用了3个广播通道,传统蓝牙技术采用 16~32 个频道
2\每次广播开启时间也由传统的 22.5ms 减少到 0.6~1.2ms(毫秒)

2)传输距离极大提高
传统蓝牙传输距离为 2~10m,而蓝牙4.0的有效传输距离可达到 60~100m

3)安全性
使用AES-128 CCM加密算法进行数据包加密和认证。
更多BLE蓝牙的解析参考博客 : BLE4.0教程一 蓝牙协议连接过程与广播分析

添加权限
打开蓝牙
1.先拿到BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
2.再拿到BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
判断是否打开蓝牙
未打开弹出 系统弹框 ,除了 魅族手机 是打开系统设置

设备/手机都是蓝牙信号

在回调方法中:

一般在扫描的过程中,我们还会设置 设备过滤原则 (因为我只想要搜索到我们想要的设备,忽略无关设备)
如:从 scanRecord -- beacon -- beacon.type == 0xFF代表Manufacture,通过与嵌入式软件定义 自己的 Manufacture值即可

用BluetoothDevice得到BluetoothGatt:

断连:

关键问题:连接后一般要做什么事?

( 必须在刚连接成功后2秒内app写一个值给设备,否则会被设备断开连接)

主要是读写 characteristic
gatt.wirteCharacteristic(mCurrentcharacteristic);

gatt.readCharacteristic(characteristic);

bluetoothGatt.setCharacteristicNotification(data, true);

真实工作中使用的蓝牙库BlueToothKit请参考我的另一篇博客:
android蓝牙入门知识和优秀蓝牙第三方库BluetoothKit的使用

关于手机蓝牙app开发教程,android蓝牙开发,PC端模拟串口接收字符,该如何编程的介绍到此结束,希望对大家有所帮助。

手机蓝牙app开发教程(android蓝牙开发,PC端模拟串口接收字符,该如何编程)

本文编辑:admin

本文相关文章:


网络编程java(java是网络编程语言吗)

网络编程java(java是网络编程语言吗)

大家好,如果您还对网络编程java不太了解,没有关系,今天就由本站为大家分享网络编程java的知识,包括java是网络编程语言吗的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录java是网络编程语言吗Java网络编

2026年5月16日 01:11

javaweb和pythonweb(python/java/web前端需要哪个编程资料)

javaweb和pythonweb(python/java/web前端需要哪个编程资料)

大家好,如果您还对javaweb和pythonweb不太了解,没有关系,今天就由本站为大家分享javaweb和pythonweb的知识,包括python/java/web前端需要哪个编程资料的问题都会给大家分析到,还望可以解决大家的问题,下

2026年5月15日 16:54

软件编程入门自学教程(如何学编程入门教程)

软件编程入门自学教程(如何学编程入门教程)

今天给各位分享如何学编程入门教程的知识,其中也会对如何学编程入门教程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录如何学编程入门教程求计算机编程入门教程,学习编程如何入门北大青鸟设计培训:软件编程入门自学的方

2026年5月15日 09:48

想学程序员又是零基础(零基础想学编程应该怎么学习)

想学程序员又是零基础(零基础想学编程应该怎么学习)

各位老铁们好,相信很多人对想学程序员又是零基础都不是特别的了解,因此呢,今天就来为大家分享下关于想学程序员又是零基础以及零基础想学编程应该怎么学习的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录零基础想学编程应该

2026年5月15日 06:43

什么是编程?编程零基础应当如何开始学习 Python

什么是编程?编程零基础应当如何开始学习 Python

大家好,编程相信很多的网友都不是很明白,包括什么是编程也是一样,不过没有关系,接下来就来为大家分享关于编程和什么是编程的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录什么是编程编程零基础应当如何开始学习 Pyth

2026年5月15日 03:51

有线上的少儿编程课吗火花编程是吗好不好啊?网上编程课靠谱吗

有线上的少儿编程课吗火花编程是吗好不好啊?网上编程课靠谱吗

本篇文章给大家谈谈网上编程课,以及有线上的少儿编程课吗火花编程是吗好不好啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录有线上的少儿编程课吗火花编程是吗好不好啊网上编程课靠谱吗有线上的少儿编程课吗火花编程是吗好不好啊线上的少

2026年5月14日 22:54

网上学编程靠谱吗(猿来教育学编程怎么样靠谱吗)

网上学编程靠谱吗(猿来教育学编程怎么样靠谱吗)

各位老铁们,大家好,今天由我来为大家分享网上学编程靠谱吗,以及猿来教育学编程怎么样靠谱吗的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录猿来教育学编

2026年5月14日 18:22

python基础知识(编程语言python入门要学习哪些)

python基础知识(编程语言python入门要学习哪些)

这篇文章给大家聊聊关于python基础知识,以及编程语言python入门要学习哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录编程语言python入门要学习哪些学python需要什么基础知识python培训都学哪些知识编程

2026年5月14日 17:25

互联网+项目编程题目有哪些?互联网编程技术有哪些

互联网+项目编程题目有哪些?互联网编程技术有哪些

“互联网编程”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看互联网+项目编程题目有哪些?互联网编程技术有哪些!本文目录互联网+项目编程题目有哪些互联网编程技术有哪些互联网编程的不足和改进措施北大青鸟java培训:编程开发语言

2026年5月13日 14:44

网络编程面试(面试时怎么教熟悉linux网络编程)

网络编程面试(面试时怎么教熟悉linux网络编程)

本篇文章给大家谈谈网络编程面试,以及面试时怎么教熟悉linux网络编程对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录面试时怎么教熟悉lin

2026年5月11日 01:59

更多文章:


南宁网站优化设计:小型企业如何用低成本实现效果?

南宁网站优化设计:小型企业如何用低成本实现效果?

你有没有想过,为什么有些网站打开速度特别快,而且看起来特别舒服,但就是找不到?其实啊,这跟网站优化设计有很大关系。今天咱们就来聊聊,南宁的小型企业,预算不多的情况下,怎么给自己的网站做个优化设计。 网站优化设计,到底是个啥? 说实话,很多人

2026年6月28日 11:30

枣庄seo百度优化新站如何快速排名?

枣庄seo百度优化新站如何快速排名?

你有没有想过,新站做seo百度优化,到底哪些长尾词更容易排名?说实话,我刚开始做网站的时候也犯过迷糊,瞎堆关键词结果啥也没排名。后来慢慢摸索,发现新站想快速起来,得挑对长尾词。 新站长尾词怎么选?3个核心技巧 选长尾词不是随便写几个词就行,

2026年6月21日 15:21

web前端开发网页制作代码(用html如何制作一个简单的网页代码)

web前端开发网页制作代码(用html如何制作一个简单的网页代码)

“web前端开发网页制作代码”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看web前端开发网页制作代码(用html如何制作一个简单的网页代码)!本文目录用html如何制作一个简单的网页代码大家好,请教大家如何记住web前端开

2026年4月26日 08:27

怎么把百度设为主页面?百度首页快照一般多久更新一次

怎么把百度设为主页面?百度首页快照一般多久更新一次

今天给各位分享怎么把百度设为主页面的知识,其中也会对怎么把百度设为主页面进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录怎么把百度设为主页面百度首页快照一般多久更新一次百度一下主页 在哪里百度首页IP地址是什么

2026年5月15日 04:52

老域名抢注后如何快速排名:seo老域名抢注后如何快速排名

老域名抢注后如何快速排名:seo老域名抢注后如何快速排名

嘿,最近在琢磨SEO老域名抢注的事,发现很多人买了老域名后不知道怎么快速让新站排名。其实这事儿没那么难,关键在于长尾词的选择和优化。今天就跟大家聊聊,老域名抢注后新站怎么快速出排名。 老域名新站排名的难点 说实话,老域名虽然带点权重,但新站

2026年6月14日 05:39

青岛助创网络科技有限公司(中国电信李沧分公司是国企吗)

青岛助创网络科技有限公司(中国电信李沧分公司是国企吗)

本篇文章给大家谈谈青岛助创网络科技有限公司,以及中国电信李沧分公司是国企吗对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录中国电信李沧分公司

2026年4月25日 10:07

济宁网站运营策略(电商网站的运营策略有哪些)

济宁网站运营策略(电商网站的运营策略有哪些)

“济宁网站运营策略”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看济宁网站运营策略(电商网站的运营策略有哪些)!本文目录电商网站的运营策略有哪些网站运营专家是如何运营网站的网站运营步骤浅谈如何正确的运营一个网站济宁宜居网网站

2026年5月9日 02:07

vue动态路由seo配置详解:vue seo是什么

vue动态路由seo配置详解:vue seo是什么

vue seo是什么?为什么重要? 你有没有想过,为啥有些Vue网站排名上不去?别急,这背后往往和vue seo有关。简单来说,vue seo就是解决Vue单页面应用在搜索引擎优化方面的难题。因为Vue页面是动态加载的,搜索引擎爬虫可能无法

2026年6月21日 00:30

东莞虎门招聘网最新招聘信息(虎门兴科电子招够人了吗)

东莞虎门招聘网最新招聘信息(虎门兴科电子招够人了吗)

各位老铁们,大家好,今天由我来为大家分享东莞虎门招聘网最新招聘信息,以及虎门兴科电子招够人了吗的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录虎门兴

2026年5月11日 14:11

网站首页建设建议:如何设计吸引人的网站首页布局

网站首页建设建议:如何设计吸引人的网站首页布局

你想知道,怎么让你的网站首页一下子抓住眼球吗?说实话,这事儿挺重要的,毕竟首页是用户第一眼看到的地方。我常用的方法,就是从用户的角度出发,设计一个既美观又实用的布局。下面,咱们就来聊聊这事儿。 核心定位与风格 设计网站首页,首先得明确你的网

2026年6月14日 18:03

备案密码找回流程(农资手机备案密码忘记怎么办)

备案密码找回流程(农资手机备案密码忘记怎么办)

各位老铁们,大家好,今天由我来为大家分享备案密码找回流程,以及农资手机备案密码忘记怎么办的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录农资手机备案

2026年4月26日 00:02

供应链管理系统的组成(供应链包括哪几个模块)

供应链管理系统的组成(供应链包括哪几个模块)

其实供应链管理系统的组成的问题并不复杂,但是又很多的朋友都不太了解供应链包括哪几个模块,因此呢,今天小编就来为大家分享供应链管理系统的组成的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录供应链包括哪几个模块供应链

2026年5月2日 03:17

新开的店怎么吸引客人?新开的店铺怎么吸引到客流量

新开的店怎么吸引客人?新开的店铺怎么吸引到客流量

各位老铁们好,相信很多人对新开的店铺都不是特别的了解,因此呢,今天就来为大家分享下关于新开的店铺以及新开的店怎么吸引客人的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录新开的店怎么吸引客人新开的店铺怎么吸引到客流

2026年4月21日 06:07

淮南seo优化哪家强?本地企业如何做SEO优化

淮南seo优化哪家强?本地企业如何做SEO优化

『淮南seo优化哪家强?本地企业如何做SEO优化』 你有没有想过,为啥有些淮南本地的公司网站,明明不花很多钱做广告,排名却那么靠前?其实啊,这背后学问大着呢!今天咱就来聊聊,淮南本地企业做SEO优化,到底该怎么玩转。 本地SEO优化,到底是

2026年6月16日 12:00

济宁网站建设大全:个人网站从零到一的建设流程

济宁网站建设大全:个人网站从零到一的建设流程

你有没有想过,自己动手建个网站,其实也没那么难?说实话,现在济宁这边的网站建设已经挺成熟了,个人建站也变得简单多了。今天咱就聊聊,想建个个人网站,到底得走哪些步骤。希望能帮到你! 一、为啥要建个人网站? 建网站不是啥高科技,主要是为了展示自

2026年6月6日 13:12

怎么建立共享文件夹(如何在局域网内建立共享文件夹)

怎么建立共享文件夹(如何在局域网内建立共享文件夹)

这篇文章给大家聊聊关于怎么建立共享文件夹,以及如何在局域网内建立共享文件夹对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录如何在局域网内建立共享文件夹如何设置文件夹共享如何在局域网内建立共享文件夹 在使用Windows 10工

2026年4月17日 14:55

鄂州seo费用明细:新站如何合理预算

鄂州seo费用明细:新站如何合理预算

鄂州seo费用明细:新站如何合理预算 最近有朋友问,做鄂州的网站SEO,新站费用大概要多少?说实话,这个问题有点复杂,因为费用跟很多因素有关。今天咱们就来聊聊,鄂州新站做SEO,费用一般包含哪些,怎么预算才更合理。 一、新站SEO费用主要由

2026年6月4日 03:51

重庆税务公众号关注(重庆税务怎么交医保)

重庆税务公众号关注(重庆税务怎么交医保)

这篇文章给大家聊聊关于重庆税务公众号关注,以及重庆税务怎么交医保对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录重庆税务怎么交医保重庆养老保险网上怎么缴费重庆税务怎么交医保重庆税务交医保步骤如下:1、打开手机微信,点击右上角箭

2026年4月29日 04:57

上海软件定制开发(上海明酷是三方公司吗)

上海软件定制开发(上海明酷是三方公司吗)

这篇文章给大家聊聊关于上海软件定制开发,以及上海明酷是三方公司吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录上海明酷是三方公司吗上海哪家APP开发公司比较好 麻烦帮忙推荐上海靠谱的手机应用软件开发公司上海软件开发外包公司有

2026年5月15日 06:20

网络推广计划书(哪位专业人士帮忙做个网站推广策划书..急用.!!!)

网络推广计划书(哪位专业人士帮忙做个网站推广策划书..急用.!!!)

其实网络推广计划书的问题并不复杂,但是又很多的朋友都不太了解哪位专业人士帮忙做个网站推广策划书..急用.!!!,因此呢,今天小编就来为大家分享网络推广计划书的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录哪位专业

2026年5月10日 20:05

近期文章

本站热文

至强cpu参数(e52696v3处理器参数)
2024-04-28 15:30:07 浏览:455
标签列表

热门搜索