安卓蓝牙app开发教程(安卓开发 蓝牙)
本篇文章给大家谈谈安卓蓝牙app开发教程,以及安卓开发 蓝牙对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
如何使用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。
新手刚刚学习android,推荐android开发的入门教程
学习android注意事项:
1,android技术准备实训目标:通过这部分的学习,学员能够达到学习android开发课程的基本要求。熟练使用Java语言,实现GUI桌面应用程序的开发JDK的安装和配置开发工具Eclipse3.4安装。实训知识点: Java标识符、数据类型流程控制、面向对象编程、继承、抽象类、接口、包、异常、IO流、Swing、游戏算法介绍
,2,android入门实训目标:通过这部分的学习,学员具备了android程序开发的能力,能独立完成常用的应用软件。实训知识点: Android系统概述和内置工具、Android 开发环境的搭建和启动模拟器、建立android工程、Android应用程序开发及运行编译结构、API参考文档的使用、使用am工具启动android应用程序、部署应用到真实手机、控件和事件编程、菜单编程、对话框编程、视图组编程、各种布局的使用、Grid视图组、List视图组、使用Tab组织UI
,3,android进阶实训目标:通过这部分的学习,学员的android开发能力会有大幅提高。等传感器编程、android优化和性能提高。实训知识点及案例分析:Service概述、创建和启动、生命周期、权限及跨进程调用;广播的概念及生命周期、广播发送的权限广播接收器的实现、接收SMS短信、播放MP3;内容提供器的概念作用和常见接口、使用内容提供器实现增删改查、内容提供其权限和创建内容提供器、SQLite数据库添删改查操作、使用list视图组显示数据;Widget概念和制作方法、Widget各种XML描述文件详解2D图形图像及文本、Gallery UI编程、GridView编程、OnDraw编程、drawable编程基本动画编程技巧、Tween动画、Frame动画、TimerOpenGL ES的2D和3D绘图GPS服务、GPRS网络使用、android蓝牙开发、android方向、加速表、光线、磁场、临近性、温度
4,项目实战实训目标:本阶段让学员开发,设计Android网上购物系统,其中包括Android图形界面开发,Android声音,Android网络通讯,和服务器后端进行通讯交换数据。
Android基础知识:
一、Android开发的分类:
1、Android客户端应用程序
如新浪微博、网银客户端、凡客、淘宝客户端,快盘客户端。Android在这里的应用还是界面层的东西为主。核心还在WEB。客户端界面很重要,用户体验度很重要。从应用需求上来讲,几乎大一点的网站,都需要有手机客户端程序。
2、Android通用类程序
如基于LBS(基于位置的服务)的应用 (这类一般会嵌入到客户端应用程序中),流媒体播放应用。由于移动设备的方便便捷、3G、4G网络的发展,这类应用有不错的前景。
3、Android游戏开发
需要掌握的游戏引擎LGame,游戏框架等。手机上的游戏会是一大块内容,有前途。
4、Android底层开发
需要掌握C、Linux等较底层的东西,发展方向应该是驱动、协议开发,嵌入式开发。
开始学习了解一般从界面、控件开始,这也是大部分人认为简单、比较快上手的原因。学习一段时间后,自己可以定一个方向发展。
二、Android学习需要哪些知识点
1、Java基础知识
J2SE:Java基础类(lang包,IO包,util包(集合框架),面向对象,多线程,网络编程)
2、J2EE知识
如果你想从事的Android客户端应用程序的开发,这部分知识是必备的。显然Android客户端只是做的数据的请求、展现,所需的数据在服务器端。
技能点:Tomcat(Weblogic),XML解析,JSON解析,JSP/Servlet。了解SSH。
3、Linux、C语言知识
可以作为你后续发展需要了解的。
在论坛上、QQ上看到不少童鞋Java基础还比较欠缺,就开始搞Android了,当然就问题多多。学习热情可嘉,但需要打一个好的基础,有一个好的学习路线。
三、Android学习比较好的资料
1、应该说现在市面上的书,入门的还是不少,但一般现在只讲了简单控件的单个用法。
《Android开发范例大全》,《Android应用开发详解》可以参考。想了解游戏的话,可以参考《Android2.0游戏开发实战宝典》。
2、Android学习视频,也基本上停留在讲简单入门,单个控件用法为主,这方面远不及Java,J2EE,SSH的视频那么丰富。应该讲,你看完了这些,离开发还有很大一段距离。而且,这些视频在讲课方法上不如一些Java的好。现在的视频资料太丰富,从哈佛、斯坦福的课程,到IPHONE开发课程,都有。但全部跟着视频完成所有的学习,有很长一段跟要走。
3、Android的论坛比较多,论坛的缺点就是什么东西得自己一个个查找、去等。自学是一个艰苦而漫长的过程。对你的锻炼和提升也最大。自学有一个缺点,就是容易迷失方向,一个知识点你永远不知道要掌握多深,相关的应用是什么。自学就好比像你一个人在走一条目标很远,前面叉路很多的暗道一样。
4、培训机构学习。如果你时间上允许不失为一种好的选择,可以快速入门。互联网产品(时代)有一个重要特点,就是拿资金换时间。如果能快速入门,到这个行业去发展,就比自己慢慢学习要好得多。毕竟现在Android开发太热了。对开发人员的要求也会逐渐提高。(如既要求能做Android开发,又做IPHONE移植开发)。
微信小程序蓝牙教程--完整版亲测
#使用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[i].name) {
/* 根据指定的蓝牙设备名称匹配到deviceId */
that.deviceId = that.devices[i].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[2].uuid,
success: function(res) {
for (var i = 0; i res.characteristics.length; i++) {
if ((res.characteristics[i].properties.notify || res.characteristics[i].properties.indicate)
(res.characteristics[i].properties.read res.characteristics[i].properties.write)) {
console.log(res.characteristics[i].uuid, '蓝牙特征值 ==========')
/* 获取蓝牙特征值 */
that.notifyCharacteristicsId = res.characteristics[i].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 不知道有没有潜在的问题,目前线上运行为发现任何的问题
#今天的蓝牙使用心得到此结束,谢谢
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 ListString devices;
private ListBluetoothDevice 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 ArrayListBluetoothDevice();
devices = new ArrayListString();
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() {
ArrayAdapterString adapter = new ArrayAdapterString(this, android.R.layout.simple_list_item_1,
devices);
listView.setAdapter(adapter);
}
}
如何创建一个安卓手机的APP,用于模拟遥控器键盘,输出蓝牙信号?
我有做这样的app, 也做过USB串口通信和通过蓝牙控制单片机的程序, QQ2227421573
安卓蓝牙app开发教程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于安卓开发 蓝牙、安卓蓝牙app开发教程的信息别忘了在本站进行查找喔。