【问题标题】:Scanning for BLE Devices from C/C++从 C/C++ 扫描 BLE 设备
【发布时间】:2015-03-18 10:44:31
【问题描述】:

"Bluetooth Device Access Guide",我读到蓝牙 API 应该可以从 C 或 C++ 访问。我在 IOBluetooth 框架中发现了一些与蓝牙相关的 C 头文件(IOBluetoothUserLib.h、Bluetooth.h),它们包含枚举和数据结构以定义搜索条件,但我找不到任何采用此类枚举或数据结构的函数作为参数。根据文档,我必须创建一个 CBCentralManager,但我无法从 C 或 C++ 中找到这样做的方法。

背景:我们使用 OS/X 作为开发平台来开发支持 BLE 的微控制器。要更新此微控制器上的固件,我想编写一个 BLE 引导加载程序,并且我想要一个命令行客户端来更新固件。所有代码都是用 C++ 编写的,我不想为这个小任务学习 objectiv-C。

任何指针、文档、示例?

谢谢

托尔斯滕

【问题讨论】:

  • 如果blucat项目解决了您的目的,您可以检查一次。
  • @MohitJain 在我看来,bluecat 是用 java 编写的。所以我不得不让 C/CPP 适应 Java 来使用一个客观的 C 库。
  • 好的。据我了解,您实际上需要的是一些库(可能是用 Objective-C 编写的),它具有一些接口,以便可以从 C 调用它。您可以为 BLE 获取一些开源的 Objective-C 代码并将其插入到您的代码中. (可能)
  • @MohitJain 这就是我目前正在遵循的路线。但我想避免学习 obj-c,因为我引用的文档明确指出 API 可以从 C/C++ 访问,我在这里问,如何从 C 使用 BLE API: -) 所以,我需要的是一个解决方案。我可以用 C 编写的首选 ;-)

标签: c macos bluetooth-lowenergy core-bluetooth


【解决方案1】:

根据文档,我必须创建一个 CBCentralManager,但我无法从 C 或 C++ 中找到这样做的方法。

您参考的文档是针对经典蓝牙的,IOBluetooth 框架对此具有一些功能。 CBCentralManager 是 CoreBluetooth 的管理器,仅适用于蓝牙 LE。

对于经典蓝牙,您需要的管理器是来自 IOKit 框架的 HID 管理器,其文档可以在 here 找到。如果您四处搜索,您会发现很多 C++ 使用 IOKit 和 IOHIDManager 的示例(12)。

IOKit 实际上可以为您提供所需的所有功能,但 IOBluetooth 提供了一些蓝牙特定的功能。来自Developing Bluetooth Applications

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

【讨论】:

  • 嗨@Henrik,这很有意义。所以不可能使用 C/C++ 来访问蓝牙 LE API,对吧?
  • 对,至少我在 CoreBluetooth 文档中找不到对 C++ API 的任何引用。我现在重读了您的帖子,发现您实际上对蓝牙 LE 感兴趣,而不是经典蓝牙,所以很抱歉我的回答没有解决您的问题。
  • 它确实解决了我的问题,指出我在叫错树;-)
  • 你可能想写一些Objective-C++ 胶水来使用CoreBluetooth。
【解决方案2】:

我同意Henrik 你需要一些胶水。看RedBearLab guys work,精确到类。

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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多