位置: 编程技术 - 正文

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

  • 支付企业所得税会计科目
  • 在建工程转固定资产需要交税吗
  • 印花税购销合同减半征收政策
  • 一般纳税人每月开票不超10万
  • 会计准则折旧年限规定最新
  • 个人代人开普票个税怎么算
  • 工伤私了赔偿
  • 固定资产按什么价值入账
  • 技术研发费用计入什么科目
  • 商业企业购货分录
  • 专票信息内容
  • 小规模纳税人普票超过30万怎么交税
  • 工业企业哪些房子要交房产税
  • 一般纳税人进项税额转出会计分录
  • 刻章发票可以抵税吗
  • 红字发票信息表是销方还是购方开
  • 劳务派遣差额征税政策
  • 如果辞职了,能一次性拿到钱吗?
  • 拿到购房发票
  • 调整利润分配期怎么计算
  • 金税盘上传参数设置服务器设置
  • 免税企业进项怎么处理
  • 送积分怎么做账
  • 销售部门的固定资产折旧计入什么科目
  • 10款手机赚钱软件下载
  • 苹果电脑里的finder是什么
  • win10平板模式怎么改回来
  • 创业补贴的作用
  • 固定资产和低值易耗品的登记和管理咋弄?
  • 销售方红字发票账务处理
  • 资产负债表的编制依据是会计恒等式
  • phpif嵌套
  • php ajax 实现
  • 增值税发票可以作废重新开吗
  • 帝国cms使用手册
  • 长期股权投资会计准则
  • 无盘领发票要怎么办
  • 公司名义送花圈
  • 差旅费计入什么
  • mongodb aggregate 性能
  • 如何判断关联
  • 调整汇兑损益的摘要怎么写?
  • 三代手续费操作流程
  • 费用票必须是公司发票吗
  • sql2008混合模式
  • 赔偿损失费用发票怎么开
  • 购进国内交通运输产品
  • 企业收到退回的银行汇票多余款项
  • 上月暂估的成本这月收到票怎么做
  • 将固定资产转为投资性房地产账务处理
  • 为什么车船税没有发票
  • 转贴现占谁的授信
  • 房租费用计入什么现金流量
  • 销售未开票怎么做分录
  • 银行手续费未取得发票可以进行税前扣除吗
  • 免征的教育费附加怎么做账
  • 网络发票管理办法细则
  • 探讨探讨
  • sql server 获取今天的数据
  • win8.1怎么重新装系统
  • Win10 Mobile 10549 预览版新功能上手体验视频
  • ubuntu16.04开启远程桌面
  • 苹果mac与平板的区别
  • centos配置httpd
  • win10老是弹窗广告
  • 如何打开音量控制器
  • /etc/rc.d/rc与/etc/rc.d/init.d的关系介绍
  • win7系统怎么设置屏幕常亮
  • win7 分区表
  • win7系统耳机设置在哪里
  • opengl环境光
  • Android开发如何找到TextView指定文本
  • python让用户选择
  • node.js文件流
  • js与jquery的关系
  • genymotion-unable to load virtualbox engine
  • 西安市港务区属于哪个街道办
  • 北京24小时税务自助机
  • 涉嫌虚开增值税专用发票罪
  • 河北新农合怎么查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设