{"id":1037,"date":"2025-01-12T22:29:51","date_gmt":"2025-01-12T22:29:51","guid":{"rendered":"https:\/\/www.bleuio.com\/blog\/?p=1037"},"modified":"2025-01-13T10:00:20","modified_gmt":"2025-01-13T10:00:20","slug":"building-a-ble-real-time-macos-menu-bar-app-using-bleuio","status":"publish","type":"post","link":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/","title":{"rendered":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In this tutorial, we will guide you through creating a BLE real-time <strong>macOS<\/strong> menu bar application using the <strong>BleuIO<\/strong> USB BLE dongle. BleuIO is an incredibly versatile tool that simplifies the development of BLE (Bluetooth Low Energy) applications, making it ideal for developers looking to build innovative projects with ease.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">macOS menu bar applications offer a seamless way to monitor and interact with data in real time without requiring a dedicated application window. By leveraging the power of the BleuIO dongle, we can create a menu bar app that provides live updates on environmental metrics like temperature, humidity, and CO2 levels. This project demonstrates how BleuIO can be integrated into real-time applications, showcasing its potential for BLE-based projects.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why is This Project Useful?<\/h3>\n\n\n\n<ul start=\"1\" class=\"wp-block-list\">\n<li><strong>Real-Time Updates:<\/strong> The app fetches BLE data at regular intervals and updates the macOS menu bar dynamically.<\/li>\n\n\n\n<li><strong>Ease of Access:<\/strong> The macOS menu bar provides a non-intrusive interface, allowing users to access live data at a glance.<\/li>\n\n\n\n<li><strong>Extensibility:<\/strong> This tutorial serves as a starting point for developers to explore more advanced BLE applications with BleuIO.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Requirements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To complete this project, you will need:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/www.bleuio.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">BleuIO USB BLE Dongle:<\/a><\/strong> A powerful and easy-to-use BLE dongle for developing BLE applications.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.hibouair.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">HibouAir &#8211; Air Quality Monitor:<\/a><\/strong> A BLE-enabled air quality monitor that broadcasts real-time environmental data such as temperature,pressure,voc,light, humidity, and CO2 levels.<\/li>\n\n\n\n<li><strong>macOS System:<\/strong> A macOS device with Python 3 installed.<\/li>\n\n\n\n<li><strong>Python Libraries:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>rumps<\/code>: For creating macOS menu bar applications.<\/li>\n\n\n\n<li><code>bleuio<\/code>: For communicating with the BleuIO dongle.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">How Real-Time Updates Are Handled<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The app connects to the BleuIO dongle and scans for BLE advertisements air quality data from HibouAir. Using a timer, the app periodically initiates a scan every 2 minutes. The decoded data is then displayed directly in the macOS menu bar, providing real-time updates without user intervention.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step-by-Step Guide<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Set Up the Environment<\/h4>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Ensure you have a macOS system with Python 3 installed.<\/li>\n\n\n\n<li>Install the necessary dependencies using <code>pip<\/code>:<br><code>pip install rumps bleuio<\/code><\/li>\n\n\n\n<li>Plug in your BleuIO USB dongle.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Project Overview<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Our goal is to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connect to the BleuIO dongle.<\/li>\n\n\n\n<li>Put the dongle in <strong>Central Mode<\/strong> to scan for BLE advertisements.<\/li>\n\n\n\n<li>Scan for real time air quality data from HibouAir<\/li>\n\n\n\n<li>Decode the advertisement data to extract temperature, humidity, pressure, and CO2 levels.<\/li>\n\n\n\n<li>Update the macOS menu bar with the decoded data in real time.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: Writing the Code<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Below is the Python script for the macOS menu bar app. This code handles the dongle initialization, data scanning, decoding, and menu updates.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import rumps\nimport time\nimport json\nfrom datetime import datetime\nfrom bleuio_lib.bleuio_funcs import BleuIO\nboardID=\"220069\"\n\n# Function to decode advertisement data\ndef adv_data_decode(adv):\n    try:\n        pos = adv.find(\"5B0705\")\n        if pos == -1:\n            raise ValueError(\"Invalid advertisement data: '5B0705' not found.\")\n\n        dt = datetime.now()\n        current_ts = dt.strftime(\"%Y\/%m\/%d %H:%M:%S\")\n\n        # Temperature decoding\n        temp_hex = int(adv&#91;pos + 22:pos + 26]&#91;::-1], 16)  # Reversed bytes\n        if temp_hex > 1000:\n            temp_hex = (temp_hex - (65535 + 1)) \/ 10\n        else:\n            temp_hex = temp_hex \/ 10\n\n        # Pressure decoding (convert from little-endian)\n        pressure_bytes = bytes.fromhex(adv&#91;pos + 18:pos + 22])\n        pressure = int.from_bytes(pressure_bytes, byteorder='little') \/ 10\n\n        # Humidity decoding (convert from little-endian)\n        humidity_bytes = bytes.fromhex(adv&#91;pos + 26:pos + 30])\n        humidity = int.from_bytes(humidity_bytes, byteorder='little') \/ 10\n\n        return {\n            \"boardID\": adv&#91;pos + 8:pos + 14],\n            \"pressure\": pressure,\n            \"temp\": temp_hex,\n            \"hum\": humidity,\n            \"co2\": int(adv&#91;pos + 46:pos + 50], 16),\n            \"ts\": current_ts,\n        }\n    except Exception as e:\n        print(f\"Error decoding advertisement data: {e}\")\n        return {}\n\n\n# Callback function for scan results\ndef my_scan_callback(scan_input):\n    try:\n        scan_result = json.loads(scan_input&#91;0])\n        data = scan_result.get(\"data\", \"\")\n\n        decoded_data = adv_data_decode(data)\n\n        # Update menu with decoded data\n        app.update_menu(decoded_data)\n\n    except Exception as e:\n        print(f\"Error parsing scan result: {e}\")\n\n# Callback function for events\ndef my_evt_callback(evt_input):\n    cbTime = datetime.now()\n    currentTime = cbTime.strftime(\"%H:%M:%S\")\n    print(f\"\\n\\n&#91;{currentTime}] Event: {evt_input}\")\n\nclass AirQualityApp(rumps.App):\n    def __init__(self):\n        super(AirQualityApp, self).__init__(\"CO2 : 550\")\n        self.my_dongle = None  # Placeholder for the dongle object\n        self.co2_item = rumps.MenuItem(title=\"CO2 : 550ppm\", callback=lambda _: None)\n        self.temp_item = rumps.MenuItem(title=\"Temperature: 25\u00b0C\", callback=lambda _: None)\n        self.hum_item = rumps.MenuItem(title=\"Humidity: 65 %rh\", callback=lambda _: None)\n        self.press_item = rumps.MenuItem(title=\"Pressure: 1000 mbar\", callback=lambda _: None)\n\n        self.menu = &#91;\n            self.co2_item,\n            self.temp_item,\n            self.hum_item,\n            self.press_item,\n            None  # Separator\n        ]\n\n        # Establish connection and start scanning on startup\n        self.connect_dongle()\n        self.start_periodic_scan()\n\n    def connect_dongle(self):\n        try:\n            self.my_dongle = BleuIO()  # Initialize the dongle\n            self.my_dongle.register_evt_cb(my_evt_callback)  # Register event callback\n            self.my_dongle.register_scan_cb(my_scan_callback)  # Register scan callback\n            print(\"Dongle connected successfully.\")\n\n            # Set the dongle to central mode\n            response = self.my_dongle.at_central()\n            print(\"Dongle is now in central mode.\")\n\n        except Exception as e:\n            print(f\"Error connecting to dongle: {e}\")\n\n    def scan(self, _=None):  # Added `_` to accept the timer argument\n        try:\n            # Start scanning for specific data\n            response = self.my_dongle.at_findscandata(boardID, 3)\n            print(f\"Scan initiated. Response: {response.Rsp}\")\n        except Exception as e:\n            print(f\"Error during scan: {e}\")\n\n    def start_periodic_scan(self):\n        try:\n            rumps.timer(120)(self.scan)  # Run the scan method every 30 seconds\n        except Exception as e:\n            print(f\"Error setting up periodic scan: {e}\")\n\n    def update_menu(self, decoded_data):\n        try:\n            self.title = f\"CO2 : {decoded_data.get('co2', 'N\/A')}ppm\"  # Update app title\n            self.co2_item.title = f\"CO2 : {decoded_data.get('co2', 'N\/A')}ppm\"\n            self.temp_item.title = f\"Temperature: {decoded_data.get('temp', 'N\/A')}\u00b0C\"\n            self.hum_item.title = f\"Humidity: {decoded_data.get('hum', 'N\/A')} %rh\"\n            self.press_item.title = f\"Pressure: {decoded_data.get('pressure', 'N\/A')} mbar\"\n        except Exception as e:\n            print(f\"Error updating menu: {e}\")\n\nif __name__ == \"__main__\":\n    app = AirQualityApp()\n    app.run()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note : Make sure to change the BoardID to your HibouAir CO2 device on line 6<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Run the App<\/h4>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Save the script as <code>bleuio.py<\/code>.<\/li>\n\n\n\n<li>Run the script using:<br><code>python bleuio.py<\/code><\/li>\n\n\n\n<li>The app will appear in the macOS menu bar with latest CO2 value. Click the icon to view the live BLE data updates.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Output<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"342\" src=\"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/image-1024x342.png\" alt=\"\" class=\"wp-image-1039\" srcset=\"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/image-1024x342.png 1024w, https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/image-300x100.png 300w, https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/image-768x256.png 768w, https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/image.png 1106w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Extending the Project<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This project is a foundation for exploring the capabilities of BleuIO. You can extend it to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Monitor additional BLE devices.<\/li>\n\n\n\n<li>Implement alert notifications for specific data thresholds.<\/li>\n\n\n\n<li>Log the data to a file or send it to a cloud service for further analysis.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial demonstrates how to create a real-time macOS menu bar application using the BleuIO dongle. By following this guide, you\u2019ll not only learn how to handle BLE data but also understand how to integrate it into user-friendly macOS applications. BleuIO opens up endless possibilities for BLE-based projects, and we\u2019re excited to see what you create next!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we will guide you through creating a BLE real-time macOS menu bar application using the BleuIO USB BLE dongle. BleuIO is an incredibly versatile tool that simplifies the development of BLE (Bluetooth Low Energy) applications, making it ideal for developers looking to build innovative projects with ease. macOS menu bar applications offer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1038,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,2],"tags":[],"class_list":["post-1037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bleuio","category-bleuio-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application\" \/>\n<meta property=\"og:description\" content=\"In this tutorial, we will guide you through creating a BLE real-time macOS menu bar application using the BleuIO USB BLE dongle. BleuIO is an incredibly versatile tool that simplifies the development of BLE (Bluetooth Low Energy) applications, making it ideal for developers looking to build innovative projects with ease. macOS menu bar applications offer [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/\" \/>\n<meta property=\"og:site_name\" content=\"BleuIO - Create Bluetooth Low Energy application\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-12T22:29:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-13T10:00:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"407\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"BleuIO\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/\"},\"author\":{\"name\":\"BleuIO\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\"},\"headline\":\"Building a BLE Real-Time macOS Menu Bar App Using BleuIO\",\"datePublished\":\"2025-01-12T22:29:51+00:00\",\"dateModified\":\"2025-01-13T10:00:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/\"},\"wordCount\":573,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/macos-menubar-app.jpg\",\"articleSection\":[\"BleuIO\",\"BleuIO tutorial\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/\",\"name\":\"Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/macos-menubar-app.jpg\",\"datePublished\":\"2025-01-12T22:29:51+00:00\",\"dateModified\":\"2025-01-13T10:00:20+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/macos-menubar-app.jpg\",\"contentUrl\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/macos-menubar-app.jpg\",\"width\":900,\"height\":407,\"caption\":\"macos menubar app\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a BLE Real-Time macOS Menu Bar App Using BleuIO\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/\",\"name\":\"BleuIO - Create Bluetooth Low Energy application\",\"description\":\"Learn Bluetooth Low Energy programming and build Bluetooth Low Energy Application\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/#\\\/schema\\\/person\\\/89bc581382d5964043f96efc54b75b80\",\"name\":\"BleuIO\",\"sameAs\":[\"https:\\\/\\\/www.bleuio.com\\\/blog\"],\"url\":\"https:\\\/\\\/www.bleuio.com\\\/blog\\\/author\\\/biadmin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/","og_locale":"en_US","og_type":"article","og_title":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application","og_description":"In this tutorial, we will guide you through creating a BLE real-time macOS menu bar application using the BleuIO USB BLE dongle. BleuIO is an incredibly versatile tool that simplifies the development of BLE (Bluetooth Low Energy) applications, making it ideal for developers looking to build innovative projects with ease. macOS menu bar applications offer [&hellip;]","og_url":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/","og_site_name":"BleuIO - Create Bluetooth Low Energy application","article_published_time":"2025-01-12T22:29:51+00:00","article_modified_time":"2025-01-13T10:00:20+00:00","og_image":[{"width":900,"height":407,"url":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg","type":"image\/jpeg"}],"author":"BleuIO","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#article","isPartOf":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/"},"author":{"name":"BleuIO","@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80"},"headline":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO","datePublished":"2025-01-12T22:29:51+00:00","dateModified":"2025-01-13T10:00:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/"},"wordCount":573,"commentCount":0,"image":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg","articleSection":["BleuIO","BleuIO tutorial"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/","url":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/","name":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO - BleuIO - Create Bluetooth Low Energy application","isPartOf":{"@id":"https:\/\/www.bleuio.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#primaryimage"},"image":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#primaryimage"},"thumbnailUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg","datePublished":"2025-01-12T22:29:51+00:00","dateModified":"2025-01-13T10:00:20+00:00","author":{"@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80"},"breadcrumb":{"@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#primaryimage","url":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg","contentUrl":"https:\/\/www.bleuio.com\/blog\/wp-content\/uploads\/2025\/01\/macos-menubar-app.jpg","width":900,"height":407,"caption":"macos menubar app"},{"@type":"BreadcrumbList","@id":"https:\/\/www.bleuio.com\/blog\/building-a-ble-real-time-macos-menu-bar-app-using-bleuio\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.bleuio.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Building a BLE Real-Time macOS Menu Bar App Using BleuIO"}]},{"@type":"WebSite","@id":"https:\/\/www.bleuio.com\/blog\/#website","url":"https:\/\/www.bleuio.com\/blog\/","name":"BleuIO - Create Bluetooth Low Energy application","description":"Learn Bluetooth Low Energy programming and build Bluetooth Low Energy Application","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bleuio.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.bleuio.com\/blog\/#\/schema\/person\/89bc581382d5964043f96efc54b75b80","name":"BleuIO","sameAs":["https:\/\/www.bleuio.com\/blog"],"url":"https:\/\/www.bleuio.com\/blog\/author\/biadmin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/comments?post=1037"}],"version-history":[{"count":7,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1037\/revisions"}],"predecessor-version":[{"id":1049,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/posts\/1037\/revisions\/1049"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/media\/1038"}],"wp:attachment":[{"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/media?parent=1037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/categories?post=1037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bleuio.com\/blog\/wp-json\/wp\/v2\/tags?post=1037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}