# killerbee **Repository Path**: gathon/killerbee ## Basic Information - **Project Name**: killerbee - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-27 - **Last Updated**: 2026-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # killerbee MQTT android client For comparison with [Paho Client](https://github.com/eclipse/paho.mqtt.android) check the blog on [Killer Bee vs Paho](https://medium.com/adonmo-tech/killer-bee-3d88ef82d1de). ## Adding as a Dependency This package is currently hosted as a github package. Github currently supports public package hosting but requires github personal access token to fetch them. In short you need to have a github account to use this as a dependency. ### Setting up github credentials * [Generate an github personal access token with repo actions and read:packages access](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) * Create a file `github.properties` in project root. * Add `github.properties` filename to `.gitgnore` to avoid adding it to version control. * Add the github values to the `github.properties` file ```bash GITHUB_USER= GITHUB_PERSONAL_ACCESS_TOKEN= ``` ### Add maven repository for github package Add the maven repo for `KillerBee` as shown below in `build.gradle` of the project root. ```groovy def githubProperties = new Properties() githubProperties.load(new FileInputStream(rootProject.file("github.properties"))) allprojects { repositories { google() mavenCentral() //Use for local testing of library after assemble and publishToMavenLocal //mavenLocal() maven { name = "KillerBee" url = uri("https://maven.pkg.github.com/adonmo/killerbee") credentials { username = githubProperties['GITHUB_USER'] password = githubProperties['GITHUB_PERSONAL_ACCESS_TOKEN'] } } } } ``` ### Add dependency to build.gradle in app folder ```groovy implementation 'com.adonmo.libraries:killerbee:1.0.1' ``` ## Sample Implementation ```java package com.adonmo.sample.killerbee import android.os.Bundle import android.os.Handler import android.os.HandlerThread import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.adonmo.killerbee.AndroidMQTTClient import com.adonmo.killerbee.IMQTTConnectionCallback import com.adonmo.killerbee.action.MQTTActionStatus import com.adonmo.killerbee.adapter.ConnectOptions import com.adonmo.killerbee.helper.Constants.LOG_TAG import java.util.concurrent.ScheduledThreadPoolExecutor class MainActivity : AppCompatActivity(), IMQTTConnectionCallback { private lateinit var mqttThread: HandlerThread private lateinit var mqttHandler: Handler private lateinit var mqttClient: AndroidMQTTClient private lateinit var executor: ScheduledThreadPoolExecutor override fun onCreate(savedInstanceState: Bundle?) { Log.v(LOG_TAG, "Running on thread [${Thread.currentThread()}]") super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mqttThread = HandlerThread("mqttThread") mqttThread.start() mqttHandler = Handler(mqttThread.looper) /* As it stands a minimum of 4 threads seems to be necessary to let the MQTT client run as it blocks a few of them(3 based on testing) with a looper most likely */ executor = ScheduledThreadPoolExecutor(4) mqttClient = AndroidMQTTClient( ConnectOptions( clientID = "OG", serverURI = "tcp://broker.hivemq.com:1883", cleanSession = true, keepAliveInterval = 30, maxReconnectDelay = 60000, automaticReconnect = true, ), mqttHandler, this, executorService = executor ) mqttClient.connect() } override fun connectActionFinished( status: MQTTActionStatus, connectOptions: ConnectOptions, throwable: Throwable? ) { if (status == MQTTActionStatus.SUCCESS) { mqttClient.subscribe("Jello", 1) mqttClient.subscribe(arrayOf("HelloBee", "BeeHello"), intArrayOf(1, 0)) } else { Log.e( LOG_TAG, "Connection Action Failed for [${connectOptions.clientID}] to [${connectOptions.serverURI}]" ) } } override fun disconnectActionFinished(status: MQTTActionStatus, throwable: Throwable?) { Log.d(LOG_TAG, "Disconnect Action Status: [$status]") } override fun publishActionFinished( status: MQTTActionStatus, messagePayload: ByteArray, throwable: Throwable? ) { if (status == MQTTActionStatus.SUCCESS) { Log.d(LOG_TAG, "Published message $messagePayload") } } override fun subscribeActionFinished( status: MQTTActionStatus, topic: String, throwable: Throwable? ) { if (status == MQTTActionStatus.SUCCESS) { mqttClient.publish("HelloBee", "World".toByteArray(), 1, false) } } override fun subscribeMultipleActionFinished( status: MQTTActionStatus, topics: Array, throwable: Throwable? ) { if (status == MQTTActionStatus.SUCCESS) { mqttClient.publish("HelloBee", "World".toByteArray(), 1, false) } } override fun connectionLost(connectOptions: ConnectOptions, throwable: Throwable?) { Log.d( LOG_TAG, "Connection lost for [${connectOptions.clientID}] from [${connectOptions.serverURI}]" ) } override fun messageArrived( topic: String?, message: ByteArray? ) { message?.let { Log.d(LOG_TAG, "Received message [$message]") } //mqttClient.disconnect() } } ```