рдХреБрдЫ рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА (рдпрд╛рдиреА gs.up.receive
рдФрд░ as.up.receive
) рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИрдВред
ttn-lw-cli events subscribe --gateway-id ...
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{
"name": "gs.up.receive",
"time": "2019-05-10T08:48:36.397803Z",
"identifiers": [
{
"gateway_ids": {
"gateway_id": "tektelic-micro",
"eui": "647FDAFFFE0059AB"
}
}
],
"data": {
"@type": "type.googleapis.com/ttn.lorawan.v3.UplinkMessage",
"raw_payload": "QKogASYAkdgBU2NToyoatD/C",
"settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 7
}
},
"coding_rate": "4/5",
"frequency": "867900000",
"timestamp": 3375161699
},
"rx_metadata": [
{
"gateway_ids": {
"gateway_id": "tektelic-micro",
"eui": "647FDAFFFE0059AB"
},
"timestamp": 3375161699,
"rssi": 2,
"snr": 10,
"uplink_token": "ChwKGgoOdGVrdGVsaWMtbWljcm8SCGR/2v/+AFmrEOPCs8kM"
}
],
"received_at": "2019-05-10T08:48:36.397329Z",
"correlation_ids": [
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
],
"gateway_channel_index": 4
},
"correlation_ids": [
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF",
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
],
"origin": "Johans-MacBook-Pro.local"
}
correlation_ids
рдореЗрдВ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ
рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рд╢рд╛рдпрдж рджреЛ рдмрд╛рд░ рдЬреБрдбрд╝ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рдЙрди рдШрдЯрдирд╛рдУрдВ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрдиреЗ рдкрд░ рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рд╛рдБ
@htdvisser рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдкреЗрд▓реЛрдб рд╕реЗ рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рд╕рдВрджрд░реНрдн рдХреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд▓рдЧреНрди рд╣реИрдВ, рдпрд╛рдиреА рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ;
ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)
рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдШрдЯрдирд╛ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ ctx
рдФрд░ msg
( GetCorrelationIDs()
рдорд╛рдзреНрдпрдо рд╕реЗ) рдореЗрдВ рд╣реИрдВред
рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП?
https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148
рд╣рд╛рдБ, рд╣рдо рдореЗрдВ рдорд░реНрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ pkg/events/correlation_context.go
(рдЕрдкрдиреА рд╣реА рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ mergeCorrelationIDs
) рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ pkg/events/events.go
:
if cids := data.GetCorrelationIDs(); len(cids) > 0 {
cids = append(cids[:0:0], cids...)
sort.Strings(cids)
evt.innerEvent.CorrelationIDs = mergeCorrelationIDs(evt.innerEvent.CorrelationIDs, cids)
}
рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ evt.innerEvent.CorrelationIDs
рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдпрд╣ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред
рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ @ pgalic96 ?
рд╕рд╛рдорд╛рди рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реЛ рдЧрдпрд╛, рдореИрдВрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
if data, ok := data.(interface{ GetCorrelationIDs() []string }); ok {
mapCorrelationIds := make(map[string]struct{})
for _, correlationID := range evt.innerEvent.CorrelationIDs {
mapCorrelationIds[correlationID] = struct{}{}
}
for _, correlationID := range data.GetCorrelationIDs() {
if _, ok := mapCorrelationIds[correlationID]; !ok {
evt.innerEvent.CorrelationIDs = append(evt.innerEvent.CorrelationIDs, correlationID)
}
}
}
рдЕрднреА рддрдХ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ TestCorrelationID
рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреЗрд▓реЛрдб рдореЗрдВ рд╕рдорд╛рди TestCorrelationID
рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╣рд╕рдВрдмрдВрдз рдХреА рд▓рдВрдмрд╛рдИ рдХреНрдпрд╛ рд╣реИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 1 рдФрд░ 2 рдирд╣реАрдВред
рдЪрд░ рдирд╛рдо рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ evt.innerEvent.CorrelationIDs
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдЯреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ
рдореИрдВ @rvolosatovs рдорд░реНрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо @ pgalic96 рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп / рдХрдЯреМрддреА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдХрдо рдХреБрд╢рд▓ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА
@ pgalic96 рдХреНрдпрд╛ рдЖрдк рд╕реНрдЯреЗрдЯрд╕ рдЕрдкрдбреЗрдЯ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?
рдореИрдВ рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдЕрднреА рддрдХ рдЗрд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХрд▓ рдХрд╛рд░реНрдпрд╛рд▓рдп рдЖ рд░рд╣рд╛ рд╣реВрдВред рдХрд▓ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред
рдореИрдВ @htdvisser рд╕реБрдЭрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рдмрджрд▓
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ @rvolosatovs рдорд░реНрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣рд╕рдВрдмрдВрдз рдЖрдИрдбреА рдХреЗ рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рдпрджрд┐ рд╣рдо @ pgalic96 рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп / рдХрдЯреМрддреА рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдХрдо рдХреБрд╢рд▓ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА