2016-04-20 4 views
2

Я переместил mqtt-hs в LTS-5.13 и скомпилировал только штраф с стекю. Затем я создал следующего абонента, чтобы прослушивать иерархию тем. Это абонентский кодbasic mqtt with haskell

{-# LANGUAGE OverloadedStrings #-} 
module Main(main) where 

import Control.Concurrent (threadWaitRead) 
import System.Posix.Types 
import Network.MQTT 
import Network.MQTT.Logger 

main :: IO() 
main = do 
    conn <- connect defaultConfig { cLogger = warnings stdLogger, cHost = "192.168.0.1" } 
    qos <- subscribe conn Confirm "/something" callback 
    putStrLn "control-c to finish" 
    threadWaitRead $ Fd 1 

callback topic payload = putStrLn $ "A message was published to " ++ show topiC++ ": " ++ show payload 

Когда я отправить что-нибудь на тему (с помощью простого Haskell издателя тоже), я получаю это в консоли этой программы:

control-c to finish 
[Error] {handle: <socket: 3>}: recvLoop: end of file 
[Error] recvLoop: No reconnect, terminating. 

, но никакого другого выхода ,

Оба издателя и подписчика подключаются к брокеру (Mosquitto). Кажется, что абонент Ok, выше это происходит только при получении сообщения от издателя. Вышеупомянутое сообщение также возникает, когда я останавливаю брокера.

Любые идеи?

Обновление

Я клонировал самый последний MQTT-HS (0.3.0) и ввел это изменение

--- a/Network/MQTT.hs 
+++ b/Network/MQTT.hs 
@@ -448,9 +448,10 @@ recvLoop :: MQTT -> IO() 
recvLoop m = loopWithReconnect m "recvLoop" $ \mqtt -> do 
    h <- readMVar (handle mqtt) 
    eof <- hIsEOF h 
- if eof 
-  then ioError $ mkIOError eofErrorType "" (Just h) Nothing 
-  else getMessage mqtt >>= dispatchMessage mqtt 
+ getMessage mqtt >>= dispatchMessage mqtt 
+ -- if eof 
+ -- then ioError $ mkIOError eofErrorType "" (Just h) Nothing 
+ -- else getMessage mqtt >>= dispatchMessage mqtt 
    `catch` 
    \e -> logWarning mqtt $ "recvLoop: Caught " ++ show (e :: MQTTException) 

т.е., я отключил проверку EOF. Теперь сообщение печатается на консоль, но абонент входит в цикл, бросая [Warning] recvLoop: Caught EOF как можно быстрее.

Это mosquito ошибка или ошибка в mqtt-hs?

Update 2

Я могу подтвердить, что работает с ActiveMQ без хака. Сказав это, лучше, если mqtt-hs может восстановиться после закрытия соединения брокера с абонентом.

ответ

1

Я считаю, что у вас может быть это неправильно сконфигурировано. В настоящее время я использую mqtt-hs, и у меня почти нет проблем (исключая ошибку, которая уже исправлена ​​в github проекта). Новое обновление использует TChan для правильной доставки сообщений, как в постоянном соединении, есть вероятность, что некоторые сообщения могут быть потеряны, поскольку обработчик еще не был доступен.

Вы определяете соединение с брокером, но вы не сообщаете клиенту о том, как следует обрабатывать пересоединения. Для справки, я использую нечто вроде следующего в данный момент:

mqttConfig :: HostName -> MQTTConfig 
mqttConfig host = defaultConfig { cClean = False 
           , cClientID = "myClientId" 
           , cHost = host 
           , cUsername = Just "username" 
           , cPassword = Just "password" 
           , cKeepAlive = Just 10 
           , cReconnPeriod = Just 1 
           , cLogger = stdLogger } 

Даже если версия используется здесь немного обновляется, очень мало нужно изменить и reconnctions произойдет по мере необходимости, когда брокер (mosquitto а здесь) спускается, а затем восстанавливается.

+0

Да, добавление 'cReconnPeriod = Just 1' исправляет это! Мне нужно прочитать о «TChan», но простой подход выше работает с исправленным. Tnx. – carlosayam

Смежные вопросы