| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- #include <assert.h>
- #include <stdbool.h>
- #include <stdint.h>
- #include "nimble/nimble_port.h"
- #include "host/ble_hs.h"
- #include "host/util/util.h"
- #include "services/gap/ble_svc_gap.h"
- static const char gap_name[] = "nimble";
- static uint8_t own_addr_type;
- static void start_advertise(void);
- static void
- put_ad(uint8_t ad_type, uint8_t ad_len, const void *ad, uint8_t *buf,
- uint8_t *len)
- {
- buf[(*len)++] = ad_len + 1;
- buf[(*len)++] = ad_type;
- memcpy(&buf[*len], ad, ad_len);
- *len += ad_len;
- }
- static void
- update_ad(void)
- {
- uint8_t ad[BLE_HS_ADV_MAX_SZ];
- uint8_t ad_len = 0;
- uint8_t ad_flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
- put_ad(BLE_HS_ADV_TYPE_FLAGS, 1, &ad_flags, ad, &ad_len);
- put_ad(BLE_HS_ADV_TYPE_COMP_NAME, sizeof(gap_name), gap_name, ad, &ad_len);
- ble_gap_adv_set_data(ad, ad_len);
- }
- static int
- gap_event_cb(struct ble_gap_event *event, void *arg)
- {
- switch (event->type) {
- case BLE_GAP_EVENT_CONNECT:
- if (event->connect.status) {
- start_advertise();
- }
- break;
- case BLE_GAP_EVENT_DISCONNECT:
- start_advertise();
- break;
- }
- return 0;
- }
- static void
- start_advertise(void)
- {
- struct ble_gap_adv_params advp;
- int rc;
- printf("advertise\n");
- update_ad();
- memset(&advp, 0, sizeof advp);
- advp.conn_mode = BLE_GAP_CONN_MODE_UND;
- advp.disc_mode = BLE_GAP_DISC_MODE_GEN;
- rc = ble_gap_adv_start(own_addr_type, NULL, BLE_HS_FOREVER,
- &advp, gap_event_cb, NULL);
- assert(rc == 0);
- }
- static void
- app_ble_sync_cb(void)
- {
- int rc;
- ble_addr_t addr;
- /* generate new non-resolvable private address */
- rc = ble_hs_id_gen_rnd(1, &addr);
- assert(rc == 0);
- /* set generated address */
- rc = ble_hs_id_set_rnd(addr.val);
- assert(rc == 0);
- rc = ble_hs_util_ensure_addr(0);
- assert(rc == 0);
- rc = ble_hs_id_infer_auto(0, &own_addr_type);
- assert(rc == 0);
- start_advertise();
- }
- void
- nimble_host_task(void *param)
- {
- ble_hs_cfg.sync_cb = app_ble_sync_cb;
- ble_svc_gap_device_name_set(gap_name);
- nimble_port_run();
- }
|