{"id":2207,"date":"2021-12-31T10:03:58","date_gmt":"2021-12-31T15:03:58","guid":{"rendered":"https:\/\/www.yorku.ca\/professor\/drsmith\/?p=2207"},"modified":"2022-01-02T06:21:51","modified_gmt":"2022-01-02T11:21:51","slug":"firmata-java","status":"publish","type":"post","link":"https:\/\/www.yorku.ca\/professor\/drsmith\/2021\/12\/31\/firmata-java\/","title":{"rendered":"Firmata &#038; Java"},"content":{"rendered":"\n<p><a href=\"https:\/\/github.com\/firmata\/arduino\">Firmata<\/a> is a set of Arduino projects that are aimed at helping solve a particular class of problems with embedded devices: having a main computer send and receive data from an Arduino, typically in a simple control or data-logging application.  This is similar to how people use the Arduino support for <a href=\"https:\/\/www.mathworks.com\/hardware-support\/arduino-matlab.html\">Matlab<\/a>.<\/p>\n\n\n\n<p>In Java we use <a href=\"https:\/\/github.com\/kurbatov\/firmata4j\">Firmata4j<\/a>, one of three Java implementations on the host computer side. <\/p>\n\n\n\n<p>Here is a preview video:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Firmata blink LED test\" width=\"1778\" height=\"1000\" src=\"https:\/\/www.youtube.com\/embed\/XP8kVzSaZPo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><figcaption>Blinking LED using Firmata and Java.<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.36.48-AM.png\" alt=\"Load StandardFirmata on to your Arduino board.\" class=\"wp-image-2210\" width=\"219\" height=\"184\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.36.48-AM.png 875w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.36.48-AM-300x253.png 300w\" sizes=\"auto, (max-width: 219px) 100vw, 219px\" \/><figcaption>Load StandardFirmata on to your Arduino<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Arduino IDE <\/h2>\n\n\n\n<p>Using the Arduino IDE, load the StandardFirmata on to your Arduino board:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Select the board (e.g. Tools -&gt; Board -&gt; Arduino UNO)<\/li><li>Select the port (e.g. Tools -&gt; Port -&gt; \/dev\/cu.usbserial-0001 or COM3, etc.)<\/li><li>Select the firmware (File -&gt; Examples -&gt; Firmata -&gt; StandardFirmata)<\/li><li>Compile and download StandardFirmata to your Arduino-compatible board.<\/li><\/ol>\n\n\n\n<p>Now, open up the Serial Monitor window in the Arduino IDE, set it to 57,600 baud and you should see a message appear that says \"StandardFirmata.ino\".  If you don't, check that you're at 57600 baud on your monitor and then hit the reset button on the Arduino board.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.42.06-AM-1024x594.png\" alt=\"The serial monitor should say &quot;StandardFirmata.ino&quot;\" class=\"wp-image-2211\" width=\"256\" height=\"149\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.42.06-AM-1024x594.png 1024w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.42.06-AM-300x174.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-8.42.06-AM.png 1070w\" sizes=\"auto, (max-width: 256px) 100vw, 256px\" \/><figcaption>Use the serial monitor to check to see <\/figcaption><\/figure><\/div>\n\n\n\n<p>You can also connect to the board using <a href=\"https:\/\/freeware.the-meiers.org\">CoolTerm<\/a> or <a href=\"https:\/\/sourceforge.net\/projects\/realterm\/\">RealTerm<\/a>. These terminal programs offer more detailed ways of looking at the serial data.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Java program<\/h2>\n\n\n\n<p>In order to do useful work you'll need to write a client program to interact with your board.  It's 2022, so we'll use the latest version of IntelliJ (2021.3 CE) and the JDK (17).<\/p>\n\n\n\n<p>Start a new project in IntelliJ and select JDK 17 (e.g. Oracle OpenJDK 17.0.1).  I'll call my project FirmataTest8 but you can call it anything else you want.<\/p>\n\n\n\n<p>Add a new Java Class in your project.  I'll call mine firmataTest8.  Inside this project, add two Java classes: Pins.java and FirmataTestClass.java.  <\/p>\n\n\n\n<p>Here is <strong>FirmataTestClass.java<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Original source by Richard Robinson, Dec 2021.\n\/\/ Updated by James Andrew Smith, Dec 2021.\nimport org.firmata4j.firmata.FirmataDevice;\n\nimport java.io.IOException;\n\n    public class firmataTestClass {\n        public static void main(String&#91;] args) throws IOException, InterruptedException {\n            var device = new FirmataDevice(<mark class=\"kt-highlight\">\"\/dev\/cu.usbserial-0001\"); \/\/ Change to your serial port<\/mark>\n\n            device.start();\n            device.ensureInitializationIsDone();\n\n            \/\/ LED assumed to be on D4\n            \/\/ Change in Pins if you have a different pin.\n            var led = device.getPin(Pins.D4);\n\n\n            \/\/ infinite loop to send LED on\/off signal to Arduino with LED on D4\n            while(true) {\n                led.setValue(0);\n                Thread.sleep(500);\n                led.setValue(1);\n                Thread.sleep(500);\n            }\n\n        }\n    }\n<\/code><\/pre>\n\n\n\n<p>And here is the <strong>Pins.java<\/strong> class:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * Maps the Arduino pin labels to those of Firmata\n * Original by Richard Robinson, Dec. 2021.\n *\/\npublic class Pins {\n\n    static final int D4 =  4; \/\/ LED\n\n    private Pins() {\n    }\n}<\/code><\/pre>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"alignright size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"111\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.16.18-AM-300x111.png\" alt=\"Download com.github.kurbatov:firmata4j:2.3.8 via Maven.\" class=\"wp-image-2214\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.16.18-AM-300x111.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.16.18-AM.png 1009w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption>Download <strong>firmata4j<\/strong> via Maven into IntelliJ (e.g com.github.kurbatov:firmata4j:2.3.8)<\/figcaption><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Import two packages with Maven<\/h3>\n\n\n\n<p>Next, you need to import two packages: <strong>firmata4j<\/strong> and <strong>slf4j<\/strong>.  Start with firmata4j:<\/p>\n\n\n\n<p><code>File -> Project Structure -> Libraries -> + -> From Maven<\/code><\/p>\n\n\n\n<p>Search for com.github.kurbatov and choose <strong>firmata4j:2.3.8<\/strong> (e.g. <code>com.github.kurbatov:firmata4j:2.3.8<\/code>)<\/p>\n\n\n\n<p>Next, you likely need to also add in slf4j explicitly into your project, otherwise you may get a \"class path\" error at run time.  To do this, use Maven again: <\/p>\n\n\n\n<p><code>File -> Project Structure -> Libraries -> + -> From Maven<\/code><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"109\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.23.21-AM-300x109.png\" alt=\"Download org.slf4j:slf4j-jcl:1.7.3 from Maven.\" class=\"wp-image-2215\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.23.21-AM-300x109.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.23.21-AM.png 817w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption>Get <strong>slf4j<\/strong>, the logging library: org.slf4j:slf4j-jcl:1.7.3 via Maven.<\/figcaption><\/figure><\/div>\n\n\n\n<p>and search for org.slf4j and then choose <strong>slf4j-jcl:1.7.3<\/strong>.  Be careful.  There are lots of options here.  You want the \"JCL\" library and you want to choose the 1.7.3 version of it (e.g. <code>org.slf4j:slf4j-jcl:1.7.3<\/code>).<\/p>\n\n\n\n<p>When it's all done you should see that there are two libraries downloaded and assocaited with your Java project.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.32.19-AM.png\" alt=\"two libraries: firmata4j and slf4j\" class=\"wp-image-2217\" width=\"724\" height=\"170\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.32.19-AM.png 965w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.32.19-AM-300x71.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><figcaption>two libraries: firmata4j (2.3.8) and slf4j (JCL 1.7.3)<\/figcaption><\/figure><\/div>\n\n\n\n<p>Next, compile and run.  You should see the D4 LED blinking.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.50.37-AM-1-1024x699.png\" alt=\"The D4 LED will blink over and over if your program runs correctly.  You'll also see a lot of red (and some green) coming from the small pair of LEDs beside the USB port because of the communication b\/w the board and your computer.\" class=\"wp-image-2219\" width=\"512\" height=\"350\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.50.37-AM-1-1024x699.png 1024w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.50.37-AM-1-300x205.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.50.37-AM-1-1536x1048.png 1536w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/Screen-Shot-2021-12-31-at-9.50.37-AM-1.png 1758w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><figcaption>The D4 LED will blink over and over if your program runs correctly. You'll also see a lot of red (and some green) coming from the small pair of LEDs beside the USB port because of the communication b\/w the board and your computer.<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Notes on versions<\/h2>\n\n\n\n<p>As of Arduino 1.8.16 the Firmata version is 2.5.  You will see a warning:<\/p>\n\n\n\n<p>WARNING: Current version of firmata protocol on device (2.5) differs from version supported by firmata4j (2.3).<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Don't downgrade <\/span>to 2.3.  It's not worth it.  You'll get errors about i2c support.  So <strong>stick to 2.5<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"78\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2022\/01\/Screen-Shot-2022-01-02-at-6.12.48-AM-1024x78.png\" alt=\"\" class=\"wp-image-2235\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2022\/01\/Screen-Shot-2022-01-02-at-6.12.48-AM-1024x78.png 1024w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2022\/01\/Screen-Shot-2022-01-02-at-6.12.48-AM-300x23.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2022\/01\/Screen-Shot-2022-01-02-at-6.12.48-AM.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Firmata version warning within Java. Don't worry about the warning about version 2.5.  If you downgrade to 2.3 you won't have access to I2C, which is required for the OLED display on the Grove Beginner Kit for Arduino.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>That's it.  There is more you can do, but this will allow you to make sure that you've got communicaiton between your Arduino board and your Java program.  For those of you using a different board than the Grove Beginner Kit for Arduino, you'll need to choose a different LED, like D13.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>Many thanks to Richard Robinson for his work on the original demo!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Telemetrix update to StandardFirmata<\/h2>\n\n\n\n<p>A very recent addition to the Firmata family is <a href=\"http:\/\/mryslab.blogspot.com\">Alan Yorkink<\/a>'s <a href=\"https:\/\/mryslab.github.io\/telemetrix\/\">Telemetrix<\/a>.  This appears to provide more hardware support than Standard Firmata.  We'll have to test it out in the future. But, for the time being, we'll stick to Standard Firmata.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"128\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/12\/noun-signature-1720818-2.png\" alt=\"a pen\" class=\"wp-image-2116\"\/><\/figure><\/div>\n\n\n\n<p>James Andrew Smith is a Professional Engineer and Associate Professor in the Electrical Engineering and Computer Science <a href=\"http:\/\/eecs.lassonde.yorku.ca\">Department<\/a> of York University's <a href=\"http:\/\/lassonde.yorku.ca\">Lassonde School<\/a>, with degrees in Electrical and Mechanical Engineering&nbsp;from the University of Alberta and McGill University.&nbsp;&nbsp;Previously a program director in biomedical engineering, his research background spans robotics, locomotion, human birth and&nbsp;engineering&nbsp;education. While on sabbatical in 2018-19 with his wife and kids he lived in Strasbourg, France and&nbsp;he&nbsp;taught at the <a href=\"https:\/\/www.insa-strasbourg.fr\/en\/\">INSA Strasbourg<\/a> and <a href=\"https:\/\/www.hs-karlsruhe.de\">Hochschule Karlsruhe<\/a> and wrote about his&nbsp;<a href=\"https:\/\/twitter.com\/search?q=(%23sabbaticallife)%20(from%3Aonnimikki)&amp;src=typed_query\">personal<\/a> and <a href=\"https:\/\/twitter.com\/search?q=insa%20(from%3Ajasmith_yorku)&amp;src=typed_query\">professional <\/a><a href=\"https:\/\/twitter.com\/search?q=karlsruhe%20(from%3Ajasmith_yorku)&amp;src=typed_query\">perspectives<\/a>.&nbsp;&nbsp;James is a proponent of using social media to advocate for justice, equity, diversity and inclusion as well as evidence-based applications of research&nbsp;in the public sphere.&nbsp;You can find him on&nbsp;<a href=\"https:\/\/twitter.com\/jasmith_yorku\">Twitter<\/a>. Originally from Qu\u00e9bec City, he now lives in Toronto, Canada.&nbsp;&nbsp;&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Firmata is a set of Arduino projects that are aimed at helping solve a particular class of problems with embedded devices: having a main computer send and receive data from an Arduino, typically in a simple control or data-logging application. This is similar to how people use the Arduino support for Matlab. In Java we [&hellip;]<\/p>\n","protected":false},"author":762,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","footnotes":""},"categories":[42,50,55],"tags":[10,407,406,405,403,404,164,408],"class_list":["post-2207","post","type-post","status-publish","format-standard","hentry","category-arduino","category-java","category-programming","tag-arduino","tag-client","tag-data-logger","tag-data-logging","tag-firmata","tag-firmware","tag-java","tag-server"],"taxonomy_info":{"category":[{"value":42,"label":"arduino"},{"value":50,"label":"java"},{"value":55,"label":"programming"}],"post_tag":[{"value":10,"label":"arduino"},{"value":407,"label":"client"},{"value":406,"label":"data logger"},{"value":405,"label":"data logging"},{"value":403,"label":"firmata"},{"value":404,"label":"firmware"},{"value":164,"label":"java"},{"value":408,"label":"server"}]},"featured_image_src_large":false,"author_info":{"display_name":"drsmith","author_link":"https:\/\/www.yorku.ca\/professor\/drsmith\/author\/drsmith\/"},"comment_info":"","category_info":[{"term_id":42,"name":"arduino","slug":"arduino","term_group":0,"term_taxonomy_id":42,"taxonomy":"category","description":"","parent":0,"count":30,"filter":"raw","cat_ID":42,"category_count":30,"category_description":"","cat_name":"arduino","category_nicename":"arduino","category_parent":0},{"term_id":50,"name":"java","slug":"java","term_group":0,"term_taxonomy_id":50,"taxonomy":"category","description":"","parent":0,"count":27,"filter":"raw","cat_ID":50,"category_count":27,"category_description":"","cat_name":"java","category_nicename":"java","category_parent":0},{"term_id":55,"name":"programming","slug":"programming","term_group":0,"term_taxonomy_id":55,"taxonomy":"category","description":"","parent":0,"count":30,"filter":"raw","cat_ID":55,"category_count":30,"category_description":"","cat_name":"programming","category_nicename":"programming","category_parent":0}],"tag_info":[{"term_id":10,"name":"arduino","slug":"arduino","term_group":0,"term_taxonomy_id":10,"taxonomy":"post_tag","description":"","parent":0,"count":17,"filter":"raw"},{"term_id":407,"name":"client","slug":"client","term_group":0,"term_taxonomy_id":407,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":406,"name":"data logger","slug":"data-logger","term_group":0,"term_taxonomy_id":406,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":405,"name":"data logging","slug":"data-logging","term_group":0,"term_taxonomy_id":405,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":403,"name":"firmata","slug":"firmata","term_group":0,"term_taxonomy_id":403,"taxonomy":"post_tag","description":"","parent":0,"count":7,"filter":"raw"},{"term_id":404,"name":"firmware","slug":"firmware","term_group":0,"term_taxonomy_id":404,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":164,"name":"java","slug":"java","term_group":0,"term_taxonomy_id":164,"taxonomy":"post_tag","description":"","parent":0,"count":10,"filter":"raw"},{"term_id":408,"name":"server","slug":"server","term_group":0,"term_taxonomy_id":408,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/users\/762"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/comments?post=2207"}],"version-history":[{"count":11,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2207\/revisions"}],"predecessor-version":[{"id":2237,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/2207\/revisions\/2237"}],"wp:attachment":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/media?parent=2207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/categories?post=2207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/tags?post=2207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}