Bluetooth Low Energy based Firmware Over The Air with Mbed. Mbed part is a external processor of the IoT devices and communicate with a Bluetooth module. The Bluetooth module have to support BLE and implement BLE FOTA profile designed by ours. BLE FOTA profile specification is available from our GIT hub wiki(https://github.com/sevencore/BLEFOTA).

Dependencies:   mbed

Fork of mbed_fota by KIM HyoengJun

Bluetooth Low Energy based Firmware Over The Air with Mbed. Mbed part is a external processor of the IoT devices and communicate with a Bluetooth module. The Bluetooth module have to support BLE and implement BLE FOTA profile designed by ours. BLE FOTA profile specification is available from our GIT hub wiki.

Committer:
dudnwjs
Date:
Fri Jul 17 14:04:12 2015 +0000
Revision:
6:8dd20294b2aa
Parent:
5:e11b23f9aacc
Child:
9:fcf91f563147
EXT DEMO FILE OPEN COMPLETE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudnwjs 3:1e70387e1337 1 #include "app.h"
dudnwjs 3:1e70387e1337 2 #include "gapm_task.h"
dudnwjs 3:1e70387e1337 3 #include "dialog_fota_config.h"
dudnwjs 4:60be78a172c2 4 #include "diss_task.h"
dudnwjs 5:e11b23f9aacc 5 #include "fota_server_task.h"
dudnwjs 3:1e70387e1337 6
dudnwjs 3:1e70387e1337 7 namespace sevencore_fota{
dudnwjs 5:e11b23f9aacc 8
dudnwjs 5:e11b23f9aacc 9 struct app_env_tag app_env;
dudnwjs 3:1e70387e1337 10
dudnwjs 3:1e70387e1337 11 void app_rst_gap(BleMsgHandler *BMH)
dudnwjs 3:1e70387e1337 12 {
dudnwjs 3:1e70387e1337 13 struct gapm_reset_cmd gm_cmd;
dudnwjs 3:1e70387e1337 14 gm_cmd.operation = GAPM_RESET;
dudnwjs 5:e11b23f9aacc 15
dudnwjs 5:e11b23f9aacc 16 app_env.state = APP_IDLE;
dudnwjs 5:e11b23f9aacc 17 app_env.num_of_devices = 0;
dudnwjs 5:e11b23f9aacc 18 for (int i=0; i < MAX_SCAN_DEVICES; i++)
dudnwjs 5:e11b23f9aacc 19 {
dudnwjs 5:e11b23f9aacc 20 app_env.devices[i].free = true;
dudnwjs 5:e11b23f9aacc 21 app_env.devices[i].adv_addr.addr[0] = '\0';
dudnwjs 5:e11b23f9aacc 22 app_env.devices[i].data[0] = '\0';
dudnwjs 5:e11b23f9aacc 23 app_env.devices[i].data_len = 0;
dudnwjs 5:e11b23f9aacc 24 app_env.devices[i].rssi = 0;
dudnwjs 5:e11b23f9aacc 25 }
dudnwjs 5:e11b23f9aacc 26
dudnwjs 3:1e70387e1337 27 uint8_t *msg;
dudnwjs 3:1e70387e1337 28 unsigned short msg_size = 1+sizeof(ble_hdr) + sizeof(gapm_reset_cmd);
dudnwjs 3:1e70387e1337 29 msg = new uint8_t[msg_size];
dudnwjs 3:1e70387e1337 30 BMH->BleMsgAlloc(GAPM_RESET_CMD, TASK_GAPM, TASK_GTL,
dudnwjs 3:1e70387e1337 31 sizeof(struct gapm_reset_cmd),&gm_cmd,msg);
dudnwjs 3:1e70387e1337 32
dudnwjs 3:1e70387e1337 33 BMH->BleSendMsg(msg,msg_size);
dudnwjs 3:1e70387e1337 34
dudnwjs 3:1e70387e1337 35 return;
dudnwjs 3:1e70387e1337 36 }
dudnwjs 3:1e70387e1337 37
dudnwjs 4:60be78a172c2 38 void app_diss_db_create(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 39 {
dudnwjs 4:60be78a172c2 40 uint8_t *msg;
dudnwjs 4:60be78a172c2 41 // Add DIS in the database
dudnwjs 4:60be78a172c2 42 struct diss_create_db_req req;
dudnwjs 4:60be78a172c2 43 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct diss_create_db_req);
dudnwjs 6:8dd20294b2aa 44 req.features = (DIS_MANUFACTURER_NAME_CHAR_SUP|DIS_MODEL_NB_STR_CHAR_SUP|DIS_SERIAL_NB_STR_CHAR_SUP);
dudnwjs 4:60be78a172c2 45
dudnwjs 4:60be78a172c2 46 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 47
dudnwjs 4:60be78a172c2 48 BMH->BleMsgAlloc(DISS_CREATE_DB_REQ,TASK_DISS, TASK_GTL,sizeof(struct diss_create_db_req),&req,msg);
dudnwjs 4:60be78a172c2 49 BMH->BleSendMsg(msg,msg_size);
dudnwjs 4:60be78a172c2 50 }
dudnwjs 4:60be78a172c2 51
dudnwjs 5:e11b23f9aacc 52 void app_fota_server_db_create(BleMsgHandler* BMH)
dudnwjs 5:e11b23f9aacc 53 {
dudnwjs 5:e11b23f9aacc 54 uint8_t *msg;
dudnwjs 5:e11b23f9aacc 55 // Add DIS in the database
dudnwjs 5:e11b23f9aacc 56 struct fota_server_create_db_req req;
dudnwjs 5:e11b23f9aacc 57 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct fota_server_create_db_req);
dudnwjs 5:e11b23f9aacc 58 req.features = 0x01FF;
dudnwjs 5:e11b23f9aacc 59
dudnwjs 5:e11b23f9aacc 60 msg = new uint8_t[msg_size];
dudnwjs 5:e11b23f9aacc 61
dudnwjs 5:e11b23f9aacc 62 BMH->BleMsgAlloc(FOTA_SERVER_CREATE_DB_REQ,TASK_FOTA_SERVER, TASK_GTL,sizeof(struct fota_server_create_db_req),&req,msg);
dudnwjs 5:e11b23f9aacc 63 BMH->BleSendMsg(msg,msg_size);
dudnwjs 5:e11b23f9aacc 64 }
dudnwjs 5:e11b23f9aacc 65
dudnwjs 4:60be78a172c2 66 void app_adv_start(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 67 {
dudnwjs 4:60be78a172c2 68 uint8_t device_name_length;
dudnwjs 4:60be78a172c2 69 uint8_t device_name_avail_space;
dudnwjs 4:60be78a172c2 70 uint8_t device_name_temp_buf[64];
dudnwjs 4:60be78a172c2 71 uint8_t *msg;
dudnwjs 4:60be78a172c2 72 unsigned short msg_size;
dudnwjs 4:60be78a172c2 73 msg_size = 1 + sizeof(ble_hdr) + sizeof(struct gapm_start_advertise_cmd);
dudnwjs 4:60be78a172c2 74 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 75
dudnwjs 4:60be78a172c2 76 // Allocate a message for GAP
dudnwjs 4:60be78a172c2 77 struct gapm_start_advertise_cmd cmd;
dudnwjs 4:60be78a172c2 78 cmd.op.code = GAPM_ADV_UNDIRECT;
dudnwjs 4:60be78a172c2 79 cmd.op.addr_src = GAPM_PUBLIC_ADDR;
dudnwjs 4:60be78a172c2 80 cmd.intv_min = APP_ADV_INT_MIN;
dudnwjs 4:60be78a172c2 81 cmd.intv_max = APP_ADV_INT_MAX;
dudnwjs 4:60be78a172c2 82 cmd.channel_map = APP_ADV_CHMAP;
dudnwjs 4:60be78a172c2 83 cmd.info.host.mode = GAP_GEN_DISCOVERABLE;
dudnwjs 4:60be78a172c2 84 cmd.info.host.adv_data_len = APP_ADV_DATA_MAX_SIZE;
dudnwjs 4:60be78a172c2 85 cmd.info.host.scan_rsp_data_len = APP_SCAN_RESP_DATA_MAX_SIZE;
dudnwjs 4:60be78a172c2 86
dudnwjs 4:60be78a172c2 87 /*-----------------------------------------------------------------------------------
dudnwjs 4:60be78a172c2 88 * Set the Advertising Data and the Scan Response Data
dudnwjs 4:60be78a172c2 89 *---------------------------------------------------------------------------------*/
dudnwjs 4:60be78a172c2 90
dudnwjs 4:60be78a172c2 91
dudnwjs 4:60be78a172c2 92 // Advertising Data
dudnwjs 4:60be78a172c2 93 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 94 if(nvds_get(NVDS_TAG_APP_BLE_ADV_DATA, &cmd.info.host.adv_data_len,
dudnwjs 4:60be78a172c2 95 &cmd.info.host.adv_data[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 96 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 97 {
dudnwjs 4:60be78a172c2 98 cmd.info.host.adv_data_len = APP_DFLT_ADV_DATA_LEN;
dudnwjs 4:60be78a172c2 99 memcpy(&cmd.info.host.adv_data[0], APP_DFLT_ADV_DATA, cmd.info.host.adv_data_len);
dudnwjs 4:60be78a172c2 100
dudnwjs 4:60be78a172c2 101 //Add list of UUID
dudnwjs 4:60be78a172c2 102 #if (BLE_APP_HT)
dudnwjs 4:60be78a172c2 103 cmd.info.host.adv_data_len += APP_HT_ADV_DATA_UUID_LEN;
dudnwjs 4:60be78a172c2 104 memcpy(&cmd.info.host.adv_data[APP_DFLT_ADV_DATA_LEN], APP_HT_ADV_DATA_UUID, APP_HT_ADV_DATA_UUID_LEN);
dudnwjs 4:60be78a172c2 105 #else
dudnwjs 4:60be78a172c2 106 #if (BLE_APP_NEB)
dudnwjs 4:60be78a172c2 107 cmd.info.host.adv_data_len += APP_NEB_ADV_DATA_UUID_LEN;
dudnwjs 4:60be78a172c2 108 memcpy(&cmd.info.host.adv_data[APP_DFLT_ADV_DATA_LEN], APP_NEB_ADV_DATA_UUID, APP_NEB_ADV_DATA_UUID_LEN);
dudnwjs 4:60be78a172c2 109 #endif //(BLE_APP_NEB)
dudnwjs 4:60be78a172c2 110 #endif //(BLE_APP_HT)
dudnwjs 4:60be78a172c2 111 }
dudnwjs 4:60be78a172c2 112
dudnwjs 4:60be78a172c2 113 // Scan Response Data
dudnwjs 4:60be78a172c2 114 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 115 if(nvds_get(NVDS_TAG_APP_BLE_SCAN_RESP_DATA, &cmd.info.host.scan_rsp_data_len,
dudnwjs 4:60be78a172c2 116 &cmd.info.host.scan_rsp_data[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 117 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 118 {
dudnwjs 4:60be78a172c2 119 cmd.info.host.scan_rsp_data_len = APP_SCNRSP_DATA_LENGTH;
dudnwjs 4:60be78a172c2 120 memcpy(&cmd.info.host.scan_rsp_data[0], APP_SCNRSP_DATA, cmd.info.host.scan_rsp_data_len);
dudnwjs 4:60be78a172c2 121 }
dudnwjs 4:60be78a172c2 122
dudnwjs 4:60be78a172c2 123 // Get remaining space in the Advertising Data - 2 bytes are used for name length/flag
dudnwjs 4:60be78a172c2 124 device_name_avail_space = APP_ADV_DATA_MAX_SIZE - cmd.info.host.adv_data_len - 2;
dudnwjs 4:60be78a172c2 125
dudnwjs 4:60be78a172c2 126 // Check if data can be added to the Advertising data
dudnwjs 4:60be78a172c2 127 if (device_name_avail_space > 0)
dudnwjs 4:60be78a172c2 128 {
dudnwjs 4:60be78a172c2 129 // Get the Device Name to add in the Advertising Data (Default one or NVDS one)
dudnwjs 4:60be78a172c2 130 #if (NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 131 device_name_length = NVDS_LEN_DEVICE_NAME;
dudnwjs 4:60be78a172c2 132 if (nvds_get(NVDS_TAG_DEVICE_NAME, &device_name_length, &device_name_temp_buf[0]) != NVDS_OK)
dudnwjs 4:60be78a172c2 133 #endif //(NVDS_SUPPORT)
dudnwjs 4:60be78a172c2 134 {
dudnwjs 4:60be78a172c2 135 // Get default Device Name (No name if not enough space)
dudnwjs 4:60be78a172c2 136 device_name_length = strlen(APP_DFLT_DEVICE_NAME);
dudnwjs 4:60be78a172c2 137 memcpy(&device_name_temp_buf[0], APP_DFLT_DEVICE_NAME, device_name_length);
dudnwjs 4:60be78a172c2 138 }
dudnwjs 4:60be78a172c2 139
dudnwjs 4:60be78a172c2 140 if(device_name_length > 0)
dudnwjs 4:60be78a172c2 141 {
dudnwjs 4:60be78a172c2 142 // Check available space
dudnwjs 4:60be78a172c2 143 if( device_name_length > device_name_avail_space)
dudnwjs 4:60be78a172c2 144 device_name_length = device_name_avail_space;
dudnwjs 4:60be78a172c2 145
dudnwjs 4:60be78a172c2 146 // Fill Length
dudnwjs 4:60be78a172c2 147 cmd.info.host.adv_data[cmd.info.host.adv_data_len] = device_name_length + 1;
dudnwjs 4:60be78a172c2 148 // Fill Device Name Flag
dudnwjs 4:60be78a172c2 149 cmd.info.host.adv_data[cmd.info.host.adv_data_len + 1] = '\x09';
dudnwjs 4:60be78a172c2 150 // Copy device name
dudnwjs 4:60be78a172c2 151 memcpy(&cmd.info.host.adv_data[cmd.info.host.adv_data_len + 2], device_name_temp_buf, device_name_length);
dudnwjs 4:60be78a172c2 152
dudnwjs 4:60be78a172c2 153 // Update Advertising Data Length
dudnwjs 4:60be78a172c2 154 cmd.info.host.adv_data_len += (device_name_length + 2);
dudnwjs 4:60be78a172c2 155 }
dudnwjs 4:60be78a172c2 156 }
dudnwjs 4:60be78a172c2 157
dudnwjs 4:60be78a172c2 158 // Send the message
dudnwjs 4:60be78a172c2 159 BMH->BleMsgAlloc(GAPM_START_ADVERTISE_CMD,TASK_GAPM, TASK_GTL,sizeof (struct gapm_start_advertise_cmd),&cmd,msg);
dudnwjs 4:60be78a172c2 160 BMH->BleSendMsg(msg, msg_size);
dudnwjs 4:60be78a172c2 161
dudnwjs 4:60be78a172c2 162 return;
dudnwjs 4:60be78a172c2 163 }
dudnwjs 4:60be78a172c2 164
dudnwjs 4:60be78a172c2 165 void app_set_mode(BleMsgHandler* BMH)
dudnwjs 4:60be78a172c2 166 {
dudnwjs 4:60be78a172c2 167 uint8_t *msg;
dudnwjs 4:60be78a172c2 168 struct gapm_set_dev_config_cmd cmd;
dudnwjs 4:60be78a172c2 169 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct gapm_set_dev_config_cmd);
dudnwjs 4:60be78a172c2 170 msg = new uint8_t[msg_size];
dudnwjs 4:60be78a172c2 171
dudnwjs 4:60be78a172c2 172 cmd.operation = GAPM_SET_DEV_CONFIG;
dudnwjs 4:60be78a172c2 173 // Device Role
dudnwjs 4:60be78a172c2 174 cmd.role = GAP_PERIPHERAL_SLV;
dudnwjs 4:60be78a172c2 175 // Device Appearance
dudnwjs 4:60be78a172c2 176 cmd.appearance = 0x0000;
dudnwjs 4:60be78a172c2 177 // Device Appearance write permission requirements for peer device
dudnwjs 4:60be78a172c2 178 cmd.appearance_write_perm = GAPM_WRITE_DISABLE;
dudnwjs 4:60be78a172c2 179 // Device Name write permission requirements for peer device
dudnwjs 4:60be78a172c2 180 cmd.name_write_perm = GAPM_WRITE_DISABLE;
dudnwjs 4:60be78a172c2 181 // Peripheral only: *****************************************************************
dudnwjs 5:e11b23f9aacc 182 // Maximum trasnimt unit size
dudnwjs 5:e11b23f9aacc 183 //cmd.max_mtu = 16;
dudnwjs 4:60be78a172c2 184 // Slave preferred Minimum of connection interval
dudnwjs 4:60be78a172c2 185 cmd.con_intv_min = 8; // 10ms (8*1.25ms)
dudnwjs 4:60be78a172c2 186 // Slave preferred Maximum of connection interval
dudnwjs 4:60be78a172c2 187 cmd.con_intv_max = 16; // 20ms (16*1.25ms)
dudnwjs 4:60be78a172c2 188 // Slave preferred Connection latency
dudnwjs 4:60be78a172c2 189 cmd.con_latency = 0;
dudnwjs 4:60be78a172c2 190 // Slave preferred Link supervision timeout
dudnwjs 4:60be78a172c2 191 cmd.superv_to = 100;
dudnwjs 4:60be78a172c2 192 // Privacy settings bit field
dudnwjs 4:60be78a172c2 193 cmd.flags = 0;
dudnwjs 4:60be78a172c2 194
dudnwjs 4:60be78a172c2 195 BMH->BleMsgAlloc(GAPM_SET_DEV_CONFIG_CMD, TASK_GAPM, TASK_GTL,sizeof(struct gapm_set_dev_config_cmd ),&cmd, msg);
dudnwjs 4:60be78a172c2 196 BMH->BleSendMsg(msg,msg_size);
dudnwjs 4:60be78a172c2 197
dudnwjs 4:60be78a172c2 198 return;
dudnwjs 4:60be78a172c2 199 }
dudnwjs 4:60be78a172c2 200
dudnwjs 4:60be78a172c2 201
dudnwjs 5:e11b23f9aacc 202 void app_fota_server_enable(ble_dev *device,BleMsgHandler* BMH)
dudnwjs 5:e11b23f9aacc 203 {
dudnwjs 5:e11b23f9aacc 204 uint8_t *msg;
dudnwjs 5:e11b23f9aacc 205 struct fota_server_enable_req req;
dudnwjs 5:e11b23f9aacc 206 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct fota_server_enable_req);
dudnwjs 5:e11b23f9aacc 207 req.conhdl = device->conhdl;
dudnwjs 5:e11b23f9aacc 208 req.sec_lvl = 1;
dudnwjs 5:e11b23f9aacc 209
dudnwjs 5:e11b23f9aacc 210 msg = new uint8_t[msg_size];
dudnwjs 5:e11b23f9aacc 211
dudnwjs 5:e11b23f9aacc 212 // Send the message
dudnwjs 5:e11b23f9aacc 213 BMH->BleMsgAlloc(FOTA_SERVER_ENABLE_REQ, TASK_FOTA_SERVER, TASK_GTL,sizeof(struct fota_server_enable_req),&req,msg);
dudnwjs 5:e11b23f9aacc 214 BMH->BleSendMsg(msg,msg_size);
dudnwjs 5:e11b23f9aacc 215 }
dudnwjs 5:e11b23f9aacc 216
dudnwjs 5:e11b23f9aacc 217 void app_dis_enable(ble_dev *device,BleMsgHandler* BMH)
dudnwjs 5:e11b23f9aacc 218 {
dudnwjs 5:e11b23f9aacc 219 uint8_t *msg;
dudnwjs 5:e11b23f9aacc 220 // Allocate the message
dudnwjs 5:e11b23f9aacc 221 struct diss_enable_req req;
dudnwjs 5:e11b23f9aacc 222 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(diss_enable_req);
dudnwjs 5:e11b23f9aacc 223 // Fill in the parameter structure
dudnwjs 5:e11b23f9aacc 224 req.conhdl = device->conhdl;
dudnwjs 5:e11b23f9aacc 225 req.sec_lvl = 1;
dudnwjs 5:e11b23f9aacc 226 req.con_type = PRF_CON_DISCOVERY;
dudnwjs 5:e11b23f9aacc 227
dudnwjs 5:e11b23f9aacc 228 msg = new uint8_t[msg_size];
dudnwjs 5:e11b23f9aacc 229
dudnwjs 5:e11b23f9aacc 230 // Send the message
dudnwjs 5:e11b23f9aacc 231 BMH->BleMsgAlloc(DISS_ENABLE_REQ,TASK_DISS, TASK_GTL, sizeof(struct diss_enable_req),&req,msg);
dudnwjs 5:e11b23f9aacc 232 BMH->BleSendMsg(msg,msg_size);
dudnwjs 5:e11b23f9aacc 233 }
dudnwjs 5:e11b23f9aacc 234
dudnwjs 5:e11b23f9aacc 235 void app_connect_confirm(uint8_t auth,ble_dev *device,BleMsgHandler* BMH)
dudnwjs 5:e11b23f9aacc 236 {
dudnwjs 5:e11b23f9aacc 237 uint8_t *msg;
dudnwjs 5:e11b23f9aacc 238 // confirm connection
dudnwjs 5:e11b23f9aacc 239 struct gapc_connection_cfm cfm;
dudnwjs 5:e11b23f9aacc 240 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(gapc_connection_cfm);
dudnwjs 5:e11b23f9aacc 241 cfm.auth = auth;
dudnwjs 5:e11b23f9aacc 242 cfm.authorize = GAP_AUTHZ_NOT_SET;
dudnwjs 5:e11b23f9aacc 243
dudnwjs 5:e11b23f9aacc 244 msg = new uint8_t[msg_size];
dudnwjs 5:e11b23f9aacc 245
dudnwjs 5:e11b23f9aacc 246 // Send the message
dudnwjs 5:e11b23f9aacc 247 BMH->BleMsgAlloc(GAPC_CONNECTION_CFM, KE_BUILD_ID(TASK_GAPC,device->conidx), TASK_GTL,sizeof (struct gapc_connection_cfm),&cfm,msg);
dudnwjs 5:e11b23f9aacc 248 BMH->BleSendMsg(msg,msg_size);
dudnwjs 5:e11b23f9aacc 249 }
dudnwjs 5:e11b23f9aacc 250
dudnwjs 5:e11b23f9aacc 251 void app_send_disconnect(uint16_t dst, uint16_t conhdl, uint8_t reason,BleMsgHandler* BMH)
dudnwjs 5:e11b23f9aacc 252 {
dudnwjs 5:e11b23f9aacc 253 uint8_t *msg;
dudnwjs 5:e11b23f9aacc 254 struct gapc_disconnect_ind disconnect_ind;
dudnwjs 5:e11b23f9aacc 255 unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(gapc_disconnect_ind);
dudnwjs 5:e11b23f9aacc 256 // fill parameters
dudnwjs 5:e11b23f9aacc 257 disconnect_ind.conhdl = conhdl;
dudnwjs 5:e11b23f9aacc 258 disconnect_ind.reason = reason;
dudnwjs 5:e11b23f9aacc 259
dudnwjs 5:e11b23f9aacc 260 msg = new uint8_t[msg_size];
dudnwjs 5:e11b23f9aacc 261
dudnwjs 5:e11b23f9aacc 262 // send indication
dudnwjs 5:e11b23f9aacc 263 BMH->BleMsgAlloc(GAPC_DISCONNECT_IND,dst, TASK_GTL,sizeof(struct gapc_disconnect_ind),&disconnect_ind,msg);
dudnwjs 5:e11b23f9aacc 264 BMH->BleSendMsg(msg,msg_size);
dudnwjs 5:e11b23f9aacc 265 }
dudnwjs 5:e11b23f9aacc 266
dudnwjs 5:e11b23f9aacc 267
dudnwjs 3:1e70387e1337 268 }//namespace