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
>>>
>>>
>>>
>>>
>>>
>
>