0

IoT可以使用以下环境从环境中创建模块:

 ModuleClient.CreateFromEnvironmentAsync(settings)

但是,似乎没有设备的等效方法。现在,我在程序中设置设备连接字符串来测试它,但是有没有更好的方法来读取iotedge/config.yaml部署在那里的所有边缘设备的连接字符串?

为 .NET 和 python 执行此操作的方法将不胜感激。

4

2 回答 2

0

您可以使用 yaml 解析库来反序列化文档,例如 YamlDotNet。其实可以参考iot edge中的YamlDocument。但是在类中,并没有提供获取键值的方法。请参考以下代码。

public class YamlDocument
{
    readonly Dictionary<object, object> root;

    public YamlDocument(string input)
    {
        var reader = new StringReader(input);
        var deserializer = new Deserializer();
        this.root = (Dictionary<object, object>)deserializer.Deserialize(reader);
    }

    public object GetKeyValue(string key)
    {
        if(this.root.ContainsKey(key))
        {
            return this.root[key];
        }

        foreach(var item in this.root)
        {
            var subItem = item.Value as Dictionary<object, object>;
            if(subItem != null && subItem.ContainsKey(key))
            {
                return subItem[key];
            }
        }

        return null;            
    }
}

然后就可以从 config.yaml 中获取设备连接字符串了。如果你使用python,你可以导入yaml库来分析文件。

        StreamReader sr = new StreamReader(@"C:\ProgramData\iotedge\config.yaml");
        var yamlString = sr.ReadToEnd();

        var yamlDoc = new YamlDocument(yamlString);
        var connectionString = yamlDoc.GetKeyValue("device_connection_string");
        Console.WriteLine("{0}", connectionString);
于 2018-07-26T07:24:08.817 回答
0

要从主机获取配置文件,请将以下内容添加到 docker 部署文件中。请注意,源文件是 config1.yaml,它与 config.yaml 相同,只是它对所有人都具有读取权限,而不仅仅是 root。

"createOptions": "{\"HostConfig\":{\"Binds\":[\"/etc/iotedge/config1.yaml:/app/copiedConfig.yaml\"]}}"

有了上面的行,就可以在容器中使用复制的Config.yaml 文件,以及@Michael Xu 的解析代码来派生连接字符串。

从长远来看,无论如何,人们可能都想使用设备配置服务,但希望这对出于任何原因使用设备连接字符串的人有所帮助..

于 2018-07-30T06:56:50.097 回答