public async Task Process(UdpReceiveResult message, UdpClient client) { var now = DateTime.UtcNow; try { switch (_semtech.GetIdentifier(message.Buffer)) { case Identifier.PUSH_DATA: Log.Info(log, "PUSH_DATA from " + message.RemoteEndPoint.Address.ToString() + ":" + message.RemoteEndPoint.Port.ToString(), now); var pushdata = _semtech.UnmarshalPushData(message.Buffer); IPEndPoint ep = null; Broker broker = null; if (_gateways.TryGetValue(ByteArrayToString(pushdata.GatewayMACAddress), out ep)) { var pushack = _semtech.MarshalPushAck(pushdata.RandomToken); client.SendAsync(pushack, pushack.Length, ep); Log.Info(log, "PUSH_ACK to " + ep.Address.ToString() + ":" + ep.Port.ToString(), now); foreach (var rxpk in pushdata.Json.Rxpks) { var data = Convert.FromBase64String(rxpk.Data); switch (_lora.GetMType(data[0])) { case MType.JoinRequest: var joinrequest = _lora.UnmarshalJoinRequest(data); broker = await _brokerclient.GetBrokerOnAppEUI(ByteArrayToString(joinrequest.AppEUI)); var joinaccept = await _brokerclient.SendMessage(broker.Endpoint, new Message() { Rxpk = rxpk }); var pullresp = _semtech.MarshalPullResp(new PullResp() { ProtocolVersion = 1, Identifier = Identifier.PULL_RESP, Txpk = joinaccept.Txpk }); client.SendAsync(pullresp, pullresp.Length, ep); Log.Info(log, "PULL_RESP to " + ep.Address.ToString() + ":" + ep.Port.ToString(), now); break; case MType.ConfirmedDataUp: // TODO var confirmeddataup = _lora.UnmarshalUnconfirmedDataUp(data); broker = await _brokerclient.GetBrokerOnDevAddr(ByteArrayToString(_lora.MarshalDevAddr(confirmeddataup.Fhdr.DevAddr))); await _brokerclient.SendMessage(broker.Endpoint, new Message() { Rxpk = rxpk }); break; case MType.UnconfirmedDataUp: var unconfirmeddataup = _lora.UnmarshalUnconfirmedDataUp(data); broker = await _brokerclient.GetBrokerOnDevAddr(ByteArrayToString(_lora.MarshalDevAddr(unconfirmeddataup.Fhdr.DevAddr))); await _brokerclient.SendMessage(broker.Endpoint, new Message() { Rxpk = rxpk }); break; } } } break; case Identifier.PULL_DATA: Log.Info(log, "PULL_DATA from " + message.RemoteEndPoint.Address.ToString() + ":" + message.RemoteEndPoint.Port.ToString(), now); var pulldata = _semtech.UnmarshalPullData(message.Buffer); _gateways[ByteArrayToString(pulldata.GatewayMACAddress)] = message.RemoteEndPoint; var pullack = _semtech.MarshalPullAck(pulldata.RandomToken); client.SendAsync(pullack, pullack.Length, message.RemoteEndPoint); Log.Info(log, "PULL_ACK to " + message.RemoteEndPoint.Address.ToString() + ":" + message.RemoteEndPoint.Port.ToString(), now); break; } } catch (Exception e) { Log.Error(log, e.Message, now, e); } }
public MainModule(ILora lora, IBll bll) { Get["/", true] = async(_, ct) => { return("Hello World!"); }; Get["/hasappeui/{appeui}", true] = async(parameters, ct) => { return(Response.AsJson(true)); //return HttpStatusCode.NoResponse; }; Post["/message", true] = async(parameters, ct) => { ReturnMessage returnmessage = null; try { var message = JsonConvert.DeserializeObject <Message>(Request.Body.AsString()); var data = Convert.FromBase64String(message.Rxpk.Data); switch (lora.GetMType(data[0])) { case MType.JoinRequest: log.Info("JoinRequest"); var joinaccept = await bll.ProcessJoinRequest(data); returnmessage = new ReturnMessage() { TxResult = true, Txpk = new Txpk() { Tmst = message.Rxpk.Tmst + 5000000, Freq = message.Rxpk.Freq, RfCh = message.Rxpk.RfCh, Power = 14, Modulation = message.Rxpk.Modulation, DataRate = message.Rxpk.DataRate, CodingRate = message.Rxpk.CodingRate, Polarization = true, Size = Convert.ToUInt16(joinaccept.Length - 4), Data = Convert.ToBase64String(joinaccept) } }; return(Response.AsText(JsonConvert.SerializeObject(returnmessage), "application/json")); case MType.ConfirmedDataUp: log.Info("ConfirmedDataUp"); return(Response.AsText(JsonConvert.SerializeObject(new ReturnMessage() { TxResult = false }), "application/json")); case MType.UnconfirmedDataUp: log.Info("UnconfirmedDataUp"); var unconfirmeddataup = await bll.ProcessUnconfirmedDataUp(data); return(Response.AsText(JsonConvert.SerializeObject(new ReturnMessage() { TxResult = false }), "application/json")); } log.Info("Unknown MType: " + lora.GetMType(data[0])); return(Response.AsText(JsonConvert.SerializeObject(new ReturnMessage() { TxResult = false }), "application/json")); } catch (Exception e) { log.Error(e.Message, e); return(Response.AsText(JsonConvert.SerializeObject(new ReturnMessage() { TxResult = false }), "application/json")); } }; }