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 async Task <byte[]> ProcessJoinRequest(byte[] data) { byte[] returnvalue; try { await _dal.BeginTransaction(); var joinrequest = _lora.UnmarshalJoinRequest(data); var device = await _dal.GetDeviceOnAppEUIDevEUI(ByteArrayToString(joinrequest.AppEUI), ByteArrayToString(joinrequest.DevEUI)); var appkey = StringToByteArray(device.AppKey); var joinrequestvalidated = _lora.UnmarshalJoinRequestAndValidate(appkey, data); var devnonce = ByteArrayToString(joinrequestvalidated.DevNonce); if ((await _dal.GetSessionOnDeviceDevNonceActive(device.Id, devnonce)) != null) { throw new SessionAllreadyActiveException(); } var nwkid = GetNwkId(); var freedevaddr = await _dal.GetFreeDevAddr(nwkid); var appnonce = _lora.GetAppNonce(); var netid = GetNetId(); await _dal.SetActiveSessionsInactive(device.Id); await _dal.AddSession(new Com.Bekijkhet.MyBroker.Dal.Session() { Device = device.Id, DevAddr = freedevaddr.Id, DevNonce = devnonce, AppNonce = ByteArrayToString(appnonce), NwkSKey = ByteArrayToString(_lora.GetNwkSKey(appkey, appnonce, netid, joinrequestvalidated.DevNonce)), AppSKey = ByteArrayToString(_lora.GetAppSKey(appkey, appnonce, netid, joinrequestvalidated.DevNonce)), Active = DateTime.UtcNow.AddDays(1) }); var joinaccept = new JoinAccept() { Mhdr = new Mhdr() { MType = MType.JoinAccept, Major = 1 }, AppNonce = appnonce, NetId = netid, DevAddr = Convert.ToUInt32((freedevaddr.NwkId * 16777216) + freedevaddr.NwkAddr), DlSettings = GetDlSettings(), RxDelay = GetRxDelay(), CfList = GetCfList() }; returnvalue = _lora.MarshalJoinAccept(joinaccept, appkey); _dal.CommitTransaction(); } catch (Exception e) { _dal.RollbackTransaction(); throw; } finally { _dal.Close(); } return(returnvalue); }