Пользовательское распределение поддерживает настройку исходного устройства-близнеца, а также концентратора IoT. Двойник устройства не устанавливается.
Я настроил службу обеспечения устройств в Azure для использования пользовательской функции Azure. В функции Azure через пользовательский API мы запускаем логику, чтобы определить наилучшее расположение IoT-концентратора для устройства. В дополнение к назначению IoT Hub код предоставляет исходные данные об устройстве-близнецах, но он не работает.
Я следую примеру кода, описанному в этом блоге:
https://sandervandevelde.wordpress.com/2018/12/29/custom-iot-hub-assignment-in-device-provisioning-service/
Я просмотрел несколько связанных с этим проблем с пользовательским размещением, но не нашел никого, кто использовал подход с пользовательской функцией Azure, как описано выше.
Ниже приведен фрагмент соответствующего кода из статьи блога выше.
var response = new Response(savefileresponse.AssignedHub);
//loading an instance of the initiTwin didn't work, try typing device twin values in manually
//response.initialTwin = savefileresponse.initialTwin;
response.initialTwin.properties.desired = new JObject();
response.initialTwin.properties.desired.PropOne = "2345";
response.initialTwin.properties.desired.PropTwo = "6789";
Ниже приведены определения классов, взятые из статьи блога. Обратите внимание на использование динамического типа для желаемых свойств. Кто-нибудь может подтвердить, что это правильный тип ответа на сообщение DPS?
public class AssignDeviceResponse
{
public AssignDeviceResponse()
{
this.initialTwin = new ResponseTwin();
}
public ProvisioningRegistrationStatusType Status { get; set; }
public string DeviceId { get; set; }
public string AssignedHub { get; set; }
public ResponseTwin initialTwin { get; set; }
}
#endregion
#region Microsoft DPS response contracts
public class Response
{
public Response(string hostName)
{
iotHubHostName = hostName;
initialTwin = new ResponseTwin();
}
public string iotHubHostName { get; set; }
public ResponseTwin initialTwin { get; set; }
}
public class ResponseTwin
{
public ResponseTwin()
{
properties = new ResponseProperties();
}
public dynamic tags { get; set; }
public ResponseProperties properties { get; set; } // contains desired properties
}
public class ResponseProperties
{
public dynamic desired { get; set; }
}
#endregion
После инициализации значение IoT Hub возвращается на устройство корректно. Затем я зашел в лазурный портал IoT Hub и показал двойное значение устройства. Ни одно из добавленных мной пользовательских свойств не отображается. Показанный ниже близнец, по-видимому, является некоторым IoT Hub по умолчанию, поскольку он также не соответствует двойнику в службе DPS.
{
"deviceId": "cde5d316-9c01-3961-b850-8f5c17cea937",
"etag": "AAAAAAAAAAE=",
"deviceEtag": "NzA1OTc5MzE1",
"status": "enabled",
"statusUpdateTime": "0001-01-01T00:00:00",
"connectionState": "Disconnected",
"lastActivityTime": "2019-04-26T16:41:11.6618195",
"cloudToDeviceMessageCount": 0,
"authenticationType": "selfSigned",
"x509Thumbprint": {
"primaryThumbprint":
"xxx",
"secondaryThumbprint":
"xxx"
},
"version": 2,
"properties": {
"desired": {
"$metadata": {
"$lastUpdated": "2019-04-26T16:41:09.4381992Z"
},
"$version": 1
},
"reported": {
"$metadata": {
"$lastUpdated": "2019-04-26T16:41:09.4381992Z"
},
"$version": 1
}
},
"capabilities": {
"iotEdge": false
}
}
Как установить двойное значение по умолчанию для устройства с помощью пользовательского выделения?
РЕДАКТИРОВАТЬ: Попробовав другой тип ответа на мою функцию, я решил также опубликовать код, который работает для меня, чтобы прочитать параметры, а также сформировать ответ, который действительно сериализуется через DPS. По-прежнему остается вопрос, как установить желаемые значения initialTwin. Вот код лазурной функции, который сериализуется обратно в DPS.
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequestMessage req, TraceWriter log)
{
string requestBody = await req.Content.ReadAsStringAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
//Read out key information
string deviceId = data.deviceRuntimeContext.registrationId;
string certificate = data.deviceRuntimeContext.x509.clientCertificate;
var response = new Response(data.linkedHubs?[0]);
//Can't get initialTwin data back to DPS
//response.initialTwin = new ResponseTwin() { }
return req.CreateResponse<Response>(HttpStatusCode.OK, response);
}