DecentralizedAmateurPagingNetwork / Core

The DAPNET Core is the core application of DAPNET, responsible for handling transmitter clients, clustering, and providing the REST API.
https://www.afu.rwth-aachen.de/projekte/funkruf-pager-pocsag/funkrufmaster-2-0-dapnet
42 stars 11 forks source link

Rubriken ab 96 werden auf 32 gemappt #159

Open dh3wr opened 6 years ago

dh3wr commented 6 years ago

Interessanter Fall: Eine Rubrik mit Nummer => 96+i erscheint als Nummer 32 + i

Ich habe mal etwas gesucht: https://github.com/DecentralizedAmateurPagingNetwork/Core/blob/master/src/main/java/org/dapnet/core/transmission/SkyperProtocol.java

Zeile 109: sb.append(String.valueOf((char) (rubric.getNumber() + 0x1f)));

96+0x1f = 127. Das scheint ein signed int8 Problem zu sein. Frage ist nur am Core oder auf dem Unipager?

Taronyu commented 6 years ago

Ich vermute, dass das Java-interne Encoding die Zeichen durch "?" ersetzt, weil die außerhalb des Bereichs liegen:

1 32  
2 33 !
3 34 "
4 35 #
5 36 $
6 37 %
7 38 &
8 39 '
9 40 (
10 41 )
11 42 *
12 43 +
13 44 ,
14 45 -
15 46 .
16 47 /
17 48 0
18 49 1
19 50 2
20 51 3
21 52 4
22 53 5
23 54 6
24 55 7
25 56 8
26 57 9
27 58 :
28 59 ;
29 60 <
30 61 =
31 62 >
32 63 ?
33 64 @
34 65 A
35 66 B
36 67 C
37 68 D
38 69 E
39 70 F
40 71 G
41 72 H
42 73 I
43 74 J
44 75 K
45 76 L
46 77 M
47 78 N
48 79 O
49 80 P
50 81 Q
51 82 R
52 83 S
53 84 T
54 85 U
55 86 V
56 87 W
57 88 X
58 89 Y
59 90 Z
60 91 [
61 92 \
62 93 ]
63 94 ^
64 95 _
65 96 `
66 97 a
67 98 b
68 99 c
69 100 d
70 101 e
71 102 f
72 103 g
73 104 h
74 105 i
75 106 j
76 107 k
77 108 l
78 109 m
79 110 n
80 111 o
81 112 p
82 113 q
83 114 r
84 115 s
85 116 t
86 117 u
87 118 v
88 119 w
89 120 x
90 121 y
91 122 z
92 123 {
93 124 |
94 125 }
95 126 ~
96 127 
97 128 ?
98 129 ?
99 130 ?

Ist das Format für die Rubriken bei Skypern irgendwo dokumentiert? Hab da auf die Schnelle im Netz nichts gefunden. Wenn da echt ein ganzes Byte gespeichert wird und kein ASCII7, dann müssten Werte größer 127 zulässig sein.

dh3wr commented 6 years ago

Man müsste mal im XOS Quellcode schauen oder im alten Funkrufmaster... Ich versuche mich mal. Laut https://github.com/rwth-afu/UniPager/issues/113 ist wohl noch nicht klar, wie dieser Zeichen im POCSAG kodiert wird, da wohl nur 7 bit zur Verfügung stehen. Daher im alten Sourcecode schauen, was der Skyper hier erwartet.

dh3wr commented 6 years ago

Vielleicht hier?:

bool spoolfiles::spool_brd_name( String name, int brd)
{
  const int prio = 160;

  syslog logf(configuration);
  first();
  bool flag1 = true,flag2 = false;

  spoollog logs(configuration);
  logs.eintrag(G_mycall,G_mycall,zeit(),destin(),name+String(" : ")+itoS(brd),prio,SPOOLLOGMASK_NAMES);

  while (flag1)
    {
      try
    {
      ofstream sp;
      get_file(false,sp,prio);
      sp << "4512.3\r";
      sp << '1';
      sp << (char) (brd + 0x1f);
      sp << (char) (10 + 0x20);
      int l = name.slen();
      for (int i = 0;i < l;i++)
        sp << (char) ((int) name[i] + 1);
      sp.close();
      flag2 = true;
    }

bzw.

bool spoolfiles::spool_bul( const callsign &master, zeit t_master, int board, int slot, String msg, bool from_fwd, const destin &d, unsigned int prio, bool rep_flag)
{
  // Als erstes wird die Nachricht ueber die Export-Funktion 
  // ausgegeben.
  try
    {
      export_sys exp;
      exp.write_bul(master,t_master,board,slot,msg,from_fwd,d,prio,rep_flag);
    }
  catch( Error_could_not_initialize_exportsystem )
    {
      // Hat nicht geklappt...
    }
  syslog logf(configuration);
  stat.spool(!from_fwd,false);
  first();
  bool flag1 = true,flag2 = false;

  spoollog logs(configuration);
  String logmsg = "("+itoS(board)+","+itoS(slot)+")"+msg;

  if (rep_flag)
    logs.eintrag(master,master,t_master,d,logmsg,prio,SPOOLLOGMASK_REP);
  else
    logs.eintrag(master,master,t_master,d,logmsg,prio,SPOOLLOGMASK_BUL);

  // ueberfluessige Leerzeichen am Ende des Funkrufes entfernen
  msg.kuerze();

  // Laenge des Funkrufs jetzt auf 80 Zeichen begrenzen
  if (msg.slen() > 80)
    msg = msg.copy(0,80);

  while (flag1)
    {
      try
    {
      ofstream sp;
      if (check_destin(d))
        {
          get_file(false,sp,prio);
          sp << "4520.3\r";
          sp << (char) (board + 0x1f);
          sp << (char) (slot + 0x20);
          for (unsigned int i = 0;i < msg.slen(); i++ )
        sp << (char) ((int) msg[i]+1);
        } 
      else
        next();
      flag2 = true;
    }
dh3wr commented 6 years ago

Im XOS sehe ich auch keine Werte < 127

/*
 *  Tabelle zum Umwandeln von ISO-Codierten Zeichen in
 *  POCSAG-Codierte Zeichen (Umwandlung + Bitspiegelung).
 *  Zeichen, die nicht umgewandelt werden koennen, werden
 *  auf einen Punkt '.' gemapped.
 *
 */
static unsigned char code isotab[256] =
{
     0x00, 0x40, 0x20, 0x60, 0x10, 0x50, 0x30, 0x70,
     0x08, 0x48, 0x28, 0x68, 0x18, 0x58, 0x38, 0x78,
     0x04, 0x44, 0x24, 0x64, 0x14, 0x54, 0x34, 0x74,
     0x0c, 0x4c, 0x2c, 0x6c, 0x1c, 0x5c, 0x3c, 0x7c,
     0x02, 0x42, 0x22, 0x62, 0x12, 0x52, 0x32, 0x72,
     0x0a, 0x4a, 0x2a, 0x6a, 0x1a, 0x5a, 0x3a, 0x7a,
     0x06, 0x46, 0x26, 0x66, 0x16, 0x56, 0x36, 0x76,
     0x0e, 0x4e, 0x2e, 0x6e, 0x1e, 0x5e, 0x3e, 0x7e,
     0x01, 0x41, 0x21, 0x61, 0x11, 0x51, 0x31, 0x71,
     0x09, 0x49, 0x29, 0x69, 0x19, 0x59, 0x39, 0x79,
     0x05, 0x45, 0x25, 0x65, 0x15, 0x55, 0x35, 0x75,
     0x0d, 0x4d, 0x2d, 0x6d, 0x1d, 0x5d, 0x3d, 0x7d,
     0x03, 0x43, 0x23, 0x63, 0x13, 0x53, 0x33, 0x73,
     0x0b, 0x4b, 0x2b, 0x6b, 0x1b, 0x5b, 0x3b, 0x7b,
     0x07, 0x47, 0x27, 0x67, 0x17, 0x57, 0x37, 0x77,
     0x0f, 0x4f, 0x2f, 0x6f, 0x1f, 0x5f, 0x3f, 0x7f,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x01,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x6d, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x1d, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x5d, 0x3a, 0x3a, 0x3f,
     0x3a, 0x3a, 0x3a, 0x3a, 0x6f, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x1f, 0x3a,
     0x3a, 0x3a, 0x3a, 0x3a, 0x5f, 0x3a, 0x3a, 0x3a
};

D.h. es muss eine spezielle Skyper-Spielart geben, wir dies gemacht wird, Es muss also im Funkufmaster sein. Wahrscheinlich an der Stelle, wo die Daten aus dem Spooler ausgelesen werden und zum Sender verschickt werden. Ich suche...

dh3wr commented 6 years ago

Also es gibt wohl gar keine Rubriken über 95. Siehe auch das Changelog:

VERSION 0.98i
=============
[...]
- Skyper-Rubriken > 95 verarbeitet die RPC-Firmware nicht korrekt. Daher sind
  jetzt auch lokale Rubriken im Bereich 65 bis 90 erlaubt.

Da es wohl mit den 7 bit auch technisch nicht anders geht, würden wir wohl statt 1-99 die gültigen Werte auf 1-95 beschränken.

se9000 commented 5 years ago

Grundsätzlich kann der Skyper bis zu 239 Rubriken verarbeiten.

Diese unterteilen sich in sogenannte "F"- und "K"-Rubriken. Die "F"-Rubriken waren auf der Skyper-Plattform mit einem einfachen Abo zu haben (bis auf die Rubriken 1 bis 3, diese sogenannten Basisprogramme waren auf jedem Skyper zugänglich). Die "K"-Rubriken lieferten Premium-Inhalte und mussten zum regulären Preis extra gezahlt werden.

Tatsächlich ist das Protokoll, um die Rubriken des Skyper zu befüllen, auf 95 Rubriken beschränkt. Wie man die höheren Rubriken befüllen kann? Über andere RICs, auf die der Skyper auch noch hört, die aber kaum jemand kennt.

Die Aufteilung ist so: Rubriknr. 1-95 läuft über RIC 4520 Rubriknr. 96-190 läuft über RIC 4528 Rubriknr. 191-239 mit der Kennzeichnung "K" beim Standard-Skyper über RIC 4536. "Standard-Skyper" meint hier den von -T- bzw. e*message. Es gab Sondereditionen, von wetter.de, von Fußballvereinen usw., die für ihre Sonder-Programme andere RICs hatten. 4520 und 4528 sollte aber jeder Skyper programmiert haben.

Um kompatibel mit allen Geräten zu bleiben, könnte man also die Rubriken bis 190 wieder aufbohren.

73 de dg1kmm

dk7td commented 5 years ago

Werden die K-Rubriken dann extra freigeschaltet, oder läuft das über die Standard-Freischaltung wie für die übrigen Rubriken? Wobei - wenn die bei unterschiedlichen Editionen ggf. nicht korrespondieren, bringen uns die ja nicht wirklich viel. Und 96-190 (durchgehend?) sollten uns schon ne Menge zusätzlichen Platz bringen.

73 de Didi, DK7TD

se9000 commented 5 years ago

Didi, die Aktivierung, die hier verwendet wird, schaltet auch den K-Bereich frei. Für das normale Abo gibt's eine andere Aktivierungssequenz, die den K-Bereich nicht antastet. Die wurde aber im Amateurfunk m.E. nie benutzt, immer nur die "große".

Meine Idee könnte aber schon wieder sterben - ich habe von Dir, Didi, den Skyper 2/B gerade im Labor. Der kennt den zweiten Rubrik-Block (also die Nummern 96-190) nicht, sondern nur 1-95 und 191-239. Und das, obwohl die Rubrikenliste des Skypers (im Gegensatz zu den Inhalten, siehe Aufteilung oben) komplett über RIC 4512 eingespielt wird - er akzeptiert den Bereich in der Mitte nicht. Der Skyper ist keine dieser Sonderausgaben, sondern ein ganz normaler -T---Skyper. Auch kennt der die Gruppen-RIC 4504 nicht. Seltsam... das untersuche ich genauer, aber wenn sich alle Skyper 2 so verhalten, was zu testen wäre, würden wie die ja aussperren. Es könnte natürlich auch ein verändertes IDROM in diesem einen Skyper sein. Viele Geräte haben eine Vorgeschichte, wurden vielleicht mal repariert, Cityruf konnte man auch aufbuchen und so Schnickschnack. Ins IDROM kann ich momentan nicht reingucken, hab keine Lesehardware dafür da. Und Programmiersoftware mit den passenden ROM-Files kann ich auch nirgendwo auftreiben. Es bleibt spannend.

73 de DG1KMM

Taronyu commented 3 years ago

Ich habe im Refactoring-Branch nun Subadressen eingebaut. Wenn der Skyper nun mehr kann, könnte man da vielleicht was machen.