{"action":"created","comment":{"url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/comments/180816557","pull_request_review_id":111301592,"id":180816557,"diff_hunk":"@@ -0,0 +1,159 @@\n+## Cellular\n+\n+Mbed OS cellular provides your IoT application with access to world-wide operator-maintained cellular networks, both IP and non-IP, as Figure 1 illustrates. Mbed OS cellular implementation is based on international 3GPP and OMA standards, and it has been verified to work with all cellular networks such as NB-IoT, CAT-M1, 4G LTE, 3G WCDMA and GPRS.\n+\n+<span class=\"images\">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/api-cellular-overview.png)<span>Figure 1. Mbed OS cellular overview</span></span>\n+\n+Please read about [Mbed OS connectivity technology](https://www.mbed.com/en/technologies/connectivity/) if you are not yet familiar with it.\n+\n+### Key features\n+\n+Mbed OS cellular is the preferred choice of building applications for [Mbed Cloud](https://cloud.mbed.com/docs/) and cellular IoT solutions. Key features of Mbed OS cellular include:\n+\n+- Compatibility with 3GPP TS 27.007 and 27.005.\n+- OMA Lightweight M2M Client enabler.\n+- Out-of-the-box cellular modem support.\n+\n+3GPP TS 27.007 and 27.005 are standards to provide consistent cellular network data connectivity and SMS over an AT command interface for cellular devices, regardless of the underlying cellular network.\n+\n+OMA Lightweight M2M is a protocol from the Open Mobile Alliance for IoT device management. The Mbed OS cellular API provides core functionality to implement the LWM2M Client. For more information, please see [OMA LWM2M](https://en.wikipedia.org/wiki/OMA_LWM2M) and [OMA LwM2M ConnMgmt](http://www.openmobilealliance.org/release/LWM2M_CONNMGMT/V1_0-20170314-A/OMA-TS-LWM2M_ConnMgmt-V1_0-20170314-A.pdf).\n+\n+Mbed OS already supports several Mbed Enabled boards with on-board cellular modules out of the box. Because Mbed OS is an open source platform, developers can enable support for new cellular boards with our adaptation framework. Please see our [cellular porting guide](/docs/development/reference/contributing-connectivity.html#cellularinterface) for more information.\n+\n+### Quick start\n+\n+There are two phases to Mbed OS connectivity:\n+\n+1. Connect to a network.\n+1. Open a socket to send or receive data.\n+\n+The easiest way to connect your application to the internet over a cellular network is to use the `CellularConnectionFSM` class. It encapsulates most of the complexity of connecting to the cellular network and also reports any changes in connection status to your application. When connected to a cellular network, you can use Mbed OS network sockets as usual, as Figure 2 illustrates.\n+\n+<span class=\"images\">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/api-cellular-quick-start.png)<span>Figure 2. Connect to cellular network and open a socket</span></span>\n+\n+If you want to see code, you can go to our [cellular example](https://github.com/ARMmbed/mbed-os-example-cellular) or \n+our [advanced cellular example](https://github.com/ARMmbed/mbed-os-example-cellular-advanced).\n+\n+### Cellular connection management\n+\n+Applications can use cellular APIs to fine-control the cellular connection. Cellular APIs are structured based on main functionalities:\n+\n+- `CellularNetwork` for cellular network features, such as preferred operator and APN.\n+- `CellularPower` for cellular module power control, such as enabling power save.\n+- `CellularInformation` to read the cellular module type and firmware version.\n+- `CellularSIM` to enter the PIN code and other SIM management functions.\n+- `CellularSMS` to read and write SMS messages.\n+\n+The CellularDevice class encloses cellular APIs. Therefore, to use any cellular API, you need to get CellularDevice first. You can then use CellularDevice to open and close cellular APIs, as Figure 3 illustrates.\n+\n+<span class=\"images\">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/api-cellular-device.png)<span>Figure 3. Use CellularDevice to open Cellular APIs</span></span>\n+\n+When an application has opened a cellular API, you can use it to request API methods. For example:\n+\n+    CellularNetwork *network  = cellularDevice->get_network();\n+    if (network) {\n+        printf(\"Local IP address is %s\", network->get_ip_address());\n+    }\n+\n+### UDP and TCP sockets\n+\n+If you want to use UDP or TCP sockets, you need an IP stack. Mbed OS cellular has an option to use either the LWIP stack, which is part of Mbed OS, or to use the IP stack on the cellular module. Figure 4 illustrates IP stack deployment.\n+\n+<span class=\"images\">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/api-cellular-ip-stack.png)<span>Figure 4. IP stack can be used in PPP or AT mode</span></span>\n+\n+#### PPP mode with the LWIP stack on Mbed OS\n+\n+In PPP mode, the LWIP stack is linked as a part of the Mbed OS application. Sockets are implemented on the LWIP stack, and the modem is used over a Point-to-Point Protocol (PPP) link as a plain data pipe.\n+\n+You can enable PPP mode in the application configuration file:\n+\n+    \"lwip.ppp-enabled\": true\n+\n+#### AT mode with the IP stack on the modem\n+\n+In AT mode, the modem's internal IP stack is used over an AT link. Sockets are part of the IP stack, so AT commands are used to control sockets. Socket AT commands are modem specific, and you need to implement them on the Mbed OS side within a `CellularStack` class. You can browse `CellularStack` under the cellular/targets folder to learn how your cellular module supports AT sockets.\n+\n+The AT mode is enabled when the PPP mode is not enabled:\n+\n+    \"lwip.ppp-enabled\": false\n+\n+#### Should you use PPP or AT mode?\n+\n+Consider the following points when selecting PPP or AT mode:\n+\n+- Your cellular module may support only AT or PPP mode.\n+- PPP mode supports both UDP and TCP sockets.\n+- PPP mode does not allow AT commands after connecting to data mode.\n+- PPP mode uses the LWIP stack, which uses memory from your Mbed OS application.\n+- AT mode typically supports only UDP sockets.\n+- AT mode is potentially better optimized for power consumption.\n+\n+### Non-IP optimizations\n+\n+The Mbed OS cellular API has also been planned to **support non-IP communication in the near future**. You need to make two changes when using non-IP in your application:\n+\n+1. Request a non-IP context from network.\n+1. Open a non-IP socket type.\n+\n+You need to request a non-IP stack type using CellularNetwork before issuing connect:\n+\n+    nsapi_error_t set_stack_type(nsapi_ip_stack_t stack_type)\n+\n+Non-IP communication uses DatagramSocket, which is similar to UDPSocket but does not have IP addressing and UDP port functionality:\n+\n+    class DatagramSocket\n+\n+An application can also request control-plane optimizations when connecting to a cellular network. The application needs to advertise its capability to support control-plane optimizations and its preference to use it. You can select the non-IP optimization options using CellularNetwork:\n+\n+    set_ciot_optimization_config(Supported_UE_Opt supported_opt,\n+                                 Preferred_UE_Opt preferred_opt)\n+\n+### Optimize for power consumption\n+\n+The `CellularPower` class has methods to optimize power saving. The `set_powerl_level()` offers flexibility to control the reception and transmission power levels. In addition, 3GPP has specified advanced power optimizations that are useful for celluar IoT devices: Power Save Mode (PSM) and extended Discontinuous Reception (eDRX).\n+\n+#### PSM - Power Save Mode\n+\n+    opt_power_save_mode(int periodic_time, int active_time)\n+\n+The new 4G modems implementing specifications release 13 and later include PSM. PSM allows the application to tell the modem and network that it does not expect any data in a given time interval, the `periodic_time`. The modem and network can optimize the sleep state and network resource reservations based on this information. During the PSM time, nothing can contact the device from the network side. The application can still send at any time. PSM time can be hours, days or weeks.\n+\n+The `active_time` tells how many seconds the device waits to receive messages after it has sent data, or when the periodic time has lapsed. If the device sends a report to the management system, the device waits in listen state for the configured amount of time. Listening keeps the radio on in the modem, so it consumes more power than idle state.\n+\n+This feature offers great power savings for periodically reporting devices. Between reports, the device is in PSM state with the modem in the deep sleep state. The latency of contacting the device is the PSM period.\n+\n+PSM configuration is negotiated with the network, and the actual PSM time that network has accepted may differ from that requested.\n+\n+#### eDRX - extended Discontinuous Reception\n+\n+    opt_receive_period(int mode, EDRXAccessTechnology act_type, uint8_t edrx_value)\n+\n+eDRX tells how long the device sleeps in continuous connection. The device needs to be able to receive data, but it can tell the network that it checks for incoming messages, for example only every 200 seconds. It can receive messages but only at the given times to allow battery saving sleep periods. These time values are greatly extended compared to normal 4G data transmission – hence the name.\n+\n+This feature serves devices that need smaller latencies. A connection is kept open all the time, but the modem achieves a sleep state between the reception times. The data connection, if using IPv4, may need periodic keep alive messages to keep the network address translation mapping valid.\n+\n+eDRX configuration is given to the modem. It is negotiated with the network, and the time accepted by the network may differ from the requested time. Availability of this optimization depends on the cellular network.\n+\n+#### Sleep more, save energy\n+\n+CellularConnectionFSM simplifies connecting to a cellular network. `CellularConnectionFSM` is a reliable way to connect, but you may want to optimize it further when implementing applications for constrained battery-operated devices. Figure 5 illustrates the `CellularConnectionFSM` operation.\n+\n+<span class=\"images\">![](https://s3-us-west-2.amazonaws.com/mbed-os-docs-images/api-cellular-connect.png)<span>Figure 5. Cellular connection process in general</span></span>\n+\n+### Considerations for UDP, TCP and non-IP use\n+\n+Which networking protocol to use depends on multiple factors. Server communication model, power consumption, reliability need and operator support are the biggest factors. \n+\n+TCP is a reliable transmission protocol. For long-lived sessions, periodic keep alive messaging is necessary, which places demands on the main power source. For a long-lived TCP connection, the server application can contact the device. Connections can still have long latencies because the device's use of eDRX power optimization affects when it listens for incoming packets. Mbed TLS supports TLS transport security over TCP. Operators may, however, prevent using TCP over NB-IoT due to device deployment and network planning considerations.\n+\n+UDP is unreliable, which places the retransmission mechanism burden on the application. UDP does not have a session; thus, the server application can contact the device only for a short while after it has received a UDP message from the device. \n+\n+Mbed TLS supports DTLS transport security over UDP.\n+\n+Non-IP is a new option for communication over NB-IoT. The device sends messages to an operator messaging service. The server application communicates with the messaging service using a web API. The messaging service allows the device and server application to communicate regardless of their activity windows. The cellular network security services provide security inside the cellular network, from the messaging center to the web application with HTTPS. Because network support for non-IP may vary, the application depends on use case. For wider operation, it needs to support both non-IP and IP for a transition period.\n+\n+For DTLS and TLS transport security, even if the device maintains its own IP address during power save periods, the address may be changed in the network due to Network Address Translation (NAT). NAT is a mechanism to share the few IPv4 addresses among more users. The NAT address change necessitates renegotiation of the (D)TLS security session. The TLS and DTLS protocols support session ID and session ticket mechanisms to optimize the renegotiation. Both device and (D)TLS server must support the used mechanism.","path":"docs/reference/technology/connectivity/cellular.md","position":155,"original_position":155,"commit_id":"bde2c635b589f35b15e0168cae8f9bba75547c08","original_commit_id":"bde2c635b589f35b15e0168cae8f9bba75547c08","user":{"login":"AnotherButler","id":23487484,"avatar_url":"https://avatars3.githubusercontent.com/u/23487484?v=4","gravatar_id":"","url":"https://api.github.com/users/AnotherButler","html_url":"https://github.com/AnotherButler","followers_url":"https://api.github.com/users/AnotherButler/followers","following_url":"https://api.github.com/users/AnotherButler/following{/other_user}","gists_url":"https://api.github.com/users/AnotherButler/gists{/gist_id}","starred_url":"https://api.github.com/users/AnotherButler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnotherButler/subscriptions","organizations_url":"https://api.github.com/users/AnotherButler/orgs","repos_url":"https://api.github.com/users/AnotherButler/repos","events_url":"https://api.github.com/users/AnotherButler/events{/privacy}","received_events_url":"https://api.github.com/users/AnotherButler/received_events","type":"User","site_admin":false},"body":"Query: Who or what may change the address in the network due to NAT? ","created_at":"2018-04-11T16:24:56Z","updated_at":"2018-04-11T16:25:41Z","html_url":"https://github.com/ARMmbed/Handbook/pull/489#discussion_r180816557","pull_request_url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/comments/180816557"},"html":{"href":"https://github.com/ARMmbed/Handbook/pull/489#discussion_r180816557"},"pull_request":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489"}}},"pull_request":{"url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489","id":180298570,"html_url":"https://github.com/ARMmbed/Handbook/pull/489","diff_url":"https://github.com/ARMmbed/Handbook/pull/489.diff","patch_url":"https://github.com/ARMmbed/Handbook/pull/489.patch","issue_url":"https://api.github.com/repos/ARMmbed/Handbook/issues/489","number":489,"state":"open","locked":false,"title":"Cellular technology overview and porting updated","user":{"login":"AriParkkila","id":26764770,"avatar_url":"https://avatars3.githubusercontent.com/u/26764770?v=4","gravatar_id":"","url":"https://api.github.com/users/AriParkkila","html_url":"https://github.com/AriParkkila","followers_url":"https://api.github.com/users/AriParkkila/followers","following_url":"https://api.github.com/users/AriParkkila/following{/other_user}","gists_url":"https://api.github.com/users/AriParkkila/gists{/gist_id}","starred_url":"https://api.github.com/users/AriParkkila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AriParkkila/subscriptions","organizations_url":"https://api.github.com/users/AriParkkila/orgs","repos_url":"https://api.github.com/users/AriParkkila/repos","events_url":"https://api.github.com/users/AriParkkila/events{/privacy}","received_events_url":"https://api.github.com/users/AriParkkila/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-09T12:40:33Z","updated_at":"2018-04-11T16:25:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c7be2ae43bff0ada7dd6f077f0e40fa23995c02b","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489/commits","review_comments_url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489/comments","review_comment_url":"https://api.github.com/repos/ARMmbed/Handbook/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ARMmbed/Handbook/issues/489/comments","statuses_url":"https://api.github.com/repos/ARMmbed/Handbook/statuses/bde2c635b589f35b15e0168cae8f9bba75547c08","head":{"label":"AriParkkila:new_engine","ref":"new_engine","sha":"bde2c635b589f35b15e0168cae8f9bba75547c08","user":{"login":"AriParkkila","id":26764770,"avatar_url":"https://avatars3.githubusercontent.com/u/26764770?v=4","gravatar_id":"","url":"https://api.github.com/users/AriParkkila","html_url":"https://github.com/AriParkkila","followers_url":"https://api.github.com/users/AriParkkila/followers","following_url":"https://api.github.com/users/AriParkkila/following{/other_user}","gists_url":"https://api.github.com/users/AriParkkila/gists{/gist_id}","starred_url":"https://api.github.com/users/AriParkkila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AriParkkila/subscriptions","organizations_url":"https://api.github.com/users/AriParkkila/orgs","repos_url":"https://api.github.com/users/AriParkkila/repos","events_url":"https://api.github.com/users/AriParkkila/events{/privacy}","received_events_url":"https://api.github.com/users/AriParkkila/received_events","type":"User","site_admin":false},"repo":{"id":124871372,"name":"Handbook","full_name":"AriParkkila/Handbook","owner":{"login":"AriParkkila","id":26764770,"avatar_url":"https://avatars3.githubusercontent.com/u/26764770?v=4","gravatar_id":"","url":"https://api.github.com/users/AriParkkila","html_url":"https://github.com/AriParkkila","followers_url":"https://api.github.com/users/AriParkkila/followers","following_url":"https://api.github.com/users/AriParkkila/following{/other_user}","gists_url":"https://api.github.com/users/AriParkkila/gists{/gist_id}","starred_url":"https://api.github.com/users/AriParkkila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AriParkkila/subscriptions","organizations_url":"https://api.github.com/users/AriParkkila/orgs","repos_url":"https://api.github.com/users/AriParkkila/repos","events_url":"https://api.github.com/users/AriParkkila/events{/privacy}","received_events_url":"https://api.github.com/users/AriParkkila/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AriParkkila/Handbook","description":"New version of the handbook for Mbed OS","fork":true,"url":"https://api.github.com/repos/AriParkkila/Handbook","forks_url":"https://api.github.com/repos/AriParkkila/Handbook/forks","keys_url":"https://api.github.com/repos/AriParkkila/Handbook/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AriParkkila/Handbook/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AriParkkila/Handbook/teams","hooks_url":"https://api.github.com/repos/AriParkkila/Handbook/hooks","issue_events_url":"https://api.github.com/repos/AriParkkila/Handbook/issues/events{/number}","events_url":"https://api.github.com/repos/AriParkkila/Handbook/events","assignees_url":"https://api.github.com/repos/AriParkkila/Handbook/assignees{/user}","branches_url":"https://api.github.com/repos/AriParkkila/Handbook/branches{/branch}","tags_url":"https://api.github.com/repos/AriParkkila/Handbook/tags","blobs_url":"https://api.github.com/repos/AriParkkila/Handbook/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AriParkkila/Handbook/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AriParkkila/Handbook/git/refs{/sha}","trees_url":"https://api.github.com/repos/AriParkkila/Handbook/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AriParkkila/Handbook/statuses/{sha}","languages_url":"https://api.github.com/repos/AriParkkila/Handbook/languages","stargazers_url":"https://api.github.com/repos/AriParkkila/Handbook/stargazers","contributors_url":"https://api.github.com/repos/AriParkkila/Handbook/contributors","subscribers_url":"https://api.github.com/repos/AriParkkila/Handbook/subscribers","subscription_url":"https://api.github.com/repos/AriParkkila/Handbook/subscription","commits_url":"https://api.github.com/repos/AriParkkila/Handbook/commits{/sha}","git_commits_url":"https://api.github.com/repos/AriParkkila/Handbook/git/commits{/sha}","comments_url":"https://api.github.com/repos/AriParkkila/Handbook/comments{/number}","issue_comment_url":"https://api.github.com/repos/AriParkkila/Handbook/issues/comments{/number}","contents_url":"https://api.github.com/repos/AriParkkila/Handbook/contents/{+path}","compare_url":"https://api.github.com/repos/AriParkkila/Handbook/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AriParkkila/Handbook/merges","archive_url":"https://api.github.com/repos/AriParkkila/Handbook/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AriParkkila/Handbook/downloads","issues_url":"https://api.github.com/repos/AriParkkila/Handbook/issues{/number}","pulls_url":"https://api.github.com/repos/AriParkkila/Handbook/pulls{/number}","milestones_url":"https://api.github.com/repos/AriParkkila/Handbook/milestones{/number}","notifications_url":"https://api.github.com/repos/AriParkkila/Handbook/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AriParkkila/Handbook/labels{/name}","releases_url":"https://api.github.com/repos/AriParkkila/Handbook/releases{/id}","deployments_url":"https://api.github.com/repos/AriParkkila/Handbook/deployments","created_at":"2018-03-12T10:20:51Z","updated_at":"2018-04-11T15:18:37Z","pushed_at":"2018-04-11T15:18:36Z","git_url":"git://github.com/AriParkkila/Handbook.git","ssh_url":"git@github.com:AriParkkila/Handbook.git","clone_url":"https://github.com/AriParkkila/Handbook.git","svn_url":"https://github.com/AriParkkila/Handbook","homepage":"","size":27033,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"new_engine"}},"base":{"label":"ARMmbed:new_engine","ref":"new_engine","sha":"84e830cca9b98f44aa3ef45d25cfd4e92e209016","user":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars3.githubusercontent.com/u/8916057?v=4","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"repo":{"id":31957877,"name":"Handbook","full_name":"ARMmbed/Handbook","owner":{"login":"ARMmbed","id":8916057,"avatar_url":"https://avatars3.githubusercontent.com/u/8916057?v=4","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ARMmbed/Handbook","description":"New version of the handbook for Mbed OS","fork":false,"url":"https://api.github.com/repos/ARMmbed/Handbook","forks_url":"https://api.github.com/repos/ARMmbed/Handbook/forks","keys_url":"https://api.github.com/repos/ARMmbed/Handbook/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ARMmbed/Handbook/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ARMmbed/Handbook/teams","hooks_url":"https://api.github.com/repos/ARMmbed/Handbook/hooks","issue_events_url":"https://api.github.com/repos/ARMmbed/Handbook/issues/events{/number}","events_url":"https://api.github.com/repos/ARMmbed/Handbook/events","assignees_url":"https://api.github.com/repos/ARMmbed/Handbook/assignees{/user}","branches_url":"https://api.github.com/repos/ARMmbed/Handbook/branches{/branch}","tags_url":"https://api.github.com/repos/ARMmbed/Handbook/tags","blobs_url":"https://api.github.com/repos/ARMmbed/Handbook/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ARMmbed/Handbook/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ARMmbed/Handbook/git/refs{/sha}","trees_url":"https://api.github.com/repos/ARMmbed/Handbook/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ARMmbed/Handbook/statuses/{sha}","languages_url":"https://api.github.com/repos/ARMmbed/Handbook/languages","stargazers_url":"https://api.github.com/repos/ARMmbed/Handbook/stargazers","contributors_url":"https://api.github.com/repos/ARMmbed/Handbook/contributors","subscribers_url":"https://api.github.com/repos/ARMmbed/Handbook/subscribers","subscription_url":"https://api.github.com/repos/ARMmbed/Handbook/subscription","commits_url":"https://api.github.com/repos/ARMmbed/Handbook/commits{/sha}","git_commits_url":"https://api.github.com/repos/ARMmbed/Handbook/git/commits{/sha}","comments_url":"https://api.github.com/repos/ARMmbed/Handbook/comments{/number}","issue_comment_url":"https://api.github.com/repos/ARMmbed/Handbook/issues/comments{/number}","contents_url":"https://api.github.com/repos/ARMmbed/Handbook/contents/{+path}","compare_url":"https://api.github.com/repos/ARMmbed/Handbook/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ARMmbed/Handbook/merges","archive_url":"https://api.github.com/repos/ARMmbed/Handbook/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ARMmbed/Handbook/downloads","issues_url":"https://api.github.com/repos/ARMmbed/Handbook/issues{/number}","pulls_url":"https://api.github.com/repos/ARMmbed/Handbook/pulls{/number}","milestones_url":"https://api.github.com/repos/ARMmbed/Handbook/milestones{/number}","notifications_url":"https://api.github.com/repos/ARMmbed/Handbook/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ARMmbed/Handbook/labels{/name}","releases_url":"https://api.github.com/repos/ARMmbed/Handbook/releases{/id}","deployments_url":"https://api.github.com/repos/ARMmbed/Handbook/deployments","created_at":"2015-03-10T13:06:41Z","updated_at":"2018-04-10T22:06:14Z","pushed_at":"2018-04-11T16:20:29Z","git_url":"git://github.com/ARMmbed/Handbook.git","ssh_url":"git@github.com:ARMmbed/Handbook.git","clone_url":"https://github.com/ARMmbed/Handbook.git","svn_url":"https://github.com/ARMmbed/Handbook","homepage":"","size":27396,"stargazers_count":26,"watchers_count":26,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":81,"mirror_url":null,"archived":false,"open_issues_count":31,"license":null,"forks":81,"open_issues":31,"watchers":26,"default_branch":"new_engine"}},"_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489"},"html":{"href":"https://github.com/ARMmbed/Handbook/pull/489"},"issue":{"href":"https://api.github.com/repos/ARMmbed/Handbook/issues/489"},"comments":{"href":"https://api.github.com/repos/ARMmbed/Handbook/issues/489/comments"},"review_comments":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489/comments"},"review_comment":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ARMmbed/Handbook/pulls/489/commits"},"statuses":{"href":"https://api.github.com/repos/ARMmbed/Handbook/statuses/bde2c635b589f35b15e0168cae8f9bba75547c08"}},"author_association":"NONE"}}
{"actor":{"display_login":"AnotherButler"}}