Re: Mqtt support in guile?

Matt Wette <[email protected]>
Newsgroups gmane.lisp.guile.user
Message-ID <[email protected]>
I'm not seeing all of the context, but I think this should work

   (define (my-msg-handler mos data msg)
      (display (pointer->string (cdata*-ref msg 'message) (cdata*-ref 
msg 'messagesize)))
     (newline))

   (mosquitto_message_callback_set mosq my-msg-handler)

in my-msg-handler, mos will be <cdata struct-mosquitto* 0xdeadbeef>, 
data will be of type <pointer > and msg will be of type <cdata 
struct-mosquitto_message* 0xdeadbeef>

A lot of the plumbing you are doing comes for free in the 
ffi/mosquitto.scm code.  You should not have be writining 
pointer->procedure code or using (make-cdata ...) from the callback 
arguments.

On 11/1/24 8:10 AM, Mikael Djurfeldt wrote:
> BTW,
>
> I did:
>
> (mosquitto_message_callback_set mosq (procedure->pointer void 
> receive-message (list '* '* '*)))
>
> Is it correct to pass '* as argument type for the struct 
> mosquitto_message pointer (3rd arg)?
>
> On Fri, Nov 1, 2024 at 4:08 PM Mikael Djurfeldt <[email protected]> 
> wrote:
>
>     Thanks!
>
>     Doing the (make-cdata struct-mosquitto_message* message) as well
>     as changing cdata-ref to cdata*-ref works fine.
>
>     Obviously, what someone should do is to write a nice schemey
>     interface on top of what you get with (ffi mosquitto).
>
>     Best regards,
>     Mikael
>
>     On Fri, Nov 1, 2024 at 3:05 PM Matt Wette <[email protected]>
>     wrote:
>
>         And one more thing.   There is a manual for cdata.  There is a
>         link on
>         this page
>
>         https://www.nongnu.org/nyacc/
>
>
>         On 11/1/24 6:37 AM, Matt Wette wrote:
>         > I got this wrong.  Sorry!   This is it.  What I gave
>         previously was
>         > the old fh syntax.
>         >
>         > (msg (make-cdata struct-mosquitto_message* message))
>         >
>         >
>         >
>         > On 11/1/24 6:32 AM, Matt Wette wrote:
>         >> assuming message is a Guile pointer:
>         >>
>         >> (define (receive-message mosq obj message)
>         >>   (let ((msg (make-struct-mosquitto_message* message))
>         >>           (size (cdata-ref msg '* 'payloadsize))
>         >>          (payload (cdata-ref msg '* 'payload))
>         >>   (pointer->string payload size)))
>         >>
>         >>
>         >> On 10/31/24 4:49 PM, Mikael Djurfeldt wrote:
>         >>> Hi Matt,
>         >>>
>         >>> This is very nice indeed! :-)
>         >>>
>         >>> I got a small client working, but I found the unpacking of
>         values in
>         >>> the message callback function a bit cumbersome.  I now have:
>         >>>
>         >>> (define (pointer->struct-mosquitto_message pointer)
>         >>>   (let* ((size (ctype-size struct-mosquitto_message))
>         >>>          (bvec (pointer->bytevector pointer size)))
>         >>>          (Xcdata-ref bvec 0 struct-mosquitto_message)))
>         ;The only
>         >>> way I found that worked! :)
>         >>>
>         >>> (define (receive-message mosq obj message)
>         >>>   (let* ((message (pointer->struct-mosquitto_message message))
>         >>>          (payload (cdata-ref message 'payload))
>         >>>          (size (cdata-ref message 'payloadlen))
>         >>>          (payload (pointer->string payload size)))
>         >>>     (display payload)
>         >>>     (newline)))
>         >>>
>         >>> Is there some more convenient/right way to do that?
>         >>>
>         >>> Best regards,
>         >>> Mikael
>         >>>
>         >>> On Thu, Oct 31, 2024 at 1:02 PM Matt Wette
>         <[email protected]>
>         >>> wrote:
>         >>>
>         >>>     On 10/31/24 1:48 AM, Ricardo G. Herdt wrote:
>         >>>     > Hi,
>         >>>     >
>         >>>     > never did it myself, but you can create some bindings to
>         >>>     libmosquitto
>         >>>     > for your usecase. There are bindings for chicken,
>         one can take
>         >>> some
>         >>>     > inspiration from there:
>         >>> http://wiki.call-cc.org/eggref/5/mosquitto#api
>         >>>     >
>         >>>     > Regards,
>         >>>     >
>         >>>     > Ricardo
>         >>>     >
>         >>>     > Am 31.10.2024 03:24 schrieb Alan Wedel:
>         >>>     >> I have been working on a controller that uses a
>         >>> microcontroller to
>         >>>     >> read some sensors and publish their data to a mqtt
>         broker. I
>         >>> would
>         >>>     >> like to have a guile program subscribe to the mqtt
>         broker and
>         >>>     log the
>         >>>     >> sensor readings to a file. Is there anyone using
>         guile with
>         >>>     mqtt like
>         >>>     >> this? If so, how are you doing it?
>         >>>     >
>         >>>
>         >>>     Here is a dot-ffi file for mosquitto using nyacc:
>         >>>
>         >>>        (define-ffi-module (ffi mosquitto)
>         >>>          #:pkg-config "libmosquitto"
>         >>>          #:include '("mosquitto.h"))
>         >>>
>         >>>
>         >>>     I just uploaded nyacc-2.01.2, needed to compile above.
>         >>>
>         >>>     refs:
>         >>> https://savannah.nongnu.org/projects/nyacc
>         >>> https://www.nongnu.org/nyacc/nyacc-fh-ug.html
>         >>>
>         >>>     Matt
>         >>>
>         >>>
>         >>>
>         >>>
>         >>>
>         >
>         >
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.