Documentation
¶
Overview ¶
Package note dfu.go contains DFU-related structures generated/parsed by the notecard
Package note errors.go contains programmatically-testable error strings
Index ¶
- Constants
- func BodyToObject(body *map[string]interface{}, object interface{}) (err error)
- func ErrorClean(err error) error
- func ErrorContains(err error, errKeyword string) bool
- func ErrorHttpStatus(errstr string) int
- func ErrorJSON(message string, err error) (rspJSON []byte)
- func ErrorString(err error) string
- func JSONMarshal(v interface{}) ([]byte, error)
- func JSONMarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
- func JSONToBody(bodyJSON []byte) (body map[string]interface{}, err error)
- func JSONUnmarshal(data []byte, v interface{}) (err error)
- func ObjectToBody(object interface{}) (body map[string]interface{}, err error)
- func ObjectToJSON(object interface{}) (bodyJSON []byte, err error)
- func WordToNumber(word string) (num uint, success bool)
- func WordsFromNumber(number uint32) string
- func WordsFromString(in string) (out string)
- func WordsToNumber(words string) (num uint32, found bool)
- type Contact
- type Contacts
- type DFUEnv
- type DFUState
- type DeviceSession
- type DeviceUsage
- type DfuPhase
- type Event
- type EventRoutingStatus
- type History
- type Info
- type Message
- type MessageAddress
- type MessageContact
- type Note
- func (note *Note) Close()
- func (note *Note) Dup() Note
- func (note *Note) EndpointID() string
- func (note *Note) GetBody() []byte
- func (note *Note) GetConflicts() []Note
- func (note *Note) GetEndpointID() (endpointID string)
- func (note *Note) GetModified() (isAvailable bool, endpointID string, when string, where string, updates int32)
- func (note *Note) GetPayload() []byte
- func (note *Note) HasConflicts() bool
- func (note *Note) SetBody(body []byte) (err error)
- func (note *Note) SetPayload(payload []byte)
- func (note *Note) When() (when int64)
- type NotefileDesc
- type NotefileInfo
- type PacketUsage
- type RouteLogEntry
- type RoutingSource
- type TowerLocation
- type Word
Constants ¶
const ACActionAnd = "&"
ACActionAnd ensures that all of these actions are allowed
const ACActionCreate = "create"
ACActionCreate (golint)
const ACActionDelete = "delete"
ACActionDelete (golint)
const ACActionMonitor = "monitor"
ACActionMonitor (golint)
const ACActionOr = "|"
ACActionOr ensures that any of these actions are allowed
const ACActionRead = "read"
ACActionRead (golint)
const ACActionUpdate = "update"
ACActionUpdate (golint)
const ACResourceAccount = "account:"
ACResourceAccount is an account resource, which is the accountUID that always begins with this string
const ACResourceAccounts = "account:*"
ACResourceAccounts is the resource for all accounts and all meta-account-level actions
const ACResourceApp = "app:"
ACResourceApp is the app (project) resource, which is the appUID that always begins with this string
const ACResourceApps = "app:*"
ACResourceApps is the resource for all apps
const ACResourceDevice = "dev:"
ACResourceDevice is the device resource, which is the deviceUID that always begins with this string
const ACResourceDevices = "dev:*"
ACResourceDevices is the resource for all devices
const ACResourceNotecardFirmwares = "notecard:*"
ACResourceNotecardFirmwares is the resource for all notecard firmware
const ACResourceNotefile = "file:"
ACResourceNotefile is the notefile resource and its note-level actions, which is the notefileID prefixed with this string
const ACResourceNotefiles = "file:*"
ACResourceNotefiles is the resource for all notefiles and all meta-notefile-level actions
const ACResourceRoute = "route:"
ACResourceRoute is an route resource, which is the routeUID that always begins with this string
const ACResourceRoutes = "route:*"
ACResourceRoutes is the resource for all routes and all meta-route-level actions
const ACResourceSep = ":"
ACResourceSep is the separator for building compound resource names
const ACResourceUserFirmwares = "firmware:*"
ACResourceUserFirmwares is the resource for all user firmware
const ACValidActionsAccount = "account:create,account:read,account:update,account:delete"
ACValidActionsAccount are actions allowed on accounts
const ACValidActionsApp = "app:create,app:read,app:update,app:delete,app:monitor"
ACValidActionsApp are actions allowed on apps
const ACValidActionsDev = "dev:read,dev:update,dev:delete,dev:monitor"
ACValidActionsDev are actions allowed on devices
const ACValidActionsFile = "file:create,file:read,file:update,file:delete"
ACValidActionsFile are actions allowed on notefiles
const ACValidActionsFirmware = "firmware:create,firmware:read,firmware:update,firmware:delete"
ACValidActionsFirmware are actions allowed on user firmware
const ACValidActionsNotecard = "notecard:create,notecard:read,notecard:update,notecard:delete"
ACValidActionsNotecard are actions allowed on notecard firmware
const ACValidActionsRoute = "route:create,route:read,route:update,route:delete"
ACValidActionsRoute are actions allowed on routes
const ContactOwnerNoteID = "owner"
ContactOwnerNoteID indicates that this is my contact
const ContactStore = "contacts.db"
ContactStore is the place where the user retains contact info
const DefaultDeviceEndpointID = ""
DefaultDeviceEndpointID is the default endpoint name of the edge, chosen for its length in protocol messages
const DefaultHubEndpointID = "1"
DefaultHubEndpointID is the default endpoint name of the hub, chosen for its length in protocol messages
const EnvNotefile = "_env.dbs"
EnvNotefile is the hard-wired notefile that the notecard uses for env vars
const ErrAccessDenied = "{access-denied}"
ErrAccessDenied (golint)
const ErrAddToFleet = "{add-to-fleet}"
These are returned from JSONata transforms as special strings to indicate the given behavior Used by Smart Fleets and during routing
const ErrAppDeleted = "{app-deleted}"
ErrAppDeleted (golint)
const ErrAppExists = "{app-exists}"
ErrAppExists (golint)
const ErrAppNotFound = "{app-noexist}"
ErrAppNotFound (golint)
const ErrAppNotSpecified = "{app-none}"
ErrAppNotSpecified (golint)
const ErrAuth = "{auth}"
ErrAuth (golint)
const ErrCardHeartbeat = "{heartbeat}"
ErrCardHeartbeat (golint) Doesn't seem to be used as a request error
const ErrCardIo = "{io}"
ErrCardIo (golint)
const ErrClosed = "{closed}"
ErrClosed (golint)
const ErrDFUInProgress = "{dfu-in-progress}"
ErrDFUInProgress (golint)
const ErrDFUNotReady = "{dfu-not-ready}"
ErrDFUNotReady (golint)
const ErrDeviceDelay10 = "{device-delay-10}"
const ErrDeviceDelay15 = "{device-delay-15}"
const ErrDeviceDelay20 = "{device-delay-20}"
const ErrDeviceDelay30 = "{device-delay-30}"
const ErrDeviceDelay5 = "{device-delay-5}"
These can be sent from Notehub to the notecard to indicate it should pause before reconnecting Currently unused
const ErrDeviceDelay60 = "{device-delay-60}"
const ErrDeviceDisabled = "{device-disabled}"
ErrDeviceDisabled (golint)
const ErrDeviceId = "{device-id-invalid}"
ErrDeviceId (golint)
const ErrDeviceNotFound = "{device-noexist}"
ErrDeviceNotFound (golint)
const ErrDeviceNotSpecified = "{device-none}"
ErrDeviceNotSpecified (golint)
const ErrDoNotRoute = "{do-not-route}"
const ErrExtendedNetworkFailure = "{extended-network-failure}"
ErrExtendedNetworkFailure (golint)
const ErrExtendedServiceFailure = "{extended-service-failure}"
ErrExtendedServiceFailure (golint)
const ErrFileNoExist = "{file-noexist}"
ErrFileNoExist (golint)
const ErrFleetNotFound = "{fleet-noexist}"
ErrFleetNotFound (golint)
const ErrHostUnreachable = "{host-unreachable}"
ErrHostUnreachable (golint)
const ErrHubMode = "{hub-mode}"
ErrHubMode (golint) Unused
const ErrHubNoHandler = "{no-handler}"
ErrHubNoHandler (golint)
const ErrIncompatible = "{incompatible}"
ErrIncompatible (golint)
const ErrInternalTimeout = "{internal-timeout}"
ErrInternalTimeout of a notehub-to-notehub transaction (golint)
const ErrJson = "{not-json}"
ErrJson (golint)
const ErrLeaveFleetAlone = "{leave-fleet-alone}"
const ErrNetwork = "{network}"
ErrNetwork (golint)
const ErrNoteExists = "{note-exists}"
ErrNoteExists (golint)
const ErrNoteNoExist = "{note-noexist}"
ErrNoteNoExist (golint)
const ErrNotefileExists = "{notefile-exists}"
ErrNotefileExists (golint)
const ErrNotefileInUse = "{notefile-in-use}"
ErrNotefileInUse (golint)
const ErrNotefileName = "{notefile-bad-name}"
ErrNotefileName (golint)
const ErrNotefileNoExist = "{notefile-noexist}"
ErrNotefileNoExist (golint)
const ErrNotefileQueueDisallowed = "{notefile-queue-disallowed}"
ErrNotefileQueueDisallowed (golint)
const ErrProductNotFound = "{product-noexist}"
ErrProductNotFound (golint)
const ErrProductNotSpecified = "{product-none}"
ErrProductNotSpecified (golint)
const ErrRegistrationFailure = "{registration-failure}"
ErrRegistrationFailure (golint)
const ErrRemoveFromFleet = "{remove-from-fleet}"
const ErrReqNotSupported = "{not-supported}"
ErrReqNotSupported (golint)
const ErrRouteTimeout = "{route-timeout}"
ErrRouteTimeout of a notehub-to-customer-service transaction (golint)
const ErrSyntax = "{syntax}"
ErrSyntax (golint)
const ErrTemplateIncompatible = "{template-incompatible}"
ErrTemplateIncompatible (golint)
const ErrTicket = "{ticket}"
ErrTicket (golint)
const ErrTimeout = "{timeout}"
ErrTimeout (golint)
const ErrTooBig = "{too-big}"
ErrTooBig (golint)
const ErrTooManyNotes = "{too-many-notes}"
ErrTooManyNotes (golint)
const ErrTrackerExists = "{tracker-exists}"
ErrTrackerExists (golint)
const ErrTrackerNoExist = "{tracker-noexist}"
ErrTrackerNoExist (golint)
const ErrWebPayload = "{web-payload}"
ErrWebPayload (golint)
const EventAdd = "note.add"
EventAdd (golint)
const EventDelete = "note.delete"
EventDelete (golint)
const EventGeolocation = "device.geolocation"
EventGeolocation (golint)
const EventGet = "get"
EventGet (golint)
const EventNoAction = ""
EventNoAction (golint)
const EventPost = "post"
EventPost (golint)
const EventPut = "put"
EventPut (golint)
const EventSessionBegin = "session.begin"
EventSessionBegin (golint)
const EventSessionEnd = "session.end"
EventSessionEndNotehub (golint)
const EventSocket = "web.socket"
EventSocket (golint)
const EventTest = "test"
EventTest (golint)
const EventTower = "device.tower"
EventTower (golint)
const EventUpdate = "note.update"
EventUpdate (golint)
const EventWebhook = "webhook"
EventWebhook (golint)
const GeolocationNotefile = "_geolocate.qo"
GeolocationNotefile is the hard-wired notefile that the notehub uses when performing a geolocation
const HealthHostNotefile = "_health_host.qo"
HealthHostNotefile is the hard-wired notefile that the host uses for health-related info
const HealthNotefile = "_health.qo"
HealthNotefile is the hard-wired notefile that the notecard uses for health-related info
const HubDefaultInboundNotefile = "data.qi"
HubDefaultInboundNotefile is the hard-wired default notefile for user data
const HubDefaultOutboundNotefile = "data.qo"
HubDefaultOutboundNotefile is the hard-wired default notefile for user data
const LogNotefile = "_log.qo"
LogNotefile is the hard-wired notefile that the notecard uses for debug logging
const MessageContentASCII = ""
MessageContentASCII is just simple ASCII text
const MessageInbox = "messages.qi"
MessageInbox is the place into which messages are received
const MessageOutbox = "messages.qo"
MessageOutbox is the place from which messages are sent
const MessageSTagReceived = "received"
MessageSTagReceived indicates that this was a received message
const MessageSTagSent = "sent"
MessageSTagSent indicates that this was a sent message
const MessageStore = "messages.db"
MessageStore is the place where the user retains messages
const MessageTagImportant = "important"
MessageTagImportant indicates that the sender feels that this is an important message
const MessageTagUrgent = "urgent"
MessageTagUrgent indicates that the sender feels that this is an urgent message
const NotecardRequestNotefile = "_req.qis"
NotecardRequestNotefile is a special notefile for sending notecard requests
const NotecardResponseNotefile = "_rsp.qos"
NotecardResponseNotefile is a special notefile for sending notecard responses
const SessionNotefile = "_session.qo"
SessionNotefile is the hard-wired notefile that the notehub uses when starting a session
const SocketNotefile = "_socket.qo"
SocketNotefile is the hard-wired notefile that the notehub uses when doing websocket I/O
const StatusGPSInactive = "{gps-inactive}"
const StatusIdle = "{idle}"
Status messages returned by the notecard in request.Status
const StatusNtnIdle = "{ntn-idle}"
const StatusTransportConnectFailure = "{connect-failure}"
const StatusTransportConnected = "{connected}"
const StatusTransportConnectedClosed = "{connected-closed}"
const StatusTransportConnecting = "{connecting}"
const StatusTransportDisconnected = "{disconnected}"
const StatusTransportWaitData = "{wait-data}"
const StatusTransportWaitGateway = "{wait-gateway}"
const StatusTransportWaitModule = "{wait-module}"
const StatusTransportWaitService = "{wait-service}"
const SyncPriorityHigh = 1
SyncPriorityHigh (golint)
const SyncPriorityHigher = 2
SyncPriorityHigher (golint)
const SyncPriorityHighest = 3
SyncPriorityHighest (golint)
const SyncPriorityLow = -1
SyncPriorityLow (golint)
const SyncPriorityLower = -2
SyncPriorityLower (golint)
const SyncPriorityLowest = -3
SyncPriorityLowest (golint)
const SyncPriorityNormal = 0
SyncPriorityNormal (golint)
const TowerNotefile = "_tower.qo"
TowerNotefile is the hard-wired notefile that the notehub uses when performing tower updates
const TrackNotefile = "_track.qo"
TrackNotefile is the hard-wired notefile that the notecard can use for tracking the device
const WatchdogNotefile = "_watchdog.qo"
WatchdogNotefile is the hard-wired notefile that the notehub uses when adding watchdog messages
const WebNotefile = "_web.qo"
WebNotefile is the hard-wired notefile that the notehub uses when performing web requests
Variables ¶
This section is empty.
Functions ¶
func BodyToObject ¶ added in v1.2.1
BodyToObject Unmarshals the specified map into an object
func ErrorClean ¶ added in v1.1.21
ErrorClean removes all error keywords from an error string
func ErrorContains ¶ added in v1.1.21
ErrorContains tests to see if an error contains an error keyword that we might expect
func ErrorHttpStatus ¶ added in v1.7.5
This scans a response.Err string for known error keywords and returns the appropriate HTTP status code If there are multiple error keywords, the first one found is used as the source for the code. We choose the first one because that should be the most relevant to the specific failure. If no known error keywords are found, we return HTTP 500 Internal Server Error.
func ErrorJSON ¶ added in v1.3.8
ErrorJSON returns a JSON object with nothing but an error code, and with an optional message
func ErrorString ¶ added in v1.1.21
ErrorString safely returns a string from any error, returning "" for nil
func JSONMarshal ¶ added in v1.2.1
JSONMarshal is the equivalent to the json package's Marshal, however it does not escape HTML sitting inside JSON strings.
func JSONMarshalIndent ¶ added in v1.2.1
JSONMarshalIndent is like Marshal but applies Indent to format the output. Each JSON element in the output will begin on a new line beginning with prefix followed by one or more copies of indent according to the indentation nesting.
func JSONToBody ¶ added in v1.1.1
JSONToBody unmarshals the specified object and returns it as a map[string]interface{}
func JSONUnmarshal ¶ added in v1.2.1
JSONUnmarshal uses JSON Numbers, rather than assuming Floats. This fixes an issue in which, when decoding to an arbitrary interface, the JSON package decodes large numbers (like Unix epoch) into floats.
func ObjectToBody ¶ added in v1.1.1
ObjectToBody Marshals the specified object and returns it as map
func ObjectToJSON ¶ added in v1.1.1
ObjectToJSON Marshals the specified object and returns it as a []byte
func WordToNumber ¶ added in v1.3.7
WordToNumber converts a single word to a number
func WordsFromNumber ¶ added in v1.3.7
WordsFromNumber converts a number to three simple words
func WordsFromString ¶ added in v1.3.7
WordsFromString hashes a string with a 32-bit function and converts it to three simple words
func WordsToNumber ¶ added in v1.3.7
WordsToNumber looks up a number from two or three simple words
Types ¶
type Contact ¶ added in v1.5.1
type Contact struct {
Name string `json:"name,omitempty"`
Affiliation string `json:"org,omitempty"`
Role string `json:"role,omitempty"`
Email string `json:"email,omitempty"`
}
Contact has the basic contact info structure
NOTE: This structure's underlying storage has been decoupled from the use of the structure in business logic. As such, please share any changes to these structures with cloud services to ensure that storage and testing frameworks are kept in sync with these structures used for business logic
type Contacts ¶ added in v1.5.1
type Contacts struct {
Admin *Contact `json:"admin,omitempty"`
Tech *Contact `json:"tech,omitempty"`
}
Contacts has contact info for this app
NOTE: This structure's underlying storage has been decoupled from the use of the structure in business logic. As such, please share any changes to these structures with cloud services to ensure that storage and testing frameworks are kept in sync with these structures used for business logic
type DFUEnv ¶ added in v1.7.3
type DFUEnv struct {
Card *DFUState `json:"card,omitempty"`
User *DFUState `json:"user,omitempty"`
Modem *DFUState `json:"modem,omitempty"`
Star *DFUState `json:"star,omitempty"`
}
DFUEnv is the data structure passed to Notehub when DFU info changes
type DFUState ¶ added in v1.7.3
type DFUState struct {
Type string `json:"type,omitempty"`
File string `json:"file,omitempty"`
Length uint32 `json:"length,omitempty"`
CRC32 uint32 `json:"crc32,omitempty"`
MD5 string `json:"md5,omitempty"`
Phase string `json:"mode,omitempty"`
Status string `json:"status,omitempty"`
BeganSecs uint32 `json:"began,omitempty"`
RetryCount uint32 `json:"retry,omitempty"`
ConsecutiveErrors uint32 `json:"errors,omitempty"`
BinaryRetries uint32 `json:"binretry,omitempty"`
DFUStartCount uint32 `json:"dfu_started,omitempty"`
DFUCompletedCount uint32 `json:"dfu_completed,omitempty"`
ODFUStartedCount uint32 `json:"odfu_started,omitempty"`
ODFUTarget string `json:"odfu_target,omitempty"`
ReadFromService uint32 `json:"read,omitempty"`
UpdatedSecs uint32 `json:"updated,omitempty"`
DownloadComplete bool `json:"dl_complete,omitempty"`
DisabledReason string `json:"disabled,omitempty"`
MinNotecardVersion string `json:"min_card_version,omitempty"`
// This will always point to the current running version
Version string `json:"version,omitempty"`
}
DFUState is the state of the DFU in progress
type DeviceSession ¶
type DeviceSession struct {
// Session ID that can be mapped to the events created during that session
SessionUID string `json:"session,omitempty"`
// When the session was initially opened
SessionBegan int64 `json:"session_began,omitempty"`
// When a persistent session was last updated
SessionUpdated int64 `json:"session_updated,omitempty"`
// Why a session was opened
WhySessionOpened string `json:"why_session_opened,omitempty"`
// When the session was initially opened
SessionEnded int64 `json:"session_ended,omitempty"`
// Why the session was closed
WhySessionClosed string `json:"why_session_closed,omitempty"`
// Log key for this session
SessionLogKey string `json:"session_log_key,omitempty"`
// Info from the device structure
DeviceUID string `json:"device,omitempty"`
DeviceSN string `json:"sn,omitempty"`
ProductUID string `json:"product,omitempty"`
FleetUIDs []string `json:"fleets,omitempty"`
// Protocol:IP:port address of the handler serving the session
Handler string `json:"handler,omitempty"`
// Cell ID where the session originated and quality ("mcc,mnc,lac,cellid")
CellID string `json:"cell,omitempty"`
// Elevation of cell tower if known
Elevation float64 `json:"elevation,omitempty"`
// Parameters passed by device as a result of scanning towers/APs
ScanResults *[]byte `json:"scan,omitempty"`
Triangulate *map[string]interface{} `json:"triangulate,omitempty"`
// Network connection information sent by the notecard
Rssi int `json:"rssi,omitempty"`
Sinr int `json:"sinr,omitempty"`
Rsrp int `json:"rsrp,omitempty"`
Rsrq int `json:"rsrq,omitempty"`
Bars int `json:"bars,omitempty"`
Rat string `json:"rat,omitempty"`
Bearer string `json:"bearer,omitempty"`
Ip string `json:"ip,omitempty"`
Bssid string `json:"bssid,omitempty"`
Ssid string `json:"ssid,omitempty"`
Iccid string `json:"iccid,omitempty"`
Apn string `json:"apn,omitempty"`
// Composed by wire.go for use in Request.Transport && Event.Transport
Transport string `json:"transport,omitempty"`
// Last known tower and triangulated location as determined at the start of session
Tower TowerLocation `json:"tower,omitempty"`
Tri TowerLocation `json:"tri,omitempty"`
// Last known capture time of a note routed through this session
When int64 `json:"when,omitempty"`
// Last known GPS location of a note routed through this session
WhereWhen int64 `json:"where_when,omitempty"`
WhereOLC string `json:"where,omitempty"`
WhereLat float64 `json:"where_lat,omitempty"`
WhereLon float64 `json:"where_lon,omitempty"`
WhereLocation string `json:"where_location,omitempty"`
WhereCountry string `json:"where_country,omitempty"`
WhereTimeZone string `json:"where_timezone,omitempty"`
// Flag indicating whether the usage data is based on actual stats from the device
IsUsageActual bool `json:"usage_actual,omitempty"`
// Physical device info
Voltage float64 `json:"voltage,omitempty"`
Temp float64 `json:"temp,omitempty"`
// Type of session
ContinuousSession bool `json:"continuous,omitempty"`
TLSSession bool `json:"tls,omitempty"`
TimeBoundedSession bool `json:"time_bounded,omitempty"`
// For keeping track of when the last work was done for a session
LastWorkDone int64 `json:"work,omitempty"`
// Number of Events routed
EventCount int64 `json:"events,omitempty"`
// Motion of the notecard
Moved int64 `json:"moved,omitempty"`
Orientation string `json:"orientation,omitempty"`
// Last known power stats at start of session
HighPowerSecsTotal uint32 `json:"hp_secs_total,omitempty"`
HighPowerSecsData uint32 `json:"hp_secs_data,omitempty"`
HighPowerSecsGPS uint32 `json:"hp_secs_gps,omitempty"`
HighPowerCyclesTotal uint32 `json:"hp_cycles_total,omitempty"`
HighPowerCyclesData uint32 `json:"hp_cycles_data,omitempty"`
HighPowerCyclesGPS uint32 `json:"hp_cycles_gps,omitempty"`
// Amount of packet usage within the session, keyed by PSID
PacketUsage map[string]PacketUsage `json:"packet_usage,omitempty"`
// Total device usage at the beginning of the period
ThisPtr *DeviceUsage `json:"this,omitempty"`
// Total device usage at the beginning of the next period, whenever it happens to occur
NextPtr *DeviceUsage `json:"next,omitempty"`
// Usage during the period - initially estimated, but then corrected when we get to the next period
PeriodPtr *DeviceUsage `json:"period,omitempty"`
// NotecardPowerSource flags
PowerCharging bool `json:"power_charging,omitempty"`
PowerUsb bool `json:"power_usb,omitempty"`
PowerPrimary bool `json:"power_primary,omitempty"`
// Mojo power usage
PowerMahUsed float64 `json:"power_mah,omitempty"`
// Information about failed connections PRIOR to this one
PenaltySecs uint32 `json:"penalty_secs,omitempty"`
FailedConnects uint32 `json:"failed_connects,omitempty"`
// Socket-relate
SocketAlias string `json:"socket_alias,omitempty"`
SocketConnectError string `json:"socket_connect_error,omitempty"`
SocketBytesSent int64 `json:"socket_bytes_sent,omitempty"`
SocketBytesRcvd int64 `json:"socket_bytes_rcvd,omitempty"`
}
DeviceSession is the basic unit of recorded device usage history
func (*DeviceSession) Next ¶
func (s *DeviceSession) Next() *DeviceUsage
func (*DeviceSession) Period ¶
func (s *DeviceSession) Period() *DeviceUsage
func (*DeviceSession) This ¶
func (s *DeviceSession) This() *DeviceUsage
type DeviceUsage ¶
type DeviceUsage struct {
Since int64 `json:"since,omitempty"`
DurationSecs uint32 `json:"duration,omitempty"`
RcvdBytes uint32 `json:"bytes_rcvd,omitempty"`
SentBytes uint32 `json:"bytes_sent,omitempty"`
RcvdBytesSecondary uint32 `json:"bytes_rcvd_secondary,omitempty"`
SentBytesSecondary uint32 `json:"bytes_sent_secondary,omitempty"`
TCPSessions uint32 `json:"sessions_tcp,omitempty"`
TLSSessions uint32 `json:"sessions_tls,omitempty"`
PacketSessions uint32 `json:"sessions_packet,omitempty"`
WebhookSessions uint32 `json:"sessions_webhook,omitempty"`
RcvdNotes uint32 `json:"notes_rcvd,omitempty"`
SentNotes uint32 `json:"notes_sent,omitempty"`
}
DeviceUsage is the device usage metric representing values from the beginning of time, since Provisioned
type DfuPhase ¶ added in v1.7.3
type DfuPhase string
const ( DfuPhaseUnknown DfuPhase = "" DfuPhaseIdle DfuPhase = "idle" DfuPhaseError DfuPhase = "error" DfuPhaseDownloading DfuPhase = "downloading" DfuPhaseSideloading DfuPhase = "sideloading" DfuPhaseReady DfuPhase = "ready" DfuPhaseReadyRetry DfuPhase = "ready-retry" DfuPhaseUpdating DfuPhase = "updating" DfuPhaseCompleted DfuPhase = "completed" )
type Event ¶
type Event struct {
EventUID string `json:"event,omitempty"`
// Indicates whether or not this event is a "platform event" - that is, an event generated automatically
// somewhere in the notecard or notehub largely for administrative purposes that doesn't pertain to either
// implicit or explicit user data.
Platform bool `json:"platform,omitempty"`
// These fields, and only these fields, are regarded as "user data". All
// the rest of the fields are regarded as "metadata".
When int64 `json:"when,omitempty"`
NotefileID string `json:"file,omitempty"`
NoteID string `json:"note,omitempty"`
Body *map[string]interface{} `json:"body,omitempty"`
Payload []byte `json:"payload,omitempty"`
Details *map[string]interface{} `json:"details,omitempty"`
// Metadata
SessionUID string `json:"session,omitempty"`
SessionBegan int64 `json:"session_began,omitempty"`
TLS bool `json:"tls,omitempty"`
Transport string `json:"transport,omitempty"`
Continuous bool `json:"continuous,omitempty"`
BestID string `json:"best_id,omitempty"`
DeviceUID string `json:"device,omitempty"`
DeviceSN string `json:"sn,omitempty"`
ProductUID string `json:"product,omitempty"`
AppUID string `json:"app,omitempty"`
Received float64 `json:"received,omitempty"`
Req string `json:"req,omitempty"`
Error string `json:"err,omitempty"`
Updates int32 `json:"updates,omitempty"`
Deleted bool `json:"deleted,omitempty"`
Sent bool `json:"queued,omitempty"`
Bulk bool `json:"bulk,omitempty"`
BulkReceived float64 `json:"batch_received,omitempty"`
BulkNumber uint32 `json:"batch_number,omitempty"`
BulkTotal uint32 `json:"batch_total,omitempty"`
FirmwareHost string `json:"firmware_host,omitempty"`
FirmwareNotecard string `json:"firmware_notecard,omitempty"`
// This field is ONLY used when we remove the payload for storage reasons, to show the app how large it was
MissingPayloadLength int64 `json:"payload_length,omitempty"`
// Location
BestLocationType string `json:"best_location_type,omitempty"`
BestLocationWhen int64 `json:"best_location_when,omitempty"`
BestLat float64 `json:"best_lat,omitempty"`
BestLon float64 `json:"best_lon,omitempty"`
BestLocation string `json:"best_location,omitempty"`
BestCountry string `json:"best_country,omitempty"`
BestTimeZone string `json:"best_timezone,omitempty"`
Where string `json:"where_olc,omitempty"`
WhereWhen int64 `json:"where_when,omitempty"`
WhereLat float64 `json:"where_lat,omitempty"`
WhereLon float64 `json:"where_lon,omitempty"`
WhereLocation string `json:"where_location,omitempty"`
WhereCountry string `json:"where_country,omitempty"`
WhereTimeZone string `json:"where_timezone,omitempty"`
TowerWhen int64 `json:"tower_when,omitempty"`
TowerLat float64 `json:"tower_lat,omitempty"`
TowerLon float64 `json:"tower_lon,omitempty"`
TowerCountry string `json:"tower_country,omitempty"`
TowerLocation string `json:"tower_location,omitempty"`
TowerTimeZone string `json:"tower_timezone,omitempty"`
TowerID string `json:"tower_id,omitempty"`
TriWhen int64 `json:"tri_when,omitempty"`
TriLat float64 `json:"tri_lat,omitempty"`
TriLon float64 `json:"tri_lon,omitempty"`
TriLocation string `json:"tri_location,omitempty"`
TriCountry string `json:"tri_country,omitempty"`
TriTimeZone string `json:"tri_timezone,omitempty"`
TriPoints int32 `json:"tri_points,omitempty"`
// Triangulation
Triangulate *map[string]interface{} `json:"triangulate,omitempty"`
// "Routed" environment variables beginning with a "$" prefix
Env *map[string]string `json:"environment,omitempty"`
Status EventRoutingStatus `json:"status,omitempty"`
FleetUIDs *[]string `json:"fleets,omitempty"`
// ONLY POPULATED FOR EventSessionBegin with info both from notecard and notehub
DeviceSKU string `json:"sku,omitempty"`
DeviceOrderingCode string `json:"ordering_code,omitempty"`
DeviceFirmware int64 `json:"firmware,omitempty"`
Bearer string `json:"bearer,omitempty"`
CellID string `json:"cellid,omitempty"`
Bssid string `json:"bssid,omitempty"`
Ssid string `json:"ssid,omitempty"`
Iccid string `json:"iccid,omitempty"`
Apn string `json:"apn,omitempty"`
Rssi int `json:"rssi,omitempty"`
Sinr int `json:"sinr,omitempty"`
Rsrp int `json:"rsrp,omitempty"`
Rsrq int `json:"rsrq,omitempty"`
Rat string `json:"rat,omitempty"`
Bars uint32 `json:"bars,omitempty"`
Voltage float64 `json:"voltage,omitempty"`
Temp float64 `json:"temp,omitempty"`
Moved int64 `json:"moved,omitempty"`
Orientation string `json:"orientation,omitempty"`
PowerCharging bool `json:"power_charging,omitempty"`
PowerUsb bool `json:"power_usb,omitempty"`
PowerPrimary bool `json:"power_primary,omitempty"`
PowerMahUsed float64 `json:"power_mah,omitempty"`
// ONLY POPULATED FOR EventSessionEnd because it comes from the notehub
NotehubLastWorkDone int64 `json:"hub_last_work_done,omitempty"`
NotehubDurationSecs int64 `json:"hub_duration_secs,omitempty"`
NotehubEventCount int64 `json:"hub_events_routed,omitempty"`
NotehubRcvdBytes uint32 `json:"hub_rcvd_bytes,omitempty"`
NotehubSentBytes uint32 `json:"hub_sent_bytes,omitempty"`
NotehubTCPSessions uint32 `json:"hub_tcp_sessions,omitempty"`
NotehubTLSSessions uint32 `json:"hub_tls_sessions,omitempty"`
NotehubRcvdNotes uint32 `json:"hub_rcvd_notes,omitempty"`
NotehubSentNotes uint32 `json:"hub_sent_notes,omitempty"`
// ONLY POPULATED for EventSessionEndNotecard because it comes from the notecard
NotecardRcvdBytes uint32 `json:"card_rcvd_bytes,omitempty"`
NotecardSentBytes uint32 `json:"card_sent_bytes,omitempty"`
NotecardRcvdBytesSecondary uint32 `json:"card_rcvd_bytes_secondary,omitempty"`
NotecardSentBytesSecondary uint32 `json:"card_sent_bytes_secondary,omitempty"`
NotecardTCPSessions uint32 `json:"card_tcp_sessions,omitempty"`
NotecardTLSSessions uint32 `json:"card_tls_sessions,omitempty"`
NotecardRcvdNotes uint32 `json:"card_rcvd_notes,omitempty"`
NotecardSentNotes uint32 `json:"card_sent_notes,omitempty"`
}
Event is the request structure passed to the Notification proc
NOTE: This structure's underlying storage has been decoupled from the use of the structure in business logic. As such, please share any changes to these structures with cloud services to ensure that storage and testing frameworks are kept in sync with these structures used for business logic
type EventRoutingStatus ¶ added in v1.7.1
type EventRoutingStatus string
const ( EventStatusEmpty EventRoutingStatus = "" EventStatusSuccess EventRoutingStatus = "success" EventStatusFailure EventRoutingStatus = "failure" EventStatusInProgress EventRoutingStatus = "in_progress" )
func GetAggregateEventStatus ¶ added in v1.6.11
func GetAggregateEventStatus(logs []RouteLogEntry) EventRoutingStatus
GetAggregateEventStatus returns the status of the event given all of the route logs for the event.
The aggregate status is determined by taking the most recent status for each route. If any of these are failures then the overall status is EventStatusFailure, otherwise it's EventStatusSuccess
type History ¶
type History struct {
When int64 `json:"w,omitempty"`
Where string `json:"l,omitempty"`
WhereWhen int64 `json:"m,omitempty"`
EndpointID string `json:"e,omitempty"`
Sequence int32 `json:"s,omitempty"`
}
History records the update history, optimized so that if the most recent entry is by the same endpoint as an update/delete, that entry is re-used. The primary use of History is for conflict detection, and you don't need to detect conflicts against yourself.
type Info ¶
type Info struct {
NoteID string `json:"id,omitempty"`
When int64 `json:"time,omitempty"`
WhereLat float64 `json:"lat,omitempty"`
WhereLon float64 `json:"lon,omitempty"`
WhereWhen int64 `json:"ltime,omitempty"`
Body *map[string]interface{} `json:"body,omitempty"`
Payload *[]byte `json:"payload,omitempty"`
Deleted bool `json:"deleted,omitempty"`
Edge bool `json:"edge,omitempty"`
Pending bool `json:"pending,omitempty"`
}
Info is a general "content" structure
type Message ¶ added in v1.2.1
type Message struct {
UID string `json:"id,omitempty"`
Sent uint32 `json:"sent,omitempty"`
Received uint32 `json:"received,omitempty"`
From MessageContact `json:"from,omitempty"`
To []MessageContact `json:"to,omitempty"`
Tags []string `json:"tags,omitempty"`
StoreTags []string `json:"stags,omitempty"`
ContentType string `json:"type,omitempty"`
Content string `json:"content,omitempty"`
Body *map[string]interface{} `json:"body,omitempty"`
}
Message is the core message data structure. Note that when stored in a map or a note, the UID is not present but rather is the map key or noteID.
type MessageAddress ¶ added in v1.2.1
type MessageAddress struct {
Hub string `json:"hub,omitempty"`
ProductUID string `json:"product,omitempty"`
DeviceUID string `json:"device,omitempty"`
DeviceSN string `json:"sn,omitempty"`
Active uint32 `json:"active,omitempty"`
}
MessageAddress is the network routing information for a message
type MessageContact ¶ added in v1.2.1
type MessageContact struct {
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
StoreTags []string `json:"stags,omitempty"`
Addresses []MessageAddress `json:"addresses,omitempty"`
}
MessageContact is the entity sending a message, who may have multiple devices/addresses
type Note ¶
type Note struct {
Body map[string]interface{} `json:"b,omitempty"`
Payload []byte `json:"p,omitempty"`
Change int64 `json:"c,omitempty"`
Histories *[]History `json:"h,omitempty"`
Conflicts *[]Note `json:"x,omitempty"`
Updates int32 `json:"u,omitempty"`
Deleted bool `json:"d,omitempty"`
Sent bool `json:"s,omitempty"`
Bulk bool `json:"k,omitempty"`
XPOff uint32 `json:"O,omitempty"`
XPLen uint32 `json:"L,omitempty"`
Tower *TowerLocation `json:"T,omitempty"`
}
Note is the most fundamental data structure, containing user data referred to as its "body" and its "payload". All access to these fields, and changes to these fields, must be done indirectly through the note API.
func CreateNote ¶
CreateNote creates the core data structure for an object, given a JSON body
func (*Note) EndpointID ¶
EndpointID determines the endpoint that last modified the note
func (*Note) GetConflicts ¶
GetConflicts fetches the conflicts, so that they may be displayed
func (*Note) GetEndpointID ¶ added in v1.7.5
GetEndpointID retrieves the endpoint that last modified the note
func (*Note) GetModified ¶
func (note *Note) GetModified() (isAvailable bool, endpointID string, when string, where string, updates int32)
GetModified retrieves information about the note's modification
func (*Note) GetPayload ¶
GetPayload retrieves the Payload from a given Note
func (*Note) HasConflicts ¶
HasConflicts determines whether or not a given Note has conflicts
func (*Note) SetBody ¶
SetBody sets the application-supplied Body field of a given Note given some JSON
func (*Note) SetPayload ¶
SetPayload sets the application-supplied Payload field of a given Note, which must be binary bytes that will ultimately be rendered as base64 in JSON
type NotefileDesc ¶ added in v1.7.3
type NotefileDesc struct {
NotefileID string `json:"file,omitempty"`
Info NotefileInfo `json:"info,omitempty"`
BodyTemplate string `json:"body_template,omitempty"`
PayloadTemplate uint32 `json:"payload_template,omitempty"`
TemplateFormat uint32 `json:"template_format,omitempty"`
TemplatePort uint16 `json:"template_port,omitempty"`
}
Information about notefiles and their templates
type NotefileInfo ¶
type NotefileInfo struct {
// The count of modified notes in this notefile. This is used in the Req API, but not in the Notebox info
Changes int `json:"changes,omitempty"`
// The count of total notes in this notefile. This is used in the Req API, but not in the Notebox info
Total int `json:"total,omitempty"`
// This is a unidirectional "to-hub" or "from-hub" endpoint
SyncHubEndpointID string `json:"sync_hub_endpoint,omitempty"`
// Relative positive/negative priority of data, with 0 being normal
SyncPriority int `json:"sync_priority,omitempty"`
// Timed: Target for sync period, if modified and if the value hasn't been synced sooner
SyncPeriodSecs int `json:"sync_secs,omitempty"`
// ReqTime is specified if notes stored in this notefile must have a valid time associated with them
ReqTime bool `json:"req_time,omitempty"`
// ReqLoc is specified if notes stored in this notefile must have a valid location associated with them
ReqLoc bool `json:"req_loc,omitempty"`
// AnonAddAllowed is specified if anyone is allowed to drop into this notefile without authentication
AnonAddAllowed bool `json:"anon_add,omitempty"`
// ImportTime is the epoch time of when an external data source (such as a feed) last sync'ed data inbound
ImportTime int64 `json:"import_time,omitempty"`
// ExportTime is the epoch time of when an external data source (such as a feed) last sync'ed data outbound
ExportTime int64 `json:"export_time,omitempty"`
}
NotefileInfo has parameters about the Notefile
type PacketUsage ¶ added in v1.7.4
type PacketUsage struct {
Updated int64 `json:"updated,omitempty"`
DownlinkPackets int64 `json:"dl_p,omitempty"`
DownlinkBytes int64 `json:"dl_b,omitempty"`
DownlinkBytesBillable int64 `json:"dl_bb,omitempty"`
UplinkPackets int64 `json:"ul_p,omitempty"`
UplinkBytes int64 `json:"ul_b,omitempty"`
UplinkBytesBillable int64 `json:"ul_bb,omitempty"`
BillableMinBytesPerPacket int64 `json:"bmbpp,omitempty"`
}
Indication of the packet usage within a session
type RouteLogEntry ¶ added in v1.5.1
type RouteLogEntry struct {
EventSerial int64 `json:"event,omitempty"`
RouteSerial int64 `json:"route,omitempty"`
Date time.Time `json:"date,omitempty"`
Attn bool `json:"attn,omitempty"`
Status string `json:"status,omitempty"`
Text string `json:"text,omitempty"`
URL string `json:"url,omitempty"`
Source RoutingSource `json:"source,omitempty"`
// Time in milliseconds that the route took to process
// We're making a simplifying assumption that the route will always
// take at least 1ms. So 0 means we didn't record the duration.
Duration int64 `json:"duration,omitempty"`
}
RouteLogEntry is the log entry used by notification processing
type RoutingSource ¶ added in v1.7.3
type RoutingSource uint8
const ( RoutingSourceUnknown RoutingSource = iota RoutingSourceNormal RoutingSourceProxy RoutingSourceRetry RoutingSourceManual RoutingSourceDirect RoutingSourceTest )
func (RoutingSource) String ¶ added in v1.7.3
func (s RoutingSource) String() string
String returns a string representation of the routing source
type TowerLocation ¶
type TowerLocation struct {
Source string `json:"source,omitempty"` // source of this location
When int64 `json:"time,omitempty"` // time when this location was ascertained
Name string `json:"n,omitempty"` // name of the location
CountryCode string `json:"c,omitempty"` // country code
Lat float64 `json:"lat,omitempty"` // latitude
Lon float64 `json:"lon,omitempty"` // longitude
TimeZone string `json:"zone,omitempty"` // timezone name
MCC int `json:"mcc,omitempty"`
MNC int `json:"mnc,omitempty"`
LAC int `json:"lac,omitempty"`
CID int `json:"cid,omitempty"`
OLC string `json:"l,omitempty"` // open location code
TimeZoneID int `json:"z,omitempty"` // timezone id (see tz.go)
Deprecated int64 `json:"count,omitempty"` // (no longer used or supported)
Towers int `json:"towers,omitempty"` // number of triangulation points
}
TowerLocation is a location structure generated by a lookup