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 <mik...@djurfeldt.com> 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 <matt.we...@gmail.com>
    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
        <matt.we...@gmail.com>
        >>> 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
        >>>
        >>>
        >>>
        >>>
        >>>
        >
        >

Reply via email to