| from ubluepy import Peripheral, constants |
| |
| BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE = const(0x02) |
| BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED = const(0x04) |
| |
| BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE = const( |
| BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED |
| ) |
| |
| EDDYSTONE_FRAME_TYPE_URL = const(0x10) |
| EDDYSTONE_URL_PREFIX_HTTP_WWW = const(0x00) # "http://www". |
| EDDYSTONE_URL_SUFFIX_DOT_COM = const(0x01) # ".com" |
| |
| |
| def string_to_binarray(text): |
| b = bytearray([]) |
| for c in text: |
| b.append(ord(c)) |
| return b |
| |
| |
| def gen_ad_type_content(ad_type, data): |
| b = bytearray(1) |
| b.append(ad_type) |
| b.extend(data) |
| b[0] = len(b) - 1 |
| return b |
| |
| |
| def generate_eddystone_adv_packet(url): |
| # flags |
| disc_mode = bytearray([BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE]) |
| packet_flags = gen_ad_type_content(constants.ad_types.AD_TYPE_FLAGS, disc_mode) |
| |
| # 16-bit uuid |
| uuid = bytearray([0xAA, 0xFE]) |
| packet_uuid16 = gen_ad_type_content( |
| constants.ad_types.AD_TYPE_16BIT_SERVICE_UUID_COMPLETE, uuid |
| ) |
| |
| # eddystone data |
| rssi = 0xEE # -18 dB, approx signal strength at 0m. |
| eddystone_data = bytearray([]) |
| eddystone_data.append(EDDYSTONE_FRAME_TYPE_URL) |
| eddystone_data.append(rssi) |
| eddystone_data.append(EDDYSTONE_URL_PREFIX_HTTP_WWW) |
| eddystone_data.extend(string_to_binarray(url)) |
| eddystone_data.append(EDDYSTONE_URL_SUFFIX_DOT_COM) |
| |
| # service data |
| service_data = uuid + eddystone_data |
| packet_service_data = gen_ad_type_content( |
| constants.ad_types.AD_TYPE_SERVICE_DATA, service_data |
| ) |
| |
| # generate advertisment packet |
| packet = bytearray([]) |
| packet.extend(packet_flags) |
| packet.extend(packet_uuid16) |
| packet.extend(packet_service_data) |
| |
| return packet |
| |
| |
| def start(): |
| adv_packet = generate_eddystone_adv_packet("micropython") |
| p = Peripheral() |
| p.advertise(data=adv_packet, connectable=False) |