位置: 编程技术 - 正文

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万免征
  • 输入法自定义按键位置
  • win10禁用安全杀毒功能
  • php技巧
  • 电脑中毒之后怎么办
  • 存货报废会计分录例题
  • gain_trickler_3202.exe 进程查询 gain_trickler_3202进程是什么文件
  • php中md5函数
  • 出售债券税费处理方法
  • 以前年度收入如何确认收入
  • phpjoin
  • 百度统计网址
  • yii框架怎么样
  • 企业预缴所得税怎么算
  • 快速搞懂Pinia及数据持久化存储(详细教程)
  • 分享项目成果
  • 第十七届全国大学生智能车
  • webserviceclient
  • 银行存款利息应记什么科目
  • 免税收入是否入成本科目
  • Uncaught DONException: Failed to execute ‘atob‘ on “window ‘: The string to be decoded is not carrec...
  • 小规模纳税人免征增值税的账务处理
  • 应收账款的账务改为公司招待费用怎么做会计分录
  • 预缴增值税款怎么入账
  • 从合同有什么
  • 使用sqlserver创建数据库和删除数据库的实验总结
  • 出口退税的发票是专票还是普票
  • 普通发票怎么冲红字
  • 顾客抽奖奖项名称
  • 小规模红冲发票怎么做分录
  • 工会经费保留整数吗
  • 购入固定资产的现金流量项目
  • 没有付款的费用怎么入账
  • 视同销售要以什么顺序确定销售额?
  • 个体工商户对公账户需要交税吗
  • 增值税留抵退税申请流程
  • sql server的相关技术知识
  • bios1962错误
  • windows 开始
  • centos怎么样
  • 远程关机对话框怎么打开
  • win7系统打开浏览器后突然卡住了
  • gitlab离线安装 linux
  • windows102021年更新
  • ntfs权限怎么设置
  • android四大组件生命周期
  • node.js适用哪些场景
  • python基础开发
  • jquery 字符串
  • android:ViewPager与FragmentPagerAdapter
  • jquery插件大全
  • JQuery解析XML数据的几个简单实例
  • jquery event
  • 河南省医保网上报销流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设