code: def publish(self, topic, message=None, qos=0, retain=False):
          
          logger.info('Publish topic: %s, message: %s, qos: %s, retain: %s'
              % (topic, message, qos, retain))
          self._mid = -1
          self._mqttc.on_publish = self._on_publish
          result, mid = self._mqttc.publish(topic, message, int(qos), retain)
          if result != 0:
              raise RuntimeError('Error publishing: %s' % result)
  
          timer_start = time.time()
          while time.time() < timer_start + self._loop_timeout:
              if mid == self._mid:
                  break;
              self._mqttc.loop()
  
          if mid != self._mid:
              logger.warn('mid wasn\'t matched: %s' % mid)
docs: Publish a message to a topic with specified qos and retained flag.
          It is required that a connection has been established using `Connect`
          keyword before using this keyword.
  
          `topic` topic to which the message will be published
  
          `message` message payload to publish
  
          `qos` qos of the message
  
          `retain` retained flag
  
          Examples:
  
          | Publish | test/test | test message | 1 | ${false} |