① 手机蓝牙与单片机的通信如何实现
一、准备工作:
1.一款带串口的单片机。
2.USB转串口模块(自己焊接的,所以很丑,当然也可以用学习板上的串口部分)。
3.蓝牙转串口模块。
4.如果你的手机系统是android的,下载个android蓝牙调试助手。
5.电脑上安装一个串口调试助手。
6.若干杜邦线等。
二、调试工作
万事俱备,只欠东风。
1.调试蓝牙模块
用杜邦线连接USB转串口模块和蓝牙模块。
串口模块 蓝牙模块。
VCC--------->VCC。
TXD---------->RXD。
RXD<----------TXD。
GND--------->GND。
打开手机蓝牙助手,连接到该蓝牙模块,成功后随便输入一些字符,就会在电脑上看到串口助手上有显示该字符,前提是串口的波特率和蓝牙模块的波特率对应(默认是9600)。
2.调试单片机的串口
还是用杜邦线连接USB转串口模块和单片机,在电脑上打开串口调试助手调试。
接线方式参考调试蓝牙模块。
单片机的程序就不说了,这里假设已经做好了。如果正常则会看到预期效果。
三、连接工作
把蓝牙模块和单片机模块连接起来,然后打开蓝牙调试助手,连接蓝牙模块发送数据。
这个时候,就好像你在电脑上用串口助手给单片机发送数据一样。
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。
在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
② Android 蓝牙开发(一)
普通蓝牙设备官方文档
Android 平台包含蓝牙网络堆栈支持 ,凭借此支持,设备能以无线方式与其他蓝牙设备交换数据。应用框架提供了通过 Android Bluetooth API 访问蓝牙功能的途径。使用 Bluetooth API Android 应用可以执行下面的操作:
传统蓝牙适用于电池使用强度较大的操作,例如 Android 设备之间的流传输和通信等。针对具有低功耗要求的蓝牙设备,Android 4.3(API 18)中引入了面向低功耗蓝牙的 API 支持。
使用 Android Bluetooth API 来完成使用蓝牙进行通信的四项主要任务: 设置蓝牙 、 查找局部区域内的配对设备或可用设备 、 连接设备 ,以及在 设备之间传输数据 。
关于蓝牙的 API 在 android.bluetooth 包中,下面介绍一下和蓝牙相关的主要类:
在 BluetoothProfile IPC 客户端连接到服务(即,运行特定配置文件的内部服务)或断开服务连接时向其发送通知的接口。
使用蓝牙必须声明权限 BLUETOOTH 才可以执行蓝牙通信。
1、获取蓝牙适配器
例如:我们可以查询所有已配对的设备,然后使用 ArrayAdapter 向用户显示每台设备的名称:
要发起连接仅需要知道目标蓝牙设备的 Mac 地址就可以了。
注意 执行 discovery 对于蓝牙适配器来说是一个非常繁重的过程,并且会消耗大量资源。在找到要连接的设备后, 要确保使用 cancelDiscovery() 来停止发现,然后尝试连接 。如果您已经和某台设备进行连接,那么这个时候执行发现操作会大幅度的减少此连接可用的带宽!因此不应该在处于连接状态的时候执行发现操作!
例如:
在连接之前如果两个设备没有配对,则系统会自动发出配对请求。
服务器套接字接受连接的基本过程
放在子线程中去执行。
例子:
客户端连接的基本过程
调用 connect() 的时候要确保客户端没有执行发现操作。如果执行了会大幅度降低连接的速度,增加失败的可能。
例子
在连接之前调用 cancleDiscovery() 在进行连接之前应该始终调用这个方法,而且调用的时候无需检测是否正在扫描。
过程:
从 Android 3.0 开始, Bluetooth API 便支持使用蓝牙配置文件。蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范。
1、蓝牙配置文件就是设备间通信(蓝牙设备)的一种规范
免提配置文件便是一个示例,对于连接到无线耳机的手机,两台设备都必须支持免提配置文件。我们也可以通过实现接口 BluetoothProfile 来写入自己的类来支持特定的蓝牙配置文件。Android API 提供了以下的几种蓝牙配置文件的实现:
2、使用配置文件的基本步骤
创建 HDP 应用:
关于普通蓝牙设备和普通蓝牙设备之间的连接通信
关于蓝牙设备和蓝牙仪器(蓝牙耳机、电子秤等等类似产品)
这种之间的通信是通过配置文件代理来实现的。
都有一个对应的配置文件代理类。具体的操作是通过这个对象来完成。
参考: https://mp.weixin.qq.com/s?__biz=MzU5NzA2NjQzMg==&mid=2247484128&idx=1&sn=&scene=21#wechat_redirect
③ Android开发之蓝牙(Bluetooth)
在上一篇中有介绍了Wifi与网络连接处理
Android开发之WiFi与网络连接处理
下面,来继续说说Android中蓝牙的基本使用。
Bluetooth是目前使用的最广泛的无线通讯协议之一,主要针对短距离设备通讯(10米),常用于连接耳机、鼠标和移动通讯设备等。
值得一提的是:
android4.2新增了部分新功能,但是对于Bluetooth熟悉的人或许开始头疼了,那就是Android4.2引入了一个新的蓝牙协议栈针BLE。谷歌和Broadcom之间的合作,开发新的蓝牙协议栈,取代了基于堆栈的Bluez。因此市场上出现了老设备的兼容问题,很多蓝牙设备在android4.2手机上不能正常使用。
BluetoothAdapter简单点来说就是代表了本设备(手机、电脑等)的蓝牙适配器对象。
first:we need permission
要操作蓝牙,先要在AndroidManifest.xml里加入权限
**下面来看看如何使用蓝牙。 **↓↓↓****
Demo已就绪:
返回值:如果设备具备蓝牙功能,返回BluetoothAdapter 实例;否则,返回null对象。
打开蓝牙设备的方式:
1.直接调用函数enable()去打开蓝牙设备 ;
2.系统API去打开蓝牙设备,该方式会弹出一个对话框样式的Activity供用户选择是否打开蓝牙设备。
注意: 1.如果蓝牙已经开启,不会弹出该Activity界面。2.在目前大多数Android手机中,是不支持在飞行模式下开启蓝牙的。如果蓝牙已经开启,那么蓝牙的开关 ,状态会随着飞行模式的状态而发生改变。
1. 搜索蓝牙设备
使用BluetoothAdapter的startDiscovery()方法来搜索蓝牙设备
startDiscovery()方法是一个异步方法,调用后会立即返回。该方法会进行对其他蓝牙设备的搜索,该过程会持续12秒。该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。
系统开始搜索蓝牙设备
^( *  ̄(oo) ̄ ) ^ 系统会发送以下三个广播:
2.扫描设备
3.定义广播接收器接收搜索结果
4.注册广播
获取附近的蓝牙设备
第一步建立连接:首先Android sdk(2.0以上版本)支持的蓝牙连接是通过BluetoothSocket建立连接,服务端BluetoothServerSocket和客户端(BluetoothSocket)需指定同样的UUID,才能建立连接,因为建立连接的方法会阻塞线程,所以服务器端和客户端都应启动新线程连接。
(这里的服务端和客户端是相对来说的)
两个蓝牙设备之间的连接,则必须实现服务端与客户端的机制。
当两个设备在同一个RFCOMM channel下分别拥有一个连接的BluetoothSocket,这两个设备才可以说是建立了连接。
服务端设备与客户端设备获取BluetoothSocket的途径是不同的。
1,服务端设备是通过accepted一个incoming connection来获取的,
2,客户端设备则是通过打开一个到服务端的RFCOMM channel来获取的。
服务端
通过调用BluetoothAdapter的(String, UUID)方法来获取BluetoothServerSocket(UUID用于客户端与服务端之间的配对)
客户端
调用BluetoothService的(UUID)方法获取BluetoothSocket(该UUID应该同于服务端的UUID)。
调用BluetoothSocket的connect()方法(该方法为block方法),如果UUID同服务端的UUID匹配,并且连接被服务端accept,则connect()方法返回。
数据传递,通过以上操作,就已经建立的BluetoothSocket连接了,数据传递无非是通过流的形式
获取流
该类就是关于远程蓝牙设备的一个描述。通过它可以和本地蓝牙设备---BluetoothAdapter连接通信。
好多东西我也不知道怎么描述,下面给出Demo:
刚好有刚学习的小伙伴问我ListView怎么用,那我就用ListView。
源码:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git
④ 苹果手机和没卡的安卓手机怎么蓝牙互传软件
苹果使用蓝牙将照片发送到安卓手机。下面是怎么做的。1.首先打开苹果手机桌面的菜单栏,在菜单栏中打开接受“隔空投送”选项。2.打开后会弹出一个框。找到并单击选择“所有人”选项。3.打开两部手机,找到手机里的设置,点击进入设置界面,打开安卓和苹果手机的蓝牙。4.打开蓝牙界面中的蓝牙开关。5.最后回到苹果手机桌面,点击照片进入图库。选择要发送的图片,通过蓝牙发送到要发送的安卓手机。
苹果是怎么用蓝牙把东西传到安卓手机上的?使用蓝牙文件交换!你可以在finder- application或者launchpad- other中找到。对于安卓系统,一般可以通过蓝牙传输。我自己测试过。希望给个好评,谢谢!
不,苹果是苹果圈外面的挡箭牌。可以发在线qq之类的。
1.IOS和android不能通过蓝牙互相通信。2.一般通过双方手机的app分享图片比较方便,比如微信、手机QQ、云盘等。3.您也可以通过连接电脑进行传输。第一代iPhone由苹果前CEO史蒂夫·乔布斯于2007年1月9日发布,2007年6月29日正式发布。第二代iPhone3G于2008年6月10日由美国苹果公司掌门人史蒂夫·乔布斯在苹果全球开发者大会上正式发布。第三代iPhone3Gs由苹果公司于2009年6月9日在WWDC2009上正式发布。2013年9月10日发布第七代iPhone 5s和iPhone 5c,同年9月20日正式发布。第八代iPhone 6和iPhone 6 Plus于2014年9月10日发布,中国大陆销售时间定于10月17日。第九代iPhone 6s和iPhone 6s Plus于北京时间2015年9月10日正式发布。2015年9月12日15: 00开始接受预订,2015年9月25日正式上线。中国是首批国家之一。第十代iPhone 7和iPhone 7 Plus于北京时间2016年9月8日发布,起售价5388元。2017年3月21日,苹果推出特别版iPhone 7和iPhone 7 Plus,外观为动人的红色,起售价6188元。第十一代iPhone 8、iPhone 8 Plus、iPhone X于北京时间2017年9月13日发布。4.7英寸iPhone 8,5.5英寸iPhone 8 Plus和5.8英寸iPhone X,iPhone 8起价5888元,iPhone 8 Plus起价6688元。9月22日正式上线。iPhone X于10月27日预订,11月3日上市。64G版8388元,顶配256GB版9688元。望采纳!
⑤ 安卓怎样连接两个蓝牙
手机连接两个蓝牙设备在系统和更新设置中进行操作。
以手机华为P40为例,手机连接两个蓝牙设备的步骤分为3步,具体操作如下
1.点击系统和更新
在设置界面中,点击打开系统和更新。
2.选择开发人员选项
在系统和更新界面中,点击开发人员选项。
3.修改蓝牙连接个数
在开发人员选项界面中,点击最大蓝牙音频连接个数,选择两个即可。
我们在使用蓝牙设备的时候,通常可能是一对一的情况。但是如果你想让他与多个设备连接应该怎么用呢?
首先我们先确定一下蓝牙是否有这个功能,因为比较低版本的蓝牙就没有一对多的功能。
另外就是在蓝牙开启的情况下,我们与一部设备连接,同时再长按开关键,还可以继续寻找另一个设备。
这个时候我们就会听到蓝牙传来的提示间,这就表示找到配对的设备,可以连接。
连接完成第一个设备以后,我们再按同样的方法打开第二个设备,让系统自动找到蓝牙配对。
这样设备与蓝牙之间就找寻配对成功,当我们使用的时候,就会看到蓝牙列表里的设备。
如果此时不需要连接两个的话,把蓝牙一个关掉即可,这样两个与一个都可以正常使用。
⑥ android蓝牙BLE(三) —— 广播
在蓝牙开发中,有些情况是不需要连接的,只要外设广播自己的数据即可,例如苹果的 ibeacon 。自 Android 5.0 更新蓝牙API后,手机可以作为外设广播数据。
广播包有两种:
其中 广播包是每个外设都必须广播的,而响应包是可选的 。每个广播包的长度必须是 31个字节 ,如果不到 31个字节 ,则剩下的全用 0 填充 补全,这部分的数据是无效的
广播包中包含若干个广播数据单元,广播数据单元也称为 AD Structure 。
广播数据单元 = 长度值Length + AD type + AD Data。
长度值 Length 只占 一个字节 ,并且位于广播数据单元的 第一个字节 。
概念的东西有些抽象,先看看下面的广播报文:
0x代表这串字符串是十六进制的字符串。 两位十六进制数代表一个字节 。因为两个字符组成的十六进制字符串最大为 FF ,即255,而Java中byte类型的取值范围是-128到127,刚好可以表示一个255的大小。所以两个十六进制的字符串表示一个字节。
继续查看报文内容,开始读取第一个广播数据单元。读取 第一个 字节: 0x07 ,转换为十进制就是7,即表示后面的7个字节是这个广播数据单元的数据内容。超过这7个字节的数据内容后,表示是一个新的广播数据单元。
而第二个广播数据单元,第一个字节的值是 0x16 ,转换为十进制就是22,表示后面22个字节为第二个广播数据单元。
在广播数据单元的 数据部分 中, 第一个字节 代表 数据类型 (AD type),决定数据部分表示的是什么数据。(即广播数据单元第二个字节为AD type)
AD Type 的类型如下:
这bit 1~7分别代表着发送该广播的蓝牙芯片的物理连接状态。当bit的值为1时,表示支持该功能。
例:
蓝牙广播的数据格式大致讲了一下,有助于下面的广播操作的理解。
先看看广播设置( AdvertiseSettings )如何定义:
(1)、通过 AdvertiseSettings.Builder#setAdvertiseMode() 设置广播模式。其中有3种模式:
(2)、通过 AdvertiseSettings.Builder#setAdvertiseMode() 设置广播发射功率。共有4种功率模式:
(3)、通过 AdvertiseSettings.Builder#setTimeout() 设置持续广播的时间,单位为毫秒。最多180000毫秒。当值为0则无时间限制,持续广播,除非调用 BluetoothLeAdvertiser#stopAdvertising() 停止广播。
(4)、通过 AdvertiseSettings.Builder#setConnectable() 设置该广播是否可以连接的。
之前说过,外设必须广播广播包,扫描包是可选。但添加扫描包也意味着广播更多得数据,即可广播62个字节。
可见无论是广播包还是扫描包,其广播的内容都是用 AdvertiseData 类封装的。
(1)、 AdvertiseData.Builder#setIncludeDeviceName() 方法,可以设置广播包中是否包含蓝牙的名称。
(2)、 AdvertiseData.Builder#setIncludeTxPowerLevel() 方法,可以设置广播包中是否包含蓝牙的发射功率。
(3)、 AdvertiseData.Builder#addService UUID (Parcel UUID ) 方法,可以设置特定的 UUID 在广播包中。
(4)、 AdvertiseData.Builder#addServiceData(Parcel UUID ,byte[]) 方法,可以设置特定的 UUID 和其数据在广播包中。
(5)、 AdvertiseData.Builder#addManufacturerData(int,byte[]) 方法,可以设置特定厂商Id和其数据在广播包中。
从 AdvertiseData.Builder 的设置中可以看出,如果一个外设需要在不连接的情况下对外广播数据,其数据可以存储在 UUID 对应的数据中,也可以存储在厂商数据中。但由于厂商ID是需要由Bluetooth SIG进行分配的,厂商间一般都将数据设置在厂商数据。
另外可以通过 BluetoothAdapter#setName() 设置广播的名称
先看一个例子,我们分别在 广播包 和 扫描包 中设置 AdvertiseData.Builder 的 每一种广播报文参数 ,得到一下报文内容:
(1)、Type = 0x01 表示设备LE物理连接。
(2)、Type = 0x09 表示设备的全名
(3)、Type = 0x03 表示完整的16bit UUID 。其值为0xFFF7。
(4)、Type = 0xFF 表示厂商数据。前两个字节表示厂商ID,即厂商ID为0x11。后面的为厂商数据,具体由用户自行定义。
(5)、Type = 0x16 表示16 bit UUID 的数据,所以前两个字节为 UUID ,即 UUID 为0xF117,后续为 UUID 对应的数据,具体由用户自行定义。
最后继承 AdvertiseCallback 自定义广播回调。
初始化完毕上面的对象后,就可以进行广播:
广播主要是通过 BluetoothLeAdvertiser#startAdvertising() 方法实现,但在之前需要先获取 BluetoothLeAdvertiser 对象。
BluetoothLeAdvertiser 对象存在两个情况获取为Null:
所以在调用 BluetoothAdapter#getBluetoothLeAdvertiser() 前,需要先调用判断蓝牙已开启,并判断在 BluetoothAdapter 中获取的 BluetoothLeAdvertiser 是否为空(测试过某些华为手机 mBluetoothAdapter.() 为 false , 但是能发送ble广播)。
与广播成对出现就是 BluetoothLeAdvertiser.stopAdvertising() 停止广播了,传入开启广播时传递的广播回调对象,即可关闭广播:
虽然通过广播告知外边自身拥有这些Service,但手机自身并没有初始化Gattd的Service。导致外部的中心设备连接手机后,并不能找到对应的 GATT Service 和 获取对应的数据。
Service类型有两个级别:
创建 BluetoothGattService 时,传入两个参数: UUID 和Service类型:
我们都知道Gatt中, Service 的下一级是 Characteristic , Characteristic 是最小的通信单元,通过对 Characteristic 进行读写操作来进行通信。
特征属性表示该 BluetoothGattCharacteristic 拥有什么功能,即能对 BluetoothGattCharacteristic 进行什么操作。其中主要有3种:
权限属性用于配置该特征值所具有的功能。主要两种:
Characteristic 下还有 Descriptor ,初始化 BluetoothGattDescriptor 时传入: Descriptor UUID 和 权限属性
为 Service 添加 Characteristic ,为 Characteristic 添加 Descriptor :
通过蓝牙管理器 mBluetoothManager 获取 Gatt Server ,用来添加 Gatt Service 。添加完 Gatt Service 后,外部中心设备连接手机时,将能获取到对应的 GATT Service 和 获取对应的数据
定义 Gatt Server 回调。当中心设备连接该手机外设、修改特征值、读取特征值等情况时,会得到相应情况的回调。
最后开启广播后,用nRF连接后看到的特征值信息如下图所示:(加多了一个只能都的特征值)
android蓝牙BLE(一) —— 扫描
android蓝牙BLE(二) —— 通信
android蓝牙BLE(三) —— 广播
android蓝牙BLE(四) —— 实战