第一步

新建项目

注意:不要选成移动应用xamarin.Forms要选android应用(Xamarin) xamarin.Forms 和 Xamarin.Android还是有区别的。小项目就用Xamarin.Android就好了

选择空白模板

作为通讯App 必定需要 Server端 所以我们在这里在新建一个Client端 原本的app1项目作为server端

在解决方案上右键 添加新的项目

继续选 Android 应用

起名字叫app1Client

继续选空白模板

OK到这里第一步建立项目就完成了

下一步我们将开始配置项目了。

第二步

配置项目

Android在使用蓝牙时需要添加4个权限

在app1项目上 右键属性 Android清单 内找到 所需权限 勾选

BLUETOOTH(利用这个权限去执行蓝牙通信)

BLUETOOTH_PRIVILEGED(配对连接时需要)

BLUETOOTH_ADMIN(让app拥有启动设备发现或操纵蓝牙设置,必须声明BLUETOOTH_ADMIN权限)

注意:真机android版本6.0及以上使用蓝牙搜索需要开发权限ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION

将App1 和 App1Client 2个项目都添加上述权限

第三步 编写代码

怎么添加界面和按钮一类的我就不详细写了 这里主要写怎么实现通讯的部分

1.获得蓝牙设备 这需要用到 BluetoothAdapter 这个类

private readonly BluetoothAdapter localAdapter;
localAdapter = BluetoothAdapter.DefaultAdapter;

localAdapter 就是默认蓝牙适配器了

BluetoothAdapter 类 提供了 蓝牙适配器的状态 以及打开蓝牙 关闭蓝牙等一些方法 具体内容请自己点进该类查看

2获取建立服务端的监听和通讯线程

我先写下思路 我们首先需要一个线程来监听是否有客户端来请求建立连接

如果建立连接成功就去建立一个通讯线程来读取Client端发来的数据..是不是很简单

下面我们来是实现

监听线程方法

//在你想要启动监听线程的地方添加这个线程
Thread t = new Thread(Monitor);
t.Start();public void Monitor(){BluetoothServerSocket serverSock = localAdapter.ListenUsingRfcommWithServiceRecord("Bluetooth", Java.Util.UUID.FromString("0000-0000-0000-0000-1234567"));BluetoothSocket sock = null;while (true){try{sock = serverSock.Accept();}catch (System.Exception){}Thread t = new Thread(Connected);t.Start(sock);}

核心方法 localAdapter.ListenUsingRfcommWithServiceRecord

        //// 摘要://     Create a listening, secure RFCOMM Bluetooth socket with Service Record.//// 参数://   name://     service name for SDP record////   uuid://     uuid for SDP record//// 返回结果://     To be added.//// 异常://   T:Java.IO.IOException://     on error, for example Bluetooth not available, or insufficient permissions, or//     channel in use.//// 言论://     Portions of this page are modifications based on work created and shared by the//     Android Open Source Project and used according to terms described in the Creative//     Commons 2.5 Attribution License.[Register("listenUsingRfcommWithServiceRecord", "(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;", "")]public BluetoothServerSocket ListenUsingRfcommWithServiceRecord(string name, UUID uuid);

public BluetoothServerSocket ListenUsingRfcommWithServiceRecord(string name, UUID uuid); 该方法 需要个一个连接名称和一个 UUID 并返回一个BluetoothServerSocket 对象 如果你会Socket的话接下来就很简单了。

BluetoothServerSocket 类提供了几个建立连接的方法

Accept()方法返回了一个BluetoothSocket对象

BluetoothSocket 类提供了蓝牙适配输入输出流的操作

public Stream OutputStream { get; } //输入流 读操作使用该流
public Stream InputStream { get; } //输出流 写操作使用该流
public BluetoothDevice RemoteDevice { get; } //远程设备属性

接下来我们要实现通讯线程

                Thread t = new Thread(Connected);t.Start(sock);

当建立连接成功 执行该代码来新建一个通讯线程

由于通讯线程需要该连接的套接字 所以我们要把建立连接成功后的套接字作为参数传递到线程函数内

通讯线程方法

        public void Connected(object sock){BluetoothSocket mSock = (BluetoothSocket)sock;byte[] rebuf = new byte[1024];         while (true){int len =  mSock.InputStream.Read(rebuf,0, rebuf.Length);if (len > 0){byte[] rebuf2 = new byte[len];Array.Copy(rebuf, 0, rebuf2, 0, len);string str = System.Text.Encoding.ASCII.GetString(rebuf2);Toast.MakeText(this, str, ToastLength.Short).Show();}Thread.Sleep(100);}

由于线程启动时传递的参数只能是Object对象所以先将 Object对象转换为BluetoothSocket 对象  BluetoothSocket mSock = (BluetoothSocket)sock;

然后我们在新建一个缓冲区 用来读取数据 由于我们现在还不知道将要读取的数据有多大。我们可以先建立一个和蓝牙读取缓冲区大小一样的byte数组 byte[] rebuf = new byte[1024]; 当然我这里只用了1KB 蓝牙的读取缓冲区默认好像是4KB

接下来我们就每100毫秒区读一下是否有数据 当然你可以用更快的速度来读取如果你一个包的大小很小的话

//// 摘要://     当在派生类中重写时,从当前流读取字节序列,并将此流中的位置提升读取的字节数。//// 参数://   buffer://     字节数组。 当此方法返回时,此缓冲区包含指定的字符数组,此数组中 offset 和 (offset + count - 1) 之间的值被从当前源中读取的字节所替换。////   offset://     buffer 中的从零开始的字节偏移量,从此处开始存储从当前流中读取的数据。////   count://     要从当前流中最多读取的字节数。//// 返回结果://     读入缓冲区中的总字节数。 如果很多字节当前不可用,则总字节数可能小于请求的字节数;如果已到达流结尾,则为零 (0)。//// 异常://   T:System.ArgumentException://     offset 和 count 的总和大于缓冲区长度。////   T:System.ArgumentNullException://     buffer 为 null。////   T:System.ArgumentOutOfRangeException://     offset 或 count 为负数。////   T:System.IO.IOException://     出现 I/O 错误。////   T:System.NotSupportedException://     流不支持读取。////   T:System.ObjectDisposedException://     在流关闭后调用方法。public abstract int Read(byte[] buffer, int offset, int count);int len =  mSock.InputStream.Read(rebuf,0, rebuf.Length);

Read方法返回一个int 类型的对象 表示读到的数据长度

如果数据长度 > 0

我们就可以解析了

byte[] rebuf2 = new byte[len];
Array.Copy(rebuf, 0, rebuf2, 0, len);
string str = System.Text.Encoding.ASCII.GetString(rebuf2);

新建一个 读取到长度大小的byte数组 将读到的数据拷贝到新的数组内进行解析。到这一步 一个最基础的服务端就完成了

To be continued .......

下集预告:明天我们将讲解如何写一个客户端来与服务端建立连接

-------------------------------------------------------------------------------------------------

本想把客户端的也好好写一篇。可惜工作太忙时间有限。

我把源码放出来。。

BLETEST.rar_Xamarin蓝牙通讯-Android代码类资源-CSDN下载

有需求的自己下载吧

----------------------------------------------------------------------------------------

对一些大家提出的问题回答

1.说缺少文件的。应该是缺少Xamarin

感谢下载 Xamarin - Visual Studio

添加Xamarin

2.无法连接服务端的

请修改client端

MainActivity.cs文件内的代码

void Monitor() 函数内我限定了服务端是HUAWEI P30的设备,请修改为你自己做服务端的设备名称。

VS2019 Xamarin.Android开发蓝牙通讯相关推荐

  1. Xamarin.Android开发及常见问题的解决

    一.Xamarin.Android开发环境的搭建 (一)所需组件 1.VS2013(VS2010以上即可) 2.JDK(http://www.oracle.com/technetwork/java/j ...

  2. Xamarin.Android开发实践(十七)

    Xamarin.Android开发实践(十七) 原文:Xamarin.Android开发实践(十七) Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定 ...

  3. Xamarin Android开发实战(上册)

    Xamarin Android开发实战(上册)大学霸内部资料 试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamarin ...

  4. Xamarin.Android开发实践(十四)

    原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...

  5. Xamarin.Android开发实践(一)

    原文:Xamarin.Android开发实践(一) 一.准备工作 1.创建一个空的解决方案,并命名为Phoneword 2.右击解决方案 新建->新建项目 并命名为Phoneword_Droid ...

  6. xamarin Android 开发 文件“obj\Debug\android\bin\packaged_resources”不存在

    严重性 代码 说明 项目 文件 行 禁止显示状态 错误 文件"obj\Debug\android\bin\packaged_resources"不存在. AndroidTest 各 ...

  7. Android开发——蓝牙通信实现

    Android开发--蓝牙通信实现 项目需求 项目主要代码及功能实现 AndroidManifest.xml res/values/string.xml activity_main.xml ChatS ...

  8. Android开发蓝牙与ble设备的通讯

    一.写在前面的话 一直想写一篇关于蓝牙与ble设备通讯的博客,但是一直也不知道从何下手,可能是之前思路不清晰吧,也就一直拖拖拖,拖到现在.最近又做到关于ble设备的项目了,在此总结一下吧.(如有不到位 ...

  9. android开发蓝牙传输图片,如何发送/接收文本和图片通过蓝牙android到另一个android手机...

    我假设你已经在开发Android的蓝牙应用的经验. Android蓝牙API不直接支持OBEX,意味着我无法将任何文件直接推送到任何设备. Android蓝牙API提供诸如发现,连接和使用流的数据传输 ...

  10. xamarin android 书,xamarin android 开发

    开始环境vs2017 直接创建android 项目,左边是android studio 的项目目录  右边是vs创建的android 项目目录 结构基本相同,有res对应的Resources文件 加载 ...

最新文章

  1. cifar-10 cnn 分类
  2. 【转】Epoll模型
  3. GStreamer(二)
  4. html超链接去虾线,挑虾线别只会用牙签了,渔民都是这样做的,1秒处理一个,超方便...
  5. 值得使用的CSS库添加图像悬停效果!
  6. 选择在何处重构(下)
  7. QT每日一练day22:键盘事件
  8. java application pdf_從Java應用程序中即時打開PDF文件
  9. RDIFramework.NET(.NET快速信息化系统开发框架) Web版介绍
  10. java网络通信:伪异步I/O编程(PIO)
  11. Zabbix---6 监控 端口 连接数
  12. 基于Python的文本分析
  13. python3 json文件_Python3读写JSON文件
  14. PV-RCNN:Point-based与Voexl-based共同成就的高性能3D目标检测网络
  15. java 小数位数控制
  16. UltraEdit编辑器无法使用快捷键全选ctrl+a功能失效解决办法
  17. 三国志2017服务器维护时间,《三国志2017》版本更新公告
  18. 自旋波matlab计算,从电子到磁振子,自旋波计算开启新篇章
  19. 1.计算机指令系统,深入学习计算机指令系统唐书
  20. 洛谷——P1296 奶牛的耳语(java实现)

热门文章

  1. 2021湖北省副高考试成绩查询,2021年湖北省教育考试院成绩查询登录入口
  2. 电脑开关电源维修图解
  3. 微信公众号排版指南(全)
  4. Oracle --- 表空间
  5. .bat脚本初体验——使用批处理bat清洗文件名
  6. 最详细的【微信小程序+阿里云Web服务】开发部署指引(三):开通阿里云主机
  7. vim 使用系统粘贴板复制粘贴
  8. java short 写法_Java Short类shortValue()方法及示例
  9. python3实现base64编码
  10. 978_使用emacs lisp安装emacs插件