I'm still busy trying to get MQTT (using Mosquitto MQTT) running for me in
Scheme. I have the following code, and this works fine when compiling.

Note, that I have defined the `on_message` callback as external, so
basically a C function in the end. This forces me to use this code compiled.

Ideally, in a next step, I'd like to put everything into a Chicken module
in a way that will also be usable in the interpreter. Therefore my question:

*What would I have to do to be able to use pure Scheme functions as
callbacks here?*

Any hint and help appreciated ...


> ;; csc -I /usr/include -L "-l mosquitto" mqtt.scm
>
> (import (chicken memory))
> (import (chicken blob))
> (import bind)
> (bind-rename/pattern "_" "-")
> (bind* "struct mosquitto_message{
>           int mid;
>           char *topic;
>           void *payload;
>           int payloadlen;
>           int qos;
>           ___bool retain;
>         };")
> (bind* "int mosquitto_lib_init();")
> (bind* "int mosquitto_lib_cleanup();")
> (bind* "int mosquitto_lib_version(___out int *major,
>   ___out int *minor,
>   ___out int *revision);")
> (bind* "struct mosquitto *mosquitto_new(const char *id,
>                                         ___bool clean_session,
> void *obj);")
> (bind* "void mosquitto_destroy(struct mosquitto *mosq);")
> (bind* "int mosquitto_connect(struct mosquitto *mosq,
>       const char *host,
>       int port,
>       int keepalive);")
> (bind* "int mosquitto_publish(struct mosquitto *mosq,
>                               ___out int *mid,
>       const char *topic,
>       ___length(payload) int payloadlen,
>       ___blob payload /* const void *payload */,
>       int qos,
>       ___bool retain);")
> (bind* "___safe int mosquitto_loop(struct mosquitto *mosq, int timeout,
> int max_packets);")
> (bind* "___safe int mosquitto_loop_forever(struct mosquitto * mosq, int
> timeout, int max_packets);")
> (bind* "int mosquitto_subscribe(struct mosquitto *mosq,
> int *mid,
> const char *sub,
> int qos);")
> (bind* "int mosquitto_unsubscribe(struct mosquitto *mosq,
>                                   int *mid,
>   const char *sub);")
> ;; setting callbacks
> (bind* "void mosquitto_connect_callback_set(struct mosquitto *mosq,
>                                             void (*on_connect)(struct
> mosquitto *, void *, int));")
> ;;(bind* "mosquitto_disconnect_callback_set")
> ;;(bind* "mosquitto_publish_callback_set")
> ;; NB: the last type of return value in the vallback is 'const struct *'
> according
> ;;     to mosquitto.h; however, it seems impossible to encode this in the
> ;;     Scheme callback function using combinations of 'c-pointer' and
> 'const'
> (bind* "void mosquitto_message_callback_set(struct mosquitto *mosq,
>                                             void (*on_message)(struct
> mosquitto *,
>                      void *,
>        struct mosquitto_message *));")
> ;;(bind* "mosquitto_subscribe_callback_set")
> ;;(bind* "mosquitto_unsubscribe_callback_set")
> ;;(bind* "mosquitto_log_callback_set")
> (mosquitto-lib-init)
> (display (mosquitto-lib-version))
> ;; on-connect callback
> (define-external (on_connect ((c-pointer "struct mosquitto") mosq)
>              ((c-pointer void) userdata)
>              (int returncode))
>          void
> (begin
>    (display "connected to broker ... returncode: ")
>    (display returncode)
>    (newline)))
> ;; on-message callback
> (define-external (on_message ((c-pointer "struct mosquitto") mosq)
>      ((c-pointer void) userdata)
>      ((c-pointer "struct mosquitto_message") msg))
>           void
>   (let* ((len (mosquitto-message-payloadlen msg))
>          (*payload (mosquitto-message-payload msg))
>                      (payload (make-blob len))
>          (mid (mosquitto-message-mid msg))
>          (topic (mosquitto-message-topic msg))
>          (qos (mosquitto-message-qos msg))
>          (retain (mosquitto-message-retain msg))
>          ;; int mid; char* topic; int qos; bool retain
>            )
>      (if (> len 0)
>        (move-memory! *payload payload len))
>      (display "Wow! ... there was a message!\n")
>      (display (blob->string payload)) (newline)
>      (display retain)
>        (newline)))
> (let-values (((res major minor revision) (mosquitto-lib-version)))
>   (display major) (newline)
>   (display minor) (newline)
>   (display revision) (newline))
> ;; #f is equivalent to C's NULL
> (define mqttc (mosquitto-new #f #t #f))
> (display "mqtt client address\n")
> (display mqttc) (newline)
> (mosquitto-connect-callback-set mqttc #$on_connect)
> (mosquitto-message-callback-set mqttc #$on_message)
> (display "connect to broker\n")
> (display (mosquitto-connect mqttc "localhost" 1883 60))
> (newline)
> (mosquitto-subscribe mqttc #f "greetings/#" 0)
> (define payload (string->blob "gluck, gluck!"))
> (mosquitto-publish mqttc "chicken/call" payload 0 #f)
> (let loop ()
>   (mosquitto-loop mqttc -1 1)
>   (loop))
> ;;(mosquitto-loop-forever mqttc -1 1)
> ;; (mosquitto-loop mqttc -1 1)
> (mosquitto-destroy mqttc)
> (mosquitto-lib-cleanup)



-- 
Christoph Lange
Lotsarnas Väg 8
430 83 Vrångö
_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to