/** * Copyright © 2016-2022 The Thingsboard Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ syntax = "proto3"; package transport; option java_package = "org.thingsboard.server.gen.transport"; option java_outer_classname = "TransportProtos"; /** * Service Discovery Data Structures; */ message ServiceInfo { string serviceId = 1; repeated string serviceTypes = 2; repeated string transports = 6; } /** * Transport Service Data Structures; */ message SessionInfoProto { string nodeId = 1; int64 sessionIdMSB = 2; int64 sessionIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; int64 deviceIdMSB = 6; int64 deviceIdLSB = 7; string deviceName = 8; string deviceType = 9; int64 gwSessionIdMSB = 10; int64 gwSessionIdLSB = 11; int64 deviceProfileIdMSB = 12; int64 deviceProfileIdLSB = 13; int64 customerIdMSB = 14; int64 customerIdLSB = 15; } enum SessionEvent { OPEN = 0; CLOSED = 1; } enum SessionType { SYNC = 0; ASYNC = 1; } enum KeyValueType { BOOLEAN_V = 0; LONG_V = 1; DOUBLE_V = 2; STRING_V = 3; JSON_V = 4; } enum CredentialsType { ACCESS_TOKEN = 0; X509_CERTIFICATE = 1; MQTT_BASIC = 2; LWM2M_CREDENTIALS = 3; } message KeyValueProto { string key = 1; KeyValueType type = 2; bool bool_v = 3; int64 long_v = 4; double double_v = 5; string string_v = 6; string json_v = 7; } message TsKvProto { int64 ts = 1; KeyValueProto kv = 2; } message TsKvListProto { int64 ts = 1; repeated KeyValueProto kv = 2; } message DeviceInfoProto { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 deviceIdMSB = 3; int64 deviceIdLSB = 4; string deviceName = 5; string deviceType = 6; string additionalInfo = 7; int64 deviceProfileIdMSB = 8; int64 deviceProfileIdLSB = 9; int64 customerIdMSB = 10; int64 customerIdLSB = 11; string powerMode = 12; int64 edrxCycle = 13; int64 psmActivityTimer = 14; int64 pagingTransmissionWindow = 15; } /** * Transport Service Messages; */ message SessionEventMsg { SessionType sessionType = 1; SessionEvent event = 2; } message PostTelemetryMsg { repeated TsKvListProto tsKvList = 1; } message PostAttributeMsg { repeated KeyValueProto kv = 1; } message GetAttributeRequestMsg { int32 requestId = 1; repeated string clientAttributeNames = 2; repeated string sharedAttributeNames = 3; bool onlyShared = 4; } message GetAttributeResponseMsg { int32 requestId = 1; repeated TsKvProto clientAttributeList = 2; repeated TsKvProto sharedAttributeList = 3; bool isMultipleAttributesRequest = 4; string error = 5; bool sharedStateMsg = 6; } message AttributeUpdateNotificationMsg { repeated TsKvProto sharedUpdated = 1; repeated string sharedDeleted = 2; } message ValidateDeviceTokenRequestMsg { string token = 1; } message ValidateDeviceX509CertRequestMsg { string hash = 1; } message ValidateBasicMqttCredRequestMsg { string clientId = 1; string userName = 2; string password = 3; } message ValidateDeviceCredentialsResponseMsg { DeviceInfoProto deviceInfo = 1; string credentialsBody = 2; bytes profileBody = 3; } message GetOrCreateDeviceFromGatewayRequestMsg { int64 gatewayIdMSB = 1; int64 gatewayIdLSB = 2; string deviceName = 3; string deviceType = 4; } message GetOrCreateDeviceFromGatewayResponseMsg { DeviceInfoProto deviceInfo = 1; bytes profileBody = 2; } message GetEntityProfileRequestMsg { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; } message GetAllQueueRoutingInfoRequestMsg { } message GetQueueRoutingInfoResponseMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 queueIdMSB = 3; int64 queueIdLSB = 4; string queueName = 5; string queueTopic = 6; int32 partitions = 7; } message QueueUpdateMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 queueIdMSB = 3; int64 queueIdLSB = 4; string queueName = 5; string queueTopic = 6; int32 partitions = 7; } message QueueDeleteMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 queueIdMSB = 3; int64 queueIdLSB = 4; string queueName = 5; } message LwM2MRegistrationRequestMsg { string tenantId = 1; string endpoint = 2; } message LwM2MRegistrationResponseMsg { DeviceInfoProto deviceInfo = 1; } message LwM2MRequestMsg { LwM2MRegistrationRequestMsg registrationMsg = 1; } message LwM2MResponseMsg { LwM2MRegistrationResponseMsg registrationMsg = 1; } message GetResourceRequestMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; string resourceType = 3; string resourceKey = 4; } message GetResourceResponseMsg { bytes resource = 1; } message ValidateDeviceLwM2MCredentialsRequestMsg { string credentialsId = 1; } message ToTransportUpdateCredentialsProto { repeated string credentialsId = 1; repeated string credentialsValue = 2; } message GetTenantRoutingInfoRequestMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; } message GetTenantRoutingInfoResponseMsg { bool isolatedTbCore = 1; bool isolatedTbRuleEngine = 2; } message GetDeviceProfileRequestMsg { int64 profileIdMSB = 1; int64 profileIdLSB = 2; } message GetEntityProfileResponseMsg { string entityType = 1; bytes data = 2; bytes apiState = 3; } message GetDeviceRequestMsg { int64 deviceIdMSB = 1; int64 deviceIdLSB = 2; } message GetDeviceResponseMsg { int64 deviceProfileIdMSB = 1; int64 deviceProfileIdLSB = 2; bytes deviceTransportConfiguration = 3; } message GetDeviceCredentialsRequestMsg { int64 deviceIdMSB = 1; int64 deviceIdLSB = 2; } message GetDeviceCredentialsResponseMsg { bytes deviceCredentialsData = 1; } message GetSnmpDevicesRequestMsg { int32 page = 1; int32 pageSize = 2; } message GetSnmpDevicesResponseMsg { repeated string ids = 1; bool hasNextPage = 2; } message EntityUpdateMsg { string entityType = 1; bytes data = 2; } message EntityDeleteMsg { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; } message ResourceUpdateMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; string resourceType = 3; string resourceKey = 4; } message ResourceDeleteMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; string resourceType = 3; string resourceKey = 4; } message SessionCloseNotificationProto { string message = 1; } message SubscribeToAttributeUpdatesMsg { bool unsubscribe = 1; SessionType sessionType = 2; } message SubscribeToRPCMsg { bool unsubscribe = 1; SessionType sessionType = 2; } message SendPendingRPCMsg { } message ToDeviceRpcRequestMsg { int32 requestId = 1; string methodName = 2; string params = 3; int64 expirationTime = 4; int64 requestIdMSB = 5; int64 requestIdLSB = 6; bool oneway = 7; bool persisted = 8; } message ToDeviceRpcResponseMsg { int32 requestId = 1; string payload = 2; string error = 3; } message UplinkNotificationMsg { int64 uplinkTs = 1; } message ToDeviceRpcResponseStatusMsg { int32 requestId = 1; int64 requestIdMSB = 2; int64 requestIdLSB = 3; string status = 4; } message ToServerRpcRequestMsg { int32 requestId = 1; string methodName = 2; string params = 3; } message ToServerRpcResponseMsg { int32 requestId = 1; string payload = 2; string error = 3; } message ClaimDeviceMsg { int64 deviceIdMSB = 1; int64 deviceIdLSB = 2; string secretKey = 3; int64 durationMs = 4; } message DeviceCredentialsProto { int64 deviceIdMSB = 1; int64 deviceIdLSB = 2; CredentialsType credentialsType = 3; string credentialsId = 4; string credentialsValue = 5; } message CredentialsDataProto { ValidateDeviceTokenRequestMsg validateDeviceTokenRequestMsg = 1; ValidateDeviceX509CertRequestMsg validateDeviceX509CertRequestMsg = 2; ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 3; } message ProvisionDeviceRequestMsg { string deviceName = 1; CredentialsType credentialsType = 2; ProvisionDeviceCredentialsMsg provisionDeviceCredentialsMsg = 3; CredentialsDataProto credentialsDataProto = 4; } message ProvisionDeviceCredentialsMsg { string provisionDeviceKey = 1; string provisionDeviceSecret = 2; } message ProvisionDeviceResponseMsg { ResponseStatus status = 1; CredentialsType credentialsType = 2; string credentialsValue = 3; } enum ResponseStatus { UNKNOWN = 0; SUCCESS = 1; NOT_FOUND = 2; FAILURE = 3; } message GetOtaPackageRequestMsg { int64 deviceIdMSB = 1; int64 deviceIdLSB = 2; int64 tenantIdMSB = 3; int64 tenantIdLSB = 4; string type = 5; } message GetOtaPackageResponseMsg { ResponseStatus responseStatus = 1; int64 otaPackageIdMSB = 2; int64 otaPackageIdLSB = 3; string type = 4; string title = 5; string version = 6; string contentType = 7; string fileName = 8; } //Used to report session state to tb-Service and persist this state in the cache on the tb-Service level. message SubscriptionInfoProto { int64 lastActivityTime = 1; bool attributeSubscription = 2; bool rpcSubscription = 3; } message SessionSubscriptionInfoProto { SessionInfoProto sessionInfo = 1; SubscriptionInfoProto subscriptionInfo = 2; } message DeviceSessionsCacheEntry { repeated SessionSubscriptionInfoProto sessions = 1; } message TransportToDeviceActorMsg { SessionInfoProto sessionInfo = 1; SessionEventMsg sessionEvent = 2; GetAttributeRequestMsg getAttributes = 3; SubscribeToAttributeUpdatesMsg subscribeToAttributes = 4; SubscribeToRPCMsg subscribeToRPC = 5; ToDeviceRpcResponseMsg toDeviceRPCCallResponse = 6; SubscriptionInfoProto subscriptionInfo = 7; ClaimDeviceMsg claimDevice = 8; ProvisionDeviceRequestMsg provisionDevice = 9; ToDeviceRpcResponseStatusMsg rpcResponseStatusMsg = 10; SendPendingRPCMsg sendPendingRPC = 11; UplinkNotificationMsg uplinkNotificationMsg = 12; } message TransportToRuleEngineMsg { SessionInfoProto sessionInfo = 1; PostTelemetryMsg postTelemetry = 2; PostAttributeMsg postAttributes = 3; ToDeviceRpcResponseMsg toDeviceRPCCallResponse = 4; ToServerRpcRequestMsg toServerRPCCallRequest = 5; } /** * TB Core Data Structures */ message TbSubscriptionProto { string serviceId = 1; string sessionId = 2; int32 subscriptionId = 3; string entityType = 4; int64 tenantIdMSB = 5; int64 tenantIdLSB = 6; int64 entityIdMSB = 7; int64 entityIdLSB = 8; } message TbTimeSeriesSubscriptionProto { TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; int64 startTime = 4; int64 endTime = 5; bool latestValues = 6; } message TbAttributeSubscriptionProto { TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; string scope = 4; } message TbAlarmSubscriptionProto { TbSubscriptionProto sub = 1; int64 ts = 2; } message TbSubscriptionUpdateProto { string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; string errorMsg = 4; repeated TbSubscriptionUpdateValueListProto data = 5; } message TbAlarmSubscriptionUpdateProto { string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; string errorMsg = 4; string alarm = 5; bool deleted = 6; } message TbAttributeUpdateProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; string scope = 6; repeated TsKvProto data = 7; } message TbAlarmUpdateProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; string alarm = 6; } message TbAlarmDeleteProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; string alarm = 6; } message TbAttributeDeleteProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; string scope = 6; repeated string keys = 7; } message TbTimeSeriesDeleteProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; repeated string keys = 6; } message TbTimeSeriesUpdateProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; int64 tenantIdMSB = 4; int64 tenantIdLSB = 5; repeated TsKvProto data = 6; } message TbSubscriptionCloseProto { string sessionId = 1; int32 subscriptionId = 2; } message TbSubscriptionKetStateProto { string key = 1; int64 ts = 2; } message TbSubscriptionUpdateValueListProto { string key = 1; repeated TbSubscriptionUpdateTsValue tsValue = 2; } message TbSubscriptionUpdateTsValue { int64 ts = 1; optional string value = 2; } /** * TB Core to TB Core messages */ message DeviceStateServiceMsgProto { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 deviceIdMSB = 3; int64 deviceIdLSB = 4; bool added = 5; bool updated = 6; bool deleted = 7; } message SubscriptionMgrMsgProto { TbTimeSeriesSubscriptionProto telemetrySub = 1; TbAttributeSubscriptionProto attributeSub = 2; TbSubscriptionCloseProto subClose = 3; TbTimeSeriesUpdateProto tsUpdate = 4; TbAttributeUpdateProto attrUpdate = 5; TbAttributeDeleteProto attrDelete = 6; TbAlarmSubscriptionProto alarmSub = 7; TbAlarmUpdateProto alarmUpdate = 8; TbAlarmDeleteProto alarmDelete = 9; TbTimeSeriesDeleteProto tsDelete = 10; } message LocalSubscriptionServiceMsgProto { TbSubscriptionUpdateProto subUpdate = 1; TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2; } message FromDeviceRPCResponseProto { int64 requestIdMSB = 1; int64 requestIdLSB = 2; string response = 3; int32 error = 4; } message EdgeNotificationMsgProto { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 edgeIdMSB = 3; int64 edgeIdLSB = 4; string type = 5; string action = 6; int64 entityIdMSB = 7; int64 entityIdLSB = 8; string entityType = 9; string body = 10; PostTelemetryMsg postTelemetryMsg = 11; PostAttributeMsg postAttributesMsg = 12; } /** TB Core to Version Control Service */ message CommitRequestMsg { string txId = 1; // To correlate prepare, add, delete and push messages PrepareMsg prepareMsg = 2; AddMsg addMsg = 3; DeleteMsg deleteMsg = 4; PushMsg pushMsg = 5; AbortMsg abortMsg = 6; } message CommitResponseMsg { string commitId = 1; string name = 2; int32 added = 3; int32 modified = 4; int32 removed = 5; } message PrepareMsg { string commitMsg = 1; string branchName = 2; } message AddMsg { string relativePath = 1; string entityDataJson = 2; } message DeleteMsg { string relativePath = 1; } message PushMsg { } message AbortMsg { } message ListVersionsRequestMsg { string branchName = 1; string entityType = 2; int64 entityIdMSB = 3; int64 entityIdLSB = 4; } message EntityVersionProto { int64 ts = 1; string id = 2; string name = 3; } message ListVersionsResponseMsg { repeated EntityVersionProto versions = 1; } message ListEntitiesRequestMsg { string branchName = 1; string versionId = 2; string entityType = 3; } message VersionedEntityInfoProto { string entityType = 1; int64 entityIdMSB = 2; int64 entityIdLSB = 3; } message ListEntitiesResponseMsg { repeated VersionedEntityInfoProto entities = 1; } message ListBranchesRequestMsg { } message ListBranchesResponseMsg { repeated string branches = 1; } message EntityContentRequestMsg { string versionId = 1; string entityType = 2; int64 entityIdMSB = 3; int64 entityIdLSB = 4; } message EntityContentResponseMsg { string data = 1; } message EntitiesContentRequestMsg { string versionId = 1; string entityType = 2; int32 offset = 3; int32 limit = 4; } message EntitiesContentResponseMsg { repeated string data = 1; } message GenericRepositoryRequestMsg {} message GenericRepositoryResponseMsg {} message ToVersionControlServiceMsg { string nodeId = 1; int64 tenantIdMSB = 2; int64 tenantIdLSB = 3; int64 requestIdMSB = 4; int64 requestIdLSB = 5; bytes vcSettings = 6; GenericRepositoryRequestMsg initRepositoryRequest = 7; GenericRepositoryRequestMsg testRepositoryRequest = 8; GenericRepositoryRequestMsg clearRepositoryRequest = 9; CommitRequestMsg commitRequest = 10; ListVersionsRequestMsg listVersionRequest = 11; ListEntitiesRequestMsg listEntitiesRequest = 12; ListBranchesRequestMsg listBranchesRequest = 13; EntityContentRequestMsg entityContentRequest = 14; EntitiesContentRequestMsg entitiesContentRequest = 15; } message VersionControlResponseMsg { int64 requestIdMSB = 1; int64 requestIdLSB = 2; string error = 3; GenericRepositoryResponseMsg genericResponse = 4; CommitResponseMsg commitResponse = 5; ListBranchesResponseMsg listBranchesResponse = 6; ListEntitiesResponseMsg listEntitiesResponse = 7; ListVersionsResponseMsg listVersionsResponse = 8; EntityContentResponseMsg entityContentResponse = 9; EntitiesContentResponseMsg entitiesContentResponse = 10; } /** * Main messages; */ /* Request from Transport Service to ThingsBoard Core Service */ message TransportApiRequestMsg { ValidateDeviceTokenRequestMsg validateTokenRequestMsg = 1; ValidateDeviceX509CertRequestMsg validateX509CertRequestMsg = 2; GetOrCreateDeviceFromGatewayRequestMsg getOrCreateDeviceRequestMsg = 3; GetEntityProfileRequestMsg entityProfileRequestMsg = 4; LwM2MRequestMsg lwM2MRequestMsg = 5; ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6; ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7; ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8; GetResourceRequestMsg resourceRequestMsg = 9; GetOtaPackageRequestMsg otaPackageRequestMsg = 10; GetSnmpDevicesRequestMsg snmpDevicesRequestMsg = 11; GetDeviceRequestMsg deviceRequestMsg = 12; GetDeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 13; GetAllQueueRoutingInfoRequestMsg getAllQueueRoutingInfoRequestMsg = 14; } /* Response from ThingsBoard Core Service to Transport Service */ message TransportApiResponseMsg { ValidateDeviceCredentialsResponseMsg validateCredResponseMsg = 1; GetOrCreateDeviceFromGatewayResponseMsg getOrCreateDeviceResponseMsg = 2; GetEntityProfileResponseMsg entityProfileResponseMsg = 3; ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4; GetSnmpDevicesResponseMsg snmpDevicesResponseMsg = 5; LwM2MResponseMsg lwM2MResponseMsg = 6; GetResourceResponseMsg resourceResponseMsg = 7; GetOtaPackageResponseMsg otaPackageResponseMsg = 8; GetDeviceResponseMsg deviceResponseMsg = 9; GetDeviceCredentialsResponseMsg deviceCredentialsResponseMsg = 10; repeated GetQueueRoutingInfoResponseMsg getQueueRoutingInfoResponseMsgs = 11; } /* Messages that are handled by ThingsBoard Core Service */ message ToCoreMsg { TransportToDeviceActorMsg toDeviceActorMsg = 1; DeviceStateServiceMsgProto deviceStateServiceMsg = 2; SubscriptionMgrMsgProto toSubscriptionMgrMsg = 3; bytes toDeviceActorNotificationMsg = 4; EdgeNotificationMsgProto edgeNotificationMsg = 5; } /* High priority messages with low latency are handled by ThingsBoard Core Service separately */ message ToCoreNotificationMsg { LocalSubscriptionServiceMsgProto toLocalSubscriptionServiceMsg = 1; FromDeviceRPCResponseProto fromDeviceRpcResponse = 2; bytes componentLifecycleMsg = 3; bytes edgeEventUpdateMsg = 4; QueueUpdateMsg queueUpdateMsg = 5; QueueDeleteMsg queueDeleteMsg = 6; VersionControlResponseMsg vcResponseMsg = 7; } /* Messages that are handled by ThingsBoard RuleEngine Service */ message ToRuleEngineMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; bytes tbMsg = 3; repeated string relationTypes = 4; string failureMessage = 5; } message ToRuleEngineNotificationMsg { bytes componentLifecycleMsg = 1; FromDeviceRPCResponseProto fromDeviceRpcResponse = 2; QueueUpdateMsg queueUpdateMsg = 3; QueueDeleteMsg queueDeleteMsg = 4; } /* Messages that are handled by ThingsBoard Transport Service */ message ToTransportMsg { int64 sessionIdMSB = 1; int64 sessionIdLSB = 2; SessionCloseNotificationProto sessionCloseNotification = 3; GetAttributeResponseMsg getAttributesResponse = 4; AttributeUpdateNotificationMsg attributeUpdateNotification = 5; ToDeviceRpcRequestMsg toDeviceRequest = 6; ToServerRpcResponseMsg toServerResponse = 7; EntityUpdateMsg entityUpdateMsg = 8; EntityDeleteMsg entityDeleteMsg = 9; ProvisionDeviceResponseMsg provisionResponse = 10; ToTransportUpdateCredentialsProto toTransportUpdateCredentialsNotification = 11; ResourceUpdateMsg resourceUpdateMsg = 12; ResourceDeleteMsg resourceDeleteMsg = 13; UplinkNotificationMsg uplinkNotificationMsg = 14; QueueUpdateMsg queueUpdateMsg = 15; QueueDeleteMsg queueDeleteMsg = 16; } message UsageStatsKVProto{ string key = 1; int64 value = 2; } message ToUsageStatsServiceMsg { int64 tenantIdMSB = 1; int64 tenantIdLSB = 2; int64 entityIdMSB = 3; int64 entityIdLSB = 4; repeated UsageStatsKVProto values = 5; int64 customerIdMSB = 6; int64 customerIdLSB = 7; } message ToOtaPackageStateServiceMsg { int64 ts = 1; int64 tenantIdMSB = 2; int64 tenantIdLSB = 3; int64 deviceIdMSB = 4; int64 deviceIdLSB = 5; int64 otaPackageIdMSB = 6; int64 otaPackageIdLSB = 7; string type = 8; }