public double variance = 0; //其内部的方差 #endregion Fields #region Constructors public MODEventTrustResult(int node, int reportNodeId, string pkgIdent, MODEventCategoryType category, DSClass ds) { this.nodeId = node; this.reportNodeId = Global.getInstance().readers[reportNodeId].Id; this.ds = ds; this.eventIdent = pkgIdent; //TODO app confirmBeliefThrehold = new Dictionary<MODEventType, double>(); confirmBeliefThrehold[MODEventType.DropPacketMaliciously] = 0.3; this.timeStamp = Scheduler.getInstance().currentTime; }
public MODEventTrustCategoryResult(int node, int app, MODEventCategoryType category, DSClass ds) { this.node = node; this.ds = ds; this.category = category; this.categoryIdent = node + "-" + category; this.app = app; this.confirmedEventNums = new int[(int)MODEventType.COUNT]; //TODO app }
//如果本节点是其邻居,那么判断没有收到所有数据包的情况 public static MODEventTrustResult NotObservedEventTrustResult(int suspectedNode, int reportNode, string pkgIdent, MODEventCategoryType category, double[] speeds, bool[] isNeighbors) { //可能存在其他误差,设一个较小的值 double b0 = 0.002, b1 = 0.002, b2 = 0.002, b3 = 0.002; if (!isNeighbors[0] && !isNeighbors[1]) { b0 = b1 = b2 = b3 = 0.1; } else if (isNeighbors[0] && !isNeighbors[1])//prev是nb,sus不是nb { b0 = b1 = b2 = b3 = 0.1; if (speeds[0] > 4) //与速度有关 { b1 = Math.Min(0.3 * speeds[0] / baseSpeed, 0.6); b3 = Math.Min(0.3 * speeds[0] / baseSpeed, 0.6); } } else if (!isNeighbors[0] && isNeighbors[1])//prev不是nb,sus是nb { b0 = b1 = b2 = b3 = 0.1; if (speeds[0] + speeds[2] > 4) //与速度有关 { b1 = Math.Min(0.3 * (speeds[0] + speeds[2]) / baseSpeed, 0.6); b3 = Math.Min(0.3 * (speeds[0] + speeds[2]) / baseSpeed, 0.6); } } else//均为邻居 { b0 = b1 = b2 = b3 = 0.1; if (speeds[0] + speeds[1] + speeds[2] > 4) { //与速度有关 b1 = Math.Min(0.3 * (speeds[0] + speeds[1] + speeds[2]) / baseSpeed, 0.6); b3 = Math.Min(0.3 * (speeds[0] + speeds[1] + speeds[2]) / baseSpeed, 0.6); } } double total = b0 + b1 + b2 + b3 + 0.3; b0 = b0 / total; b1 = b1 / total; b2 = b2 / total; b3 = b3 / total; DSClass ds = new DSClass(pow(MODDropPacketEventType.END)); ds.SetM(pow(MODDropPacketEventType.NotDropPacket), b0); ds.SetM(pow(MODDropPacketEventType.NotDropPacketButNotReceivePacket), b1); ds.SetM(pow(MODDropPacketEventType.DropPacketDueToBandwith), b2); ds.SetM(pow(MODDropPacketEventType.DropPacketMaliciously), b3); ds.SetM(pow(MODDropPacketEventType.END) - 1, 1 - b0 - b1 - b2 - b3); ds.Cal(); MODEventTrustResult r = new MODEventTrustResult(suspectedNode, reportNode, pkgIdent, category, ds); if (ds.b[pow(MODEventType.NotDropPacket) + pow(MODEventType.NotDropPacketButNotReceivePacket)] < global.NormalBelief && ds.p[pow(MODEventType.NotDropPacket) + pow(MODEventType.NotDropPacketButNotReceivePacket)] < global.NormalPlausibility)//确实是攻击,恶意事件的信念大于正常事件,或恶意事件的信念大于某一个阈值 { r.supportDroppingMalicious = 1; } else r.supportDroppingMalicious = -1; return r; }
public static MODEventTrustResult MergeMaliciousEventTrustResult(int node, Node reportNode, List<MODEventTrustResult> reports, string pkgIdent, MODEventCategoryType category) { double b0 = 0.0; double b1 = 0.0; double b2 = 0.0; double b3 = 0.0; //各个b的方差 double x0 = 0, x1 = 0, x2 = 0, x3 = 0; DSClass ds = new DSClass(pow(MODDropPacketEventType.END)); //TODO,确认下面是否是正确的 for (int i = 0; i < reports.Count; i++) { b0 += reports[i].ds.b[pow(MODDropPacketEventType.NotDropPacket)]; b1 += reports[i].ds.b[pow(MODDropPacketEventType.NotDropPacketButNotReceivePacket)]; b2 += reports[i].ds.b[pow(MODDropPacketEventType.DropPacketDueToBandwith)]; b3 += reports[i].ds.b[pow(MODDropPacketEventType.DropPacketMaliciously)]; } b0 = b0 / reports.Count; b1 = b1 / reports.Count; b2 = b2 / reports.Count; b3 = b3 / reports.Count; ds.SetM(pow(MODDropPacketEventType.NotDropPacket), b0); ds.SetM(pow(MODDropPacketEventType.NotDropPacketButNotReceivePacket), b1); ds.SetM(pow(MODDropPacketEventType.DropPacketDueToBandwith), b2); ds.SetM(pow(MODDropPacketEventType.DropPacketMaliciously), b3); ds.SetM(pow(MODDropPacketEventType.END) - 1, 1 - b0 - b1 - b2 - b3); ds.Cal(); //计算方差,即一致度 //TODO,确认下面是否是正确的 for (int i = 0; i < reports.Count; i++) { x0 += Math.Pow(b0 - reports[i].ds.b[pow(MODDropPacketEventType.NotDropPacket)], 2); x1 += Math.Pow(b1 - reports[i].ds.b[pow(MODDropPacketEventType.NotDropPacketButNotReceivePacket)], 2); x2 += Math.Pow(b2 - reports[i].ds.b[pow(MODDropPacketEventType.DropPacketDueToBandwith)], 2); x3 += Math.Pow(b3 - reports[i].ds.b[pow(MODDropPacketEventType.DropPacketMaliciously)], 2); } MODEventTrustResult result = new MODEventTrustResult(node, reportNode, pkgIdent, category, ds); result.variance = x0 + x1 + x2 + x3; if (result.ds.b[pow(MODEventType.NotDropPacket) + pow(MODEventType.NotDropPacketButNotReceivePacket)] < global.NormalBelief && result.ds.p[pow(MODEventType.NotDropPacket) + pow(MODEventType.NotDropPacketButNotReceivePacket)] < global.NormalPlausibility)//确实是攻击,恶意事件的信念大于正常事件,或恶意事件的信念大于某一个阈值 result.supportDroppingMalicious = 1; else result.supportDroppingMalicious = -1; return result; }
public static MODEventTrustResult ForgeNormalEventTrustResult(int node, int reportNode, string pkgIdent, MODEventCategoryType category) { double b0 = 0.7; double b1 = 0.1; double b2 = 0.1; double b3 = 0.1; DSClass ds = new DSClass(pow(MODDropPacketEventType.END)); ds.SetM(pow(MODDropPacketEventType.NotDropPacket), b0); ds.SetM(pow(MODDropPacketEventType.NotDropPacketButNotReceivePacket), b1); ds.SetM(pow(MODDropPacketEventType.DropPacketDueToBandwith), b2); ds.SetM(pow(MODDropPacketEventType.DropPacketMaliciously), b3); ds.SetM(pow(MODDropPacketEventType.END) - 1, 1 - b0 - b1 - b2 - b3); ds.Cal(); MODEventTrustResult result = new MODEventTrustResult(node, reportNode, pkgIdent, category, ds); result.supportDroppingMalicious = -1; return result; }
public static int GetStartTypeByCategory(MODEventCategoryType category) { switch (category) { case MODEventCategoryType.DropPacket: return (int)MODEventType.NotDropPacket; //TODO others default: return -1; } }
public static int GetOffsetByCategory(MODEventCategoryType category, MODEventType type) { switch (category) { case MODEventCategoryType.DropPacket: return (int)type - (int)MODDropPacketEventType.NotDropPacket; //TODO others default: return -1; } }