文档管理中心
HiCar Guides集成开发Linux设备接入开发步骤开发厂商HMI应用初始化SDK连接手机蓝牙启动厂商HMI应用

连接手机蓝牙启动厂商HMI应用

场景说明

为了简化用户首次连接HiCar的步骤,车机可以在检测到连接手机蓝牙后,直接启动厂商HMI应用。

说明
  • 为实现该功能,需要车机蓝牙支持与UUID(FA87C0D0-AFAC-11DE-8A39-0800200C9A66)进行Secure RFcomm通信。
  • 需要车机蓝牙类型(BluetoothClass.Device)为指定蓝牙类型:1032(AUDIO_VIDEO_HANDSFREE)或1056(AUDIO_VIDEO_CAR_AUDIO)。

当支持HiCar的手机与支持HiCar的车机,建立蓝牙连接时,车机侧HiCar SDK和手机侧HiCar App会通过蓝牙RFcomm通道进行数据交互,在确认双方都支持HiCar后手机侧将直接推荐用户使用HiCar,用户在手机侧同意使用HiCar后,车机侧需要直接进入到连接界面(连接码或者扫码连接界面),从而简化用户的首次连接流程。

用户体验路径如下:

  1. 手动修改车机蓝牙名称为HiCarTest,用户手机和车机连接蓝牙后,若满足推荐条件,则手机端会出现如下弹窗,询问用户是否体验HiCar(HiCarTest为测试使用车机蓝牙名称,正式使用需要厂商提供蓝牙默认名称,在经过验证后会添加到蓝牙推荐白名单的规则里,白名单生效后现网可正常使用)。

  2. 若用户点击“同意”,则车机端应该拉起HiCar HMI应用界面(PIN码或二维码界面);若用户点击“取消”,则车机端不会收到任何回调通知,即无需进行任何动作。

为实现该功能,厂商需根据本章节内容完成功能开发。

图1 交互流程

接口说明

表1 相关接口
展开

文件

接口

说明

hicar.c

HiCarStartBluetoothRecommend(const char* modelId, int32_t allowConnectionType)

SDK初始化之后,调用此接口传入车机的modelID和支持的连接类型。

hicar.c

ShowStartPage()

接收到显示连接界面的回调,HMI应用需实现此回调接口,跳转到HiCar连接界面。

表2 相关结构体(bt_socket_wrapper.h)
展开

结构体

结构体内函数

说明

BtRecommendAdpterOps

registerBtSocketCallback(BtSocketDataCallback *callback)

从SDK中获得数据接收处理函数,用于处理从蓝牙socket中获取的数据。

initBtSocket(RfcommServerInfo serverInfo)

根据SDK给出的RfcommServerInfo创建蓝牙socket,并处理从socket中接收的数据。

sendData(char *data)

SDK会调用此函数,将数据回复给手机。

unregisterBtSocketCallback()

反注册函数,释放从SDK中拿到的数据处理函数。

deInitBtSocket()

反初始化函数,销毁蓝牙socket。

说明

Rfcomm建立成功后,手机会弹窗询问用户是否同意使用。用户点击确认之后才会给HMI发送显示连接起始界面的回调(ShowStartPage),不需要HMI提前自行拉起HiCar连接界面。

开发步骤

  1. 厂商需实现监听蓝牙连接的接口,并在检测到有蓝牙连接时,在HiCar SDK初始化成功的回调中调用HiCarStartBluetoothRecommend方法,传入车机modelID和支持的连接类型 (此处的modelId为完整的8位modelId)。
  2. 实现ShowStartPage接口,在此回调方法中跳转到HiCar连接界面(连接码界面或者扫码连接界面)。
  3. 蓝牙连接及数据收发需要厂商实现bt_socket_wrapper.h中的接口,即根据此头文件实现bt_socket_wrapper.c 。

    收起
    自动换行
    深色代码主题
    复制
    1. // 实现结构体内的所有接口,且结构体对象名称必须为g_btRecommendAdapter
    2. const BtRecommendAdpterOps g_btRecommendAdapter = {
    3. .InitBtSocket = InitSocket,
    4. .DeInitBtSocket = DeInitSocket,
    5. .RegisterBtSocketCallback = RegisterSocketCallback,
    6. .SendData = ReplyData,
    7. .UnregisterBtSocketCallback = UnregisterSocketCallback
    8. };
    9. //RegisterSocketCallback实现建议: 定义全局变量,如g_recvCallback,将callback赋值给g_recvCallback
    10. int32_t RegisterSocketCallback(BtSocketDataCallback *callback) {
    11. printf("registerCallback\n");
    12. if (callback == NULL) {
    13. printf("callback is null\n");
    14. return -1;
    15. }
    16. g_recvCallback = callback;
    17. return 0;
    18. }
    19. //InitSocket实现建议:开始建立蓝牙连接,并监听蓝牙socket发送过来的数据,收到数据时调用,调用g_recvCallback(data),将数据回调给sdk处理
    20. 注:此处为python语句,只展示逻辑
    21. server_sock = BluetoothSocket(RFCOMM)
    22. server_sock.bind(("", 0))
    23. server_sock.listen(1)
    24. port = server_sock.getsockname()[1]
    25. advertise_service(server_sock, "HiCarRecommend",
    26. service_id="fa87c0d0-afac-11de-8a39-0800200c9a66",
    27. service_classes=["fa87c0d0-afac-11de-8a39-0800200c9a66", SERIAL_PORT_CLASS],
    28. profiles=[SERIAL_PORT_PROFILE])
    29. print("listening")
    30. client_sock, client_info = server_sock.accept()
    31. print("bluetooth socket connected")
    32. //ReplyData实现建议:在此函数中使用InitSocket函数创建的蓝牙连接 发送数据
    33. int32_t ReplyData(const char *data)
    34. {
    35. if (data == NULL) {
    36. printf("ReplyData input is invalid.\n");
    37. return RESULT_ERROR; // return a NONZERO value
    38. }
    39. // 使用InitSocket函数创建的蓝牙连接 发送数据
    40. // send(socket_created_in_InitSocket_func, data, ...);
    41. // printf("ReplyData ok, ...\n", ...);
    42. return RESULT_OK; // return 0
    43. }
    44. //UnregisterSocketCallback实现建议:在此函数中注销已注册的函数
    45. int32_t UnregisterSocketCallback() {
    46. printf("unregisterCallback");
    47. g_callback = NULL;
    48. return 0;
    49. }
    50. //DeInitSocket实现建议:在此函数中完成断开socket连接的逻辑
    51. int32_t DeInitSocket() {
    52. //断开连接
    53. return 0;
    54. }

在 指南 中进行搜索
请输入您想要搜索的关键词