位置: 编程技术 - 正文

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(选择照片的快捷键)

  • 税务局退回个税手续费会计分录
  • 个体户无票收入对公司有影响吗
  • 押金和租金
  • 建筑企业预交的附加税怎么办
  • 注册资本金实缴和认缴区别
  • 增值税小规模纳税人优惠政策
  • 扣缴义务人是否可以领税务发票,是否可以正常申报
  • 企业会计制准下增值税科目的核算
  • 异地施工缴税增值税交多少
  • 个人所得税财产所得
  • 分配股利需要缴纳个税吗
  • 注册资金未缴齐什么意思
  • 企业计提固定资产折旧
  • 增值税专票销货清单模板
  • 财产租赁合同金额含税吗
  • 建筑业外出经营管理办法
  • 普票抵扣税
  • 项目部临时设施平面图
  • 个人所得税未缴算偷税吗
  • 资本收益率的计算公式净资产收益率
  • 伙食费没有发票可以税前扣除吗
  • 工具器具属于固废吗
  • 汇算清缴补交需要调报表吗
  • 撤销实收资本会怎么样
  • 软件行业服务费印花税
  • 防洪保安基金应用范围
  • 多次出库的商品最后一起结账的分录怎么写?
  • 公司全额承担个税会计分录
  • 购车的进项税怎么算
  • 增值税专票和普票的区别税率
  • 联想随身充评测
  • 出版社购买版权是什么
  • php数组函数输出《咏雪》里有多少"片"字
  • 罗汉松的养殖方法剪枝视频
  • laravel with查询指定字段
  • 车辆开具发票后会计分录?
  • php清除缓存的几个方法
  • 年报中投资总额怎么填
  • java cookie
  • 金税盘到上传截止日期
  • 多付款退回怎样写说明
  • 股东分红后股票会涨吗
  • 收到进项发票怎么入账
  • 计提工资包含个人扣款吗
  • 商业会计与财务会计的相同
  • 企业代扣代缴个人所得税申报流程图
  • 税局代个人开增值税普通票样板
  • 工资包含福利费吗
  • 建筑公司预收工程款
  • 如果租房没有合同怎么办
  • 机票的退票费会退到哪里
  • 开票方没有缴纳增值税
  • 提取法定盈余公积金的比例是多少
  • 购进溢余分录
  • 确认借款无法收款怎么办
  • 公司借款给个人的税务问题
  • 以前年度的销售退回能否直接冲减销售收入
  • 借主营业务成本贷应付账款
  • 预付购买设备款
  • 建账时应考虑的问题包括下列哪三项
  • mysql 5.7.28安装
  • ubuntu怎么说
  • ubuntu鼠标不能移动
  • iptables 增加
  • win7系统如何连接共享打印机
  • 简述linux的系统结构
  • win8应用商店无法使用
  • 基于bootstrap的毕业设计
  • cocos creator3
  • bootstrap内容
  • 我是如何从0开始做到年入1000+万的
  • awk fnr nr
  • node.js可以跨平台吗
  • 使用jquery
  • unity3d物理现象模拟
  • 国家审计署查民营企业
  • 煤炭资源税税率调整
  • 税务部门的扣款协议
  • 辽宁省银监局长
  • 深圳市龙华区企业
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设