Android与蓝牙串口模块通信
1.蓝牙串口模块使用SPP-CA模块
蓝牙串口模块就是使用单片机的TX,RX与蓝牙模块通信,单片机通过TX发送数据给蓝牙模块,然后蓝牙模块在通过蓝牙协议把数据发送出去,蓝牙模块与Android的通信方式使用spp协议。
2.蓝牙通信
蓝牙的通信需要服务端和客户端,客户端搜索蓝牙设备,链接服务端。主要是通过插座通信,相关的知识可以学习了解下插座通信。链接建立起来,通信时数据的读写是通过输入输出流的方式读写。
3.Android蓝牙架构和API的说明
查看“机器人系统原理及开发要点详解”和“深入理解的Android网络编程”里的蓝牙相关章节,2本书里相关的章节有详细的介绍。
4.uuid
提示:如果要连接到蓝牙串行板,请尝试使用着名的SPP UUID 00001101-0000-1000-8000-00805F9B34FB。但是如果您连接到Android对等体,那么请生成您自己的唯一UUID。
这是Android官方文档的说明,如果是连接蓝牙串口模块使用通用的uuid 00001101-0000-1000-8000-00805F9B34FB,如果是Android手机间的通信链接,可以使用生成的uuid,客服端和服务端的uuid必须相同,下面通过蓝牙串口助手读取回来的UUID,下面是我的蓝牙串口模块的UUID。
下面是读取手机的蓝牙的UUID,可以看到比较多的UUID,有比较多的服务。
另外下面是其他蓝牙设备的UUID,应该是蓝牙4.0的。
代码部分还是比较简单的,下面是Android的蓝牙链接的主要部分代码,也是参考网上的。
包gjz.bluetooth;
导入gjz.bluetooth.R;
导入gjz.bluetooth.Bluetooth.ServerOrCilent;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.UUID;
导入android.app.Activity;
导入android.bluetooth.BluetoothAdapter;
导入android.bluetooth.BluetoothDevice;
导入android.bluetooth.BluetoothServerSocket;
导入android.bluetooth.BluetoothSocket;
导入android.content.Context;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.util.Log;
导入android.view.View;
导入android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
导入android.widget.AdapterView;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.Toast;
导入android.widget.AdapterView.OnItemClickListener;
public class chatActivity extends Activity implements OnItemClickListener,OnClickListener {
/ **当活动首次创建时调用。* /
private ListView mListView;
private ArrayList <deviceListItem>列表;
私人按钮sendButton;
私人按钮disconnectButton;
私人EditText editMsgView;
deviceListAdapter mAdapter;
上下文mContext;
/ *一些常量,代表服务器的名称* /
public static final String PROTOCOL_SCHEME_L2CAP =“btl2cap”;
public static final String PROTOCOL_SCHEME_RFCOMM =“btspp”;
public static final String PROTOCOL_SCHEME_BT_OBEX =“btgoep”;
public static final String PROTOCOL_SCHEME_TCP_OBEX =“tcpobex”;
private BluetoothServerSocket mserverSocket = null;
private ServerThread startServerThread = null;
private clientThread clientConnectThread = null;
private BluetoothSocket socket = null;
private BluetoothDevice device = null;
private readThread mreadThread = null ;;
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.chat);
mContext = this
在里面();
}
private void init(){
list = new ArrayList <deviceListItem>();
mAdapter = new deviceListAdapter(this,list);
mListView =(ListView)findViewById(R.id.list);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(本);
mListView.setFastScrollEnabled(真);
editMsgView =(EditText)findViewById(R.id.MessageText);
editMsgView.clearFocus();
sendButton =(Button)findViewById(R.id.btn_msg_send);
sendButton.setOnClickListener(new OnClickListener(){
@ Override
public void onClick(View arg0){
// TODO自动生成的方法存根
String msgText = editMsgView.getText()。toString();
if(msgText.length()> 0) {
sendMessageHandle(msgText);
editMsgView.setText(“”);
editMsgView.clearFocus();
//关闭InputMethodManager
InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(),0);
} else
Toast.makeText(mContext,“发送内容不能为空!”,Toast.LENGTH_SHORT).show();
}
});
disconnectButton =(Button)findViewById(R.id.btn_disconnect);
disconnectButton.setOnClickListener(new OnClickListener(){
@ Override
public void onClick(View arg0){
// TODO自动生成的方法存根
if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
{
shutdownClient();
}
else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
{
shutdownServer();
}
Bluetooth.isOpen = false;
Bluetooth.serviceOrCilent = ServerOrCilent.NONE;
Toast.makeText(mContext,“已断开连接!”,Toast.LENGTH_SHORT).show();
}
});
}
private Handler LinkDetectedHandler = new Handler(){
@
Override public void handleMessage(Message msg){
//Toast.makeText(mContext,(String)msg.obj,Toast.LENGTH_SHORT).show();
if(msg.what == 1)
{
list.add(new deviceListItem((String)msg.obj,true));
}
else
{
list.add(new deviceListItem((String)msg.obj,false));
}
mAdapter.notifyDataSetChanged();
mListView.setSelection(list.size() - 1);
}
};
@Override
public synchronized void onPause(){
super.onPause();
}
@Override
public synchronized void onResume(){
super.onResume();
if(Bluetooth.isOpen)
{
Toast.makeText(mContext,“连接已经打开,可以通信,如果要再建立连接,请先断开!”,Toast.LENGTH_SHORT).show();
返回;
}
if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
{
String address = Bluetooth.BlueToothAddress;
if(!address.equals(“null”))
{
device = mBluetoothAdapter.getRemoteDevice(address);
clientConnectThread = new clientThread();
clientConnectThread.start();
Bluetooth.isOpen = true;
}
else
{
Toast.makeText(mContext,“address is null!”,Toast.LENGTH_SHORT).show();
}
}
else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
{
startServerThread = new ServerThread();
startServerThread.start();
Bluetooth.isOpen = true;
}
}
//开启客户端
私有类clientThread extends Thread {
public void run(){
try {
//创建一个Socket连接:只需要服务器在注册时的UUID号
// socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID);
socket = device.createRfcommSocketToServiceRecord(UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));
//连接
消息msg2 = new Message();
msg2.obj =“请稍候,正在连接服务器:”+ Bluetooth.BlueToothAddress;
msg2.what = 0;
LinkDetectedHandler.sendMessage(MSG2);
socket.connect();
消息msg = new Message();
msg.obj =“已经连接上服务端!可以发送信息”。
msg.what = 0;
LinkDetectedHandler.sendMessage(MSG);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
}
catch(IOException e)
{
Log.e(“connect”,“”,e);
消息msg = new Message();
msg.obj =“连接服务端异常!断开连接重新试一试”。
msg.what = 0;
LinkDetectedHandler.sendMessage(MSG);
}
}
};
//开启服务器
私有类ServerThread extends Thread {
public void run(){
try {
/ *创建一个蓝牙服务器
*参数分别:服务器名称,UUID * /
mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
UUID.fromString(“00001101-0000 -1000-8000-00805F9B34FB“));
Log.d(“server”,“wait cilent connect ...”);
消息msg = new Message();
msg.obj =“请稍候,正在等待客户端的连接...”;
msg.what = 0;
LinkDetectedHandler.sendMessage(MSG);
/ *接受客户端的连接请求* /
socket = mserverSocket.accept();
Log.d(“server”,“accept success!”);
消息msg2 = new Message();
String info =“客户端已经连接上!可以发送信息”。
msg2.obj = info;
msg.what = 0;
LinkDetectedHandler.sendMessage(MSG2);
//启动接受数据
mreadThread = new readThread();
mreadThread.start();
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
}
}
};
/ *停止服务器* /
private void shutdownServer(){
new Thread(){
public void run(){
if(startServerThread!= null)
{
startServerThread.interrupt();
startServerThread = null;
}
if(mreadThread!= null)
{
mreadThread.interrupt();
mreadThread = null;
}
try {
if(socket!= null)
{
socket.close();
socket = null;
}
if(mserverSocket!= null)
{
mserverSocket.close(); / *关闭服务器* /
mserverSocket = null;
}
} catch(IOException e){
Log.e(“server”,“mserverSocket.close()”,e);
}
};
}。开始();
}
/ *停止客户端连接* /
private void shutdownClient(){
new Thread(){
public void run(){
if(clientConnectThread!= null)
{
clientConnectThread.interrupt();
clientConnectThread = null;
}
if(mreadThread!= null)
{
mreadThread.interrupt();
mreadThread = null;
}
if(socket!= null){
try {
socket.close();
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
}
socket = null;
}
};
}。开始();
}
//发送数据
private void sendMessageHandle(String msg)
{
if(socket == null)
{
Toast.makeText(mContext,“没有连接”,Toast.LENGTH_SHORT).show();
返回;
}
try {
OutputStream os = socket.getOutputStream();
os.write(msg.getBytes());
} catch(IOException e){
// TODO自动生成的catch块
e.printStackTrace();
}
list.add(new deviceListItem(msg,false));
mAdapter.notifyDataSetChanged();
mListView.setSelection(list.size() - 1);
}
//读取数据
private class readThread extends Thread {
public void run(){
byte [] buffer = new byte [1024];
int字节;
InputStream mmInStream = null;
尝试{
mmInStream = socket.getInputStream();
} catch(IOException e1){
// TODO自动生成的catch块
e1.printStackTrace();
}
while(true){
try {
//从InputStream读取
if((bytes = mmInStream.read(buffer))> 0)
{
byte [] buf_data = new byte [bytes];
for(int i = 0; i <bytes; i ++)
{
buf_data [i] = buffer [i];
}
的String =新字符串(buf_data);
消息msg = new Message();
msg.obj = s;
msg.what = 1;
LinkDetectedHandler.sendMessage(MSG);
}
} catch(IOException e){
try {
mmInStream.close();
} catch(IOException e1){
// TODO自动生成的catch块
e1.printStackTrace();
}
休息
}
}
}
}
@Override
protected void onDestroy(){
super.onDestroy();
if(Bluetooth.serviceOrCilent == ServerOrCilent.CILENT)
{
shutdownClient();
}
else if(Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE)
{
shutdownServer();
}
Bluetooth.isOpen = false;
Bluetooth.serviceOrCilent = ServerOrCilent.NONE;
}
public class SiriListItem {
String message;
boolean isSiri;
public SiriListItem(String msg,boolean siri){
message = msg;
isSiri = siri
}
}
@覆盖
公共无效onItemClick(适配器视图<?>为arg0,查看ARG1,INT ARG2,长ARG3){
// TODO自动生成方法存根
}
@覆盖
公共无效的onClick(查看为arg0){
// TODO自动生成方法stub
}
public class deviceListItem {
String message;
boolean isSiri;
public deviceListItem(String msg,boolean siri){
message = msg;
isSiri = siri
}
}
}
下面是实现的效果。
1.Android手机通信
一台手机作为服务端,等待客服端链接。
另一台手机作为客户端,链接服务端,链接成功,发送数据
2.Android和蓝牙模块的通信
蓝牙模块作为服务器端,安卓手机作为客户端,链接蓝牙模块。
蓝牙模块通过串口线链接PC,通过串口工具接收Android手机端发送数据,Android手机端链接成功信息连接<< A0:E4:53:18:BB:42 CONNETED,链接成功发送信息hellokitty mina123456789,Android链接断开信息DISC:SUCCESS + READY + PAIRABLE
看到不少朋友需要源码:找了电脑上源码
下面是源码下载地址:
http://download.csdn.net/detail/cwcwj3069/9876795
Android与蓝牙串口模块通信相关推荐
- java 蓝牙读取数据格式,单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例...
原标题:单片机与安卓手机通过蓝牙串口模块利用JSON数据格式通信实例 JSON 指的是 Java 对象表示法(Java Object Notation),JSON 是轻量级的文本数据交换格式,JSON ...
- android车机蓝牙,安卓APP通过蓝牙串口模块控制DSP车机收音机
从零开始,嘀咕很久 终于可以使用了... 安卓APP是电脑版xdr-gtk 的手机版控制,频谱扫描和RDS还没嘀咕好... 手机APP是在 ace919 eggplant886两位控制DSP车机的基础 ...
- android 车载蓝牙模块,安卓APP通过蓝牙串口模块控制DSP车机收音机
从零开始,嘀咕很久 终于可以使用了... 安卓APP是电脑版xdr-gtk 的手机版控制,频谱扫描和RDS还没嘀咕好... 手机APP是在 ace919 eggplant886两位控制DSP车机的基础 ...
- android蓝牙模块有哪些类型,蓝牙串口模块是什么?怎么用?有哪些种类?
燚智能点评:蓝牙串口模块,分为经典蓝牙串口(4.0以前的)和BLE串口(4.0以后).经典蓝牙的速度快,和普通串口速度相当,功耗高.BLE的速度慢,也就1K每秒上下,但是功耗低. 如果做物联网产品的控 ...
- 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...
原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...
- HC-02蓝牙串口模块的配置和使用
HC-02蓝牙串口模块是基于蓝牙2.0并兼容BLE的双模蓝牙数传模块,带底板的蓝牙模块如下图: 模块可以作为从机与HC-05或HC-06的主机设备通信,也可以和手机通信. 模块在上电未连接蓝牙的时候L ...
- arduino蓝牙通讯代码_通过手机控制蓝牙串口模块与Arduino通讯
功能 通过手机APP向蓝牙模块发送指令,蓝牙模块通过串口将指令传递给Arduino开发板,并由Arduino做出反馈,传递给手机. 工具材料Arduino 开发板 ×1 蓝牙串口模块×1 Androi ...
- uniapp app蓝牙打印_编程器加装蓝牙串口模块与手机APP操作演示
编程器加装蓝牙模块后,可以方便的使用手机查看打印信息,进入控制台执行各种串口命令.本款蓝牙串口APP具有保存打印信息.分享打印信息.设置字体大小.清除屏幕信息.进入控制台.发送串口命令.执行串口命令- ...
- 关于蓝牙串口模块开发
我想做一个蓝牙串口APP,跟我的蓝牙串口模块进行通讯,但网上找的例子都是查找蓝牙,蓝牙配对什么步骤,这些步骤每个手机都可以手动做,没必要弄了吧,怎么还弄这些步骤呢?只要手动配对后再监听就可以了吧?有开 ...
最新文章
- Redis 存储字符串和对象
- WebX.0:Web1.0
- Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析
- c#子线程线程中操作窗体更新的报错
- VTK:可视化之BackgroundTexture
- 目标群体是什么意思_抖音代运营日常主要是做什么的?
- python3.6与3.7的区别_选择 Python3.6 还是 Python 3.7
- 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
- html移动端即时翻译插件,React框架实现移动页面翻译是一种什么体验?
- 如何使用QXDM 的1477项 转化utc时间
- java 调用net remoting_获取 org.springframework.remoting.RemoteAccessException: 在进行调用时无法访问远程服务?...
- java电子小词典课程设计,java课程设计---英汉电子词典
- ROS——RPLIDAR A1 SDK详解
- 万元怎样保留小数点_excel中数值转换成万元后如何只保留两位小数?,excle 万元 元...
- Ubuntu 声卡解决办法合集
- U-Net网络模型学习总结
- 【英语写作】以亚太杯为例
- 解决第三方dll出现:找不到指定模块(非路径错误)
- 奇异值分解实验:图像压缩与推荐系统
- JDK 8的新特性-Lambda表达式 精品文章总结