PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信,原理跟socket通信类似,不同的是使用的通信协议不同,本人结合相关的API,做了以下最简单的封装。

1、获取本地蓝牙设备与附近蓝牙设备信息

2、通信类


/*
通信类:只是对于客户端通信
Initialize
Create
Connect
Send
Receive
Close
Finalize
*/

class  BlueToothSimple
{
public:
    bool Initialize();

    bool Create();

    bool Connect(const char* straddr, const char* guid = "0000fd2d-0000-1000-8000-00805f9b34fb");

    bool Send(const char* msgToServer);

    // 返回字符串
    string Receive();

    // 返回特殊的数据,针对于\r\n 划分开的字符串
    vector<CString> ReceiveEx();

    bool Close();

    void Finalize();

protected:

    int error;

    SOCKET btSocket;
};

3、支持服务器客户端蓝牙虚拟通信接口

class BlueToothSocket
{

public:

    BlueToothSocket();

    ~BlueToothSocket();

    BOOL StartSearchBthDev(IN DWORD dwControlFlags);

    BOOL GetNextBthDev(
        IN OUT BTHDEV_INFO *pcBthDevInfo,
        IN DWORD dwControlFlags = LUP_RETURN_NAME | LUP_RETURN_ADDR | LUP_FLUSHCACHE
        );

    BOOL EndSearchBthDev();

    bool Initialize();

    void Finalize();

    BOOL Create(int af = AF_BTH, int type = SOCK_STREAM, int protocol = BTHPROTO_RFCOMM);

    BOOL Close();

    int Bind(BTH_ADDR sktAddr = 0, ULONG port = BT_PORT_ANY);

    int Listen(IN int backlog);

    int GetSockName(BTH_ADDR *psktAddr, ULONG *port);

    int SetBthService(TCHAR *lpServiceName);

    int Accept(BlueToothSocket *pcBth);

    int GetBTHAddr(const char* straddr, BTH_ADDR* btaddr);

    int Connect(BTH_ADDR sktAddr, ULONG port, int nMSecond = -1);

    int Send(LPVOID lpData, int len, int flags = 0);

    int Recv(LPVOID lpData, int len, int flags = 0);

    int SendAll(LPVOID lpData, int len, int flags = 0);

    int RecvAll(LPVOID lpData, int len, int flags = 0);

private:

    void HexMac2String(BTH_ADDR dw64Addr, TCHAR *pstrMac);
};

资源下载地址:https://download.csdn.net/download/u011269801/89296309?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python实现单例模式

目录 1、使用装饰器实现 2、使用__new__方法实现 单例模式是一种设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个唯一实例。这种模式在多种场景中都非常有用&#xff0c;以下是单例模式的一些常见应用场景&#xff1a; 应用程序的…

Spring线程池有哪些

目录 SimpleAsyncTaskExecutor SyncTaskExecutor ThreadPoolTaskExecutor ThreadPoolTaskScheduler Spring框架提供了多种线程池类型,以满足不同场景下的需求。以下是一些常见的Spring线程池类型: SimpleAsyncTaskExecutor 这个实现不重用任何线程,每次调用都会启动一…

抽空学学go

2024年5月9日11:14:24 学习go 看课8小时转职Golang工程师(如果你想低成本学习Go语言)_哔哩哔哩_bilibili 文档[8小时转职Golang工程师 (yuque.com)]( 1.安装go 2024年5月9日11:27:16 2.安装 vscode go配置环境 vs code配置go开发环境 (zhihu.com) vscode里面配置代理&…

全志ARM-SG90舵机

控制转角 向黄色信号线“灌入”PWM信号。 PWM波的频率不能太高&#xff0c;50hz&#xff0c;即周期1/频率1/500.02s&#xff0c;20ms左右数据&#xff1a; 不同的PWM波形对应不同的旋转角度&#xff0c;以20ms为周期&#xff0c;50hz为频率的PWM波 定时器需要定时20ms,关心的单…

el-checkbox复选框做单选

思路&#xff1a;&#xff08;所有选择项都在一个数组中&#xff09;给每一个选项设置一个是否选中的属性&#xff08;checked&#xff09;&#xff0c;通过change事件来改变,数组中每一项的checked&#xff0c;如果change事件的值是true,那么就要把数组中&#xff08;如根据唯…

零基础入门篇①③ Python可变序列类型--列表

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…

vue阶段案例,练习filter、map、forEach,双向绑定,三元表达式,以及图片滚动,文字跳动等等。

阶段案例 通过案例来练习双向绑定&#xff0c;三元表达式&#xff0c;以及图片滚动&#xff0c;文字跳动等等。 代码如下&#xff1a; <template><table class"bjtp" ><div class"title" >{{title}}</div><div class"s…

【解决Android Studio】cmake报错找不到vulkan包

1 报错信息 CMake Error at D:/Android/project/cmake/3.10.2.4988404/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message): Could NOT find Vulkan (missing: Vulkan_LIBRARY) Call Stack (most recent call first): 2. 错误原因 minSdk版本不对&am…

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…

动作识别 slowfast动作识别项目记录

动作识别 slowfast动作识别项目记录

如何在自己的服务器上快速搭建第一个网站(其一)

根据上篇文章相信很多人以及成功搭建服务器啦。今天我们讲下如何在自己的服务器快速搭建第一个网站的一些重要配置&#xff0c;以及搭建网站的必备环境。干货满满&#xff0c;希望大家能够关注点赞收藏。 我会不定期更新一些实用的工具&#xff0c;欢迎大家私信评论喔&#xf…

12个网上赚钱野路子信息差,人人可做的赚钱小项目!

在这个多元化的时代&#xff0c;副业已经成为许多人增加收入、实现自我价值的重要途径。今天&#xff0c;我们就来聊聊那些既有趣又能赚钱的副业项目&#xff0c;让你的钱包鼓起来&#xff01; 1.文字创作 写作不仅是情感的宣泄&#xff0c;更是财富的积累。无论是自媒体文、软…

事件代理 浅谈

事件代理是一种将事件处理委托给父元素或祖先元素来管理的技术。当子元素触发特定事件时&#xff0c;该事件不会直接在子元素上进行处理&#xff0c;而是会冒泡到父元素或祖先元素&#xff0c;并在那里进行处理。这样做的好处是可以减少事件处理函数的数量&#xff0c;提高性能…

VR智慧文旅:开启“韵味”旅游季的新篇章

为了充分满足游客的假日文化旅游需求&#xff0c;各地纷纷“解锁”新花样&#xff0c;沉浸式实景观展震撼“出圈”。在数字化浪潮的推动下&#xff0c;文化旅游行业正经历着变革&#xff0c;在万物皆可沉浸的时代&#xff0c;VR智慧文旅燃起了不一样的热度。 许多业内人士认为&…

hdfs磁盘清理历史数据

hdfs集群磁盘清理历史数据流程如下&#xff1a; #可以查看web界面hdfs集群的磁盘使用率,并记录下来,对比清理后的效果: 清理前 86.00% 194.24TB/225.85TB #统计warehouse目录下的磁盘使用量(目前表都是建在该路径下) hadoop fs -du -h /user/hive/warehouse #统计bak目录下磁…

Tiff文件解析和PackBits解压缩

实现了Tiff图片文件格式的解析&#xff0c;对Tiff文件中的PackBits压缩格式进行解压缩&#xff0c;对Tiff文件中每一个Frame转换成BufferedImage显示。 Java语言实现&#xff0c;Eclipse下开发&#xff0c;AWT显示图片。 public static TIFF Parse(final byte[] bytes) throw…

Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上

目录 步骤一&#xff1a;创建两个 Java 业务 Pod步骤二&#xff1a;创建一个 Nginx Pod步骤三&#xff1a;创建一个 Service步骤四&#xff1a;创建一个 Ingress注意事项 要在 Kubernetes 上搭建一个 Nginx 的 Pod&#xff0c;并确保传入的 API 请求被均匀地分发到两个 Java 业…

排序算法(Java版)

目录 1、直接插入排序2、希尔排序3、直接选择排序4、堆排序5、冒泡排序6、快速排序6.1 递归实现6.2 非递归实现 7、归并排序7.1 递归实现7.2 非递归实现 8、性能分析 今天我们学习一种算法&#xff1a;排序算法&#xff08;本文的排序默认是从小到大顺序&#xff09;&#xff0…

C++纯C实现贪吃蛇小游戏

公众号&#xff1a;编程驿站 #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h>//描述蛇的节点信息 typedef struct SnakeNode {int x;int y; } Snode;//箱子&#xff1a;放置蛇的所有节点 Snode snakes[100]; //保存…

渗透思考题

一&#xff0c;尝试登录。 客户端对密码进行哈希处理并缓存密码hash&#xff0c;丢弃实际的明文密码&#xff0c;然后将用户名发送到服务器&#xff0c;发起认证请求 密文存储位置&#xff1a;数据库文件位于C:WindowsSystem32configsam&#xff0c;同时挂载在注册表中的HKLMSA…