// Create creates the given Node. func (a *NodeAPI) Create(ctx context.Context, req *pb.CreateNodeRequest) (*pb.CreateNodeResponse, error) { var appEUI, devEUI lorawan.EUI64 var appKey lorawan.AES128Key if err := appEUI.UnmarshalText([]byte(req.AppEUI)); err != nil { return nil, err } if err := devEUI.UnmarshalText([]byte(req.DevEUI)); err != nil { return nil, err } if err := appKey.UnmarshalText([]byte(req.AppKey)); err != nil { return nil, err } node := models.Node{ DevEUI: devEUI, AppEUI: appEUI, AppKey: appKey, RXDelay: uint8(req.RxDelay), RX1DROffset: uint8(req.Rx1DROffset), } if req.ChannelListID > 0 { node.ChannelListID = &req.ChannelListID } if err := storage.CreateNode(a.ctx.DB, node); err != nil { return nil, err } return &pb.CreateNodeResponse{}, nil }
// Update updates the node matching the given DevEUI. func (a *NodeAPI) Update(ctx context.Context, req *pb.UpdateNodeRequest) (*pb.UpdateNodeResponse, error) { var appEUI, devEUI lorawan.EUI64 var appKey lorawan.AES128Key if err := appEUI.UnmarshalText([]byte(req.AppEUI)); err != nil { return nil, err } if err := devEUI.UnmarshalText([]byte(req.DevEUI)); err != nil { return nil, err } if err := appKey.UnmarshalText([]byte(req.AppKey)); err != nil { return nil, err } node, err := storage.GetNode(a.ctx.DB, devEUI) if err != nil { return nil, err } node.AppEUI = appEUI node.AppKey = appKey node.RXDelay = uint8(req.RxDelay) node.RX1DROffset = uint8(req.Rx1DROffset) if req.ChannelListID > 0 { node.ChannelListID = &req.ChannelListID } else { node.ChannelListID = nil } if err := storage.UpdateNode(a.ctx.DB, node); err != nil { return nil, err } return &pb.UpdateNodeResponse{}, nil }
// Create creates the given node-session. The DevAddr must contain the same NwkID as the configured NetID. Node-sessions will expire automatically after the configured TTL. func (a *NodeSessionAPI) Create(ctx context.Context, req *pb.CreateNodeSessionRequest) (*pb.CreateNodeSessionResponse, error) { var appEUI, devEUI lorawan.EUI64 var appSKey, nwkSKey lorawan.AES128Key var devAddr lorawan.DevAddr if err := appEUI.UnmarshalText([]byte(req.AppEUI)); err != nil { return nil, err } if err := devEUI.UnmarshalText([]byte(req.DevEUI)); err != nil { return nil, err } if err := appSKey.UnmarshalText([]byte(req.AppSKey)); err != nil { return nil, err } if err := nwkSKey.UnmarshalText([]byte(req.NwkSKey)); err != nil { return nil, err } if err := devAddr.UnmarshalText([]byte(req.DevAddr)); err != nil { return nil, err } var cFList *lorawan.CFList if len(req.CFList) > len(cFList) { return nil, fmt.Errorf("max CFList channels is %d", len(cFList)) } if len(req.CFList) > 0 { cFList = &lorawan.CFList{} for i, f := range req.CFList { cFList[i] = f } } ns := models.NodeSession{ DevAddr: devAddr, AppEUI: appEUI, DevEUI: devEUI, AppSKey: appSKey, NwkSKey: nwkSKey, FCntUp: req.FCntUp, FCntDown: req.FCntDown, RXDelay: uint8(req.RxDelay), RX1DROffset: uint8(req.Rx1DROffset), CFList: cFList, } if err := a.validateNodeSession(ns); err != nil { return nil, err } if err := storage.CreateNodeSession(a.ctx.RedisPool, ns); err != nil { return nil, err } return &pb.CreateNodeSessionResponse{}, nil }