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问题的更多相关文章

  1. iOS蓝牙BLE4.0通信功能

    概述 iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下. 详细 代码下载:ht ...

  2. 在 NetBeans 中开发一般 Java 应用程序时配置 Allatori 进行代码混淆

    要在 NetBeans 中开发一般 Java 应用程序时利用 Allatori 进行代码混淆,设置比 IntelliJ IDEA 稍微简单一点,首先在 NetBeans 项目所在硬盘目录内创建一个名为 ...

  3. 使用 IntelliJ IDEA 开发一般 Java 应用程序时配置 Allatori 进行代码混淆

    使用 IntelliJ IDEA 开发一般 Java 应用程序时通过 Allatori 进行代码混淆非常容易配置,下面总结一下本人经验,介绍一下配置方法. 首先在 IDEA 的 Module 所在硬盘 ...

  4. 如何让iOS模拟器也能测试蓝牙4.0程序?

    买一个CSR蓝牙4.0 USB适配器,插在Mac上 在终端输入sudo nvram bluetoothHostControllerSwitchBehavior="never" 重启 ...

  5. eclipse开发hadoop2.2.0程序

    在 Eclipse 环境下可以方便地进行 Hadoop 并行程序的开发和调试.前提是安装hadoop-eclipse-plugin,利用这个 plugin, 可以在 Eclipse 中创建一个 Had ...

  6. 蓝牙BLE4.0的LL层数据和L2CAP层数据的区分与理解

    一直搞不太清楚蓝牙BLE协议,不知道LL层和L2CAP层是如何划分的,后来博士给我讲了讲就理解了,写下来,做个记录: 1. 我们知道,除了蓝牙5.1新出的CTE,所有的BLE都是如下类型的包: 对于连 ...

  7. 在生成.net core 3.0程序时不包含nuget库

    在.net core 3.0中,默认的生成行为有了两个变化,一个是默认生成可执行文件,另一个是会复制依赖的Nuget项. 前一个变化会默认生成可执行的exe,用起来更加方便了.另一个变化可能是为了减少 ...

  8. iOS蓝牙4.0协议简单介绍

    iOS开发蓝牙4.0的框架是CoreBluetooth,本文主要介绍CoreBluetooth的使用,关于本文中的代码片段大多来自github上的一个demo,地址是myz1104/Bluetooth ...

  9. IOS BLE4.0蓝牙和外设连接和收发数据的流程

    前言: 苹果在IOS 6系统之后开始支持BLE 4.0,iPhone4s,iPod 5,iPad 3等之后的机型开始内嵌BLE4.0硬件,因此在开发前请先确认你的开发环境符合上述要求,并且苹果在BLE ...

随机推荐

  1. looping through multiple lists

    map: 最大长度输出: zip: 最短输出: third: 有序排列: a = ['a1', 'a2', 'a3'] b = ['b1', 'b2'] print "Map:" ...

  2. 21.模块的执行以及__name__

    执行结果: "E:\Program Files\JetBrains\PycharmProjects\python_demo\venv\Scripts\python.exe" &qu ...

  3. mysql主从之双主配置

    mysql双主配置 mysql双主其实就是互相同步,互为主从 任意一台都能够执行插入动作 生产环境用得非常少,因为还是担心数据一致的问题 生产环境一般来说主从已经够用 172.19.132.121的配 ...

  4. SpringBoot简介与快速入门

    一.SpringBoot简介 1.1 原有Spring优缺点分析 1.1.1 Spring的优点分析 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE ...

  5. cocos2dx 仿射变换

    AffineTransform __CCAffineTransformMake(float a, float b, float c, float d, float tx, float ty) { Af ...

  6. 【题解】[NOI2019Route](70分)

    占坑 做法是拆掉所有式子,拆完式子看一下,如果A=0,发现边被分为了终点走向n的边和不走向n的边.所以边就有了新的边权,并且可以相加.然后通过网络流建模的套路建模使得满足时间的限制,然后由于有负边,所 ...

  7. Spring Boot 配置文件中使用变量、使用随机数

    参数引用 在application.properties中的各个参数之间可以直接通过是使用placeHolder的方式进行引用,如: book.author=Clark book.name=C++ b ...

  8. 1082 射击比赛 (20 分)C语言

    本题目给出的射击比赛的规则非常简单,谁打的弹洞距离靶心最近,谁就是冠军:谁差得最远,谁就是菜鸟.本题给出一系列弹洞的平面坐标(x,y),请你编写程序找出冠军和菜鸟.我们假设靶心在原点(0,0). 输入 ...

  9. 1087 有多少不同的值 (20 分)C语言

    当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数,即 x 的整数部分.) 输入格式: ...

  10. JavaScript substring()

    JavaScript substring() 方法 参数 描述 start 必需.一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置. stop 可选.一个非负的整数, ...