android spp 服务端,Android开发之蓝牙(一)——基于SPP协议蓝牙模块通信,androidspp...
Android开发之蓝牙(一)——基于SPP协议蓝牙模块通信,androidspp
使用设备
基本概念
基本流程
本文意在介绍蓝牙开发的主要流程,学习使用蓝牙开发一个星期了,写写一个星期以来遇到的一些小问题,还有介绍下流程。开发具有基本的通信功能,本项目主要是用于与蓝牙模块的串口读写功能。
下一篇文章还有Android开发之蓝牙(二)——基于BLE协议蓝牙模块通信:
http://blog.csdn.net/wzhworld/article/details/76324738
使用设备
1、魅族手机
2、蓝牙FSC-BT826
3、最终目的是做出能与串口调试助手通信的功能
基本概念
1、适配器:
BuletoothAdapter:本地蓝牙的适配器,也就是说当前应用程序所运行的Android设备上的蓝牙。
BuletoothDevice : 远程的蓝牙适配器,也就是说你要连接的Android设备的适配器。。
2、权限:
android.permission.BLUETOOTH : 一些配置连接蓝牙的权限
android.permission.BLUETOOTH_ADMIN : 进行操作的权限
3、相关广播:
BluetoothDevice.ACTION_FOUND:表示可搜索到附近的蓝牙设备
BluetoothDevice.ACTION_PAIRING_REQUEST:配对请求
BluetoothAdapter.ACTION_STATE_CHANGE:配对状态改变
后面两个因为刚刚开始用的时候很迷糊,所以就直接是自动匹配,所以这两个都没怎么用到,不过感觉如果是要做这一方面的话得去了解这些广播代表什么。
基本流程
程序写得有点乱,所以还是说下大概程序写法,
(1)我是在主活动初始化布局、蓝牙适配、获取选定蓝牙设备,PS:得先匹配后才能连接
(2)然后开启一个服务,通过广播从主活动把选定蓝牙对象发送到服务中。
(3)服务收到之后主要所做的任务就是开启两个线程,一个是负责对蓝牙的socket进行连接,另一个是通过socket进行读写,第二个线程主要进行的是read,而写只需要在需要的时候才使用,所以不需要在run中。
(4)异步线程采用消息机制handler进行成功失败消息的传输。
1、检测蓝牙以及权限是否开启
//获取蓝牙适配器,当没有开启时开启,会回调一个成功与否的结果
private void initBluetooth() {
if(!mBluetoothAdapter.isEnabled()){
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE);
}
}
2、此时注册一个广播接收器进行接收
//注册广播
IntentFilter discoveryFilter = new IntentFilter();
discoveryFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
discoveryFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
discoveryFilter.addAction(BluetoothDevice.ACTION_FOUND);
discoveryFilter.addAction(BluetoothTools.ACTION_CONNECT_ERROR);
discoveryFilter.addAction(BluetoothTools.ACTION_CONNECT_SUC);
discoveryFilter.addAction(BluetoothTools.ACTION_RECEIVE_DATA);
registerReceiver(mBluetoothReceiver, discoveryFilter);
3、获取本地适配器,进行连接
public BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
******
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();//异步的,不会等待结果,直接返回。
} else if(!mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.startDiscovery();
} //如果设备正在寻找
4、进行匹配,连接
ClsUtils.createBond(mLastBluetoothDevice.getClass(), mLastBluetoothDevice);
ClsUtils.setPin(mLastBluetoothDevice.getClass(), mLastBluetoothDevice,pin);
使用了一个ClsUtils的工具类,其实就是将一些创建配对什么的提供一个方法,简单化。
不过遇到的奇怪的问题就是我createBond创建配对之后,使用Pin配对会自动配对,并没有说弹出窗口,查了下网上说需要取消窗口什么的,我试了也是不行,所以就最后没管了,直接一个自动配对,不过pin是死的,我设了0000,对BT826模块等蓝牙模块才有用。
5、在主活动获取对象之后,传到服务之中去开启线程。首先是开启连接的线程
//如果匹配成功
if (BluetoothTools.ACTION_PAIRING_SUCC.equals(actionCon)){
Bundle mBundle = intent.getExtras();
BluetoothDevice mBluetoothDevice = mBundle.getParcelable("Pairing_Succ");
BluetoothClientConnThread mThread = new BluetoothClientConnThread(handler,mBluetoothDevice);
mThread.start();//开钱连接线程
}
6、进行连接的具体过程
注意连接之前要取消扫描,因为扫描是一个很费时的动作,连接通信的过程其实与网络的SOCKET相似。
//UUID匹配
socket = serverDevice.createRfcommSocketToServiceRecord(BluetoothTools.PRIVATE_UUID);//蓝牙模块的UUID是固定(只对于spp),是00001101-0000-1000-8000-00805F9B34FB
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
socket.connect();
Log.e("Socket connect",String.valueOf(socket.isConnected()));
7、开启聊天的线程
通过广播读取editView写的数据,然后用的是gbk,当时有用过UTF8但是传输我记得发生乱码
//如果键盘点击send发送数据
if(BluetoothTools.ACTION_DATA_TO_GAME.equals(actionCon)){
try {
String editData = (String)intent.getExtras().get("editViewData");
byte[] bytes = editData.getBytes("gbk");
communThread.write(bytes);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
8、通信线程的read、write
bytes = mmInStream.read(buffer);
serviceHandler.obtainMessage(BluetoothTools.MESSAGE_READ_OBJECT, bytes, -1, buffer).sendToTarget();
就是将读到的buffer通过消息机制传回服务,
/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
当时也参考了很多的文章,有得是用object传输的,但传的的时候有点问题,传不了,所以最后都改为使用字节流传输。
基本大概的spp通信就是这样一个过程,整体上不算很难,但因为属于初学阶段用起来还不是很熟练,所以学得久一点。下一篇的BLE其实大概过程相差不会很大,但有一些会改变。
Android开发之蓝牙(二)——基于BLE协议蓝牙模块通信
git下载
csdn下载
顶
0
踩
0
查看评论
http://www.dengb.com/ydkfrm/1297894.htmlwww.dengb.comtruehttp://www.dengb.com/ydkfrm/1297894.htmlTechArticleAndroid开发之蓝牙(一)——基于SPP协议蓝牙模块通信,androidspp 使用设备 基本概念 基本流程 本文意在介绍蓝牙开发的主要流程,学习使用...
android spp 服务端,Android开发之蓝牙(一)——基于SPP协议蓝牙模块通信,androidspp...相关推荐
- android socket 服务端,Android socket 服务端
Android socket 服务端 Android 想在Android 上跑一个 socket 服务端.把在java工程里运行起来的代码直接放到android项目里来,开启线程,创建ServerSo ...
- android对讲机 服务端,Android的WIFI局域网对讲机
https://blog.csdn.net/z979451341/article/details/79280749 (三)Android局域网内语音对讲 基于UDP语音传输 https://blog. ...
- android从服务端获取json解析显示在客户端上面,Android服务端获取json解析显示在客户端上面.doc...
Android服务端获取json解析显示在客户端上面 Android从服务端获取json解析显示在客户端上面 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比 ...
- Android——Tcp服务端实现
Android--Tcp服务端 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. ...
- Android模拟服务端下发消息的Socket通讯工具
Android模拟服务端下发消息的Socket通讯工具 1. 背景简介 背景简介: 有些场景需要依赖服务端下发消息到客户端,比如PowerMsg,服务端下发消息Type,客户端解析Type做出相应动作 ...
- TCP服务端程序开发
TCP服务端程序开发 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收数据 发送数据 关闭套接字 2. socket 类的介绍 ...
- [Asp.net core 3.1] 通过一个小组件熟悉Blazor服务端组件开发
通过一个小组件,熟悉 Blazor 服务端组件开发.github:https://github.com/git-net/NBlazors 一.环境搭建 vs2019 16.4, asp.net cor ...
- java项目_好程序员Java分享从入门到服务端项目开发的过程
好程序员Java分享从入门到服务端项目开发的过程,对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而 ...
- 网络编程之TCP服务端程序开发
TCP服务端程序开发 学习目标 能够写出TCP服务端应用程序接收和发送消息 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收数据 ...
最新文章
- Python + Steamlit 快速开发可视化 web 页面!
- 前端常见算法的JS实现
- 基于hi-nginx的web开发(python篇)——cookie和会话管理
- 在树洞里,渝粤题库在线整理
- C++const的多种用法
- theano学习指南5(翻译)- 降噪自动编码器
- D7控件\dw_cd_VirtualTreeview_v4.5.2\Demos\Advanced---TVirtualStringTree用法
- windows和Linux虚拟机或者云主机之间传输文件
- java编译提示错误信息_java常见编译错误信息
- excel服务器bom修改,物料清单BOM表的实现方法_勤哲Excel服务器 - 勤哲app应用之家...
- 内网穿透:看这一篇就够了!
- echart的基本使用方法
- Micrium uC-Probe STM32调试工具 ucosIIucosIII
- 什么是全栈工程师,如何成为全栈工程师
- echarts青岛市地图下钻到区市及根据各个区市经纬度在各区市地图绘制散点图和道路线
- 互联网协议 — TCP — 报文格式
- easyrecovery2023最新免费版电脑数据恢复软件使用教程
- Minkowski不等式
- 如何找靠谱的游戏开发外包公司
- 微信“公众平台测试账号”接口调试指南