
Android 开发SPP经典蓝牙。
1、传统蓝牙采用的是SPP(Serial Port Profile)协议进行数据传输。
2、SPP的UUID:00001101-0000-1000-8000-00805F9B34FB
3、手机一般以客户端的角色主动连接SPP协议设备
概念:
BluetoothAdapter:
本地蓝牙适配器,是所有蓝牙交互的入口,表示蓝牙设备自身的一个蓝牙适配器,整个系统只有一个蓝牙适配器,通过他可以发现其他蓝牙设备,查询绑定(配对)设备列表,使用MAC地址实例化BluetoothDevice以及创建BluetoothServerSocket用来侦听来自其他设备的通信。
myBluetoothAdapter = BluetoothAdaptergetDefaultAdapter();//获取默认的蓝牙Adapter
BluetoothDevice:
远程的蓝牙设备。
private static BluetoothDevice myDevice;
myDevice = myBluetoothAdaptergetRemoteDevice(BDAddr);//获取远程设备,通过蓝牙的MAC地址来获取一个远程对象
两种连接方式
BluetoothSocket
客户端:调用BluetoothDevice的createRfcommSocketToServiceRecord()可以获取该对象;调用connect()方法可以建立连接。
private static BluetoothSocket mySocket = null;
private static final UUID SPP_UUID = UUIDfromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevicegetClass()getMethod("createRfcommSocket", new Class[] {intclass});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket来选择连接的服务和协议
mySocket = (BluetoothSocket) minvoke(myDevice, 1);
BluetoothServerSocket:
服务端:通过BluetoothServerSocket对象可以创建BluetoothSocket对象,调用BluetoothServerSocket的accept()的方法可以得到改对象。
开发流程:
1:声明权限:
<uses-permission android:name="androidpermissionBLUETOOTH"/>
<uses-permission android:name="androidpermissionBLUETOOTH_ADMIN"/>
2:启动和关闭蓝牙
获取蓝牙适配器,使用close()接口可以关闭蓝牙适配器
myBluetoothAdapter = BluetoothAdaptergetDefaultAdapter();//获取默认的蓝牙Adapter
启动蓝牙
if (!blueadapterisEnabled())
//判断本机蓝牙是否打开
{//如果没打开,则打开蓝牙
blueadapterenable();
}
3使用BlueAdatper搜索
使用bluetoothAdapter搜索设备,bluetoothAdapterstartDiscovery()在搜索过程中,系统会发出三个广播信息:
ACTION_DISCOVERY_START:开始搜索
ACTION_DISCOVERY_FINISHED:搜索结束
ACTION_FOUND:找到设备
if (bluetoothAdapterisDiscovering()) {
bluetoothAdaptercancelDiscovery();//如果蓝牙设备未连接则取消搜索
}
bluetoothAdapterstartDiscovery();
}
4:(1)通过注册广播获取搜索到的设备。
IntentFilter intentFilter = new IntentFilter();
intentFilteraddAction(BluetoothDeviceACTION_FOUND);//找到设备广播
intentFilteraddAction(BluetoothAdapterACTION_DISCOVERY_FINISHED);//搜索完成广播
registerReceiver(receiver, intentFilter);//注册广播接收器
// receiver
private final BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intentgetAction();
if (BluetoothDeviceACTION_FOUNDequals(action)) {
// find a device
BluetoothDevice device = intent getParcelableExtra(BluetoothDeviceEXTRA_DEVICE);
if (devicegetBondState() != BluetoothDeviceBOND_BONDED) {
//未配对设备
newDeviceArrayAdapteradd(devicegetName() + "\n" + devicegetAddress());
}else {
//已经配对过的设备
TextView tvPaired = (TextView)findViewById(Ridtv_paired);
tvPairedsetVisibility(ViewVISIBLE);
lvPairedDevicessetVisibility(ViewVISIBLE);
pairedDeviceArrayAdapteradd(devicegetName() + "\n" + devicegetAddress());
}
Logi(TAG,"name:" + devicegetName() + " address"+ devicegetAddress());
} else if (BluetoothAdapterACTION_DISCOVERY_FINISHEDequals(action){
// search finish
Logi(TAG, "search finish!");
}
}
};
(2),直接得到当前的蓝牙设备后,就可用通过遍历pairedDevices ,得到当前手机已经配对过的蓝牙设备。
Set<BluetoothDevice> pairedDevices = myBluetoothAdaptergetBondedDevices();//获取当前蓝牙设备
if (pairedDevicessize() <= 0) return false;
for (BluetoothDevice device : pairedDevices) {
Map<String, String> map = new HashMap<String, String>();
mapput("DeviceName", devicegetName());
mapput("BDAddress", devicegetAddress());
listadd(map);
5建立连接
private static final UUID SPP_UUID = UUIDfromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevicegetClass()getMethod("createRfcommSocket", new Class[] {intclass});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket来选择连接的服务和协议
mySocket = (BluetoothSocket) minvoke(myDevice, 1);
mySocketconnect();//使用BluetoothSocket来连接设备
6把得到的蓝牙设备给通过点击ListView选择设备。
listViewsetOnItemClickListener(new ListViewOnItemClickListener() {
public void onItemClick(AdapterView<> arg0, View arg1, int arg2, long arg3) {
SelectedBDAddress = listget(arg2)get("BDAddress");
if (((ListView) arg0)getTag() != null) {
((View) ((ListView) arg0)getTag())setBackgroundDrawable(null);
}
((ListView) arg0)setTag(arg1);
arg1setBackgroundColor(ColorBLUE);
myDevice = myBluetoothAdaptergetRemoteDevice(SelectedBDAddress);
}
});
7客户端发送数据
当两个设备成功连接之后,双方都会有一个BluetoothSocket对象,这时,就可以在设备之间传送数据了。
1使用getOutputStream()方法来获取输出流来处理传输。
2调用write()。
os = socketgetOutputStream();//获取输出流
if (os != null) {//判断输出流是否为空
oswrite(messagegetBytes("UTF-8"));
}
osflush();//将输出流的数据强制提交
osclose();//关闭输出流
}
将输出流中的数据提交后,要记得关闭输出流,否则,可能会造成只能发送一次数据。
8服务端接收数据
1使用getInputStream()方法来获取输入流来处理传输。
2调用read()。
InputStream im=null;
im=bluetoothSocketgetInputStream();
byte buf[] = new byte[1024];
if (is != null) {
isread(buf, 0, buflength);//读取发来的数据
String message = new String(buf);//把发来的数据转化为String类型
BuletoothMainActivityUpdateRevMsg(message);//更新信息在显示文本框
isclose();//关闭输入流
使用服务端接收数据时,要先从客户端向服务端发起连接,只有接收到连接请求之后,才会返回一个BluetoothSocket对象。有BluetoothSocket对象才能获取到输入流。
安卓手机怎么样使用蓝牙耳机呢?下面是我为大家整理的安卓手机使用蓝牙耳机的方法,欢迎参考~
安卓手机怎么样使用蓝牙耳机
1、先给蓝牙耳机充电,保证能够正常使用;
2、向上拨动开关键,将蓝牙耳机打开;
3、同时将安卓手机的蓝牙打开,与蓝牙耳机进行配对连接;
4、在使用过程中,如果是听歌或者接听电话的时候可以调节音量按钮来调节音量的大小;
5、接听、拨打电话的时候按一下功能键就行了,同时也是暂停键;这就是安卓蓝牙耳机的使用方法,但是每一种安卓的蓝牙耳机都是有差别的,具体的可以根据自身的使用说明书进行使用
拓展阅读:蓝牙耳机选购攻略
1买蓝牙耳机用途决定款式
通话蓝牙耳机:这是商务办公、安全开车最主要的用途了,如果主要选择一些轻巧、携带方便、通话高清、传输稳定的单耳蓝牙耳机,选用领夹式或者耳挂式耳塞。
听歌蓝牙耳机:大部分人购买蓝牙耳机为了听歌,听歌最好用双耳蓝牙,因为单耳蓝牙是无法满足立体声的要求的,如果听歌肯定是立体声效果最佳。可以选用头戴式或者耳塞式蓝牙耳机。
运动蓝牙耳机:运动听歌也是蓝牙耳机的主要用途,需要选择轻巧、佩戴合适、不易掉落的蓝牙耳机,单耳双耳均可,如果是双耳入耳式的话,要注意它的线的粗细,线越粗,听诊效应越强。
玩游戏看影视:玩游戏和看影视的话,一般需要选择兼容性强、传输效果好的头戴式蓝牙耳机,因为头戴式的音质效果好,声场较强,能有更好的'画面感。
总结:买蓝牙耳机主要用途只有2个:通话和娱乐听歌看电视
2蓝牙耳机价格段位选择
低端价位:一般是30-150块的蓝牙耳机,其中主要还是以国产的QCY、爱国者、小米、vivo等为主,这些品牌会有较高的性价比和较好的质量保证,其他的国产品牌某些款式也有一些相对较好的产品。
中端价位:一般是150-800块的蓝牙耳机,其中以国外的捷波朗、缤特力、索尼为主,而QCY、美讯也有一些性价比较高中端产品,买家可以按自己的需要进行选择。
高端价位:一般是800元以上的耳机,去年和iPhone7一同发报的苹果/AppleAirPods无线蓝牙耳机。甚至有高达万元的,耳机音质为多数耳机发烧友所推崇,还有像beats这个品牌,则是以时尚外观取胜市场。
3根据耳朵习惯选择耳机
佩戴体验主要由耳机的配搭方式、耳帽、重量、松紧程度决定的,但是根据个人的主观感觉不同,也会有所出入。一般中高端品牌的是蓝牙耳机佩戴都是比较舒适的。
如果很在乎佩戴舒适度的人,那还是建议去实体店佩戴体验后再购买。
蓝牙耳机相关知识普及资料
1一定要选41版的蓝牙耳机?
耳机的传输效果主要有耳机的芯片决定的,现在蓝牙耳机芯片主要有美国的Broadcom和英国的CSR。市面上的蓝牙芯片版本主要有30、40、41三个版本,其实每个版本都有自己的特点。
蓝牙30已经存在很久了,蓝牙通话传输效果最为稳定,这也是30为什么至今还存在的原因,它的缺点就是功能相对较少、功耗大、传输速率低。
蓝牙40传输速率更加高,传输距离更远,更低功耗,无线覆盖范围增强,可以直接连接,不需输入密码,同时也可以实现自动回连,智能一拖二等功能、并可大量兼容如今的数码设备。
蓝牙41是蓝牙40的升级版,在40的基础上实现更高清、更高速率的通话效果,具有更强的灵活性,但是有些时候41的兼容不太稳定,这个要注意一下。
2耳机续航时间有多长
续航时间决定你的蓝牙耳机能用多久,又分为使用时间和待机时间。而决定续航时间的其实跟耳机的电池质量以及耳机体积都有关系。
现在多数的蓝牙耳机都以聚合物锂电池为主,因为其体积小,功效强大,续航时间长,可用寿命也高。一般的蓝牙耳机续航都有七八个小时以上了。
耳机体积决定电池硬件可装配的大小,从而决定续航时间长短,因此一般耳机越大,电池也越大、续航时间会更长。
蓝牙耳机怎么充电?
1、选用合适的充电器。一般蓝牙耳机都有专用的充电器,如果没有了专用的充电器,可以找充电接口(有的是细口圆孔的,有的是MiniUSB通用接口)一样的,并且额定输出功率一样的充电器使用。
2、充电时要把插头全部插进去,不要只插入一多半,这样时间长了损坏机器。在插拔充电插头时,要轻一些,否则时间长了会导致插头松动。
3、如果把蓝牙耳机插在底座或充电盒上充电,充电完成后比直接往蓝牙耳机充电使用时间长。充电方法和直接给耳机充电一样,把充电线对准底座的孔插进去即可。
4、当充上电后,红色指示灯亮起,说明正在充电。如果充电完成,指示灯会变成蓝色的,这时可以把充电器取下了。
5、给蓝牙耳机充电时,尽量不要再使用耳机,以免造成意外损坏。
蓝牙耳机充电注意事项
一、蓝牙耳机插上充电器时
指示灯恒亮,表示正在充电中。指示灯熄灭,表示充电完成。
二、蓝牙耳机未插上充电器
指示灯熄灭,表示已关机。指示灯恒亮,表示进入配对模式。指示灯快速闪烁5次,表示配对成功。指示灯每3秒快速闪烁1次,表示处于待机状态。指示灯每8秒慢速闪烁1次,表示处于通话状态。
蓝牙耳机常见问题疑答
1、我的手机能使用蓝牙吗?
答:蓝牙是一种世界标准的协议,只要你的手机有蓝牙功能,都能使用蓝牙耳机、蓝牙免提等蓝牙手机配件。常见的几个主要品牌的手机,可以去其网站查看自己的手机是否支持蓝牙。
2、我怎样选择蓝牙耳机
答:首先选择同自己品牌的蓝牙耳机,如索爱手机选择索爱蓝牙耳机、诺基亚手机选择诺基亚的蓝牙耳机等,同一品牌的蓝牙耳机没有喜爱的,再选择其它品牌的蓝牙耳机。其次就选择一种款式新、外形喜欢的耳机,各种蓝牙耳机功能、性能都差别不大,唯有外形各有所长而已。
3、蓝牙耳机使用简单吗?
答:蓝牙耳机使用很简单,比手机使用简单得多了。蓝牙耳机使用前,先要跟手机配对,简单的配对过程介绍:先按住耳机的开机按钮(说明书有说)8-10秒钟,再用手机搜索蓝牙设备,手机找到后会显示所找到的蓝牙名称,输入配对密码(一般是0000)后接着按手机的确定按键,那配对过程就这样简单的完成了。蓝牙耳机的按键不多,大部分只有音量按钮、接电话/挂机按钮,所以使用是很简单的。
4、蓝牙的有效范围是多少?
答:蓝牙是为了短距离数据通讯而应用的协议,有效范围在10米左右,有效范围越大,会引起耳机耗电增大、体积重量也会增大,所以没有必要要求大的有效范围。
5、蓝牙的配对密码是多少?
答:蓝牙的配对密码一般是0000,诺基亚的有些型号不是0000的,在说明书上有写明配对的密码。
6、蓝牙耳机的有效使用范围是多少?
答:与蓝牙手机简单配对,10米之内都可以无线通话。
7、蓝牙耳机有辐射问题么?
答:辐射值仅为手机的几十分之一,几乎可以忽略不计较,属于辐射免检产品,大可放心使用,属于绿色环保使用手机方式,在欧美已经颇为流行。
8、蓝牙耳机电池是否能换,寿命是多少
答:蓝牙耳机的电池大部分是内置锂电池(有少部分是蓝牙耳机是用7号电池外),电池不能更换,电池充电次数大约在500次左右。按照每次使用3天,可以使用1500天,也是大约3-4年,一款蓝牙用3年也可以淘汰了,所以不必要担心蓝牙耳机电池失效的问题。
9、给耳机充电时应该注意什么?
答:第一次充电――在您使用耳机前,需要给耳机电池充电24小时。重新充电――当您通过耳机扬声器听到每间隔20秒就重复一次,共5次鸣音时,则说明耳机需要重新充电了。
1 0、如何佩戴耳机?
答:耳机初始设置为右耳配戴。
1、打开话筒臂,然后打开耳钩(与耳机成45角)
2、将耳钩挂在耳后。
3、将耳机盖住耳部。
4、将话筒臂朝向您的嘴部
11、蓝牙耳机与支持蓝牙功能的手机绑定成功后,为什么耳机不能正常使用?
答:在您拨打电话前,必须先将耳机和话机连接起来。先在话机中找到蓝牙耳机设备列表,在属性或选项中,选择“连接”。如果还不能正常使用耳机设备,请在话机上删除该蓝牙设备,并重新进行绑定 *** 作。
12、如何给蓝牙耳机充电?
答:1、将充电器插头插进耳机中,将充电器带有释放标签的一面朝下,耳机的正面朝上。
2、将充电器的另一端插进电源插座中,充电时,耳机的指示器亮起直至充电结束。充电过程中耳机不能使用。第一次充电时间大约需要24个小时,以后充电15小时左右。
3、当充电结束时(指示灯关闭),从电源插座中取下充电器,按充电器插头上的释放键,将充电器从耳机中取下。
注:您在驾驶车辆时,可用原装的车载电源适配器来给耳机充电。
13、如何将耳机设置改为戴在左耳?
答:耳机初始设置为右耳配戴,要改变为左耳配戴:
1、打开话筒臂,然后打开耳钩(与耳机成90角)
2、轻轻提起并拉动耳机钩上部,将它从上部链接管脚处取下,然后将它推开来移动它。
3、将耳机翻转过来。
4、将耳钩底部挂在下部链接管脚,然后提起并向上部链接管脚处拉动耳钩的上部。
14、如何调节耳机音量?
答:重复多次按音量键上端,可将音量提高至所需音量。重复多次按音量键下端,可将音量降低至所需音量。
蓝牙设备地址(BD_ADDR)是一个48bit的唯一标识符,由LAP(24位地址低端部分)、UAP(8位地址高端部分)和NAP(16位无意义地址部分)组成,其格式如下所示:
NAP和UAP是蓝牙设备生产厂商的唯一标识码,由SIG分配给各个厂商;LAP则由厂商自行分配。
其中,bit40为组播地址标志位,其值为0:unicast(单播),其值为1:multicast(组播);bit41为地址类型标志位,其值为0:universal addr,其值为1:local addr。
在函数 BluetoothAddress::GetLocalAddress() 中展示了数种方式读取蓝牙BD_ADDR。
首先函数 fetch_vendor_addr(local_addr) 读取存储在vendor下bt_nvbin文件中的蓝牙地址:
其次是从system property中获取本地蓝牙地址路径:
若以上两种方法均不能获得BD_ADDR,则尝试从factory property中获取:
再者,若从factory property中也无法获取到BD_ADDR,可以从之前保存的BDA中查找:
以上方法均无法获取到固定地址时,则生成随机地址,其形式为 0x22:22:xx:xx:xx:xx ,然后将之保存在property之中,每次重新开关机后会生成新的随机地址:
A: 安卓开发蓝牙接收数据返回数据处理方式有以下几种:
1 通过InputStream获取蓝牙传输的数据,然后对数据进行处理,例如解析数据,提取有效信息;
2 通过OutputStream向蓝牙发送数据,实现蓝牙数据的发送;
3 通过BluetoothSocket实现蓝牙数据收发,连接蓝牙设备后,两端之间的通信基本上就是发送数据或者接收数据;
4 使用广播机制,在蓝牙接收到正确的数据类型后,通过发送一个广播通知客户端更新数据;
5 使用Handler把从蓝牙接收到的消息发送到主线程,由Handler进行处理和传递数据给UI线程更新UI界面。
安卓蓝牙中。要连接其他设备要调用connect()函数。。此函数你可以去看一下,官方说的是:若连接成功,就不会产生异常。不成功,就会产生异常。。。所以看看程序会运行异常不。运行了,说明没有连接成功。没运行,则连接成功了。
try {
// 连接
connect(device);
} catch (IOException e) {
ToastmakeText(MainActivitythis, "没有成功连接设备", //1
ToastLENGTH_SHORT)show();
}
若成功了,不会运行1,不成功,就会产生异常。运行异常中的程序,也就是代码1
打开手机的“设置”,再找到“蓝牙”并打开。
点击手机的“搜索蓝牙设备”。
配对成功后,可在“已配对的设备”中看到
手机蓝牙:
蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,利用"蓝牙"技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网Internet之间的通信,从而使这些现代通信设备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的24GHz ISM(即工业、科学、医学)频段。其数据速率为1Mbps。采用时分双工传输方案实现全双工传输。
以上就是关于android开发SPP经典蓝牙全部的内容,包括:android开发SPP经典蓝牙、安卓手机怎么样使用蓝牙耳机、[Android P] 蓝牙mac地址的读取与修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)