_bt_mesh_event_cb(BLUETOOTH_EVENT_MESH_MODEL_PUBLICATION_STATUS,
result, info,
event_info->cb, event_info->user_data);
+ } else if (strcasecmp(signal_name, BT_MESH_MODEL_MSG_EXECUTED) == 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_EXECUTED,
+ result, info,
+ event_info->cb, event_info->user_data);
}
BT_INFO("Mesh event handler Exit <<");
}
return result;
}
+BT_EXPORT_API int bluetooth_mesh_model_send_msg(
+ 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 Msg");
+ result = _bt_send_request_async(BT_BLUEZ_SERVICE, BT_MESH_MODEL_EXECUTE_MSG,
+ in_param1, in_param2, in_param3, in_param4,
+ user_info->cb, user_info->user_data);
+
+ 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)
{
*param_data = &g_array_index(output,
bluetooth_mesh_model_configure_t, 0);
break;
+ case BT_MESH_MODEL_EXECUTE_MSG:
+ *event_type = BT_MESH_EVENT;
+ *event = BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED;
+ ret_if(output == NULL);
+ *param_data = &g_array_index(output,
+ bluetooth_mesh_model_msg_t, 0);
+ break;
case BT_MESH_MODEL_CONFIG_GROUP_SUB:
*event_type = BT_MESH_EVENT;
*event = BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED;
#include "bt-service-mesh-util.h"
#include "bt-service-mesh-network.h"
#include "bt-service-mesh-config-client.h"
+#include "bt-service-mesh-model.h"
#ifdef TIZEN_FEATURE_BT_DPM
#include "bt-service-dpm.h"
}
break;
}
+ case BT_MESH_MODEL_EXECUTE_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_execute_msg(
+ requester_unique_creds, sender, &req);
+
+ /* Save invocation */
+ if (result != BLUETOOTH_ERROR_NONE) {
+ g_array_append_vals(*out_param1, &req, sizeof(bluetooth_mesh_model_msg_t));
+ } else {
+ bluetooth_mesh_model_msg_t *param = \
+ g_memdup(&req, sizeof(bluetooth_mesh_model_msg_t));
+
+ sender = (char*)g_dbus_method_invocation_get_sender(context);
+ _bt_save_invocation_context(context, result, sender,
+ function_name, (gpointer)param);
+ }
+ 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_NODE_GET_APPKEYS:
case BT_MESH_MODEL_CONFIGURE_APPKEY:
case BT_MESH_MODEL_GET_APPKEY_LIST:
+ case BT_MESH_MODEL_EXECUTE_MSG:
case BT_MESH_NETWORK_CREATE_GROUP:
case BT_MESH_NETWORK_REMOVE_GROUP:
case BT_MESH_MODEL_CONFIG_GROUP_SUB:
case OAL_EVENT_MESH_NETKEY_EXECUTE_EVENT:
case OAL_EVENT_MESH_APPKEY_EXECUTE_EVENT:
case OAL_EVENT_MESH_DEVKEY_MESSAGE_RECEIVED:
+ case OAL_EVENT_MESH_MESSAGE_RECEIVED:
BT_INFO("Mesh: Event");
if (mesh_cb)
mesh_cb(event_type, event_data);
case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND:
signal = BT_MESH_MODEL_APPKEY_CONFIGURED;
break;
+ case BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED:
+ signal = BT_MESH_MODEL_MSG_EXECUTED;
+ break;
case BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST:
signal = BT_MESH_MODEL_APPKEY_LIST;
break;
void _bt_mesh_msg_handler(
event_mesh_message_t *event);
-int _bt_mesh_node_model_execute_msg(const char *app_cred,
+int _bt_mesh_model_execute_msg(const char *app_cred,
const char *sender,
bluetooth_mesh_model_msg_t *req);
#define MESH_OPCODE_VENDOR_MODEL_APP_GET 0x804D
#define MESH_OPCODE_VENDOR_MODEL_APP_LIST 0x804E
+/*Model msg opcodes */
+#define MESH_OPCODE_MODEL_GENERIC_ONOFF_GET 0x8201
+#define MESH_OPCODE_MODEL_GENERIC_ONOFF_SET 0x8202
+#define MESH_OPCODE_MODEL_GENERIC_ONOFF_SET_UNACK 0x8203
+#define MESH_OPCODE_MODEL_GENERIC_ONOFF_STATUS 0x8204
+/*TO-DO Add more model msg opcodes */
uint32_t _bt_mesh_util_get_timestamp_secs(void);
#include "bt-service-mesh-network.h"
#include "bt-service-mesh-nodes.h"
#include "bt-service-mesh-config-client.h"
+#include "bt-service-mesh-model.h"
#include <oal-mesh.h>
_bt_mesh_config_client_devkey_msg_handler(event);
}
+static void __handle_mesh_message_received_event(
+ event_mesh_message_t *event)
+{
+ _bt_mesh_msg_handler(event);
+}
+
static void __handle_mesh_network_attached_event(
event_mesh_network_attached_t *event)
{
(event_mesh_devkey_message_t*)event_data);
BT_PERMANENT_LOG("Mesh: DevKey Message Received event");
break;
+ case OAL_EVENT_MESH_MESSAGE_RECEIVED:
+ __handle_mesh_message_received_event(
+ (event_mesh_message_t*)event_data);
+ BT_PERMANENT_LOG("Mesh: Model Message Received event");
+ break;
default:
break;
}
return NULL;
}
-bool _bt_mesh_check_pending_request(uint32_t opcode,
+bool _bt_mesh_check_pending_msg_request(uint32_t opcode,
uint16_t dest, uint8_t net_uuid[])
{
const struct mesh_msg_cmd *cmd;
}
-int _bt_mesh_node_model_execute_msg(const char *app_cred, const char *sender,
+int _bt_mesh_model_execute_msg(const char *app_cred, const char *sender,
bluetooth_mesh_model_msg_t *req)
{
int ret = OAL_STATUS_SUCCESS;
/* Check pending request */
opcode = req->opcode;
- if (_bt_mesh_check_pending_request(opcode, req->primary_unicast,
+ if (_bt_mesh_check_pending_msg_request(opcode, req->primary_unicast,
net_uuid.uuid)) {
BT_ERR("Device is buzy..");
return BLUETOOTH_ERROR_DEVICE_BUSY;
buf[0] = (opcode >> 16) & 0xff;
l_put_be16(opcode, buf + 1);
return 3;
- } else
+ } else {
return 0;
+ }
}
bool _bt_mesh_util_opcode_get(const uint8_t *buf,
BLUETOOTH_EVENT_MESH_NODE_TTL_CONFIGURED,
BLUETOOTH_EVENT_MESH_MODEL_APPKEY_BIND,
BLUETOOTH_EVENT_MESH_MODEL_APPKEY_LIST,
+ BLUETOOTH_EVENT_MESH_MODEL_MSG_EXECUTED,
BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_LIST,
BLUETOOTH_EVENT_MESH_MODEL_SUBSCRIPTION_CONFGURED,
BLUETOOTH_EVENT_MESH_MODEL_VIRTUAL_SUBSCRIPTION_CONFGURED,
#define BLUETOOTH_MESH_NETWORK_TOKEN_STRING_LENGTH 16
#define BLUETOOTH_MESH_APP_UNIQUE_CRED_STRING_LENGTH 50
#define BLUETOOTH_MESH_AUTH_VALUE_LENGTH_MAX 50
+#define BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX 32
typedef enum {
BLUETOOTH_MESH_NODE_KEY_ADD,
typedef struct {
char net_uuid[BLUETOOTH_MESH_NETWORK_UUID_STRING_LENGTH + 1];
+ uint16_t primary_unicast;
+ int elem_index;
+ uint16_t model;
+ uint16_t appkey_idx;
+ uint16_t opcode;
+ uint16_t msg_len;
+ char msg[BLUETOOTH_MESH_MODEL_MSG_LENGTH_MAX + 1];
+} bluetooth_mesh_model_msg_t;
+
+typedef struct {
+ char net_uuid[BLUETOOTH_MESH_NETWORK_UUID_STRING_LENGTH + 1];
bool is_virtual;
uint16_t group_addr;
char label_uuid[BLUETOOTH_MESH_NETWORK_UUID_STRING_LENGTH +1];
bluetooth_mesh_model_configure_t *req);
/**
+ * Send message to a model of a node
+ */
+int bluetooth_mesh_model_send_msg(
+ 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_NODE_GET_APPKEYS,
BT_MESH_MODEL_CONFIGURE_APPKEY,
BT_MESH_MODEL_GET_APPKEY_LIST,
+ BT_MESH_MODEL_EXECUTE_MSG,
BT_MESH_MODEL_GET_SUBSCRIPTION_LIST,
BT_MESH_MODEL_SET_PUBLICATION,
BT_MESH_MODEL_GET_PUBLICATION,
#define BT_MESH_NODE_KEY_CONFIGURED "MeshNodeKeyConfigured"
#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_APPKEY_LIST "MeshModelAppKeyList"
#define BT_MESH_MODEL_SUB_LIST "MeshModelSubscriptionList"
#define BT_MESH_MODEL_SUB_CONF "MeshModelSubConfiguration"