_bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
result, info,
event_info->cb, event_info->user_data);
+ } else if (strcasecmp(signal_name, BT_MESH_MODEL_MSG_RECEIVED) == 0) {
+ int result;
+ GVariant *param = NULL;
+ GArray *dbus_data = NULL;
+ bluetooth_mesh_model_msg_t *info = NULL;
+
+ g_variant_get(parameters, "(iv)", &result, ¶m);
+ dbus_data = g_array_new(TRUE, TRUE, sizeof(gchar));
+
+ __bt_fill_garray_from_variant(param, dbus_data);
+ g_variant_unref(param);
+
+ info = &g_array_index(dbus_data, bluetooth_mesh_model_msg_t, 0);
+ _bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
+ result, info,
+ event_info->cb, event_info->user_data);
} else if (strcasecmp(signal_name, BT_MESH_JOIN_COMPLETED) == 0) {
int result;
GVariant *param = NULL;
return result;
}
+BT_EXPORT_API int bluetooth_mesh_model_send_response(
+ bluetooth_mesh_model_msg_t *req)
+{
+ int result;
+ bt_user_info_t *user_info;
+
+ BT_CHECK_PARAMETER(req, return);
+
+ user_info = _bt_get_user_data(BT_MESH);
+ retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+ BT_INIT_PARAMS();
+ BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+ g_array_append_vals(in_param1, req, sizeof(bluetooth_mesh_model_msg_t));
+
+ BT_INFO("Mesh: Node Model Send Response");
+ result = _bt_send_request(BT_BLUEZ_SERVICE, BT_MESH_MODEL_RESPONSE_MSG,
+ in_param1, in_param2, in_param3, in_param4,
+ &out_param);
+
+ BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
+ return result;
+}
+
BT_EXPORT_API int bluetooth_mesh_node_configure_key(
bluetooth_mesh_key_configure_t *req)
{
}
break;
}
+ case BT_MESH_MODEL_RESPONSE_MSG: {
+ bluetooth_mesh_model_msg_t req;
+ memset(&req, 0x00, sizeof(bluetooth_mesh_model_msg_t));
+ __bt_service_get_parameters(in_param1,
+ &req, sizeof(bluetooth_mesh_model_msg_t));
+
+ result = _bt_mesh_model_send_response(
+ requester_unique_creds, sender, &req);
+ if (result != BLUETOOTH_ERROR_NONE)
+ g_array_append_vals(*out_param1, &req, sizeof(bluetooth_mesh_model_msg_t));
+ break;
+ }
case BT_MESH_NODE_GET_NETKEYS: {
bluetooth_mesh_node_discover_t node;
memset(&node, 0x00, sizeof(bluetooth_mesh_node_discover_t));
case BT_MESH_MODEL_CONFIGURE_APPKEY:
case BT_MESH_MODEL_GET_APPKEY_LIST:
case BT_MESH_MODEL_EXECUTE_MSG:
+ case BT_MESH_MODEL_RESPONSE_MSG:
case BT_MESH_NETWORK_CREATE_GROUP:
case BT_MESH_NETWORK_REMOVE_GROUP:
case BT_MESH_MODEL_CONFIG_GROUP_SUB:
case BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED:
signal = BT_MESH_MODEL_MSG_EXECUTED;
break;
+ case BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED:
+ signal = BT_MESH_MODEL_MSG_RECEIVED;
+ break;
case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST:
signal = BT_MESH_MODEL_APPKEY_LIST;
break;
const char *sender,
bluetooth_mesh_model_msg_t *req);
+int _bt_mesh_model_send_response(const char *app_cred,
+ const char *sender,
+ bluetooth_mesh_model_msg_t *req);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
TRUE, NULL, NULL);
param = g_variant_new("(iv)", result, out_var);
- _bt_send_event(BT_MESH_EVENT,
- BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
- param);
+ if (!evt->is_prov)
+ _bt_send_event(BT_MESH_EVENT,
+ BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
+ param);
+ else
+ _bt_send_event(BT_MESH_EVENT,
+ BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
+ param);
}
}
param.appkey_idx = event->key_idx;
param.opcode = opcode;
+ param.is_prov = event->is_prov;
BT_INFO("Send response");
if (!event->is_prov) {
return BLUETOOTH_ERROR_NONE;
}
+
+int _bt_mesh_model_send_response(const char *app_cred, const char *sender,
+ bluetooth_mesh_model_msg_t *req)
+{
+ int ret = OAL_STATUS_SUCCESS;
+ uint16_t appkey_idx;
+ oal_uuid_t net_uuid;
+ uint16_t data_len;
+ uint16_t msg_hex_len = 0;
+ uint32_t opcode = 0;
+ uint8_t buffer[MESH_CONFIG_BUFFER_MAX_LEN];
+ uint8_t msg[BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX + 1];
+
+ opcode = req->opcode;
+ if (_bt_mesh_check_pending_msg_request(opcode, req->primary_unicast,
+ net_uuid.uuid)) {
+ BT_ERR("Device is buzy..");
+ return BLUETOOTH_ERROR_DEVICE_BUSY;
+ }
+ _bt_mesh_util_convert_string_to_hex(req->net_uuid, strlen(req->net_uuid), net_uuid.uuid, 16);
+ appkey_idx = req->appkey_idx;
+ data_len = _bt_mesh_util_opcode_set(req->opcode, buffer);
+ BT_DBG("Mesh: Model string msg opcode: 0x%2.2X msg_len: %d",
+ req->opcode, req->msg_len);
+ if (req->msg_len > 0) {
+ /* Convert Mesh msg to hex*/
+ BT_DBG("Mesh: Model string msg_len: %zd, msg: %s", strlen(req->msg), req->msg);
+ msg_hex_len = strlen(req->msg)/2;
+ _bt_mesh_util_convert_string_to_hex(req->msg, strlen(req->msg), msg, msg_hex_len);
+ for (int msg_idx = 0; msg_idx < msg_hex_len; msg_idx++)
+ BT_DBG("Mesh: Model hex msg[%d]: msg: 0x%2.2X", msg_idx, msg[msg_idx]);
+
+ /* Append model msg */
+ if (msg_hex_len > 0) {
+ memcpy(buffer + data_len, msg, msg_hex_len);
+ data_len += msg_hex_len;
+ }
+ }
+ ret = mesh_model_send_message(&net_uuid, req->primary_unicast, appkey_idx, buffer, data_len);
+
+ if (ret != OAL_STATUS_SUCCESS) {
+ BT_ERR("ret: %d", ret);
+ return BLUETOOTH_ERROR_INTERNAL;
+ }
+ return BLUETOOTH_ERROR_NONE;
+}
BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND,
BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST,
BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
+ BLUETOOTH_EVENT_MESH_MODEL_MSG_RECEIVED,
BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_LIST,
BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED,
BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED,
uint16_t opcode;
uint16_t msg_len;
char msg[BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX + 1];
+ bool is_prov;
} bluetooth_mesh_model_msg_t;
typedef struct {
bluetooth_mesh_model_msg_t *req);
/**
+ * Send response to provisioner node
+ */
+int bluetooth_mesh_model_send_response(
+ bluetooth_mesh_model_msg_t *req);
+
+/**
* Get all application keys added to a model of a node
*/
int bluetooth_mesh_model_get_all_appkeys(
BT_MESH_MODEL_CONFIGURE_APPKEY,
BT_MESH_MODEL_GET_APPKEY_LIST,
BT_MESH_MODEL_EXECUTE_MSG,
+ BT_MESH_MODEL_RESPONSE_MSG,
BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
BT_MESH_MODEL_SET_PUBLICATION,
BT_MESH_MODEL_GET_PUBLICATION,
#define BT_MESH_NODE_TTL_CONFIGURED "MeshNodeTTLConfigured"
#define BT_MESH_MODEL_APPKEY_CONFIGURED "MeshModelAppKeyConfigured"
#define BT_MESH_MODEL_MSG_EXECUTED "MeshModelMsgExecuted"
+#define BT_MESH_MODEL_MSG_RECEIVED "MeshModelMsgReceived"
#define BT_MESH_MODEL_APPKEY_LIST "MeshModelAppKeyList"
#define BT_MESH_MODEL_SUB_LIST "MeshModelSubscriptionList"
#define BT_MESH_MODEL_SUB_CONF "MeshModelSubConfiguration"