8

MQTTサーバーへの接続を実行し、チャネルをサブスクライブする小さな ruby​​ プログラムを作成しています。libmosquitto C ライブラリの単なるブリッジである mosquitto gem を使用しています。

で実行できるプログラムの非常に単純な実装を作成しましたruby my_prog.rb

# Dependencies

require File.expand_path(File.join('..', 'environment'), __FILE__)


# MQTT Application

module Pulsr
    class MQTT
        attr_reader :host, :port, :alive

        def initialize(host = 'iot.eclipse.org', port = 1883, alive = 60)
            @client ||=  Mosquitto::Client.new SecureRandom.hex(8)

            Signal.trap(Signal.list.has_key?('INT') ? 'SIGINT' : 'SIGTERM') do
            @client.log 'Shutdown'
            shutdown
            end

            @host = host
            @port = port
            @alive = alive

            start
        end


        private

        def on_connect
            Proc.new { |return_code|
                @client.log "Connected RC #{return_code}"

                @client.subscribe(nil, '/pulsr', Mosquitto::EXACTLY_ONCE)
            }
        end

        def on_disconnect
            Proc.new { |return_code| @client.log "Disconnected RC #{return_code}" }
        end

        def on_subscribe
            Proc.new { |message_id, granted_qos| @client.log "Subscribed MID #{message_id} QoS #{granted_qos}" }
        end

        def on_unsubscribe
            Proc.new { |message_id| @client.log "Unsubscribed MID #{message_id}" }
        end

        def on_message
            Proc.new { |message| Pulsr::Workers::TrackingEvent.perform_async message.to_s }
        end

        def configure
            @client.logger = Logger.new(STDOUT)

            @client.on_connect &on_connect
            @client.on_disconnect &on_disconnect
            @client.on_subscribe &on_subscribe
            @client.on_unsubscribe &on_unsubscribe
            @client.on_message &on_message
        end

        def connect
            @client.connect_async(@host, @port, @alive)
        end

        def start
            @client.loop_start

            configure
            connect

            sleep
        end

        def shutdown
            @client.loop_stop(true)
            Process.exit
        end
    end
end


# MQTT Start

Pulsr::MQTT.new :host => 'iot.eclipse.org', :port => 1883, :alive => 60

mosquitto gem が提供するループを実行するためにCelluloidまたはEventMachineを使用したい場合、どうすればよいでしょうか?

mosquitto gem は優れたドキュメントを提供し、使用できるいくつかのループ メソッドを示していますが、EM やセルロイドを使用したことがなく、どこから始めればよいか、どのように行うべきかわかりません。

コミュニティに何らかの価値をもたらし、mosquitto gem への小さな追加であるオープン ソース プロジェクトになる可能性があると思いますか?

4

2 に答える 2

1

そんなに難しくないと思います。Mosquitto には優れたライブラリがあります。

これらの機能を接続する必要があります。

mosquitto_loop_misc() <-> EventMachine::PeriodicTimer.new
mosquitto_read() <-> EventMachine.watch
mosquitto_write() <-> EventMachine.watch
于 2014-11-19T15:00:34.387 に答える
0

このem-mqttgemは、eventmachine の MQTT プロトコル実装を提供します。
これは、純粋な Rubymqtt実装を使用してメッセージを処理しますlibmosquitto

gemlibmosquittoを介した解析に実装を本当に使用する必要がある場合は、上記の説明が当てはまります。コンポーネントはほとんどそのままになります。プロトコル固有のモジュールへのすべての呼び出しは、 の同等のものに置き換えられます。主な問題は、パブリック APIとその後のRuby APIが、これらすべてをに置き換えられている独自のネットワーク実装に隠していることです。そのため、必要なメソッドを Ruby に公開する前に多くのハッキングが必要になります。始めることができます。mosquittoeventmachineMQTTlibmosquittolibmosquittolibmosquittoeventmachine

于 2014-08-26T08:50:32.070 に答える