{"id":1330,"date":"2019-08-22T19:01:48","date_gmt":"2019-08-22T09:01:48","guid":{"rendered":"https:\/\/nickvsnetworking.com\/?p=1330"},"modified":"2021-12-21T19:20:08","modified_gmt":"2021-12-21T08:20:08","slug":"rtpengine-python-api-calls-via-ng-control-protocol","status":"publish","type":"post","link":"https:\/\/nickvsnetworking.com\/rtpengine-python-api-calls-via-ng-control-protocol\/","title":{"rendered":"RTPengine Python API Calls via ng Control Protocol"},"content":{"rendered":"\n<p>RTPengine has an API \/ control protocol, which is what Kamailio \/ OpenSER uses to interact with RTPengine, called the <em>ng<\/em>&nbsp;Control Protocol.<\/p>\n\n\n\n<p>Connection is based on Bencode encoded data and communicates via a UDP socket.<\/p>\n\n\n\n<p>I wrote a simple Python script to pull active calls from RTPengine, code below:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#Quick Python library for interfacing with Sipwise's fantastic rtpengine - https:\/\/github.com\/sipwise\/rtpengine\n#Bencode library from https:\/\/pypi.org\/project\/bencode.py\/ (Had to download files from webpage (PIP was out of date))\n\nimport bencode\nimport socket\nimport sys\nimport random\nimport string\n\nsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\nserver_address = ('188.0.169.13', 2224)     #Your server address\n\ncookie = \"0_2393_6\"\ndata = bencode.encode({'command': 'list'})\n\nmessage = str(cookie) + \" \" + str(data)\nprint(message)\n\n\nsent = sock.sendto(message, server_address)\n\nprint('waiting to receive')\ndata, server = sock.recvfrom(4096)\nprint('received \"%s\"' % data)\ndata = data.split(\" \", 1)       #Only split on first space\nprint(\"Cookie is: \" + str(data[0]))\nprint(\"Data is: \" + str(bencode.decode(data[1])))\nprint(\"There are \" + str(len(bencode.decode(data[1])['calls'])) + \" calls up on RTPengine at \" + str(server_address[0]))\nfor calls in bencode.decode(data[1])['calls']:\n    print(calls)\n    cookie = \"1_2393_6\"\n    data = bencode.encode({'command': 'query', 'call-id': str(calls)})\n    message = str(cookie).encode('utf-8') + \" \".encode('utf-8') + str(data).encode('utf-8')\n    sent = sock.sendto(message, server_address)\n    print('\\n\\nwaiting to receive')\n    data, server = sock.recvfrom(8192)\n\n    data = data.split(\" \", 1)       #Only split on first space\n    bencoded_data = bencode.decode(data[1])\n\n    for keys in bencoded_data:\n        print(keys)\n        print(\"\\t\" + str(bencoded_data[keys]))\n\nsock.close()\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Connecting to RTPengine via Python<\/p>\n","protected":false},"author":1,"featured_media":1335,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,2],"tags":[13,14,63,61,8,7],"class_list":["post-1330","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-voip","tag-python","tag-rtp","tag-rtp-proxy","tag-rtpengine","tag-sip","tag-voip"],"_links":{"self":[{"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/posts\/1330","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/comments?post=1330"}],"version-history":[{"count":4,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/posts\/1330\/revisions"}],"predecessor-version":[{"id":4726,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/posts\/1330\/revisions\/4726"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/media\/1335"}],"wp:attachment":[{"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/media?parent=1330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/categories?post=1330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nickvsnetworking.com\/wp-json\/wp\/v2\/tags?post=1330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}