Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Ò»²½²½´î½¨ÎïÁªÍøÏµÍ³¡ª¡ªRESTfulµÄCoAPЭÒé
 

×÷Õߣºphodal À´Ô´£ºsegmentfault ·¢²¼ÓÚ 2015-03-19

  3555  次浏览      32

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

°²×°ÃüÁîÈçÏÂ

npm install coap-cli -g

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Ï¿ÉÒÔÖ±½ÓÓÃ

brew install libcoap

2.Ubuntu libcoap°²×°

Ubuntu GNU/LinuxÏÂ

3.Windows libcoap°²×°

Windows ÏÂ

°²×°Íêlibcoap£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÓÃ×Ô´øµÄÁ½¸öÃüÁî

coap-client 
coap-server

1.ÓÃcoap-serverÆôÒ»¸öCoAP·þÎñ

coap-server

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"
}
}

½Ó×ÅÖ´ÐÐ

npm install

¾Í¿ÉÒÔ°²×°ºÃÕâ¸ö¿â¡£Èç¹ûÓöµ½È¨ÏÞÎÊÌ⣬ÇëÓÃ

sudo npm install

½Ó×Å£¬´´½¨ÕâÑùÒ»¸ö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')
})  

Ö´ÐÐ

node app.js

±ã¿ÉÒÔÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊÁË£¬ÒòΪÏÖÔÚʲôҲûÓУ¬ËùÒÔʲôҲ²»»á·µ»Ø¡£

½Ó×ÅÏÂÀ´ÔÙ´´½¨Ò»¸öclient¶ËµÄjs£¬²¢ÔËÐÐÖ®

const coap  = require('coap') 
    , req   = coap.request('coap://localhost/World')

req.on('response', function(res) {
  res.pipe(process.stdout)
})

req.end()

¾Í¿ÉÒÔÔÚconsoleÉÏÊä³ö

Hello World 

Ò²¾Í´ïµ½ÁËÎÒÃǵÄÄ¿µÄ£¬ÓÃ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

coap://localhost/id/1/

ÎÒÃǶÔÎÒÃǵÄÇëÇóÌí¼ÓÁËÒ»¸ö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£¬¼òµ¥µØ¿ÉÒÔÓÃ

_.values(e).toString()

½«½á¹ûת»»Îª

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·µ»Ø¶ÔÓ¦µÄÊý¾Ý¡£Èç

coap://localhost/id/1/

ÕâʱӦ¸ÃÇëÇóµÄÊÇ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));
})
}

²¢ÇÒÈ«²¿¶¼ÏÔʾ³öÀ´£¬Éè¼ÆµÃÕæÊÇÓе㲻ÐУ¬²»¹ýÏÖÔÚÒѾ­²î²»¶àÁË¡£

   
3555 ´Îä¯ÀÀ       32
????

HTTP????
nginx??????
SD-WAN???
5G?????
 
????

??????????
IPv6???????
??????????
???????
????

????????
????????
???????????????
??????????
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸Àýʵ¼ù 10-15[±±¾©]
Êý¾Ý¼Ü¹¹¡¢Êý¾ÝÖÎÀíÓëÊý¾ÝÔËÓª 10-17[±±¾©]
³µÔØÏµÍ³¹¦ÄÜ¿ª·¢·½·¨Óëʵ¼ù 10-25[±±¾©]
SysMLºÍEA½øÐÐϵͳÉè¼ÆÓ뽨ģ 11-19[±±¾©]
AI¸¨ÖúÈí¼þ²âÊÔ·½·¨Óëʵ¼ù 10-26[±±¾©]
OCSMP ÈÏÖ¤Åàѵ¿Î³Ì 11-18[±±¾©]

ÖйúÒÆ¶¯ ÍøÂç¹æ»®Óë¹ÜÀí
Ò½Ôº°²·ÀϵͳԶ³Ì̽ÊÓ·½°¸½âÎö
»ùÓÚRFID¼¼ÊõµÄÎïÁªÍøÑо¿
»ùÓÚÎïÁªÍø¡¢ÔƼÆËã¼Ü¹¹...
»ùÓÚRFID¼¼ÊõÎïÁªÍøÑо¿ÓëÓ¦ÓÃ
ÎïÁªÍøµÄ·¢Õ¹Æ¿¾±ºÍ¹Ø¼ü¼¼Êõ