コード例 #1
0
ファイル: RtuMap.cs プロジェクト: lulzzz/virtualrtu
        public static async Task <RtuMap> LoadFromConnectionStringAsync(string container, string filename, string connectionString)
        {
            RtuMap rmap = null;
            CloudStorageAccount acct         = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient     client       = acct.CreateCloudBlobClient();
            CloudBlobContainer  containerRef = client.GetContainerReference(container);
            await containerRef.CreateIfNotExistsAsync();

            CloudBlockBlob blobRef = containerRef.GetBlockBlobReference(filename);

            if (await blobRef.ExistsAsync())
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    await blobRef.DownloadToStreamAsync(stream);

                    string jsonString = Encoding.UTF8.GetString(stream.ToArray());
                    rmap = JsonConvert.DeserializeObject <RtuMap>(jsonString);
                }

                return(rmap);
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        private static async Task <EdgeGatewayConfiguration> ProvisionAsync(string luss)
        {
            LussEntity entity = await LussEntity.LoadAsync(luss, config.LussStorageTableName, config.StorageConnectionString);

            if (entity == null || entity.Success.HasValue || entity.Expires < DateTime.Now)
            {
                return(null);
            }


            //get the security token to call Piraeus mgmt api
            IEnumerable <Claim> claims = GetClaims(entity);
            string accessToken         = GetPiraeusAccessToken();


            //create the CAPL policies
            string publishPolicyId        = null;
            string subscribePolicyId      = null;
            AuthorizationPolicy pubPolicy = CreateCaplPolicy(entity, true, out publishPolicyId);
            AuthorizationPolicy subPolicy = CreateCaplPolicy(entity, false, out subscribePolicyId);

            //add the CAPL policies to Piraeus
            AddCaplPolicy(pubPolicy, accessToken);
            AddCaplPolicy(subPolicy, accessToken);


            //create the pi-system metadata
            string        inputUriString  = GetEventUriString(entity, true);
            string        outputUriString = GetEventUriString(entity, false);
            EventMetadata inputMetadata   = GetEventMetadata(inputUriString, publishPolicyId, subscribePolicyId, (ushort)entity.UnitId, true);
            EventMetadata outputMetadata  = GetEventMetadata(outputUriString, subscribePolicyId, publishPolicyId, (ushort)entity.UnitId, false);

            //add the pi-systems to Piraeus
            AddEventMetadata(inputMetadata, accessToken);
            AddEventMetadata(outputMetadata, accessToken);

            //update the RTU Map
            RtuMap map = RtuMap.LoadFromConnectionStringAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter().GetResult();

            if (map == null)
            {
                map = new RtuMap();
            }
            else
            {
                if (map.HasItem((ushort)entity.UnitId))
                {
                    map.Remove((ushort)entity.UnitId);
                }
            }

            map.Add((ushort)entity.UnitId, inputUriString, outputUriString);
            map.UpdateMapAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter();

            //update the LUSS entity
            entity.Access = DateTime.UtcNow;
            if (!entity.Success.HasValue)
            {
                entity.Success = true;
            }

            await entity.UpdateAsync();

            string edgeSecurityToken = GetEdgeSecurityToken(entity);

            //create the cofiguration to return
            EdgeGatewayConfiguration edgeConfig = new EdgeGatewayConfiguration()
            {
                Hostname          = entity.Hostname,
                ModBusContainer   = entity.ModbusContainer,
                ModBusPort        = entity.ModbusPort,
                ModBusPath        = entity.ModbusPath,
                RtuInputPiSystem  = inputUriString,
                RtuOutputPiSsytem = outputUriString,
                SecurityToken     = edgeSecurityToken,
                UnitId            = entity.UnitId
            };

            return(edgeConfig);
        }