{"id":96,"date":"2017-08-21T16:38:00","date_gmt":"2017-08-21T14:38:00","guid":{"rendered":"http:\/\/blog.0link.net\/?p=96"},"modified":"2017-08-21T21:24:06","modified_gmt":"2017-08-21T19:24:06","slug":"usb2vga-adapter-am-raspberry-pi","status":"publish","type":"post","link":"https:\/\/blog.0link.net\/index.php\/2017\/08\/21\/usb2vga-adapter-am-raspberry-pi\/","title":{"rendered":"USB2VGA-Adapter am Raspberry Pi"},"content":{"rendered":"<p><span style=\"font-size: 75%\"><em>erforderliche Kenntnisse: Umgang mit der Konsole, Bearbeiten von Konfigurationsdateien, einfache Bash-Skripte erstellen, Anwendungen aus Paketquellen installieren.\u00a0<\/em><\/span><\/p>\n<p>Mit dem Raspi l\u00e4sst sich ja so einiges anstellen\u00a0&#8211; ich nutze einen auf dem Schreibtisch als Desktop-Ersatz, denn mit dem\u00a0geringen Stromverbrauch ist er zum\u00a0Mails abholen und surfen im Web durchaus eine Alternative. Daneben l\u00e4uft er als quasi als ThinClient, um eine RDP-Session einer VM auf dem Homeserver auf den Schreibtisch zu holen.<\/p>\n<p>Aus meinem Nutzungsverhalten entstand auch der Wunsch einen zweiten Bildschirm am Raspi zu betreiben, um dort parallel eine Webseite (z.B. WhatsApp) offen und vor allem im Blick zu haben.<\/p>\n<p>Ich hatte vor einiger Zeit schon mal im Netz gesucht und viele erfolglose Geschichten gelesen. Ein Arbeitskollege kaufte sich k\u00fcrzlich USB2VGA-Adapter von DisplayLink und brachte diese unter Windows 10 zum laufen. Dank Google fand ich heraus, dass RaspbianJessie mittlerweile DisplayLink unterst\u00fctzt, also in die Bucht und Hardware besorgt.<\/p>\n<h5>Erster Kontakt mit dem Raspi<\/h5>\n<p>Nach dem Auspacken des USB2VGA-Adapters einfach mal an der einen Seite einen weiteren Monitor dran, das andere Ende mit einem USB-B-Kabel an den USB-Hub am Raspi (Anmerkung: funktioniert auch direkt am Raspi, wie ich bei diversen Versuchen herausfand). Eine schnelle Kontrolle mit <code>lsusb<\/code> und <code>dmesg<\/code> zeigte, dass der Adapter korrekt erkannt wurde und als <code>\/dev\/fb1<\/code> eingeh\u00e4ngt wurde. Auf dem Monitor war ein gr\u00fcnes Bild &#8230; sonst nix.<\/p>\n<p>Auch die LXDE-Bildschirmeinstellung brachte mich nicht weiter &#8230; hier gab es nur den &#8222;Standardmonitor&#8220; und keine weiteren Ger\u00e4te. Also weiter mit xrandr &#8230; das soll ja sowas k\u00f6nnen.<\/p>\n<h5>ein nervenaufreibender Tag mit xrandr<\/h5>\n<p>Ich\u00a0nehme die Pointe mal vorweg &#8211; ich habe es nicht hinbekommen, trotz vieler Versuche, stundenlangem googeln und lesen &#8230; ich konnte xrandr nicht bewegen den HDMI-Ausgang und den USB2VGA-Adapter zu verwalten.<\/p>\n<p>Es scheitert schon am HDMI-Ausgang, denn xrandr erkennt nur &#8222;default&#8220; als Display und setzt es mit einer festen Aufl\u00f6sung an. Die Abfrage <code>xrandr --listproviders<\/code> bringt als Ergebnis immer 0 und auch das Hinzuf\u00fcgen und \u00c4ndern von Bildschirmmodi hat nicht funktioniert.<\/p>\n<p>Um sicher zu gehen, dass es nicht an meinem Image liegt (Raspbian Jessie LITE mit manuell installiertem X-Server, LXDE und Openbox) habe ich auf anderen Raspis im Haus versucht &#8230;. xrandr hat mir nirgends mehr ausgespuckt.<\/p>\n<p>Da xrandr nicht korrekt funktioniert, brachte mich also auch das GUI-Tool Arandr nicht weiter, dass auch immer nur das &#8222;default&#8220;-Display mit der fixen Aufl\u00f6sung anzeigte.<\/p>\n<h5>X-Server mittels xorg.conf \u00fcberzeugen<\/h5>\n<p>Nachdem nun das moderne und flexible xrandr seinen Dienst versagte, muss nun eine feste Konfig gebastelt werden &#8230;<\/p>\n<h6>\/etc\/X11\/xorg.conf<\/h6>\n<pre lang=\"ini\" line=\"1\">Section \"Device\"\r\n Identifier \"usb\"\r\n Driver \"fbturbo\"\r\n Option \"fbdev\" \"\/dev\/fb1\"\r\n Option \"ShadowFB\" \"off\"\r\nEndSection\r\n\r\nSection \"Device\"\r\n Identifier \"pihdmi\"\r\n Driver \"fbturbo\"\r\n Option \"fbdev\" \"\/dev\/fb0\"\r\n Option \"ShadowFB\" \"off\"\r\nEndSection\r\n\r\nSection \"Monitor\"\r\n Identifier \"Terra\"\r\n Modeline \"1280x1024_60.00\" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync\r\n Option \"PreferredMode\" \"1280x1024_60.00\"\r\n Option \"DPMS\" \"true\"\r\nEndSection\r\n\r\nSection \"Screen\"\r\n Identifier \"vga\"\r\n Device \"usb\"\r\n Monitor \"Terra\"\r\n DefaultDepth 16\r\n SubSection \"Display\"\r\n  Depth 16\r\n  Modes \"1280x1024\"\r\n EndSubSection\r\nEndSection\r\n\r\nSection \"Screen\"\r\n Identifier \"hdmi\"\r\n Device \"pihdmi\"\r\n Monitor \"Terra\"\r\n DefaultDepth 24\r\n SubSection \"Display\"\r\n  Depth 24\r\n  Modes \"1280x1024\"\r\n EndSubSection\r\nEndSection\r\n\r\nSection \"ServerLayout\"\r\n Identifier \"default\"\r\n Screen 0 \"hdmi\" 0 0\r\n Screen 1 \"vga\" RightOf \"hdmi\"\r\n# Option \"Xinerama\" \"on\"\r\nEndSection\r\n<\/pre>\n<p>Dann ein\u00a0<code>sudo systemctl restart lightdm<\/code> und der X-Server brachte mir auf dem zweiten Monitor ebenfalls einen Desktop, nur ohne Panel und mit den Default-Einstellungen zum Desktop-Hintergrund. Ein Verschieben von Fenstern \u00fcber beide Desktops war nat\u00fcrlich nicht m\u00f6glich, da es eben kein ausgedehntes Desktop ist, sondern irgendwie ein weiteres Desktop unter dem gleichen Benutzer.<\/p>\n<h5>Xinerama mit Pi-HDMI und USB2VGA<\/h5>\n<p>Hoch motiviert habe ich dann versucht mittels der Zeile <code>Option \"Xinerama\" \"on\"<\/code> die Desktoperweiterung zu aktivieren. Ihr ahnt es &#8230; versucht hei\u00dft, dass es nicht funktioniert hat.<\/p>\n<p>Ich habe in der Folge gef\u00fchlt 100 Varianten der Konfig getestet, immer mit dem Ergebnis, dass der X-Server abst\u00fcrzt oder eben nur ein Screen voll nutzbar ist. Irgendwann bin ich dann auch mal auf die Idee gekommen unter <code>\/var\/log\/Xorg.0.log<\/code> zu forschen, warum &#8230; es war erstaunlich einfach:<\/p>\n<p>Der X-Server kann Xinerama nicht starten, wenn die beiden Screens unterschiedliche Farbtiefen (Depth) verwenden und st\u00fcrzt dann ganz ab. Der Pi l\u00e4uft standardm\u00e4\u00dfig mit 24 Bit, der USB2VGA-Adapter kann 16 Bit und 32 Bit, letzteres aber leider nur unter Windows.<\/p>\n<p>Ich mache es auch hier kurz &#8230; man hat jetzt eine M\u00f6glichkeit mit zwei Optionen das erweiterte Desktop zu bekommen &#8230; man freundet sich mit 16-Bit Farbtiefe auf beiden Bildschirmen an<\/p>\n<ul>\n<li>Weg 1: den HDMI-Framebuffer des Raspi \u00fcber die config.txt ebenfalls fest auf 16-Bit runterschrauben<\/li>\n<li>Weg 2: zwei USB2VGA-Adapter nehmen und den HDMI-Port des Rapsi ungenutzt lassen<\/li>\n<\/ul>\n<p>Mit Weg 2 habe ich problemlos mittels xorg.conf einen erweiterten Desktop eingerichtet bekommen. \u00dcber die Performance brauchen wir gar nicht reden, wenn das Bild komplett \u00fcber 2 USB-Adapter an einem Hub erzeugt wird und 16-Bit Farben fand ich das letzte mal unter Win2k sch\u00f6n.<\/p>\n<p>Wer damit\u00a0leben kann, kann diese Konfig nehmen &#8211; alle anderen m\u00fcssen unter der Konfig mein Workaround lesen \ud83d\ude09<\/p>\n<pre lang=\"ini\" line=\"1\">Section \"Device\"\r\n Identifier \"usb1\"\r\n Driver \"fbturbo\"\r\n Option \"fbdev\" \"\/dev\/fb1\"\r\n Option \"ShadowFB\" \"off\"\r\nEndSection\r\n\r\nSection \"Device\"\r\n Identifier \"usb2\"\r\n Driver \"fbturbo\"\r\n Option \"fbdev\" \"\/dev\/fb2\"\r\n Option \"ShadowFB\" \"off\"\r\nEndSection\r\n\r\nSection \"Device\"\r\n Identifier \"pihdmi\"\r\n Driver \"fbturbo\"\r\n Option \"fbdev\" \"\/dev\/fb0\"\r\n Option \"ShadowFB\" \"off\"\r\nEndSection\r\n\r\nSection \"Monitor\"\r\n Identifier \"Terra\"\r\n Modeline \"1280x1024_60.00\" 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync\r\n Option \"PreferredMode\" \"1280x1024_60.00\"\r\n Option \"DPMS\" \"true\"\r\nEndSection\r\n\r\nSection \"Screen\"\r\n Identifier \"vga1\"\r\n Device \"usb1\"\r\n Monitor \"Terra\"\r\n DefaultDepth 16\r\n SubSection \"Display\"\r\n Depth 16\r\n Modes \"1280x1024\"\r\n EndSubSection\r\nEndSection\r\n\r\nSection \"Screen\"\r\n Identifier \"vga2\"\r\n Device \"usb2\"\r\n Monitor \"Terra\"\r\n DefaultDepth 16\r\n SubSection \"Display\"\r\n  Depth 16\r\n  Modes \"1280x1024\"\r\n EndSubSection\r\nEndSection\r\n\r\nSection \"Screen\"\r\n Identifier \"hdmi\"\r\n Device \"pihdmi\"\r\n Monitor \"Terra\"\r\n DefaultDepth 24\r\n SubSection \"Display\"\r\n  Depth 24\r\n  Modes \"1280x1024\"\r\n EndSubSection\r\nEndSection\r\n\r\nSection \"ServerLayout\"\r\n Identifier \"default\"\r\n Screen 0 \"vga1\" 0 0\r\n Screen 1 \"vga2\" RightOf \"vga1\"\r\n Option \"Xinerama\" \"on\"\r\nEndSection\r\n<\/pre>\n<p>Mich hat diese L\u00f6sung nicht erf\u00fcllt. Ich wollte gerne auf dem Hauptscreen weiterhin meine 24-Bit-Farben nutzen. Der zweite Screen, nicht dauerhaft ben\u00f6tigt, darf gerne mit weniger laufen und soll ohnehin nur bei Bedarf ne Webseite anzeigen, oder ein weiteres Terminal beherbergen.<\/p>\n<h5>Mein Workaround:\u00a0den geteilten Desktop bewirtschaften<\/h5>\n<p>Basierend auf meiner ersten xorg.conf habe ich nun also den zweiten Desktop angenommen. Dort kann man vom ersten Desktop aus auch Programme starten.\u00a0Von einem Terminal oder aus einem Skript heraus kann man zum Beispiel mit<\/p>\n<p><code>DISPLAY=:0.1 lxterminal<\/code><\/p>\n<p>auf dem zweiten Screen ein Terminalfenster starten. Das hat aber keine Titelleiste, keine Fensterkontrollelemente und kann auf seinem Screen nicht verschoben werden. Mit etwas Recherche im Netz habe ich die Ursache auch gefunden &#8230; der Fenstermanager openbox l\u00e4uft aktuell nur auf dem ersten Bildschirm. Um das Problem zu l\u00f6sen habe ich mir mal ein Skript erstellt &#8230;<\/p>\n<pre lang=\"bash\" line=\"1\">#!\/bin\/bash\r\n#Startet Fenstermanager auf zweitem Screen\r\nDISPLAY=:0.1 openbox &amp;\r\nexec openbox-session\r\n<\/pre>\n<p>Das startet nun openbox auf dem zweiten Screen und sorgt f\u00fcr eine ordentliche Session. Jetzt haben die Fenster Titelleisten und die gewohnten Steuerelemente und k\u00f6nnen nach belieben innerhalb des zweiten Screens verschoben werden.<\/p>\n<p>jetzt kann auf dem zweiten Screen \u00fcber ein Terminal mit <code>obconf<\/code> das Aussehen angepasst werden, so dass beide Desktopteile &#8222;harmonisch&#8220; wirken.<\/p>\n<p>Ein Problem bleibt aber noch &#8230; die Fenster aus dem zweiten Screen tauchen aber logischerweise nicht im lxpanel auf dem ersten Screen auf und es gibt kein Men\u00fc\/keine Programmstarter auf dem zweiten Screen.<\/p>\n<p>Der erste Gedanke &#8230; einfach auf dem zweiten Screen auch das lxpanel starten &#8211; geht leider nicht, anders als openbox, l\u00e4sst sich lxpanel nur einmal starten. Also muss ein anderes Panel her, mit dem man die Tasks des zweiten Screens verwalten kann<\/p>\n<h5>ein Panel f\u00fcr den zweiten Screen: tint2<\/h5>\n<p>Ich habe mich f\u00fcr tint2 entschieden, weil es klein ist, recht einfach an die eigenen Bed\u00fcrfnisse angepasst werden kann und noch dazu aus den Paketquellen zu bekommen ist.<\/p>\n<p>Nach der Installation kann man es einfach im Terminal des zweiten Screens mittels tint2 starten und hat in der Grundkonfig schon mal ein Panel mit Taskleiste und Uhr.<\/p>\n<p>Das Aussehen und die Funktion des Panels l\u00e4sst sich in der <code>~\/.config\/tint2\/default.tint2rc<\/code> beeinflussen. Man kann diese auch einfach kopieren und in der Kopie nach Herzenslust\u00a0Farben, Rahmen, Panelaufteilung und vor allem Starter, mit denen man gezielt auf dem zweiten Screen Dinge starten kann, erstellen. Mit dem Tool <code>tint2conf<\/code> kann man dann eine Konfig ausw\u00e4hlen und aktivieren ohne das Panel selbst neu zu starten.<\/p>\n<h5>das Finetuning: Skripte und Starter f\u00fcrs zweite Panel<\/h5>\n<p>Ich habe mir f\u00fcr das Starten des zweiten Desktops oben erw\u00e4hntes Skript angelegt und auf meinem Desktop als Starter platziert, da ich aus Ressourcengr\u00fcnden diesen nicht immer mit laufen lassen m\u00f6chte.<\/p>\n<p>F\u00fcr das Starten der verschiedenen Apps auf dem zweiten Screen habe ich mir entsprechende Skripte und Starter erzeugt, die ich dann im zweiten Panel verkn\u00fcpft habe.<\/p>\n<h5>Chromium aufdem zweiten Screen parallel starten<\/h5>\n<p>Chromium startet standartm\u00e4\u00dfig neue Fenster immer im selben Screen. Das kann man\u00a0aber umgehen, indem man f\u00fcr den zweiten Screen ein eigenes &#8222;User-Data-Dir&#8220; f\u00fcr den Browser definiert und dann kann man sogar zwei verschiedene Browser-Konfigurationen parallel\u00a0laufen lassen. \u00a0Mein Skript <code>start_chromium2.sh<\/code> &#8230;<\/p>\n<pre lang=\"bash\" line=\"1\">#!\/bin\/bash\r\nDISPLAY=:0.1 chromium-browser --user-data-dir=\/home\/pi\/.chromium-2\r\n<\/pre>\n<p>&#8230; startet den Browser mit einem anderen Datenverzeichnis und damit auch in einem anderen Kontext. Ich habe einfach daf\u00fcr ein neues Verzeichnis im Homedir angelegt. Vielleicht ginge es auch mit einem Softlink auf das &#8222;normale&#8220; Datenverzeichnis, dann h\u00e4tten beide Browser den selben Cache, die selben Cookies &#8230; aber ich finde es ok quasi zwei verschiedene Browser zu haben, sind eh \u00fcber den Google-Account synchronisiert.<\/p>\n<p>F\u00fcr diese Skript habe ich dann einen Starter <code>chromium2.desktop<\/code> erstellt &#8230;<\/p>\n<pre lang=\"ini\" line=\"1\">[Desktop Entry]\r\nType=Application\r\nName[de_DE]=Chromium 2nd\r\nExec=\/home\/pi\/Skripte\/start_chromium2.sh\r\nGenericName=Startet Chromium auf zweitem Screen\r\nComment[de_DE]=Startet Chromium auf zweitem Screen\r\nIcon=\/home\/pi\/Skripte\/chromium.png\r\n<\/pre>\n<p>&#8230; den ich nun im zweiten Panel eingebunden habe. Man kann ihn nat\u00fcrlich auch im lxpanel oder dem Desktop verlinken, wollte ich aber nicht. So erscheint er n\u00e4mlich nur auf dem zweiten Screen, also auch nur, wenn dieser verf\u00fcgbar\u00a0ist.<\/p>\n<p>In meiner <code>default.tint2rc<\/code> habe ich das so eingebunden &#8230;<\/p>\n<pre lang=\"ini\">[...]\r\nlauncher_item_app = \/home\/rainer\/Skripte\/tint2conf.desktop\r\nlauncher_item_app = \/home\/rainer\/Skripte\/thunar2.desktop\r\nlauncher_item_app = \/home\/rainer\/Skripte\/chromium2.desktop\r\nlauncher_item_app = \/home\/rainer\/Skripte\/lxterm.desktop\r\n[...]<\/pre>\n<p>tint2conf.desktop ist ein Starter f\u00fcr das oben erw\u00e4hnte Konfig-Tool von tint2.<\/p>\n<p>thunar2.desktop bringt mir einen Dateimanager auf den zweiten Screen, denn der LXDE-Standard pcmanfm l\u00e4sst sich auch mit verschiedenen Tricks nicht auf dem zweiten Screen parallel starten.<\/p>\n<p>lxterm.desktop ist, ihr ahnt es, ein Starter f\u00fcr das Terminal auf dem zweiten Screen.<\/p>\n<p>Die Starter sind alle nach dem Prinzip vom Chromium-Starter aufgebaut &#8230; der Starter greift auf ein Skript zur\u00fcck und im Skript werden die Anwendungen immer mit der DISPLAY-Variable vorweg gestartet. Diese Variante hat den Vorteil, dass alle Starter auch vom Hauptscreen aus funktionieren, solange der zweite Screen verf\u00fcgbar ist.<\/p>\n<h5>Fazit<\/h5>\n<p>Das Verschieben von Fenstern vom einen auf den anderen Screen oder ein Screen-\u00fcbergreifendes Fenster ist mit dieser Variante nat\u00fcrlich nicht m\u00f6glich. Dazu muss man zwingend Xinerama zum Laufen bringen. Wer, wie ich, auf diese Funktion verzichten kann, kann auf diese Weise aber auch ein nutzbaren Desktop auf einem weiteren Bildschirm erzeugen.<\/p>\n<figure id=\"attachment_111\" aria-describedby=\"caption-attachment-111\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/blog.0link.net\/wp-content\/uploads\/2017\/08\/dualscreen_cut.jpg\"><img loading=\"lazy\" class=\"size-medium wp-image-111\" src=\"http:\/\/blog.0link.net\/wp-content\/uploads\/2017\/08\/dualscreen_cut-300x124.jpg\" alt=\"DualScreen mit dem Raspi \u00fcber HDMI und einem USB2VGA-Adapter f\u00fcr den zweiten Monitor rechts\" width=\"300\" height=\"124\" srcset=\"https:\/\/blog.0link.net\/wp-content\/uploads\/2017\/08\/dualscreen_cut-300x124.jpg 300w, https:\/\/blog.0link.net\/wp-content\/uploads\/2017\/08\/dualscreen_cut-1024x425.jpg 1024w, https:\/\/blog.0link.net\/wp-content\/uploads\/2017\/08\/dualscreen_cut.jpg 1297w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-111\" class=\"wp-caption-text\">DualScreen mit dem Raspi \u00fcber HDMI und einem USB2VGA-Adapter f\u00fcr den zweiten Monitor rechts<\/figcaption><\/figure>\n<p>Ein alternativer Weg f\u00fcr einen zweiten Desktop, sogar mit eigenem Benutzer ist die MultiSeat-Funktionalit\u00e4t von lightdm. Das habe ich auch ausprobiert, ist sehr interessant, weil man damit an einer Maschine mehrere unabh\u00e4ngige X-Server erzeugen und auf verschiedene Monitore verteilen kann. Trickreich ist dann das Konfigurieren der Eingabeger\u00e4te, denn ohne weitere Zutun werden Eingaben und Mausbewegungen parallel an beide X-Server gesendet (witziger Effekt), aber das war dann nicht das, was ich gesucht habe.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>erforderliche Kenntnisse: Umgang mit der Konsole, Bearbeiten von Konfigurationsdateien, einfache Bash-Skripte erstellen, Anwendungen aus Paketquellen installieren.\u00a0 Mit dem Raspi l\u00e4sst sich ja so einiges anstellen\u00a0&#8211; ich nutze einen auf dem Schreibtisch als Desktop-Ersatz, denn mit dem\u00a0geringen Stromverbrauch ist er zum\u00a0Mails abholen und surfen im Web durchaus eine Alternative. Daneben l\u00e4uft er als quasi als ThinClient, &hellip; <a href=\"https:\/\/blog.0link.net\/index.php\/2017\/08\/21\/usb2vga-adapter-am-raspberry-pi\/\" class=\"more-link\"><span class=\"screen-reader-text\">USB2VGA-Adapter am Raspberry Pi<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":98,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/96"}],"collection":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/comments?post=96"}],"version-history":[{"count":13,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/96\/revisions"}],"predecessor-version":[{"id":112,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/96\/revisions\/112"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/media\/98"}],"wp:attachment":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/media?parent=96"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/categories?post=96"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/tags?post=96"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}