位置: 编程技术 - 正文

Android与蓝牙串口模块通信(android蓝牙连接过程)

编辑:rootadmin
&#;&#;由于项目的需要Android与蓝牙模块通信,发了时间学习了下,实现了Android与蓝牙模块的通信

推荐整理分享Android与蓝牙串口模块通信(android蓝牙连接过程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android开发蓝牙传数据,安卓手机蓝牙配对后怎么传软件,安卓6.0蓝牙传输协议,android 蓝牙,android 蓝牙,android蓝牙连接过程,android 蓝牙,android蓝牙连接过程,内容如对您有帮助,希望把文章链接给更多的朋友!

1.蓝牙串口模块使用SPP-CA模块

蓝牙串口模块就是使用单片机的TX ,RX与蓝牙模块通信,单片机通过TX发送数据给蓝牙模块,然后蓝牙模块在通过蓝牙协议把数据发送出去,蓝牙模块与Android的通信方式使用spp协议。

2.蓝牙通信

蓝牙的通信需要服务端和客户端,客户端搜索蓝牙设备,链接服务端。主要是通过socket通信,相关的知识可以学习了解下socket通信。链接建立起来,通信时数据的读写是通过输入输出流的方式读写。

3.Android蓝牙架构和api说明

查看《Android系统原理及开发要点详解》和《深入理解Android网络编程》里的蓝牙相关章节,2本书里相关的章节有详细的介绍。

4.uuid

Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID ----F9BFB. However if you are connecting to an Android peer then please generate your own unique UUID.

这是Android官方文档的说明,如果是连接蓝牙串口模块使用通用的uuid ----F9BFB,如果是Android手机间的通信链接,可以使用生成的uuid,客服端和服务端的uuid必须相同,下面通过蓝牙串口助手读取回来的uuid,下面是我的蓝牙串口模块的uuid。

下面是读取手机的蓝牙的uuid,可以看到比较多的uuid,有比较多的服务。

另外下面是其他蓝牙设备的uuid,应该是蓝牙4.0的。

代码部分还是比较简单的,下面是android蓝牙链接的主要部分代码,也是参考网上的。

package gjz.bluetooth;

Android与蓝牙串口模块通信(android蓝牙连接过程)

import gjz.bluetooth.R;import gjz.bluetooth.Bluetooth.ServerOrCilent;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.UUID;import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothServerSocket;import android.bluetooth.BluetoothSocket;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.InputMethodManager;import android.widget.AdapterView;import android.widget.Button;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;

public class chatActivity extends Activity implements OnItemClickListener ,OnClickListener{ /** Called when the activity is first created. */ private ListView mListView; private ArrayList<deviceListItem>list; private Button sendButton; private Button disconnectButton; private EditText editMsgView; deviceListAdapter mAdapter; Context 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; init(); } private void init() { list = new ArrayList<deviceListItem>(); mAdapter = new deviceListAdapter(this, list); mListView = (ListView) findViewById(R.id.list); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(this); mListView.setFastScrollEnabled(true); 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 Auto-generated method stub String msgText =editMsgView.getText().toString(); if (msgText.length()>0) { sendMessageHandle(msgText); editMsgView.setText(""); editMsgView.clearFocus(); //close 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 Auto-generated method stub 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(); return; } 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; } } //开启客户端 private class clientThread extends Thread { public void run() { try { //创建一个Socket连接:只需要服务器在注册时的UUID号 // socket = device.createRfcommSocketToServiceRecord(BluetoothProtocols.OBEX_OBJECT_PUSH_PROTOCOL_UUID); socket = device.createRfcommSocketToServiceRecord(UUID.fromString("----F9BFB")); //连接 Message msg2 = new Message(); msg2.obj = "请稍候,正在连接服务器:"&#;Bluetooth.BlueToothAddress; msg2.what = 0; LinkDetectedHandler.sendMessage(msg2); socket.connect(); Message msg = new Message(); msg.obj = "已经连接上服务端!可以发送信息。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); //启动接受数据 mreadThread = new readThread(); mreadThread.start(); } catch (IOException e) { Log.e("connect", "", e); Message msg = new Message(); msg.obj = "连接服务端异常!断开连接重新试一试。"; msg.what = 0; LinkDetectedHandler.sendMessage(msg); } } };

//开启服务器 private class ServerThread extends Thread { public void run() { try { /* 创建一个蓝牙服务器 * 参数分别:服务器名称、UUID */ mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM, UUID.fromString("----F9BFB")); Log.d("server", "wait cilent connect..."); Message msg = new Message(); msg.obj = "请稍候,正在等待客户端的连接..."; msg.what = 0; LinkDetectedHandler.sendMessage(msg); /* 接受客户端的连接请求 */ socket = mserverSocket.accept(); Log.d("server", "accept success !"); Message msg2 = new Message(); String info = "客户端已经连接上!可以发送信息。"; msg2.obj = info; msg.what = 0; LinkDetectedHandler.sendMessage(msg2); //启动接受数据 mreadThread = new readThread(); mreadThread.start(); } catch (IOException e) { // TODO Auto-generated catch block 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); } }; }.start(); } /* 停止客户端连接 */ 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 Auto-generated catch block e.printStackTrace(); } socket = null; } }; }.start(); } //发送数据 private void sendMessageHandle(String msg) { if (socket == null) { Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show(); return; } try { OutputStream os = socket.getOutputStream(); os.write(msg.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block 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[]; int bytes; InputStream mmInStream = null; try { mmInStream = socket.getInputStream(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while (true) { try { // Read from the 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 s = new String(buf_data); Message msg = new Message(); msg.obj = s; msg.what = 1; LinkDetectedHandler.sendMessage(msg); } } catch (IOException e) { try { mmInStream.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } break; } } } } @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; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } @Override public void onClick(View arg0) { // TODO Auto-generated method stub } public class deviceListItem { String message; boolean isSiri;

public deviceListItem(String msg, boolean siri) { message = msg; isSiri = siri; } }}

下面是实现的效果。

1.Android手机通信

一台手机作为服务端,等待客服端链接。

另一台手机作为客户端,链接服务端,链接成功,发送数据

2.Android和蓝牙模块的通信

蓝牙模块作为服务器端,Android手机作为客户端,链接蓝牙模块。

蓝牙模块通过串口线链接PC,通过串口工具接收Android手机端发送数据,Android手机端链接成功信息CONNECTING<<A0:E4:::BB: CONNETED,链接成功发送信息hellokitty mina,Android链接断开信息DISC:SUCCESS &#;READY&#;PAIRABLE

&#;&#;

照片选择器 multiimageselector packagecom.me.nereo.multiimageselector;importandroid.content.Intent;importandroid.support.v7.app.ActionBarActivity;importandroid.os.Bundle;importandroid.text.TextUtils;importandroid.view.Menu;importan

Android 退出整个应用程序 三步走1、建立一个JAVA类importjava.util.LinkedList;importjava.util.List;importandroid.app.Activity;importandroid.app.Application;publicclassSysApplicationextendsApplication{privateListActivity

记录 "心跳机制" 相关问题 记录心跳机制相关问题论坛里碰到一个问题,记录一下。一、心跳分为两种,第一种是客户端发起的心跳,第二种是服务端发起的心跳。客户端发起的

标签: android蓝牙连接过程

本文链接地址:https://www.jiuchutong.com/biancheng/376615.html 转载请保留说明!

上一篇:Android内存分析工具(android profiler内存分析)

下一篇:照片选择器 multiimageselector(选择照片的快捷键)

  • 5月份企业所得税
  • 足浴行业是否需要缴纳文化事业建设税
  • 税率如何计算公式
  • 应交税费账目处理
  • 权益法核算转成本法
  • 填写了领款单还要填报销单吗
  • 退回以前年度费用怎么做帐
  • 库存商品领用会计分录
  • 存货成本核算方法有哪些
  • 银行存款对银行的作用
  • 资产处置损益属于当期损益吗
  • 人力资源公司代招的岗位可以去吗
  • 稽查补缴增值税做账
  • 债权性投资损失账务处理
  • 存货盘亏计入什么收入
  • 现金长短款的一般处理
  • 驾驶培训费可以报销吗
  • 房地产企业临时售楼部房产据含土地价值吗
  • 资本公积与实收资本和盈余公积有什么区别?
  • 年终奖2月发怎么申报个税
  • 税号里的0是字母还是数字
  • 用户风险是什么意思
  • 自行建造厂房一座,现已完工,经验收后交付费用
  • 速达财务软件使用说明
  • 自己从自己公司直接拿钱是犯罪吗知乎
  • 什么是劳动保护费支出
  • 个税附加扣除如何填写合适
  • 建筑行业没有库存要做暂估成本怎么做?
  • 申报附加专项扣除
  • 坏账准备如何做账
  • php文件可包含哪三部分代码
  • 无法使用内置管理员账户打开Edge
  • 电脑很空但是占用率90
  • 销售合同怎么计算印花税
  • echart怎么用
  • 记载资金的账簿印花税的税率是多少
  • 营业外收入的会计要素
  • 办公楼改造方案
  • 扣缴义务人的法律地位
  • yaf框架优缺点
  • 如何判断自己风寒还是风热
  • vue-router导航守卫
  • 使用命令查看
  • 增值税免税收入账务处理
  • 一切皆对象什么意思
  • 股权激励和期权激励
  • 小额转账汇款服务最多转账多少钱
  • 工会经费会计分录最新
  • 企业管理费用科目期末一般是
  • 材料帐怎么记
  • 库存股处理方法有哪些
  • 农产品委托代销增值税怎么算
  • 调整以前月份的管理费用怎么做
  • 员工的工资属于固定资产吗
  • 固定资产清理的累计折旧怎么算
  • 资金账簿减半征收印花税
  • 企业应付账款的借方余额反映的是
  • 对公账户没有用了一定要注销吗?
  • 什么是现金等价物
  • 什么是划分?划分应当遵守哪些规则?
  • 电脑操作系统32位和62位怎么升级
  • freebsd 安装
  • mac如何强制关机开机
  • 微软推送Win11226x1.2050
  • windows安装服务器
  • win8.1检测不到更新
  • linux命令怎么删除
  • win10周年更新版是什么意思
  • linux sendmail发送邮件
  • 自定义ui界面
  • jquery fadein 源码
  • javascript教程完整版
  • shell自动化
  • css placement
  • linux 打包
  • 10个JavaScript中易犯小错误
  • 咪咕游戏包括什么
  • python 获取uuid
  • 个体工商户如何申报个税
  • 车辆报废补贴怎么拿
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设