mqtt-sn-ruby 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/lib/mqtt-sn-ruby.rb +86 -50
 - data/test.rb +8 -2
 - metadata +1 -1
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 552d49593797c45d53598fe3d5787e3ffd692b56
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 6c955790706011b9690186974084418488733af0
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 6edfcee73ea914ed1e4272e0c38eae30954b5ae3c76ff2fd0143a00b990879226efffb5a702826b4c90b17a49b04159fe7350fb536bb046506fa6b09903f88ae
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 82aa807b9ff23d63aa707aea3937251a0ecc296717bf982a485d5c30b1d0f241f5c5e5f90b46e80085c679ffaaf7284cdd26ffc5d4e6b3afcb25423c25b99b1c
         
     | 
    
        data/lib/mqtt-sn-ruby.rb
    CHANGED
    
    | 
         @@ -53,8 +53,10 @@ class MqttSN 
     | 
|
| 
       53 
53 
     | 
    
         
             
                  @will_topic=nil
         
     | 
| 
       54 
54 
     | 
    
         
             
                  @will_msg=nil
         
     | 
| 
       55 
55 
     | 
    
         
             
                  @id="?"
         
     | 
| 
      
 56 
     | 
    
         
            +
                  @sem=Mutex.new 
         
     | 
| 
       56 
57 
     | 
    
         
             
                  @topics={} #hash of registered topics is stored here
         
     | 
| 
       57 
58 
     | 
    
         
             
                  @iq = Queue.new
         
     | 
| 
      
 59 
     | 
    
         
            +
                  @dataq = Queue.new
         
     | 
| 
       58 
60 
     | 
    
         
             
                  @s = UDPSocket.new
         
     | 
| 
       59 
61 
     | 
    
         
             
                  @t=Thread.new do
         
     | 
| 
       60 
62 
     | 
    
         
             
                    recv_thread
         
     | 
| 
         @@ -88,6 +90,7 @@ class MqttSN 
     | 
|
| 
       88 
90 
     | 
    
         
             
                hexdump msg
         
     | 
| 
       89 
91 
     | 
    
         
             
              end
         
     | 
| 
       90 
92 
     | 
    
         | 
| 
      
 93 
     | 
    
         
            +
              
         
     | 
| 
       91 
94 
     | 
    
         
             
              def send type,hash={},&block
         
     | 
| 
       92 
95 
     | 
    
         
             
                puts ""
         
     | 
| 
       93 
96 
     | 
    
         
             
                if @state!=:connected and type!=:connect and type!=:will_topic  and type!=:will_msg
         
     | 
| 
         @@ -160,6 +163,13 @@ class MqttSN 
     | 
|
| 
       160 
163 
     | 
    
         
             
                  end
         
     | 
| 
       161 
164 
     | 
    
         
             
                  @@msg_id+=1
         
     | 
| 
       162 
165 
     | 
    
         | 
| 
      
 166 
     | 
    
         
            +
                when :unsubscribe 
         
     | 
| 
      
 167 
     | 
    
         
            +
                  raise "Need :topic to :unsubscribe" if not hash[:topic]
         
     | 
| 
      
 168 
     | 
    
         
            +
                  p=[UNSUBSCRIBE_TYPE,0,@@msg_id >>8 ,@@msg_id & 0xff]
         
     | 
| 
      
 169 
     | 
    
         
            +
                  hash[:topic].each_byte do |b|
         
     | 
| 
      
 170 
     | 
    
         
            +
                    p<<b
         
     | 
| 
      
 171 
     | 
    
         
            +
                  end
         
     | 
| 
      
 172 
     | 
    
         
            +
                  @@msg_id+=1
         
     | 
| 
       163 
173 
     | 
    
         | 
| 
       164 
174 
     | 
    
         
             
                when :publish
         
     | 
| 
       165 
175 
     | 
    
         
             
                  raise "Need :topic_id to Publish!" if not hash[:topic_id]
         
     | 
| 
         @@ -191,49 +201,51 @@ class MqttSN 
     | 
|
| 
       191 
201 
     | 
    
         
             
                  puts "Error: Strange send?? #{type}"
         
     | 
| 
       192 
202 
     | 
    
         
             
                  return nil
         
     | 
| 
       193 
203 
     | 
    
         
             
                end
         
     | 
| 
       194 
     | 
    
         
            -
                if hash[:expect] 
         
     | 
| 
       195 
     | 
    
         
            -
                  while not @iq.empty?
         
     | 
| 
       196 
     | 
    
         
            -
                    mp=@iq.pop
         
     | 
| 
       197 
     | 
    
         
            -
                    puts "WARN:#{@id} ************** Purged message: #{mp}"
         
     | 
| 
       198 
     | 
    
         
            -
                  end
         
     | 
| 
       199 
     | 
    
         
            -
                  @iq.clear
         
     | 
| 
       200 
     | 
    
         
            -
                end
         
     | 
| 
       201 
     | 
    
         
            -
                raw=send_packet p
         
     | 
| 
       202 
     | 
    
         
            -
                hash[:raw]=raw if @debug
         
     | 
| 
       203 
     | 
    
         
            -
                puts "send:#{@id} #{type},#{hash.to_json}"
         
     | 
| 
       204 
     | 
    
         
            -
                timeout=hash[:timeout]||Tretry
         
     | 
| 
       205 
204 
     | 
    
         
             
                status=:timeout
         
     | 
| 
       206 
     | 
    
         
            -
                retries=0
         
     | 
| 
       207 
205 
     | 
    
         
             
                m={}
         
     | 
| 
       208 
     | 
    
         
            -
                 
     | 
| 
       209 
     | 
    
         
            -
                   
     | 
| 
       210 
     | 
    
         
            -
                     
     | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
       212 
     | 
    
         
            -
                       
     | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
       214 
     | 
    
         
            -
             
     | 
| 
       215 
     | 
    
         
            -
             
     | 
| 
       216 
     | 
    
         
            -
             
     | 
| 
       217 
     | 
    
         
            -
             
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
      
 206 
     | 
    
         
            +
                @sem.synchronize do #one command at a time -- 
         
     | 
| 
      
 207 
     | 
    
         
            +
                  if hash[:expect]
         
     | 
| 
      
 208 
     | 
    
         
            +
                    while not @iq.empty?
         
     | 
| 
      
 209 
     | 
    
         
            +
                      mp=@iq.pop
         
     | 
| 
      
 210 
     | 
    
         
            +
                      puts "WARN:#{@id} ************** Purged message: #{mp}"
         
     | 
| 
      
 211 
     | 
    
         
            +
                    end
         
     | 
| 
      
 212 
     | 
    
         
            +
                    @iq.clear
         
     | 
| 
      
 213 
     | 
    
         
            +
                  end
         
     | 
| 
      
 214 
     | 
    
         
            +
                  raw=send_packet p
         
     | 
| 
      
 215 
     | 
    
         
            +
                  hash[:raw]=raw if @debug
         
     | 
| 
      
 216 
     | 
    
         
            +
                  puts "send:#{@id} #{type},#{hash.to_json}"
         
     | 
| 
      
 217 
     | 
    
         
            +
                  timeout=hash[:timeout]||Tretry
         
     | 
| 
      
 218 
     | 
    
         
            +
                 retries=0
         
     | 
| 
      
 219 
     | 
    
         
            +
                  if hash[:expect]
         
     | 
| 
      
 220 
     | 
    
         
            +
                    while retries<Nretry do
         
     | 
| 
      
 221 
     | 
    
         
            +
                      stime=Time.now.to_i
         
     | 
| 
      
 222 
     | 
    
         
            +
                      while Time.now.to_i<stime+timeout
         
     | 
| 
      
 223 
     | 
    
         
            +
                        if not @iq.empty?
         
     | 
| 
      
 224 
     | 
    
         
            +
                          m=@iq.pop
         
     | 
| 
      
 225 
     | 
    
         
            +
                          if Array(hash[:expect]).include? m[:type]
         
     | 
| 
      
 226 
     | 
    
         
            +
                            status=:ok
         
     | 
| 
      
 227 
     | 
    
         
            +
                            break
         
     | 
| 
      
 228 
     | 
    
         
            +
                          else
         
     | 
| 
      
 229 
     | 
    
         
            +
                            puts "WARN:#{@id} ************** Discarded message: #{m}"
         
     | 
| 
      
 230 
     | 
    
         
            +
                          end
         
     | 
| 
       219 
231 
     | 
    
         
             
                        end
         
     | 
| 
      
 232 
     | 
    
         
            +
                        sleep 0.1
         
     | 
| 
      
 233 
     | 
    
         
            +
                      end
         
     | 
| 
      
 234 
     | 
    
         
            +
                      if status==:ok
         
     | 
| 
      
 235 
     | 
    
         
            +
                        break
         
     | 
| 
      
 236 
     | 
    
         
            +
                      else
         
     | 
| 
      
 237 
     | 
    
         
            +
                        retries+=1
         
     | 
| 
      
 238 
     | 
    
         
            +
                        send_packet p
         
     | 
| 
      
 239 
     | 
    
         
            +
                        puts "fail to get ack, retry #{retries} :#{@id} #{type},#{hash.to_json}"
         
     | 
| 
      
 240 
     | 
    
         
            +
                        #need to set DUP flag !
         
     | 
| 
       220 
241 
     | 
    
         
             
                      end
         
     | 
| 
       221 
     | 
    
         
            -
                      sleep 0.1
         
     | 
| 
       222 
     | 
    
         
            -
                    end
         
     | 
| 
       223 
     | 
    
         
            -
                    if status==:ok
         
     | 
| 
       224 
     | 
    
         
            -
                      break
         
     | 
| 
       225 
     | 
    
         
            -
                    else
         
     | 
| 
       226 
     | 
    
         
            -
                      retries+=1
         
     | 
| 
       227 
     | 
    
         
            -
                      send_packet p
         
     | 
| 
       228 
     | 
    
         
            -
                      puts "fail to get ack, retry #{retries} :#{@id} #{type},#{hash.to_json}"
         
     | 
| 
       229 
     | 
    
         
            -
                      #need to set DUP flag !
         
     | 
| 
       230 
242 
     | 
    
         
             
                    end
         
     | 
| 
       231 
243 
     | 
    
         
             
                  end
         
     | 
| 
       232 
     | 
    
         
            -
             
     | 
| 
       233 
     | 
    
         
            -
             
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
                  end
         
     | 
| 
      
 244 
     | 
    
         
            +
                end #sem
         
     | 
| 
      
 245 
     | 
    
         
            +
                if block
         
     | 
| 
      
 246 
     | 
    
         
            +
                  block.call  status,m
         
     | 
| 
       236 
247 
     | 
    
         
             
                end
         
     | 
| 
      
 248 
     | 
    
         
            +
             
     | 
| 
       237 
249 
     | 
    
         
             
              end
         
     | 
| 
       238 
250 
     | 
    
         | 
| 
       239 
251 
     | 
    
         
             
              def will_and_testament topic,msg
         
     | 
| 
         @@ -288,8 +300,33 @@ class MqttSN 
     | 
|
| 
       288 
300 
     | 
    
         
             
                end
         
     | 
| 
       289 
301 
     | 
    
         
             
              end
         
     | 
| 
       290 
302 
     | 
    
         | 
| 
       291 
     | 
    
         
            -
               
     | 
| 
       292 
     | 
    
         
            -
             
     | 
| 
      
 303 
     | 
    
         
            +
              
         
     | 
| 
      
 304 
     | 
    
         
            +
              def subscribe topic,hash={},&block
         
     | 
| 
      
 305 
     | 
    
         
            +
                send :subscribe, topic: topic, qos: hash[:qos],expect: :sub_ack do |s,m|
         
     | 
| 
      
 306 
     | 
    
         
            +
                  if s==:ok
         
     | 
| 
      
 307 
     | 
    
         
            +
                    if m[:topic_id] and m[:topic_id]>0 #when subs topic has no wild cards, we get topic id here:
         
     | 
| 
      
 308 
     | 
    
         
            +
                      @topics[topic]=m[:topic_id]
         
     | 
| 
      
 309 
     | 
    
         
            +
                    end
         
     | 
| 
      
 310 
     | 
    
         
            +
                  end
         
     | 
| 
      
 311 
     | 
    
         
            +
                  if block
         
     | 
| 
      
 312 
     | 
    
         
            +
                    block.call :sub_ack,m
         
     | 
| 
      
 313 
     | 
    
         
            +
                    while true
         
     | 
| 
      
 314 
     | 
    
         
            +
                      if not @dataq.empty?
         
     | 
| 
      
 315 
     | 
    
         
            +
                        m=@dataq.pop
         
     | 
| 
      
 316 
     | 
    
         
            +
                        block.call :got_data,m
         
     | 
| 
      
 317 
     | 
    
         
            +
                      end
         
     | 
| 
      
 318 
     | 
    
         
            +
                      sleep 0.1
         
     | 
| 
      
 319 
     | 
    
         
            +
                      if @state!=:connected
         
     | 
| 
      
 320 
     | 
    
         
            +
                        block.call :disconnect,{}
         
     | 
| 
      
 321 
     | 
    
         
            +
                        break
         
     | 
| 
      
 322 
     | 
    
         
            +
                      end
         
     | 
| 
      
 323 
     | 
    
         
            +
                    end
         
     | 
| 
      
 324 
     | 
    
         
            +
                  end
         
     | 
| 
      
 325 
     | 
    
         
            +
                end
         
     | 
| 
      
 326 
     | 
    
         
            +
              end
         
     | 
| 
      
 327 
     | 
    
         
            +
             
     | 
| 
      
 328 
     | 
    
         
            +
              def unsubscribe topic
         
     | 
| 
      
 329 
     | 
    
         
            +
                send :unsubscribe, topic: topic, expect: :unsub_ack do |s,m|
         
     | 
| 
       293 
330 
     | 
    
         
             
                end
         
     | 
| 
       294 
331 
     | 
    
         
             
              end
         
     | 
| 
       295 
332 
     | 
    
         | 
| 
         @@ -322,7 +359,6 @@ class MqttSN 
     | 
|
| 
       322 
359 
     | 
    
         
             
                when 1
         
     | 
| 
       323 
360 
     | 
    
         
             
                  send :publish,msg: msg, retain: hash[:retain], topic_id: @topics[topic], qos: 1, expect: [:publish_ack] do |s,m|
         
     | 
| 
       324 
361 
     | 
    
         
             
                    if s==:ok
         
     | 
| 
       325 
     | 
    
         
            -
                      puts "got handshaken once! status=#{s}, message=#{m.to_json}"
         
     | 
| 
       326 
362 
     | 
    
         
             
                    end
         
     | 
| 
       327 
363 
     | 
    
         
             
                  end
         
     | 
| 
       328 
364 
     | 
    
         
             
                when 2
         
     | 
| 
         @@ -330,7 +366,6 @@ class MqttSN 
     | 
|
| 
       330 
366 
     | 
    
         
             
                    if s==:ok
         
     | 
| 
       331 
367 
     | 
    
         
             
                      if m[:type]==:pubrec
         
     | 
| 
       332 
368 
     | 
    
         
             
                        send :pubrel,msg_id: m[:msg_id], expect: :pubcomp do |s,m|
         
     | 
| 
       333 
     | 
    
         
            -
                          puts "got handshaken twice!  status=#{s}, message=#{m.to_json}"
         
     | 
| 
       334 
369 
     | 
    
         
             
                        end
         
     | 
| 
       335 
370 
     | 
    
         
             
                      end
         
     | 
| 
       336 
371 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -364,33 +399,37 @@ class MqttSN 
     | 
|
| 
       364 
399 
     | 
    
         
             
                    when CONNACK_TYPE
         
     | 
| 
       365 
400 
     | 
    
         
             
                      m={type: :connect_ack,status: status}
         
     | 
| 
       366 
401 
     | 
    
         
             
                      @state=:connected
         
     | 
| 
       367 
     | 
    
         
            -
             
     | 
| 
       368 
402 
     | 
    
         
             
                    when SUBACK_TYPE
         
     | 
| 
       369 
403 
     | 
    
         
             
                      topic_id=(r[3].ord<<8)+r[4].ord
         
     | 
| 
       370 
404 
     | 
    
         
             
                      msg_id=(r[5].ord<<8)+r[6].ord
         
     | 
| 
       371 
405 
     | 
    
         
             
                      m={type: :sub_ack, topic_id: topic_id, msg_id: msg_id, status: status}
         
     | 
| 
      
 406 
     | 
    
         
            +
                    when UNSUBACK_TYPE
         
     | 
| 
      
 407 
     | 
    
         
            +
                      msg_id=(r[2].ord<<8)+r[3].ord
         
     | 
| 
      
 408 
     | 
    
         
            +
                      m={type: :unsub_ack, msg_id: msg_id, status: :ok}
         
     | 
| 
       372 
409 
     | 
    
         
             
                    when PUBLISH_TYPE
         
     | 
| 
       373 
410 
     | 
    
         
             
                      topic_id=(r[3].ord<<8)+r[4].ord
         
     | 
| 
       374 
411 
     | 
    
         
             
                      msg_id=(r[5].ord<<8)+r[6].ord
         
     | 
| 
       375 
412 
     | 
    
         
             
                      msg=r[7,len-7]
         
     | 
| 
       376 
413 
     | 
    
         
             
                      flags=r[2].ord
         
     | 
| 
       377 
414 
     | 
    
         
             
                      qos=(flags>>5)&0x03
         
     | 
| 
       378 
     | 
    
         
            -
                       
     | 
| 
       379 
     | 
    
         
            -
                       
     | 
| 
       380 
     | 
    
         
            -
                       
     | 
| 
      
 415 
     | 
    
         
            +
                      topic=@topics.key(topic_id)
         
     | 
| 
      
 416 
     | 
    
         
            +
                      m={type: :publish, qos: qos, topic_id: topic_id, topic: topic,msg_id: msg_id, msg: msg,status: :ok}
         
     | 
| 
      
 417 
     | 
    
         
            +
                      @dataq<<m
         
     | 
| 
      
 418 
     | 
    
         
            +
                      if qos==1 
         
     | 
| 
       381 
419 
     | 
    
         
             
                        send :publish_ack,topic_id: topic_id, msg_id: msg_id, return_code: 0
         
     | 
| 
       382 
     | 
    
         
            -
                      elsif qos==2  
     | 
| 
      
 420 
     | 
    
         
            +
                      elsif qos==2 
         
     | 
| 
       383 
421 
     | 
    
         
             
                        send :pub_rec, msg_id: msg_id
         
     | 
| 
       384 
422 
     | 
    
         
             
                      end
         
     | 
| 
      
 423 
     | 
    
         
            +
                      done=true
         
     | 
| 
       385 
424 
     | 
    
         
             
                    when PUBREL_TYPE
         
     | 
| 
       386 
425 
     | 
    
         
             
                      msg_id=(r[2].ord<<8)+r[3].ord
         
     | 
| 
      
 426 
     | 
    
         
            +
                      m={type: :pub_rel, status: :ok}
         
     | 
| 
       387 
427 
     | 
    
         
             
                      send :pub_comp, msg_id: msg_id
         
     | 
| 
       388 
428 
     | 
    
         
             
                      done=true
         
     | 
| 
       389 
429 
     | 
    
         
             
                    when DISCONNECT_TYPE
         
     | 
| 
       390 
430 
     | 
    
         
             
                      m={type: :disconnect,status: :ok}
         
     | 
| 
       391 
431 
     | 
    
         
             
                      @state=:disconnected
         
     | 
| 
       392 
432 
     | 
    
         
             
                    when REGISTER_TYPE
         
     | 
| 
       393 
     | 
    
         
            -
                      puts "registering... *************************"
         
     | 
| 
       394 
433 
     | 
    
         
             
                      topic_id=(r[2].ord<<8)+r[3].ord
         
     | 
| 
       395 
434 
     | 
    
         
             
                      msg_id=(r[4].ord<<8)+r[5].ord
         
     | 
| 
       396 
435 
     | 
    
         
             
                      topic=r[6,len-6]
         
     | 
| 
         @@ -429,13 +468,10 @@ class MqttSN 
     | 
|
| 
       429 
468 
     | 
    
         
             
                    else
         
     | 
| 
       430 
469 
     | 
    
         
             
                      m={type: :unknown, type_byte: type_byte }
         
     | 
| 
       431 
470 
     | 
    
         
             
                    end
         
     | 
| 
       432 
     | 
    
         
            -
                    if @debug
         
     | 
| 
      
 471 
     | 
    
         
            +
                    if @debug and m
         
     | 
| 
       433 
472 
     | 
    
         
             
                      m[:raw]=hexdump r
         
     | 
| 
       434 
473 
     | 
    
         
             
                    end
         
     | 
| 
       435 
474 
     | 
    
         
             
                    puts "got :#{@id} #{m.to_json}"
         
     | 
| 
       436 
     | 
    
         
            -
                    if m[:type]==:publish
         
     | 
| 
       437 
     | 
    
         
            -
                      puts "**************************** PUBLISH"
         
     | 
| 
       438 
     | 
    
         
            -
                    end
         
     | 
| 
       439 
475 
     | 
    
         
             
                    if not done
         
     | 
| 
       440 
476 
     | 
    
         
             
                      @iq<<m if m
         
     | 
| 
       441 
477 
     | 
    
         
             
                    end
         
     | 
    
        data/test.rb
    CHANGED
    
    | 
         @@ -27,18 +27,24 @@ sn2.connect "toka" 
     | 
|
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
            sn3.connect "kolmas"
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 30 
     | 
    
         
            +
            Thread.new do
         
     | 
| 
      
 31 
     | 
    
         
            +
              sn3.subscribe "eka/2",qos:2 do |s,m|
         
     | 
| 
      
 32 
     | 
    
         
            +
                puts ">>>>>>>>>>>> subscribe got: #{s},#{m}"
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
      
 35 
     | 
    
         
            +
            sn3.unsubscribe "eka/2"
         
     | 
| 
       31 
36 
     | 
    
         | 
| 
       32 
37 
     | 
    
         
             
            topic_id=0
         
     | 
| 
       33 
38 
     | 
    
         
             
            sn.will_and_testament "top2","testamentti2"
         
     | 
| 
       34 
39 
     | 
    
         | 
| 
       35 
40 
     | 
    
         
             
            sn2.ping
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
            sn3.subscribe "eka/3",qos:2 
         
     | 
| 
       37 
42 
     | 
    
         
             
            #sn.register_topic "jeesus/perkele/toimii"
         
     | 
| 
       38 
43 
     | 
    
         
             
            sn.publish "eka/1","perkkule0",qos: 0
         
     | 
| 
       39 
44 
     | 
    
         
             
            sn.publish "eka/2","perkkule1",qos: 1
         
     | 
| 
       40 
45 
     | 
    
         
             
            sn.publish "eka/3","perkkule2",qos: 2
         
     | 
| 
       41 
46 
     | 
    
         | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       42 
48 
     | 
    
         
             
            sn2.publish "eka/4","2perkkule0",qos: 0
         
     | 
| 
       43 
49 
     | 
    
         
             
            sn2.publish "eka/5","2perkkule1rrrr",qos: 1, retain: true
         
     | 
| 
       44 
50 
     | 
    
         
             
            sn2.publish "eka/6","2perkkule2",qos: 2
         
     |