ubluepy_eddystone.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from ubluepy import Peripheral, constants
  2. BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE = const(0x02)
  3. BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED = const(0x04)
  4. 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)
  5. EDDYSTONE_FRAME_TYPE_URL = const(0x10)
  6. EDDYSTONE_URL_PREFIX_HTTP_WWW = const(0x00) # "http://www".
  7. EDDYSTONE_URL_SUFFIX_DOT_COM = const(0x01) # ".com"
  8. def string_to_binarray(text):
  9. b = bytearray([])
  10. for c in text:
  11. b.append(ord(c))
  12. return b
  13. def gen_ad_type_content(ad_type, data):
  14. b = bytearray(1)
  15. b.append(ad_type)
  16. b.extend(data)
  17. b[0] = len(b) - 1
  18. return b
  19. def generate_eddystone_adv_packet(url):
  20. # flags
  21. disc_mode = bytearray([BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE])
  22. packet_flags = gen_ad_type_content(constants.ad_types.AD_TYPE_FLAGS, disc_mode)
  23. # 16-bit uuid
  24. uuid = bytearray([0xAA, 0xFE])
  25. packet_uuid16 = gen_ad_type_content(constants.ad_types.AD_TYPE_16BIT_SERVICE_UUID_COMPLETE, uuid)
  26. # eddystone data
  27. rssi = 0xEE # -18 dB, approx signal strength at 0m.
  28. eddystone_data = bytearray([])
  29. eddystone_data.append(EDDYSTONE_FRAME_TYPE_URL)
  30. eddystone_data.append(rssi)
  31. eddystone_data.append(EDDYSTONE_URL_PREFIX_HTTP_WWW)
  32. eddystone_data.extend(string_to_binarray(url))
  33. eddystone_data.append(EDDYSTONE_URL_SUFFIX_DOT_COM)
  34. # service data
  35. service_data = uuid + eddystone_data
  36. packet_service_data = gen_ad_type_content(constants.ad_types.AD_TYPE_SERVICE_DATA, service_data)
  37. # generate advertisment packet
  38. packet = bytearray([])
  39. packet.extend(packet_flags)
  40. packet.extend(packet_uuid16)
  41. packet.extend(packet_service_data)
  42. return packet
  43. def start():
  44. adv_packet = generate_eddystone_adv_packet("micropython")
  45. p = Peripheral()
  46. p.advertise(data=adv_packet, connectable=False)