各位大佬好
按照官方文档的示例
WCHBLEInit
WCHBLEEnumDevice
WCHBLEOpenDevice
上边这三个函数都通了, 然后 WCHBLEOpenDevice 这个方法的回调函数没有触发,当然这个不影响流程不用也行
WCHBLEGetAllServicesUUID
然后这个返回的uuid 是前边四位, 比如说我在浏览器上使用的uuid 全称叫做 0000abf0-0000-1000-8000-00805f9b34fb
这个函数返回的是 f0 ab 一个 ushort类型的两个字节 ,
我想问一下 ,这个返回值是全部的吗?还是说他们被截断了。
WCHBLEGetMtu
这个mtu也没什么问题
WCHBLEGetCharacteristicByUUID
这个是我比较苦恼的一个方法,我看文档上边他的入参是
[ WCHBLEHANDLE, 'ushort', ref.refType('ushort'), ref.refType('ushort') ]
除了第二个参数 比 WCHBLEGetAllServicesUUID 多了一个 ushort 以外 基本都是一样的。
但是执行完 WCHBLEGetCharacteristicByUUID 这个方法, 内存里边什么都没有 ,返回值是0,也不报错。
第一个参数因为前边好多方法用了所以我没有考虑他有问题
第三个和第四个参数,我改了很多格式或者直接传入buffer
我比较怀疑的是第二个参数 ,我尝试了用
const ServiceUUID = ref.alloc(ref.types.ushort)
ServiceUUID[0] = 0xf0
ServiceUUID[1] = 0xab
或者
const ServiceUUID = ref.alloc(ref.types.ushort)
ServiceUUID[0] = 0xab
ServiceUUID[1] = 0xf0
或者 直接使用 WCHBLEGetAllServicesUUID 第二个参数的返回值 pUUIDArry
甚至是字符串
下边是我的定义和调用 有大佬能帮忙看看吗?救救孩子
const voidRef = ref.refType('void')
// 订阅回调
const ParamInf = ref.refType('void')
// 蓝牙对象
const WCHBLEHANDLE = ref.refType('void')
// 连接回调函数类型
const pFunDevConnChangeCallBack = ffi.Function('void',[voidRef,'uchar'])
// 订阅回调
const pFunReadCallBack = ffi.Function('void',[ParamInf,ref.refType('char'),'ulong'] )
const dll = ffi.Library('./LIB//x64/WCHBLEDLL.dll', {
'WCHBLEOpenDevice': [ WCHBLEHANDLE, ['char*',pFunDevConnChangeCallBack ] ],
'WCHBLEGetCharacteristicByUUID': [ 'uchar',
[WCHBLEHANDLE,'ushort',ref.refType('ushort'),ref.refType('ushort') ]
]
});
// 连接蓝牙回调函数
const pFunDevConnChange = ffi.Callback('void',[voidRef,'uchar'],function (hDev,ConnectStatus){
console.log('xxx')
console.log(hDev)
console.log(ConnectStatus)
})
global.__bleCallback = pFunDevConnChange
const activeBleBufferRef = bleMap.get('EVA_ZERO_PA01')
// 连接
const WCHBLEHANDLEResult = await dll.WCHBLEOpenDevice(activeBleBufferRef,pFunDevConnChange)
global.WCHBLEHANDLEResult = WCHBLEHANDLEResult
console.log('连接成功')
// 获取主服务下得特征值服务
// 函数返回值为 0 成功;
// 返回值为 1 设备句柄无效;
// 返回值为其他表示获取失败。
const pCharacteristicUUIDArry = Buffer.alloc(200)
const pCharacteristicUUIDArryLen = ref.alloc(ref.types.ushort,404)
const WCHBLEGetCharacteristicByUUIDResult = await dll.WCHBLEGetCharacteristicByUUID(
WCHBLEHANDLEResult,
activeService,// 这个是上图 f0 ab 那段内存
pCharacteristicUUIDArry,
pCharacteristicUUIDArryLen
)
if(WCHBLEGetCharacteristicByUUIDResult){
console.log('获取特征值服务失败',WCHBLEGetCharacteristicByUUIDResult)
return
}