delphiXE开发蓝牙BLE4.0程序时遇到的notification问题
IDE环境delphiXE8
蓝牙硬件ST17H26
service:0xfee7
chareter:0xfec9
const u16 my_OEMServiceUUID=0xfee7;
const u16 my_OEMCharaterUUID=0xfec9;
在my_Attributes[]中添加
{4,2,2,(u8*)(&my_primaryServiceUUID), (u8*)(&my_OEMServiceUUID)},
{0,2,1,(u8*)(&my_characterUUID), (u8*)(&PROP_READ_WRITE_NORSP_NOTIFY)},
{0,2,1, (u8*)(&my_OEMCharaterUUID), (u8*)(&my_page)},
手机调试软件BLEReader可以正常看到service和charater,点击"开始通知",蓝牙端发送可以正常接收。
delphixe内容:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
case Step of
:
try
FBluetoothManagerLE := TBluetoothLEManager.Current;
FAdapter := FBluetoothManagerLE.CurrentAdapter;
if ManagerConnected then
begin
FBluetoothManagerLE.OnDiscoveryEnd := BluetoothLE1EndDiscoverDevices;
FBluetoothManagerLE.StartDiscovery(, ADeviceUUIDList);
end;
except
on E: Exception do ShowMessage('step1'+E.Message);
end;
:
try
CurrDevice.OnServicesDiscovered := ServicesDiscovered; if (FServiceDiscovered = false) then CurrDevice.DiscoverServices;
except
on E: Exception do ShowMessage('step2'+E.Message);
end;
:
try
FChar1 := FService.GetCharacteristic(StringToGUID(UUID_CHAR1));
if FChar1<>nil then
begin
CurrDevice.OnCharacteristicRead := OnCharRead;
CurrDevice.SetCharacteristicNotification(FChar1,true);
CurrDevice.ReadCharacteristic(FChar1);
FChar1.GetDescriptor()
Memo1.Lines.Add('找到键值');
Step:=;
end else Memo1.Lines.Add('aaa');
except
on E: Exception do ShowMessage('step3'+E.Message);
end;
:
;
end;
end;
在SetCharacteristicNotification后,无法从server端获得notify,跟踪到源文件中:
function TBluetoothLEDevice.SetCharacteristicNotification(const ACharacteristic: TBluetoothGattCharacteristic;
Enable: Boolean): Boolean;
const
Desc_Configuration: TBluetoothUUID = '{00002902-0000-1000-8000-00805F9B34FB}';
var
LDesc: TBluetoothGattDescriptor;
begin
Result := False;
if [TBluetoothProperty.Notify, TBluetoothProperty.Indicate] * ACharacteristic.GetProperties <> [] then
begin
// This is to ensure that we have read the descriptors before querying.
ACharacteristic.Descriptors;
// We check that we have the Configurarion descriptor, and then we set the notification accordingly.
LDesc := ACharacteristic.GetDescriptor(Desc_Configuration);
if LDesc <> nil then
Result := DoSetCharacteristicNotification(ACharacteristic, Enable);
end;
end;
可以发现,在真正设置
DoSetCharacteristicNotification(ACharacteristic, Enable);前进行了一些列的判断,注意是要求该charater下要有个
Desc_Configuration的UUID,如果没有就不会实质上地设置notify。于是回过头来修改蓝牙代码:
增加了:
{0,2,2,(u8*)(&clientCharacterCfgUUID), (u8*)(serviceChangeCCC)},
修改mac(不知道为什么,不修改反映不出变化)
重新烧录后,0xfec9下面多了一个0x2902的describe。再次运行delphi端程序,可以得到notify,问题解决。
delphiXE开发蓝牙BLE4.0程序时遇到的notification问题的更多相关文章
- iOS蓝牙BLE4.0通信功能
概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...
- 在 NetBeans 中开发一般 Java 应用程序时配置 Allatori 进行代码混淆
要在 NetBeans 中开发一般 Java 应用程序时利用 Allatori 进行代码混淆,设置比 IntelliJ IDEA 稍微简单一点,首先在 NetBeans 项目所在硬盘目录内创建一个名为 ...
- 使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆
使用 IntelliJ IDEA 开发一般 Java 应用程序时通过 Allatori 进行代码混淆非常容易配置,下面总结一下本人经验,介绍一下配置方法. 首先在 IDEA 的 Module 所在硬盘 ...
- 如何让iOS模拟器也能测试蓝牙4.0程序?
买一个CSR蓝牙4.0 USB适配器,插在Mac上 在终端输入sudo nvram bluetoothHostControllerSwitchBehavior="never" 重启 ...
- eclipse开发hadoop2.2.0程序
在 Eclipse 环境下可以方便地进行 Hadoop 并行程序的开发和调试.前提是安装hadoop-eclipse-plugin,利用这个 plugin, 可以在 Eclipse 中创建一个 Had ...
- 蓝牙BLE4.0的LL层数据和L2CAP层数据的区分与理解
一直搞不太清楚蓝牙BLE协议,不知道LL层和L2CAP层是如何划分的,后来博士给我讲了讲就理解了,写下来,做个记录: 1. 我们知道,除了蓝牙5.1新出的CTE,所有的BLE都是如下类型的包: 对于连 ...
- 在生成.net core 3.0程序时不包含nuget库
在.net core 3.0中,默认的生成行为有了两个变化,一个是默认生成可执行文件,另一个是会复制依赖的Nuget项. 前一个变化会默认生成可执行的exe,用起来更加方便了.另一个变化可能是为了减少 ...
- iOS蓝牙4.0协议简单介绍
iOS开发蓝牙4.0的框架是CoreBluetooth,本文主要介绍CoreBluetooth的使用,关于本文中的代码片段大多来自github上的一个demo,地址是myz1104/Bluetooth ...
- IOS BLE4.0蓝牙和外设连接和收发数据的流程
前言: 苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE ...
随机推荐
- java基础 -- 关键字final的用法
用法一(修饰变量): Final变量能被显式地初始化并且只能初始化一次.被声明为final的对象的引用不能指向不同的对象.但是final对象里的数据可以被改变.也就是说final对象的引用不能改变,但 ...
- HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
Map是Java最常用的集合类之一.它有很多实现类,我总结了几种常用的Map实现类,如下图所示.本篇文章重点总结几个Map实现类的特点和区别: 特点总结: 实现类 HashMap LinkedHash ...
- DOCKER学习_010:Docker的文件系统以及制作镜像
一 文件系统简介 1.1 Linux文件系统 LInux空间组成分为内核空间和用户空间(使用rootfs) linux文件系统由 bootes和 rootfs组成, bootes主要包含boot1 o ...
- 力扣142——环形链表 II
原题 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos ...
- openlayers中实现点的拖拽(modify),在layer中增加修改删除point。
最近忙着整地图,都忘记了总结来沉淀自己,自我检讨一下. 总结一下最近使用openlayer时学习的内容,先说下我的业务逻辑吧,在室内地图中 1,点击新增在地图上新增一个可以拖拽的点,拖拽完成后确定位置 ...
- asp.net core 3.x 通用主机原理及使用
一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...
- (一)Django项目架构介绍
项目的架构为: 1.虚拟环境virtualenv 安装Django==2.1.3 安装pymysql 安装mysqlclient 安装其他等 2.项目结构为: 应用APP: blog -- 管理博客 ...
- 【已解决】CentOS7使用yum安装Docker显示错误:cannot find a valid baseurl for repo: base/7/x86_64
不得不说,Docker 要求 CentOS 系统的内核版本高于 3.10,这就让有些人开始头疼了,而要查看具体的版本可以用以下命令 uname -r 当然,CentOS 6.8版本也能安装Docker ...
- WIN10高清壁纸
下面给大家分享我自己收集的WIN10的壁纸(大家可以存在在自己网盘里) 百度网盘下载 提取码:dsf5
- 6年iOS开发被裁员,是行业的饱和还是经验根本不值钱?
前言: 最近看到很多iOS开发由于公司裁员而需要重新求职的.他们普遍具有4年甚至更长的工作经验.但求职结果往往都不太理想. 我在与部分iOS开发者交谈的过程中发现,很多人的工作思路不清晰,技能不扎实, ...