Skip to content

Commit

Permalink
Finally Prototype (#62)
Browse files Browse the repository at this point in the history
Co-authored-by: e1turin <48864186+e1turin@users.noreply.github.com>
Co-authored-by: Victor Smirnov <53015676+vityaman@users.noreply.github.com>
Co-authored-by: FineGoose <90922868+YuikoSempai@users.noreply.github.com>
  • Loading branch information
4 people authored May 22, 2024
1 parent 720d141 commit 467b9f6
Show file tree
Hide file tree
Showing 127 changed files with 5,904 additions and 1,309 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.idea

# Compiled class file
*.class

Expand Down
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/deploymentTargetDropDown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/migrations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .markdownlint.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
MD013:
line_length: 80
line_length: 100
strict: true
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ An IoT service with mobile client and microservices arhitecture.

# Content

- [Technical task](./doc/technical-task.md)
- [Technical task](./doc/technical-task.md)
- [Swagger](doc/SWAGGER.md)
3 changes: 3 additions & 0 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,8 @@ kotlin {
}

dependencies {
implementation(libs.redisson)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.coroutines.core)
implementation(libs.org.eclipse.paho.client.mqttv3)
}
51 changes: 34 additions & 17 deletions common/src/main/kotlin/org/vivlaniv/nexohub/ConnectionTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,37 @@ import java.util.*

// connection-service tasks

@Serializable
data class AuthUserTask(
override val id: String = UUID.randomUUID().toString(),
val username: String,
val password: String
) : Task

@Serializable
data class AuthUserTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null,
val token: String? = null
) : TaskResult


@Serializable
data class RegisterUserTask(
override val id: String = UUID.randomUUID().toString(),
val username: String,
val password: String
) : Task

@Serializable
data class RegisterUserTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null
) : TaskResult


@Serializable
data class SearchDevicesTask(
override val id: String = UUID.randomUUID().toString()
Expand All @@ -13,7 +44,9 @@ data class SearchDevicesTask(
@Serializable
data class SearchDevicesTaskResult(
override val tid: String,
val devices: List<DeviceInfo>
override val code: Int = 0,
override val errorMessage: String? = null,
val devices: List<DeviceInfo>? = null
) : TaskResult


Expand Down Expand Up @@ -76,20 +109,4 @@ data class PutDevicePropertyTaskResult(
override val code: Int = 0,
override val errorMessage: String? = null,
val device: String,
) : TaskResult


@Serializable
data class SendDeviceSignalTask(
override val id: String = UUID.randomUUID().toString(),
val device: String,
val signal: String,
val arguments: List<Int> = listOf()
) : Task

@Serializable
data class SendDeviceSignalTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null
) : TaskResult
31 changes: 31 additions & 0 deletions common/src/main/kotlin/org/vivlaniv/nexohub/DbTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,37 @@ import java.util.*

// db-service tasks


@Serializable
data class FindUserTask(
override val id: String = UUID.randomUUID().toString(),
val username: String
) : Task

@Serializable
data class FindUserTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null,
val passwordHash: String? = null
) : TaskResult


@Serializable
data class SaveUserTask(
override val id: String = UUID.randomUUID().toString(),
val username: String,
val passwordHash: String
) : Task

@Serializable
data class SaveUserTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null
) : TaskResult


@Serializable
data class GetSavedDevicesTask(
override val id: String = UUID.randomUUID().toString(),
Expand Down
18 changes: 7 additions & 11 deletions common/src/main/kotlin/org/vivlaniv/nexohub/Model.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,19 @@ import kotlinx.serialization.Serializable
enum class Type {
BOOLEAN, // 0 or 1
PERCENT, // value from 0 to 100
BYTE, // value from 0 to 255
TEMPERATURE // temperature value
COLOR, // color value (empty byte + red + green + blue)
TEMPERATURE, // temperature value
HUMIDITY, // humidity value (percent like in range [10,80])
ENUM, // ordinal of enum value
}

@Serializable
data class Schema(
val type: Type,
val min: Int? = null,
val max: Int? = null
val max: Int? = null,
val enumValues: List<String>? = null,
val isSensor: Boolean? = null,
)

@Serializable
Expand All @@ -25,18 +29,11 @@ data class PropertyInfo(
val value: Int
)

@Serializable
data class SignalInfo(
val name: String,
val args: List<Schema>
)

@Serializable
data class DeviceInfo(
val id: String,
val type: String,
val properties: List<PropertyInfo>,
val signals: List<SignalInfo>
)

@Serializable
Expand All @@ -55,5 +52,4 @@ data class SavedDevice(
val room: String?,
val alias: String?,
var properties: List<PropertyInfo>,
val signals: List<SignalInfo>
)
17 changes: 0 additions & 17 deletions common/src/main/kotlin/org/vivlaniv/nexohub/ModelTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,21 +68,4 @@ data class SetDevicePropertyTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null
) : TaskResult


@Serializable
data class SignalDeviceTask(
override val id: String = UUID.randomUUID().toString(),
val user: String,
val device: String,
val name: String,
val args: List<Int>
) : Task

@Serializable
data class SignalDeviceTaskResult(
override val tid: String,
override val code: Int = 0,
override val errorMessage: String? = null
) : TaskResult
9 changes: 9 additions & 0 deletions common/src/main/kotlin/org/vivlaniv/nexohub/util/Util.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.vivlaniv.nexohub.util

fun colorToRGB(color: Int): Triple<Int, Int, Int> =
Triple((color shr 16) and 0xFF, (color shr 8) and 0xFF, color and 0xFF)

const val colorMask = 0x00FFFFFF

fun RGBToColor(red: Int, green: Int, blue: Int): Int =
(((red shl 16) + (green shl 8) + blue) and colorMask)
33 changes: 33 additions & 0 deletions common/src/main/kotlin/org/vivlaniv/nexohub/util/mqtt/Mqtt.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.vivlaniv.nexohub.util.mqtt

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.launch
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.eclipse.paho.client.mqttv3.MqttClient
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.util.concurrent.Executors

val mqttLogger: Logger = LoggerFactory.getLogger("mqtt")

val mqttScope = CoroutineScope(Executors.newFixedThreadPool(32).asCoroutineDispatcher())

inline fun <reified T> MqttClient.subscribe(
topic: String,
crossinline onReceived: suspend CoroutineScope.(String, T) -> Unit
) {
subscribe(topic, 2) { tpc, msg ->
mqttScope.launch {
mqttLogger.info("got message on topic $tpc: $msg")
onReceived(tpc, Json.decodeFromString<T>(msg.payload.decodeToString()))
}
}
}

inline fun <reified T> MqttClient.publish(topic: String, message: T) {
val msg = Json.encodeToString(message)
mqttLogger.info("send message on topic $topic: $msg")
publish(topic, msg.encodeToByteArray(), 2, false)
}
Loading

0 comments on commit 467b9f6

Please sign in to comment.