草庐IT

Windows端用于开发低功耗蓝牙项目的DLL(二)

WCH-SoftGroup 2023-03-28 原文

各位读者好,新版本的系统平台低功耗蓝牙开发接口库已发布,提供BLE设备的枚举、扫描、连接和检测,蓝牙服务和特征的枚举、读写、订阅,控制器版本查询等API函数。支持Windows、Android等系统。链接:WCHBleLib_MultiOS.ZIP - 南京沁恒微电子股份有限公司

前言

上一篇文章中,介绍了适用于Win10系统对BLE开发的win32动态链接库,并对库函数进行了细致的讲解,也简单说明了下该开发库的使用方法。

这一章,则具体说明了在BLE开发中对该库的具体使用方法,如何使用这些库函数,如何处理预定义的回调函数。

WCH_B LE_DLL开发库和例程下载

1. 上层应用中回调函数的定义

1.1 异步操作正常完成的回调函数

typedef void (CALLBACK* Notify_AppService)(ULONG uAction_Service, PCHAR tmpStr, INT iExtraInfo);

当前BLE操作,已经正常完成时,该回调函数会被调用。桌面应用程序可以定义一个结构相同的回调函数,用来获取BLE操作完成后的返回信息。

e.g.

VOID CALLBACK NotifyAppservice(ULONG uAction_service, PCHAR tmpstr, INT iExtraInfo);

第一个参数uAction_service表示当前已完成的BLE操作序号;

第二个参数tmpstr表示操作完成后的字符串返回信息;

第三个参数iExtraInfo只有在获取BLE设备特征所支持的功能时才会用到,表示具体的功能值。

p.s.具体参数意义可参照第一篇博客中的头文件代码片段。

1.2 扫描附近BLE设备时的回调函数

typedef void (CALLBACK* Notify_DeviceWatcher)(PCHAR deviceName, PCHAR deviceID);

当执行了扫描BLE设备的操作时,每当扫描到任意设备,或是设备的连接状态发生变化时,该回调函数都会被调用。

e.g.

VOID CALLBACK NotifyDeviceWatcher(PCHAR deviceName, PCHAR deviceID)
{
	//...
	// 当deviceName为removed_Device时,表示对应deviceID的BLE设备无法连接,需要剔除
	if (deviceName == L"removed_Device")
	{
		int iCount = m_CtrlList.GetItemCount();
		for (int i = 0; i < iCount; i++)
		{
			CString tmpStr = m_CtrlList.GetItemText(i, 1);
			if (tmpStr == deviceID)
			{
				m_CtrlList.DeleteItem(i);
				break;
			}
		}
	}
	// 把扫描到的deviceID保存
	else
	{
		m_CtrlList.InsertItem(listCount, deviceName);
		m_CtrlList.SetItemText(listCount, 1, deviceID):
		m_CtrlList.EnsureVisible(listCount++, FALSE);
	}

完整代码可参考链接中的MFC例程。

1.3 BLE操作异常时调用的回调函数

typedef void (CALLBACK* Notify_ErrorStatus)(PCHAR errorString);

当前BLE操作出现异常时,该回调函数会被调用,并通过字符串参数传递异常信息。

e.g.

VOID CALLBACK NotifyErrorStatus(PCHAR errorString)

1.4 BLE读取特征值操作和Notify时的回调函数

typedef void (CALLBACK* Notify_ReadBytes)(PUCHAR readBytes, INT iLength);

当前执行的是BLE读取特征值操作或是开启了Notify订阅时,每当读取到特征值时,会调用该回调函数。

e.g.

VOID CALLBACK NotifyReadBytes(PUCHAR readBytes, INT iLength);

第一个参数readBytes表示读取到的Hex值;

第二个参数iLength表示读取到的字节长度。

2. MFC例程使用说明

为方便用户使用该库进行开发,我们做了一个MFC的例程用来示范,软件详细使用说明如下:

2.1 建立后台任务通讯

先按照第一篇博客配置好BLE开发需要的所有设置后,打开MFC例程如上图所示,首先点击新建连接按钮,与UWP任务建立连接。

2.2 扫描附近BLE设备

连接建立成功后,点击开始扫描按钮,开始扫描附近的所有BLE设备,待列表中出现待连接BLE设备时,单击选中它,然后进入下一步。

2.3 发送BLE设备信息

选中BLE设备时,点击传ID把指定的BLE设备信息传给后台处理程序,准备连接。

2.4 建立BLE设备连接

然后开始建立与BLE设备的连接,点击开始连接设备

2.5 获取服务

连接成功后,点击尝试获取服务,可获取该设备的所有服务,显示在列表中。

2.6 获取特征

选中一个服务后,点击尝试获取特征,可获取该服务的所有特征,显示在列表中。

2.7 获取特征支持的操作

选中一个特征后,点击尝试获取操作后,可枚举出该特征所支持的所有功能。

2.8 读,写, Notify

根据支持的不同功能,可分别进行读,写,开启Notify的功能,以下是读功能的示例,点击READ,可读出特征值:

2.9 断开蓝牙连接

操作完成后,点击断开蓝牙连接可断开与BLE设备的通讯。

2.10 断开后台任务通讯

所有操作完成后,点击关闭即可断开所有通讯连接。

有关Windows端用于开发低功耗蓝牙项目的DLL(二)的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  7. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  8. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  9. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  10. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

随机推荐