RESTfulµÄCoAPÐÒé
CoAP: ǶÈëʽϵͳµÄREST
Òý×Ôά»ù°Ù¿ÆÉϵĽéÉÜ£¬ÓõÄÊǹȸè·Òë¡£¡£¡£
ÊÜÔ¼ÊøµÄÓ¦ÓÃÐÒ飨COAP£©ÊÇÒ»ÖÖÈí¼þÐÒéÖ¼ÔÚÒԷdz£¼òµ¥µÄµç×ÓÉ豸£¬Ê¹ËûÃÇÄܹ»ÔÚ»¥ÁªÍøÉϽøÐн»»¥Ê½Í¨ÐÅÖÐʹÓá£ËüÌØ±ðÕë¶ÔСÐ͵͹¦ÂÊ´«¸ÐÆ÷£¬¿ª¹Ø£¬·§ÃźÍÐèÒª±»¿ØÖÆ»ò¼à¶½Ô¶³Ì£¬Í¨¹ý±ê×¼µÄInternetÍøÂçÀàËÆµÄ×é¼þ¡£
COAPÊÇÒ»¸öÓ¦ÓòãÐÒ飬¸ÃÐÒéÊÇÓÃÓÚÔÚ×ÊÔ´ÊÜÏÞµÄÍøÂçÁ¬½ÓÉ豸£¬ÀýÈçÎÞÏß´«¸ÐÆ÷ÍøÂç½ÚµãʹÓᣠCOAP±»Éè¼ÆÎªÈÝÒ×µØ×ª»»ÎªHTTPÓëWeb¼ò»¯¼¯³É£¬Í¬Ê±Ò²ÄÜÂú×ãÌØÊâµÄÒªÇó£¬ÀýÈç¶à²¥Ö§³Ö£¬·Ç³£µÍµÄ¿ªÏú£¬ºÍ¼òµ¥ÐÔ¡£¶à²¥£¬µÍ¿ªÏú£¬ÒÔ¼°¼òµ¥ÐÔÊÇÒòÌØÍø¼«ÆäÖØÒªÎïÁªÍø£¨IOT£©ºÍ»úÆ÷¶Ô»úÆ÷£¨M2M£©É豸£¬ÕâÍùÍùÊÇ»ýÖØÄÑ·µ£¬ÓÐÌ«¶àµÄÄÚ´æºÍµçÔ´£¬±È´«Í³µÄ»¥ÁªÍøÉ豸ÓС£Òò´Ë£¬Ð§ÂÊÊǷdz£ÖØÒªµÄ¡£
COAP¿ÉÒÔÔÚÖ§³ÖUDP»òUDPµÄÄ£Äâ´ó¶àÊýÉ豸ÉÏÔËÐС£
¼òµ¥µØÀ´Ëµ£¬CoAPÊǼò»¯ÁËHTTPÐÒéµÄRESTful API£¬Òò¶øÒ²Ö»ÌṩÁËRESTµÄËĸö·½·¨£¬¼´PUT,GET,POSTºÍDELETE¡£¶ÔÓÚ΢СµÄ×ÊÔ´ÊÜÏÞ£¬ÔÚ×ÊÔ´ÊÜÏÞµÄͨÐŵÄIPµÄÍøÂ磬HTTP²»ÊÇÒ»ÖÖ¿ÉÐеÄÑ¡Ôñ¡£ËüÕ¼ÓÃÁËÌ«¶àµÄ×ÊÔ´ºÍÌ«¶àµÄ´ø¿í¡£¶ø¶ÔÓÚÎïÁªÍøÕâÖÖǶÈëʽÉ豸À´Ëµ£¬¹ØÓÚ×ÊÔ´Óë´ø¿í£¬ÊÇÎÒÃÇÐèÒªÓÅÏÈ¿¼ÂǵÄÄÚÈÝ¡£
1.CoAP²ÉÓÃÁ˶þ½øÖƱ¨Í·£¬¶ø²»ÊÇÎı¾±¨Í·(text header)
2.CoAP½µµÍÁËÍ·µÄ¿ÉÓÃÑ¡ÏîµÄÊýÁ¿¡£
3.CoAP¼õÉÙÁËһЩHTTPµÄ·½·¨
4.CoAP¿ÉÒÔÖ§³Ö¼ì²â×°ÖÃ
CoAP ÃüÁîÐй¤¾ß
ΪÁ˲âÊÔ²âÊÔÎÒÃǵĴúÂëÊÇ·ñÊÇÕýÈ·¹¤×÷£¬ÎÒÃÇÐèÒªÒ»¸öCoAPµÄÃüÁîÐй¤¾ß¡£Ä¿Ç°ÓÐÁ½¸ö²»´íµÄ¹¤¾ß¿ÉÒÔʹÓá£
CoAP-cli£¬Ò»¸ö»ùÓÚNodeJSµÄCoAPÃüÁîÐй¤¾ß£¬ÆäºËÐÄÊÇ»ùÓÚNode-CoAP¿â¡£
libcooap£¬Ò»¸öÓÃCдµÄCoAPÃüÁîÐй¤¾ß¡£
FireFox Copper£¬ Ò»¸öFirefoxµÄ²å¼þ¡£
Node CoAP CLI
°²×°ÃüÁîÈçÏÂ
CoAPÃüÁîÐÐ
ÔÚcoap-cliÖУ¬Ò»¹²ÓÐËĸö·½·¨¡£·Ö±ð±íʾRESTµÄËÄÖÖ²»Í¬µÄ·½Ê½:
Commands:
get performs a GET request
put performs a PUT request
post performs a POST request
delete performs a DELETE request |
ÔÚÕâÀÎÒÃÇÓÃcoap://vs0.inf.ethz.ch/À´×÷Ò»¸ö¼òµ¥µÄ²âÊÔ
coap get coap://vs0.inf.ethz.ch/ (2.05) ************************************************************ I-D |
²âÊÔÒ»ÏÂÏÖÔÚµÄ×îСµÄÎïÁªÍøÏµÍ³CoAP°æ
coap get coap://iot-coap.phodal.com/id/1 (2.05) [{"id":1,"value":"is id 1","sensors1":19,"sensors2":20}] |
libcoap
1.mac os libcoap°²×°
Mac OSÏ¿ÉÒÔÖ±½ÓÓÃ
2.Ubuntu libcoap°²×°
Ubuntu GNU/LinuxÏÂ
3.Windows libcoap°²×°
Windows ÏÂ
°²×°Íêlibcoap£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÓÃ×Ô´øµÄÁ½¸öÃüÁî
1.ÓÃcoap-serverÆôÒ»¸öCoAP·þÎñ
2.¿Í»§¶Ë»ñÈ¡Êý¾Ý
coap-client -m get coap://localhost |
·µ»Ø½á¹û
v:1 t:0 tkl:0 c:1 id:37109 This is a test server made with libcoap (see http://libcoap.sf.net) Copyright (C) 2010--2013 Olaf Bergmann <bergmann@tzi.org> |
Firefox Copper
ΪÁËÄÜ·ÃÎÊcoap://localhost/£¬ÓÚÊÇÎÒÃDZãÐèÒª°²×°Ò»¸öFirefox²¢°²×°Ò»¸öÃûΪCopperµÄ²å¼þ¡£
ÏÂÔØµØÖ·: https://addons.mozilla.org/en-US/firefox/addon/copper-270430/
×÷Ϊ²âÊÔÎÒÃÇͬÑù¿ÉÒÔ·ÃÎÊ coap://vs0.inf.ethz.ch:5683/
CoAP Hello,World
½Ó×ÅÎÒÃDZ㿪ʼÊÔÊÔ×öÒ»¸ö¼òµ¥µÄCoAPÐÒéµÄÓ¦ÓÃ:
ÕâÀïÓõ½µÄÊÇÒ»¸öNodejsµÄÀ©Õ¹Node-CoAP
node-coap is a client and server library for CoAP modelled after the http module. |
Node-CoAPÊÇÒ»¸ö¿Í»§¶ËºÍ·þÎñ¶ËµÄ¿âÓÃÓÚCoAPµÄÄ£¿é½¨Ä£¡£´´½¨Ò»¸öpackage.jsonÎļþ£¬Ìí¼ÓÕâ¸ö¿â
{ "dependencies":{ "coap": "0.7.2" } } |
½Ó×ÅÖ´ÐÐ
¾Í¿ÉÒÔ°²×°ºÃÕâ¸ö¿â¡£Èç¹ûÓöµ½È¨ÏÞÎÊÌ⣬ÇëÓÃ
½Ó×Å£¬´´½¨ÕâÑùÒ»¸öapp.js
const coap = require('coap')
, server = coap.createServer()
server.on('request', function(req, res) {
res.end('Hello ' + req.url.split('/')[1] + '\n')
})
server.listen(function() {
console.log('server started')
}) |
Ö´ÐÐ
±ã¿ÉÒÔÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊÁË£¬ÒòΪÏÖÔÚʲôҲûÓУ¬ËùÒÔʲôҲ²»»á·µ»Ø¡£
½Ó×ÅÏÂÀ´ÔÙ´´½¨Ò»¸öclient¶ËµÄjs£¬²¢ÔËÐÐÖ®
const coap = require('coap')
, req = coap.request('coap://localhost/World')
req.on('response', function(res) {
res.pipe(process.stdout)
})
req.end() |
¾Í¿ÉÒÔÔÚconsoleÉÏÊä³ö
Ò²¾Í´ïµ½ÁËÎÒÃǵÄÄ¿µÄ£¬ÓÃCoAPÐÒé´´½¨Ò»¸ö·þÎñ£¬½Ó×ÅÎÒÃÇÓ¦¸ÃÓÃËü´´½¨¸ü¶àµÄ¶«Î÷£¬Èç²úÉúJSONÊý¾Ý£¬ÒÔ¼°RESTful¡£ºÍHTTP°æµÄ×îСÎïÁªÍøÏµÍ³Ò»Ñù£¬CoAP°æµÄ×îСÎïÁªÍøÏµÍ³Ò²ÊÇÒª·µ»ØJSONµÄ¡£
CoAP Êý¾Ý¿â²éѯ
Node Module
Õâ˵ÀïNodeJS ModuleµÄÒâÒåÊÇÒòΪÎÒÃÇÐèÒªÔÚ±ðµÄµØ·½ÒýÓõ½db_helperÕâ¸ö¿â£¬Ò²¾ÍÊÇÏÂһС½ÚÒªµÄ½²µÄÄÚÈÝ¡£
ÕâÑùÎÒÃǾͿÉÒÔÔÚserver.jsÀàËÆÓÚÕâÑùÈ¥ÒýÓÃÕâ¸öjs¿â¡£
var DBHelper = require('./db_helper.js'); DBHelper.initDB(); |
¶øÕâÑùµ÷ÓõÄǰÌáÊÇÎÒÃÇÐèҪȥÉùÃ÷ÕâÑùµÄmodule£¬ÎªÁË·½±ãµØµ¼³öº¯Êý¹¦Äܵ÷Óá£
function DBHelper(){ } DBHelper.initDB = function(){}; module.exports = DBHelper; |
Node-Sqlite3
Õâ´ÎÎÒÃÇÓõÄÊÇSQLite3(Äã¿ÉÒÔÓÃMySQL£¬³öÓÚ°²È«¿¼ÂÇÓÃSQLite3£¬SQLite3²úÉúµÄÊÇÒ»¸öÎļþ)¡£Ò»¸ö¼òµ¥µÄinitDBº¯Êý
var db = new sqlite3.Database(config["db_name"]);
var create_table = 'create table if not exists basic (' + config["db_table"] + ');';
db.serialize(function() {
db.run(create_table);
_.each(config["init_table"], function(insert_data) {
db.run(insert_data);
});
});
db.close(); |
Ê×ÏÈ´ÓÅäÖÃÖжÁÈ¡db_name£¬½Ó×Å´´½¨table£¬È»ºóµ÷ÓÃunderscoreµÄeach·½·¨£¬´´½¨¼¸¸öÊý¾Ý¡£ÅäÖÃÈçÏÂËùʾ
config = { "db_name": "iot.db", "db_table": "id integer primary key, value text, sensors1 float, sensors2 float", "init_table":[ "insert or replace into basic (id,value,sensors1,sensors2) VALUES (1, 'is id 1', 19, 20);", "insert or replace into basic (id,value,sensors1,sensors2) VALUES (2, 'is id 2', 20, 21);" ], "query_table":"select * from basic;" }; |
¶øÖ®Ç°ËùÌáµ½µÄurl²éѯËù×öµÄÊÂÇé±ãÊÇ
DBHelper.urlQueryData = function (url, callback) { var db = new sqlite3.Database("iot.db"); var result = []; console.log("SELECT * FROM basic where " + url.split('/')[1] + "=" + url.split('/')[2]); db.all("SELECT * FROM basic where " + url.split('/')[1] + "=" + url.split('/')[2], function(err, rows) { db.close(); callback(JSON.stringify(rows)); }); }; |
½«URL´«½øÀ´£¬±ã½âÎöÕâ¸ö²ÎÊý£¬½Ó×ÅÔٷŵ½Êý¾Ý¿âÖвéѯ£¬Ôٻص÷»Ø½á¹û¡£ÕâÑùÎÒÃǾͿÉÒÔ¹¹³É֮ǰËù˵µÄ²éѯ¹¦ÄÜ£¬¶øÎÒÃÇËùνµÄpost¹¦ÄÜËÆºõÒ²¿ÉÒÔÓÃͬÑùµÄ·½·¨¼Ó½øÈ¥¡£
²éѯÊý¾Ý
¼òµ¥µØ¼Ç¼һÏÂÔÚIoT-CoAPÖÐÒ»´Î»ñÈ¡Êý¾ÝµØ¹ý³Ì¡£
ÏÈ¿´¿´ÔÚʾÀýÖеÄGet.jsµÄ´úÂ룬Õâ¹ØºõÔÚºóÃæserver¶ËµÄ´úÂë¡£
const coap = require('coap')
,requestURI = 'coap://localhost/'
,url = require('url').parse(requestURI + 'id/1/')
,req = coap.request(url)
,bl = require('bl');
req.setHeader("Accept", "application/json");
req.on('response', function(res) {
res.pipe(bl(function(err, data) {
var json = JSON.parse(data);
console.log(json);
}));
});
req.end(); |
const¶¨ÒåÊý¾ÝµÄ·½·¨£¬ºÍÎÒÃÇÔÚÆäËûÓïÑÔÖÐÓеãÏñ¡£Ö»ÊÇÕâµÄconstÖ÷ÒªÊÇΪÁ˳ÌÐòµÄ½¡×³ÐÍ,¼õÉÙ³ÌÐò³ö´í£¬µ±È»Õâ²»ÊÇjavascriptµÄÓ÷¨¡£
ÎÒÃǹ¹½¨ÁËÒ»¸öÇëÇóµÄURL
ÎÒÃǶÔÎÒÃǵÄÇëÇóÌí¼ÓÁËÒ»¸öHeader£¬ÄÚÈÝÊÇAccept£¬ÖµÊÇ'application/json'Ò²¾ÍÊÇJSON¸ñʽ¡£½Ó×Å£¬±ãÊǵȴýÇëÇó»ØÀ´£¬ÔÙ´¦Àí·µ»ØµÄÄÚÈÝ¡£
ÅжÏÇëÇóµÄ·½·¨
ÔÚÕâÀïÏȰÑһЩÎ޹صĴúÂëɾ³ýµô£¬²¢±£Ö¤ÆäÄܹ¤×÷£¬so£¬ÏÂÃæ¾ÍÊǼòÒªµÄÂß¼´úÂë¡£
var coap = require('coap');
var server = coap.createServer({});
var request_handler = require('./request_handler.js');
server.on('request', function(req, res) {
switch(req.method){
case "GET": request_handler.getHandler(req, res);
break;
}
});
server.listen(function() {
console.log('server started');
}); |
´´½¨Ò»¸öCoAP·þÎñ£¬ÅжÏreq.method£¬Ò²¾ÍÊÇÇëÇóµÄ·½·¨£¬Èç¹ûÊÇGETµÄ»°£¬¾Íµ÷ÓÃrequest_handler.getHandler(req,
res)¡£¶øÔÚgetHandlerÀÅжÏÁËÏÂÇëÇóµÄAccept
request_helper.getHandler = function(req, res) { switch (req.headers['Accept']) { case "application/json": qh.returnJSON(req, res); break; case "application/xml": qh.returnXML(req, res); break; } }; |
Èç¹ûÊÇjson¸Õµ÷ÓÃreturnJSON,
DatabaseÓë»Øµ÷
¶øÕâÀïΪÁË´¦Àí»Øµ÷º¯Êý¸Õ·ÖΪÁËÁ½²¿·Ö
query_helper.returnJSON = function(req, res) { DBHelper.urlQueryData(req.url, function (result) { QueryData.returnJSON(result, res); }); }; |
¶øÕâÀïÖ»Êǵ÷ÓÃÁË
DBHelper.urlQueryData = function (url, callback) { var db = new sqlite3.Database(config["db_name"]); console.log("SELECT * FROM basic where " + url.split('/')[1] + "=" + url.split('/')[2]); db.all("SELECT * FROM basic where " + url.split('/')[1] + "=" + url.split('/')[2], function(err, rows) { db.close(); callback(JSON.stringify(rows)); }); }; |
ÕâÀïµ÷ÓÃÁËnode sqlite3È¥²éѯ¶ÔÓ¦idµÄÊý¾Ý£¬Óûص÷´¦ÀíÁËÊý¾ÝÎÞ·¨µ½ÍⲿµÄÎÊÌ⣬¶øÉÏÃæµÄreturnJSONÔòÖ»ÊÇ·µ»Ø×îºóµÄ½á¹û£¬codeÒÔ¼°ÆäËûµÄÄÚÈÝ¡£
QueryData.returnJSON = function(result, res) { if (result.length == 2) { res.code = '4.04'; res.end(JSON.stringify({ error: "Not Found" })); } else { res.code = '2.05'; res.end(result); } }; |
µ±resulstµÄ½á¹ûΪ¿Õʱ£¬·µ»ØÒ»¸ö404£¬ÒòΪûÓÐÊý¾Ý¡£ÕâÑùÎÒÃǾ͹¹³ÉÁËÕû¸öµÄÁ´£¬ÔÙÒ»²½²½·µ»Ø½á¹û¡£
ÔÚIoT-CoAPÖÐÎÒÃÇʹÓõ½ÁËÒ»¸öBlock2µÄ¶«Î÷£¬ÓÚÊDZãÕûÀíÏà¹ØµÄһЩ×ÊÁÏ£¬×÷Ò»¸ö¼òµ¥µÄ½éÉÜ£¬ÒÔ¼°ÔÚ´úÂëÖеÄʹÓá£
CoAP Block
CoAPÊÇÒ»¸öRESTful´«ÊäÐÒéÓÃÓÚÊÜÏÞÉ豸µÄ½ÚµãºÍÍøÂç¡£»ù±¾µÄCoAPÏûÏ¢ÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¶ÔÓÚСÐÍÔØºÉÈç
1.ζȴ«¸ÐÆ÷
2.µÆ¹â¿ª¹Ø
3.Â¥Óî×Ô¶¯»¯É豸
È»¶ø£¬ÓÐʱÎÒÃǵÄÓ¦ÓÃÐèÒª´«Êä¸ü´óµÄÓÐÐ§ÔØºÉ£¬È硪¡ª¸üй̼þ¡£ÓëHTTP£¬TCP×ö·±Öع¤×÷½«´óÐÍÓÐÐ§ÔØºÉ·Ö³É¶à¸öÊý¾Ý°ü£¬²¢È·±£ËûÃÇËùÓе½´ï²¢ÒÔÕýÈ·µÄ˳Ðò±»´¦Àí¡£
CoAPÊÇͬUDPÓëDLTSÒ»ÑùÊÇ»ùÓÚÊý¾Ý±¨´«ÊäµÄ£¬ÕâÏÞÖÆÁË×ÊÔ´±íʾ(resource representation)µÄ×î´ó´óС£¬Ê¹µÃ´«Êä²»ÐèҪ̫¶àµÄ·Ö¸î¡£ËäÈ»UDPÖ§³Öͨ¹ýIP·ÖƬ´«Êä¸ü´óµÄÓÐÐ§ÔØºÉ£¬ÇÒ½öÏÞÓÚ64KiB£¬¸üÖØÒªµÄÊÇ£¬²¢Ã»ÓÐÕæÕýºÜºÃµØÔ¼ÊøÓ¦ÓúÍÍøÂç¡£
¶ø²»ÊÇÒÀÀµÓÚIP·ÖƬ£¬ÕâÖֹ淶»ù±¾COAPÁ˶ԡ°¿é¡±Ñ¡ÏÓÃÓÚ´«ÊäÐÅÏ¢´Ó¶à¸ö×ÊÔ´Çø¿éµÄÇëÇó - ÏìÓ¦¶Ô¡£ÔÚÐí¶àÖØÒªµÄÇé¿öÏ£¬×èֹʹ·þÎñÆ÷Äܹ»ÕæÕýÎÞ״̬£º·þÎñÆ÷¿ÉÒÔ´¦Àíÿ¿é·Ö¿ª´«Ê䣬¶øÎÞÐ轨Á¢Á¬½ÓÒÔǰµÄÊý¾Ý¿é´«ÊäµÄÆäËû·þÎñÆ÷¶ËÄÚ´æ¡£
×ÛÉÏËùÊö£¬¿é(Block)Ñ¡ÏîÌṩÁË´«ËÍÒ»¸ö×îСµÄÔÚ·Ö¿éµÄ·½Ê½¸ü´óµÄ³ÂÊö¡£
CoAP POST
¿´¿´ÔÚIoT CoAPÖеÄpostʾÀý¡£
const coap = require('coap')
,request = coap.request
,bl = require('bl')
,req = request({hostname: 'localhost',port:5683,pathname: '',method: 'POST'});
req.setOption('Block2', [new Buffer('1'),new Buffer("'must'"), new Buffer('23'), new Buffer('12')]);
req.setHeader("Accept", "application/json");
req.on('response', function(res) {
res.pipe(bl(function(err, data) {
console.log(data);
process.exit(0);
}));
});
req.end(); |
Block2ÖÐÒ»¹²ÓÐËĸöÊý¾Ý£¬ÏàÓ¦µÄÊý¾Ý½á¹ûÓ¦¸ÃÊÇ
{ name: 'Block2', value: <Buffer 31> } { name: 'Block2', value: <Buffer 27 6d 75 73 74 27> } { name: 'Block2', value: <Buffer 32 33> } { name: 'Block2', value: <Buffer 31 32> } |
ÕâÊÇûÓнâÎöµÄBlock2£¬¼òµ¥µØ¿ÉÒÔÓÃ
½«½á¹ûת»»Îª
Block2,1 Block2,'must' Block2,23 Block2,12 |
½Ó×Ű´","·Ö¿ª£¬
_.values(e).toString().split(',')[1] |
¾ÍÓÐ
[ '1', '\'must\'', '23', '12' ] |
±ã¿ÉÒÔºÜÓä¿ìµØ½«Æäpostµ½Êý¾Ý¿âÖÐÁË£¬
ÔÚ×öIoT-CoAPµÄ¹ý³ÌÖÐÖ»Ö§³ÖJSON£¬²éÔÄCoAPµÄ²Ý¸åʱ·¢ÏÖÖ§³ÖÁËÖî¶àµÄContent Types¡£
CoAP Content Types
ÒÔÏÂÎÄ×ÖÀ´×Թȸè·Òë:
»¥ÁªÍøÃ½ÌåÀàÐÍÊÇͨ¹ýHTTP×Ö·û´®±êʶ£¬Èç¡°application/xml¡±¡£¸Ã×Ö·û´®ÊÇÓÉÒ»¸ö¶¥²ãµÄÀàÐÍ¡°applicaion¡±ºÍ×ÓÀàÐ͵ġ°XML¡±¡£ÎªÁ˾¡Á¿¼õÉÙʹÓÃÕâЩÀàÐ͵ÄýÌåÀàÐÍÀ´±íʾµÄ¿ªÏúÏûÏ¢ÓÐÐ§ÔØºÉ£¬COAP¶¨ÒåÒ»¸ö±êʶ·û±àÂë·½°¸»¥ÁªÍøÃ½ÌåÀàÐ͵Ä×Ó¼¯¡£Ô¤¼ÆÕâ×À½«¿ÉÀ©Õ¹±êʶ·ûµÄÖµµÄIANAά»¤¡£ÄÚÈÝÀàÐÍÑ¡Ïî±»¸ñʽ»¯ÎªÒ»¸ö8λÎÞ·ûºÅÕûÊý¡£³õʼӳÉäµ½Ò»¸öºÏÊʵĻ¥ÁªÍøÃ½ÌåÀàÐͱêʶ·û±íËùʾ¡£¸´ºÏÐ͸߲ã´ÎÀàÐÍ£¨multipartºÍ²»Ö§³ÖÏûÏ¢£©¡£±êʶ·ûÖµÊÇ´Ó201-255±£ÁôµÄÌØ¶¨ÓÚ¹©Ó¦É̵ģ¬Ó¦ÓóÌÐòÌØ¶¨µÄ»òʵÑéʹÓúͲ»ÓÉIANA¡£
ÏÂÃæÊÇHTTPµÄ±êʶ·û¼°ÀàÐÍ

¶øÔÚCoAPÖÐÖ»Óмòµ¥µØ¼¸¸ö

¼òµ¥µØËµ¾ÍÊÇ£º
ÖîÈçapplication/jsonµÄContent TypesÔÚCoAPÖÐÓ¦¸ÃÊÇ50¡£ÈçÉϱíËùʾµÄ½á¹ûÊÇÆä¶ÔÓ¦µÄ½á¹û£¬ÕâÑùµÄ»°¿ÉÒÔ¼õÉÙ´«µÝµÄÐÅÏ¢Á¿¡£
CoAP JSON
ÓÚÊÇÔÚÒ»¿ªÊ¼µÄʱºòÊ×ÏÈÖ§³ÖµÄ±ãÊÇ"application/json"ÕâÑùµÄÀàÐÍ¡£
Ê×ÏÈÅжÏÇëÇóµÄheader
request_helper.getHandler = function(req, res) { switch (req.headers['Accept']) { case "application/json": qh.returnJSON(req, res); break; case "application/xml": qh.returnXML(req, res); break; } }; |
ÔÙתÖÁÏàÓ¦µÄº¯Êý´¦Àí£¬¶øÅжϵÄÒÀ¾ÝÔòÊÇAcceptÊDz»ÊÇ"application/json"¡£
registerFormat('text/plain', 0) registerFormat('application/link-format', 40) registerFormat('application/xml', 41) registerFormat('application/octet-stream', 42) registerFormat('application/exi', 47) registerFormat('application/json', 50) |
¶ÔÓ¦µØÎÒÃÇÐèÒªÔÚÒ»·¢³öÇëÇóµÄʱºòÉèÖúÃAccept£¬Òª²»¾ÍûÓа취·µ»ØÎÒÃÇÐèÒªµÄ½á¹û¡£
req.setHeader("Accept", "application/json"); |
·µ»ØJSON
ÔÚ¸øIoT CoAPÌí¼ÓÁËJSONÖ§³ÖÖ®ºó£¬±äµÃ·Ç³£ÓÐÒâ˼£¬ÖÁÉÙÎÒÃÇ¿ÉÒÔ»ñµÃÎÒÃÇÏëÒªµÄ½á¹û¡£ÔÚÉÏһƪÖÐÎÒÃǽéÉÜÁËһЩ³£ÓõŤ¾ß¡ª¡ªCoAP
ÃüÁîÐй¤¾ß¼¯¡£
CoAP¿Í»§¶Ë´úÂë
¿ªÊ¼Ö®Ç°ÎÒÃÇÐèÒªÓÐÒ»¸ö¿Í»§¶Ë´úÂ룬ÒÔ±ãÎÒÃǵķþÎñ¶Ë¿ÉÒÔ·µ»ØÕýÈ·µÄÊý¾Ý²¢½âÎö
var coap = require('coap');
var requestURI = 'coap://localhost/';
var url = require('url').parse(requestURI + 'id/1/');
console.log("Request URL: " + url.href);
var req = coap.request(url);
var bl = require('bl');
req.setHeader("Accept", "application/json");
req.on('response', function(res) {
res.pipe(bl(function(err, data) {
var json = JSON.parse(data);
console.log(json);
}));
});
req.end(); |
´úÂëÓе㳤ÄÚÈÝÒ²Óеã¶à£¬µ«ÊǺËÐÄÊÇÕâ¾ä»°£º
req.setHeader("Accept", "application/json"); |
ÕâÑùµÄ»°£¬ÎÒÃÇÖ»ÐèÒªÔÚÎÒÃǵķþÎñ¶ËÒ»Åжϣ¬
if(req.headers['Accept'] == 'application/json') { //do something }; |
ÕâÑù¾Í¿ÉÒÔ·µ»ØÊý¾ÝÁË
CoAP Server¶Ë´úÂë
Server¶ËµÄ´úÂë±È½Ï¼òµ¥£¬ÅжÏÒ»ÏÂ
if (req.headers['Accept'] == 'application/json') { parse_url(req.url, function(result){ res.end(result); }); res.code = '2.05'; } |
ÇëÇóµÄÊÇ·ñÊÇJSON¸ñʽ£¬ÔÙ·µ»ØÒ»¸ö205£¬Ò²¾ÍÊÇContent£¬Ö»ÊÇÕâʱÉè¼ÆÊÇÇëÇóÒ»¸öURL·µ»Ø¶ÔÓ¦µÄÊý¾Ý¡£Èç
ÕâʱӦ¸ÃÇëÇóµÄÊÇIDΪ1µÄÊý¾Ý£¬¼´
[ { id: 1, value: 'is id 1', sensors1: 19, sensors2: 20 }] |
¶øparse_urlÖ»ÊÇ´ÓÊý¾Ý¿â´Ó¶ÁÈ¡ÏàÓ¦µÄÊý¾Ý¡£
function parse_url(url ,callback) { var db = new sqlite3.Database(config["db_name"]); var result = []; db.all("SELECT * FROM basic;", function(err, rows) { callback(JSON.stringify(rows)); }) } |
²¢ÇÒÈ«²¿¶¼ÏÔʾ³öÀ´£¬Éè¼ÆµÃÕæÊÇÓе㲻ÐУ¬²»¹ýÏÖÔÚÒѾ²î²»¶àÁË¡£
|