从C/C++扫描BLE设备

6
"蓝牙设备访问指南"中,我了解到蓝牙API应该可以从C或C++中访问。在IOBluetooth框架中,我找到了一些与蓝牙相关的C头文件(IOBluetoothUserLib.h、Bluetooth.h),其中包含用于定义搜索条件的枚举和数据结构,但我未能找到任何接受此类枚举或数据结构作为参数的函数。根据文档,我需要创建一个CBCentralManager,但我未能找到从C或C++中这样做的方法。
背景:我们使用OS/X作为BLE启用微控制器的开发平台。为了更新这些微控制器上的固件,我想编写一个BLE引导程序,并且我想要一个命令行客户端来更新固件。所有代码都是用C++编写的,我不想为这个小任务学习Objective-C。
有任何提示、文档或示例吗?
谢谢
Torsten

如果它能解决你的问题,你可以查看blucat项目。 - Mohit Jain
@MohitJain 在我看来,Bluecat是用Java编写的。因此,我不得不将C/CPP适应为Java,以使用Objective C库。 - Torsten Robitzki
好的。根据我的理解,您需要的实际上是一些库(可能是用Objective-C编写的),它具有一些接口,以便可以从C中调用它。您可以获取一些开源的Objective-C代码用于BLE,并将其插入到您的代码中。(可能) - Mohit Jain
1
@MohitJain 这是我目前正在追求的路线。但我想避免学习 obj-c,因为引用的文档明确说明 API 可以从 C/C++ 访问,所以我在这里询问如何使用 C 来使用 BLE API :-) 所以,我需要的是一个解决方案。最好是我可以用 C 编写的解决方案;-) - Torsten Robitzki
2个回答

5
根据文档,我需要创建一个CBCentralManager,但我无法从C或C ++中找到方法。
您所提到的文档是针对经典蓝牙的,其中IOBluetooth框架具有某些功能。CBCentralManager是CoreBluetooth的管理器,仅用于蓝牙LE。
对于经典蓝牙,您需要的管理器是IOKit框架中的HID Manager,可以在此处找到相关文档。如果您搜索一下,您会发现很多关于IOKit和IOHIDManager的C ++用法示例(1, 2)。

IOKit可能已经提供了您所需的所有功能,但IOBluetooth提供了一些蓝牙特定功能。来自开发蓝牙应用程序

虽然您不需要使用蓝牙API来访问HID类设备,但您可以选择使用蓝牙框架中的函数或方法来增强用户体验。例如,您的应用程序可以提供蓝牙特定信息,让用户知道某个设备是否支持特定服务。


嗨,@Henrik,那很有道理。所以无法使用C/C++访问蓝牙LE API,对吗? - Torsten Robitzki
1
对的,至少我在CoreBluetooth文档中找不到任何关于C++ API的参考。我现在重新阅读了你的帖子,并且看到你实际上对Bluetooth LE感兴趣,而不是经典的蓝牙,所以很抱歉我的答案没有解决你的问题。 - Henrik
1
它通过指出我在错误的方向上努力解决问题,最终解决了我的问题;-) - Torsten Robitzki
你可能需要编写一些Objective-C++代码来使用CoreBluetooth。 - Henrik

1
我同意Henrik的观点,你需要一些胶水。看看RedBearLab的人们的工作,并精确到类。
ofxBLE. h/mm


// C++ interface //
// (Obj-C may be a superset of C, but this just makes interopability
// easier with oF)
class ofxBLE {
    protected:
        ofxBLEDelegate *btDelegate;
    public:
        ofxBLE();
        ~ofxBLE();
        void scanPeripherals();
        void sendPosition(uint8_t x, uint8_t y);
    bool isConnected();
};



...
- (void)bleDidDisconnect {
    NSLog(@"->Disconnected");
}
- (void)bleDidReceiveData:(unsigned char *)data length:(int)length {   
}
@end
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
//= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
//                                          C++ class implementation
ofxBLE::ofxBLE() {
    btDelegate = [[ofxBLEDelegate alloc] init];
}
ofxBLE::~ofxBLE() {

}
void ofxBLE::scanPeripherals(){
    [btDelegate scanForPeripherals];
}

void ofxBLE::sendPosition(uint8_t x, uint8_t y) {
    // position should be NORMALIZED to between 0 and 255 BEFORE
    // passing into this method!
    [btDelegate sendPositionX:x withY:y];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接