Last active
July 10, 2024 13:54
-
-
Save N3MIS15/589062360a658a36b9c810fec8bb0c91 to your computer and use it in GitHub Desktop.
micropython iBeacon example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import struct | |
import ubluetooth as bt | |
from micropython import const | |
MANUFACTURER_ID = const(0x004C) | |
DEVICE_TYPE = const(0x02) | |
DATA_LENGTH = const(0x15) | |
BR_EDR_NOT_SUPPORTED = const(0x04) | |
FLAG_BROADCAST = const(0x01) | |
MANUFACTURER_DATA = const(0xFF) | |
def convert_tx_power(dbm): | |
return dbm + 0xFF + 1 | |
class iBeacon(): | |
def __init__(self, ble, uuid, major, minor, tx_power): | |
# Setup BLE | |
self.ble = ble | |
self.ble.active(False) | |
self.ble.active(True) | |
print("BLE Activated") | |
self.uuid = uuid | |
self.major = major | |
self.minor = minor | |
self.tx_power = convert_tx_power(tx_power) | |
self.adv_payload = self.create_payload() | |
def create_payload(self): | |
payload = bytearray() | |
#Set advertising flag | |
value = struct.pack('B', BR_EDR_NOT_SUPPORTED) | |
payload += struct.pack('BB', len(value) + 1, FLAG_BROADCAST) + value | |
# Set advertising data | |
value = struct.pack('<H2B', MANUFACTURER_ID, DEVICE_TYPE, DATA_LENGTH) | |
value += self.uuid | |
value += struct.pack(">2HB", self.major, self.minor, self.tx_power) | |
payload += struct.pack('BB', len(value) + 1, MANUFACTURER_DATA) + value | |
return payload | |
def advertise(self, interval_us=100000): | |
print("Advertising: " + str(self.adv_payload)) | |
self.ble.gap_advertise(None) | |
self.ble.gap_advertise(interval_us, adv_data=self.adv_payload, connectable=False) | |
def update(self, major, minor, advertise_interval): | |
self.ble.active(False) | |
self.major = major | |
self.minor = minor | |
self.adv_payload = self.create_payload() | |
self.ble.active(True) | |
self.advertise(advertise_interval) | |
def demo(): | |
beacon = iBeacon( | |
ble = bt.BLE(), | |
uuid = bytearray(( | |
0xa4, 0x95, 0xbb, 0x10, 0xc5, 0xb1, 0x4b, 0x44, | |
0xb5, 0x12, 0x13, 0x70, 0xf0, 0x2d, 0x74, 0xde | |
)), | |
major = 62, | |
minor = 1050, | |
tx_power = -50, | |
) | |
beacon.advertise() | |
if __name__ == "__main__": | |
demo() | |
while True: | |
pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the contribution, N3MIS15.
It doesn't seem to have any relevance to controlling the advertisement tx power using the currently available micropython library. Am I missing something here/
I was hoping that someone might be able to point me towards full documentation.