From 5cc503177272e66d42e747faa786ff0974bdcdcb Mon Sep 17 00:00:00 2001 From: Abhay Agarwal Date: Mon, 10 Aug 2020 18:32:26 +0530 Subject: [PATCH] Mesh: Add API for group message communication This patch introduces an API which can be used to send/receive group messages. Change-Id: I64d63126db38f8cd7f826b41e0aa904cb92217ac Signed-off-by: Abhay Agarwal --- include/bluetooth_internal.h | 21 +++++++++++++++++ src/bluetooth-mesh.c | 56 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/include/bluetooth_internal.h b/include/bluetooth_internal.h index f255de5..494734f 100644 --- a/include/bluetooth_internal.h +++ b/include/bluetooth_internal.h @@ -5059,6 +5059,27 @@ int bt_mesh_model_send_msg(bt_mesh_model_h model, /** * @internal * @ingroup CAPI_NETWORK_BLUETOOTH_MESH_MODULE + * @brief Send Group message originated by a local mesh model. + * + * @param: in: group, group handle to which message to be sent + * @param: in: appkey, appkey to encrypt mesh message + * appkey must be valid for corresponding model, i.e + * appkey must be bound to the model + * @param: in: msg_params, opcode and the message to be sent + * @param: in: callback, callback to be called for msg response + * + * @see bt_mesh_model_msg_params_s + * + * @since_tizen 6.0 + * @privlevel platform + */ +int bt_mesh_group_send_msg(bt_mesh_group_h group, + bt_mesh_appkey_h appkey, bt_mesh_model_msg_params_s *msg_params, + bt_mesh_model_msg_cb callback, void *user_data); + +/** + * @internal + * @ingroup CAPI_NETWORK_BLUETOOTH_MESH_MODULE * @brief Create a Mesh group with a given group address in the Local Network * * @since_tizen 6.0 diff --git a/src/bluetooth-mesh.c b/src/bluetooth-mesh.c index 8742cc9..00b5ec5 100644 --- a/src/bluetooth-mesh.c +++ b/src/bluetooth-mesh.c @@ -2906,6 +2906,62 @@ int bt_mesh_model_send_msg(bt_mesh_model_h model, return BT_ERROR_NONE; } +int bt_mesh_group_send_msg(bt_mesh_group_h group, + bt_mesh_appkey_h appkey, bt_mesh_model_msg_params_s *msg_params, + bt_mesh_model_msg_cb callback, void *user_data) +{ + int error_code = BT_ERROR_NONE; + bt_mesh_group_s *group_s; + bt_mesh_network_s *network_s; + bt_mesh_appkey_s *appkey_s; + bluetooth_mesh_model_msg_t req; + + FUNC_ENTRY; + BT_CHECK_MESH_SUPPORT(); + BT_CHECK_MESH_INIT_STATUS(); + BT_CHECK_INPUT_PARAMETER(group); + BT_CHECK_INPUT_PARAMETER(appkey); + BT_CHECK_INPUT_PARAMETER(msg_params); + BT_CHECK_INPUT_PARAMETER(callback); + + group_s = (bt_mesh_group_s*) group; + BT_MESH_VALIDATE_HANDLE(group_s, group_list); + + appkey_s = (bt_mesh_appkey_s*) appkey; + BT_MESH_VALIDATE_HANDLE(appkey_s, appkey_list); + + network_s = (bt_mesh_network_s*) group_s->parent; + BT_MESH_VALIDATE_HANDLE(network_s, networks); + + BT_INFO("Mesh: Model msg opcode: 0x%2.2X",msg_params->opcode); + + memset(&req, 0x00, sizeof(bluetooth_mesh_model_msg_t)); + g_strlcpy(req.net_uuid, network_s->uuid, 33); + req.primary_unicast = group_s->addr; + req.appkey_idx = appkey_s->appkey_index; + req.opcode = msg_params->opcode; + + if (msg_params->data) { + BT_INFO("Mesh: Group msg strlen %zd message: %s", + strlen(msg_params->data), msg_params->data); + + req.msg_len = strlen(msg_params->data); + g_strlcpy(req.msg, msg_params->data, sizeof(msg_params->data) + 1); + } else { + req.msg_len = 0; + } + + error_code = _bt_get_error_code(bluetooth_mesh_model_send_msg(&req)); + if (error_code != BT_ERROR_NONE) { + BT_ERR("%s(0x%08x)", _bt_convert_error_to_string(error_code), error_code); + return error_code; + } + + FUNC_EXIT; + _bt_set_cb(BT_EVENT_MESH_NODE_MODEL_EXECUTE_MSG_COMPLETED, callback, user_data); + return BT_ERROR_NONE; +} + int bt_mesh_network_foreach_groups(bt_mesh_network_h network, bt_mesh_network_group_info_cb callback, void *user_data) { -- 2.7.4