首页 > 解决方案 > 尝试使用提供的 API、基于 TCP 的 JSON 和 C# 与 Heatmiser neoHub 通信

问题描述

我正在尝试编写一个简单的程序来与 Heatmiser neoHub 进行通信,它应该能够获取和设置有关我的供暖系统的各种信息。

根据 Heatmiser API 文档,我应该通过 TCP 使用 JSON 到 neoHub 的端口 4242,我认为我的发送代码正在工作,但我没有得到任何响应。

目前我有一个小的 .Net Core 2.2 控制台应用程序,它将 JSON 命令编码为字节数组并将其发送到连接到 neoHub 的 TCP 套接字,然后我等待 neoHub 的响应。

我的第一次尝试会解析返回的 JSON,并且连接没有超时,并等待了几分钟,然后我会在没有响应的情况下终止应用程序。当前版本已进一步简化,仅将任何未解析的 JSON 响应输出到控制台,仅等待 10 秒,但我仍然没有得到响应。

using System.Net.Sockets;
using System.Text;

namespace NeoHub
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect("192.168.0.204", 4242);
            socket.ReceiveTimeout = 10000;

            Console.WriteLine("connected...");
            string jsonData = "{\"GET_LIVE_DATA\":0}";

            byte[] sendData = Encoding.UTF8.GetBytes(jsonData);
            byte[] readData = new byte[1024 * 4];

            try
            {
                int sendBytes = socket.Send(sendData);
                Console.WriteLine("sent {0}...", sendBytes);

                int readBytes = socket.Receive(readData);
                Console.WriteLine("receive {0}...", readBytes);
                Console.WriteLine(Encoding.UTF8.GetString(readData));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }
}

{"GET_LIVE_DATA":0} 的结果应该是类似于下面的 JSON 文件(我已经截断了示例输出)。

{
"CLOSE_DELAY": 0,
"COOL_INPUT": false,
"GLOBAL_SYSTEM_TYPE": "HeatOnly",
"HOLIDAY_END": 0,
"HUB_AWAY": false,
"HUB_HOLIDAY": false,
"HUB_TIME": 1518613752,
"OPEN_DELAY": 0,
"TIMESTAMP_DEVICE_LISTS": 1518607836,
"TIMESTAMP_ENGINEERS": 1518607837,
"TIMESTAMP_PROFILE_0": 1518607836,
"TIMESTAMP_PROFILE_COMFORT_LEVELS": 1518604883,
"TIMESTAMP_PROFILE_TIMERS": 1518600089,
"TIMESTAMP_PROFILE_TIMERS_0": 1518607918,
"TIMESTAMP_SYSTEM": 1518607836
}

标签: c#jsontcp

解决方案


通过查看 GitHub https://github.com/RJ/heatmiser-neohub.py上的 Python 解决方案,我设法解决了我自己的问题。

小而关键的补充是行尾:

string jsonData = "{\"GET_LIVE_DATA\":0}";

需要是

string jsonData = "{\"GET_LIVE_DATA\":0}" + "\0\r";

推荐阅读