84 lines
2.4 KiB
Julia
Executable File
84 lines
2.4 KiB
Julia
Executable File
"""
|
|
struct MessageCB with fields
|
|
* topic:: String
|
|
* payload::Vector{UInt8}
|
|
|
|
A struct containing incoming message information and payload.
|
|
"""
|
|
struct MessageCB
|
|
topic::String
|
|
payload::Vector{UInt8}
|
|
end
|
|
|
|
"""
|
|
struct ConnectionCB with fields
|
|
* clientptr::Ptr
|
|
* val::UInt8
|
|
* returncode::Cint
|
|
|
|
The clientptr contains the ptr of the client that connected or disconnected.
|
|
This allows to distinguish between clients.
|
|
val is 0 on disconnect and 1 on connect.
|
|
returncode is the MQTT return code which can be used to identify, e.g., the reason for a disconnect.
|
|
"""
|
|
struct ConnectionCB
|
|
clientptr::Ptr{Cmosquitto}
|
|
val::UInt8
|
|
returncode::Cint
|
|
end
|
|
|
|
|
|
const messages_channel = Channel{MessageCB}(20)
|
|
const connect_channel = Channel{ConnectionCB}(5)
|
|
|
|
"""
|
|
get_messages_channel()
|
|
|
|
Returns the channel to which received messages are sent. The channel is a Channel{MessageCB}(20).
|
|
See ?Mosquitto.MessageCB for information on the struct
|
|
"""
|
|
get_messages_channel() = messages_channel
|
|
|
|
"""
|
|
get_connect_channel()
|
|
|
|
Returns the channel to which event notifications for connections or disconnections are sent. The channel is a Channel{ConnectionCB}(5).
|
|
See ?Mosquitto.ConnectionCB for information on the struct
|
|
"""
|
|
get_connect_channel() = connect_channel
|
|
|
|
|
|
# This callback function puts any message on arrival in the channel
|
|
# messages_channel which is a Channel{Mosquitto.Message}(20)
|
|
function callback_message(mos::Ptr{Cmosquitto}, obj::Ptr{Cvoid}, message::Ptr{CMosquittoMessage}) #, clientid::String)
|
|
# get topic and payload from the message
|
|
jlmessage = unsafe_load(message)
|
|
jlpayload = [unsafe_load(jlmessage.payload, i) for i = 1:jlmessage.payloadlen]
|
|
topic = unsafe_string(jlmessage.topic)
|
|
|
|
# put it in the channel for further use
|
|
if Base.n_avail(messages_channel)>=messages_channel.sz_max
|
|
take!(messages_channel)
|
|
end
|
|
put!(messages_channel, MessageCB(topic, jlpayload))
|
|
|
|
return nothing
|
|
end
|
|
|
|
|
|
function callback_connect(mos::Ptr{Cmosquitto}, obj::Ptr{Cvoid}, rc::Cint)
|
|
if Base.n_avail(connect_channel)>=connect_channel.sz_max
|
|
take!(connect_channel)
|
|
end
|
|
put!( connect_channel, ConnectionCB(mos, one(UInt8), rc ) )
|
|
return nothing
|
|
end
|
|
|
|
|
|
function callback_disconnect(mos::Ptr{Cmosquitto}, obj::Ptr{Cvoid}, rc::Cint)
|
|
if Base.n_avail(connect_channel)>=connect_channel.sz_max
|
|
take!(connect_channel)
|
|
end
|
|
put!( connect_channel, ConnectionCB(mos, zero(UInt8), rc ) )
|
|
return nothing
|
|
end |