ÒýÑÔ
ÎïÁªÍøÊ±´ú£¬ËùÓÐÉ豸¶¼¿ÉÒÔ½ÓÈëÎÒÃǵĻ¥ÁªÍø¡£ÏëÏë¿´Ö»ÒªÓÐһ̨ÖÇÄÜÊÖ»ú£¬¾Í¿ÉÒÔ²Ù¿ØËùÓеÄÉ豸£¬Ò²¿ÉÒÔ»ñÈ¡µ½ËùÓÐÉ豸²É¼¯µÄÐÅÏ¢¡£²»¹ý£¬²¢²»ÊÇËùÓÐÉ豸¶¼Ö§³ÖHTTPÐÒéµÄ£¬¶øÇÒÈÃÉ豸֧³ÖHTTPÐÒéÒ²²»ÏÖʵ£¬ÒòΪ¶ÔÓÚÉ豸À´Ëµ£¬Õâ¸öÐÒéÌ«ÖØÁË£¬»áÏûºÄ´óÁ¿µÄ´ø¿íºÍµçÁ¿¡£ÓÚÊÇCoAPÐÒéÒ²¾ÍÔËÓ¦¶øÉúÁË£¬ÎÒÃÇ¿ÉÒÔ°ÑËü¿´Îª³¬¼ò»¯°æµÄHTTPÐÒé¡£¶øCalifornium¿ò¼Ü£¬¾ÍÊǶÔCoAPÐÒéµÄJavaʵÏÖ¡£
CoAPÐÒé
ÔÚÔĶÁCalifornium¿ò¼Ü֮ǰ£¬ÎÒÃÇÐèÒª¶ÔCoAPÐÒéÓиö´óÖµÄÁ˽⣬ÒѾ¶®µÃÁ˵Äͬѧ¿ÉÒÔÖ±½ÓÌø¹ý±¾Õ½ڡ£
CoAP±¨ÎÄ
Ê×ÏÈÈÃÎÒÃÇ¿´Ò»ÏÂCoAPÐÒéµÄ±¨ÎÄÊdz¤É¶ÑùµÄ£º

Version (Ver)£º³¤¶ÈΪ2룬±íʾCoAPÐÒéµÄ°æ±¾ºÅ¡£µ±Ç°°æ±¾Îª01£¨¶þ½øÖƱíʾÐÎʽ£©¡£
Type (T)£º³¤¶ÈΪ2룬±íʾ±¨ÎÄÀàÐÍ¡£ÆäÖи÷ÀàÐͼ°¶þ½øÖƱíʾÐÎʽÈçÏ£¬Confirmable
(00)¡¢Non-confirmable (01)¡¢Acknowledgement (10)¡¢Reset
(11)¡£ÔÚÃèÊöµÄʱºòΪÁ˼ò±ã£¬»á½«ConfirmableËõдΪCON£¬Non-confirmableËõдΪNON£¬AcknowledgementËõдΪACK£¬ResetËõдΪRST¡£±ÈÈçÒ»¸ö±¨ÎĵÄÀàÐÍΪConfirmable£¬ÎÒÃǾͻá¼òдΪCON±¨ÎÄ¡£
Token Length (TKL)£º³¤¶ÈΪ4룬±íʾToken×ֶεij¤¶È¡£
Code£º³¤¶ÈΪ8룬±íʾÏìÓ¦Âë¡£ÆäÖÐǰ3λ´ú±íÒ»¸öÊý£¬ºó5λ´ú±íÒ»¸öÊý¡£Èç010 00000£¬×ªÎªÊ®½øÖƾÍÊÇ2.00£¨±íʾʱÖÐ¼ä´øÒ»¸öµã£©£¬ÆäÒâ˼¿ÉÒÔÀí½âΪHTTPÖÐ200
OKÏìÓ¦Âë¡£
Message ID£º³¤¶ÈΪ16룬±íʾÏûÏ¢id¡£ÓÃÀ´±íʾÊÇ·ñΪͬһ¸öµÄ±¨ÎÄ£¨ÖØ·¢³¡¾°Ï£¬È¥ÖØ»áÓõ½£©£¬»òÕßCONÇëÇó±¨ÎĺÍACKÏìÓ¦±¨Îĵį¥Åä¡£
Token£º³¤¶ÈÓÉTKL×ֶξö¶¨£¬±íʾһ´Î»á»°¼Ç¼¡£ÓÃÀ´¹ØÁªÇëÇóºÍÏìÓ¦¡£ÓÐÈË¿ÉÄÜÓÐÒÉ»ó£¬Message
ID²»ÊÇ¿ÉÒÔ½«ÇëÇóºÍÏìÓ¦¹ØÁªÂ𣿵ÄÈ·£¬CONÀàÐ͵ÄÇëÇó±¨ÎÄÓëACKÀàÐ͵ÄÏìÓ¦±¨ÎÄ¿ÉÒÔÓÃMessage
ID½øÐйØÁª£¬µ«NONÀàÐ͵ı¨ÎÄÓÉÓÚûÓÐÒªÇóÊÇÒ»¶ÔµÄ£¬ËùÒÔÈç¹ûNONÀàÐ͵ı¨ÎÄÏë³É¶Ô£¬ÄǾÍÖ»ÄÜͨ¹ýÏàͬµÄTokenÀ´Æ¥ÅäÁË¡£
Options£º³¤¶È²»È·¶¨£¬±íʾ±¨ÎĵÄÑ¡Ïî¡£ÀàËÆÎªHTTPµÄÇëÇóÍ·£¬ÄÚÈݰüÀ¨Uri-Host¡¢Uri-Path¡¢Uri-PortµÈµÈ¡£
1 1 1 1 1 1 1 1£ºPayload Marker£¬ÓÃÀ´¸ôÀëOptions×ֶκÍPayload×ֶΡ£
Payload£º³¤¶ÈÓÉÊý¾Ý°ü¾ö¶¨£¬±íʾӦÓòãÐèÒªµÄÊý¾Ý¡£
ÏûÏ¢´«ÊäÄ£ÐÍ
CoAPÐÒéÊÇËäÈ»Êǽ¨Á¢ÔÚUDPÖ®Éϵ쬵«ÊÇËüÓпɿ¿ºÍ²»¿É¿¿Á½ÖÖ´«ÊäÄ£ÐÍ¡£
¿É¿¿´«ÊäÄ£ÐÍ£º

ÈçÉÏͼ£¬¿Í»§¶Ëͨ¹ý·¢ÆðÒ»¸öCON±¨ÎÄ£¨Message ID = 0x7D34£©£¬·þÎñ¶ËÔÚÊÕµ½CON±¨ÎÄÖ®ºó£¬ÐèÒª»Ø¸´Ò»¸öACK±¨ÎÄ£¨Message
ID = 0x7d34£©¡£Í¨¹ýMessage ID½«CON±¨ÎĺÍACK±¨ÎĶÔÓ¦ÆðÀ´¡£
È·±£¿É¿¿´«ÊäµÄ·½·¨ÓÐÁ©£ºÆäÒ»£¬Í¨¹ý·þÎñ¶Ë»Ø¸´ACK±¨ÎÄ£¬¿Í»§¶Ë¿ÉÒÔÈ·ÈÏCON±¨ÎÄÒѱ»·þÎñ¶Ë½ÓÊÕ£»Æä¶þ£¬³¬Ê±ÖØ´«»úÖÆ¡£Èô¿Í»§¶ËÔÚÒ»¶¨Ê±¼äÄÚδÊÕµ½ACK±¨ÎÄ£¬ÔòÈÏΪCON±¨ÎÄÒѾÔÚÁ´Â·É϶ªÊ§£¬Õâʱºò¾Í»áÖØ´«CON±¨ÎÄ£¬ÖØ´«Ê±¼äºÍ´ÎÊý¿ÉÅäÖá£
²»¿É¿¿´«ÊäÄ£ÐÍ£º

ÈçÉÏͼ£¬¿Í»§¶Ë·¢ÆðÒ»¸öNON±¨ÎÄ £¨Message ID = 0x01a0
£©Ö®ºó£¬·þÎñ¶ËÎÞÐè»Ø¸´ÏìÓ¦£¬¿Í»§¶ËÒ²²»»áÖØ·¢¡£
ÇëÇóÓëÏìӦģÐÍ
ÓÉÓÚ´æÔÚ¿É¿¿Óë²»¿É¿¿Á½ÖÖ´«ÊäÄ£ÐÍ£¬ÄÇô¶ÔÓ¦µÄÒ²»á´æÔÚÁ½ÖÖÇëÇóÓëÏìӦģÐÍ¡£
CONÇëÇó£¬ACKÏìÓ¦£º

ÈçÉÏͼ£¬¿Í»§¶Ë·¢ÆðÁËÒ»¸öCON±¨ÎÄ£¨ Message ID = 0xbc90
, Code = 0.01 GET , Options = {" Uri -Path":"/temperature"},
Token = 0x71£©£¬·þÎñ¶ËÔÚÊÕµ½²éѯ ζȵÄÇëÇóÖ®ºó£¬»Ø¸´ACK±¨ÎÄ£¨Message ID
= 0xbc90 , Code = 2.05 Content, Payload = "22.5
C", Token = 0x71£©¡£Ò²¾ÍÊÇ˵·þÎñ¶Ë¿ÉÒÔÔÚACK±¨ÎÄÖУ¬¾Í½«¿Í»§¶Ë²éѯζȵĽá¹ûÒ»Æð·µ»Ø¡£

µ±È»£¬»¹ÓÐÒ»ÖÖÇé¿ö£¬ÄǾÍÊÇ·þÎñ¶Ë¿ÉÄÜÓÉÓÚijЩÔÒò²»ÂíÉÏ·µ»Ø½á¹û¡£ÈçÉÏͼ£¬¿Í»§¶Ë·¢Æð²éѯζȵÄCON±¨ÎÄÖ®ºó£¬·þÎñ¶ËÏȻظ´ACK±¨ÎÄ¡£Ò»¶Îʱ¼ä¹ýºó£¬·þÎñ¶ËÔÙ·¢ÆðCON±¨Îĸø¿Í»§¶Ë£¬²¢½«Î¶ȵĽá¹ûÒ»ÆðЯ´ø£¬¿Í»§¶ËÊÕµ½½á¹ûÖ®ºó»Ø¸´ACK±¨ÎÄ¡£
NONÇëÇó£¬NONÏìÓ¦£º

ÈçÉÏͼ£¬¿Í»§¶Ë·¢ÆðÁËÒ»¸öNON±¨ÎÄ£¨Message ID = 0x7a11,
Code = 0.01 GET , Options = {"Uri -Path":"/temperature"},
Token = 0x74£©£¬·þÎñ¶ËÔÚÊÕµ½²éѯζȵÄÇëÇóÖ®ºó£¬»Ø¸´NON±¨ÎÄ£¨ Message ID
= 0x23bc , Code = 2.05 Content , Payload = "22.5
C" , Token = 0x74 £©¡£
¿ÉÒÔ·¢ÏÖ£¬CONÀàÐ͵ÄÇëÇó±¨ÎÄÓëACKÀàÐ͵ÄÏìÓ¦±¨ÎÄÊÇͨ¹ýMessage ID½øÐÐÆ¥Å䣬NONÀàÐ͵ÄÇëÇó±¨ÎÄÓëNONÀàÐ͵ÄÏìÓ¦±¨ÎÄÔòÊÇͨ¹ýToken½øÐÐÆ¥Åä¡£
ÖÁ´Ë£¬ÔÛÃǵÄCoAPÐÒé³õѧ֮·Òѵ½ÁËÖյ㣬Èç¹û»¹ÏëÏêϸÑо¿µÄͬѧ£¬¿ÉÒÔ²éÔÄRFC 7252£¬ÕâÀï¾Í²»ÔÙ×öÏêÊöÁË£¡ÄÇô£¬½ÓÏÂÀ´¾ÍÈÃÎÒÃǶÔCalifornium¿ªÔ´¿ò¼Üһ̽¾¿¾¹°É£¡
·ÖÎöÈë¿Ú
ÏëÒª·ÖÎöÒ»¸ö¿ò¼Ü£¬×îºÃµÄ·½·¨¾ÍÊÇÏÈʹÓÃËü£¬ÔÙͨ¹ýdebug£¬Ò»²½²½µØÁ˽âËüÊÇÈçºÎÔËÐеġ£
Ê×ÏÈÔÚpom.xmlÎļþÀïÒýÈëCalifornium¿ªÔ´¿ò¼ÜµÄÒÀÀµ£º
<dependency>
<groupId>org.eclipse.californium</groupId>
<artifactId>californium-core</artifactId>
<version>2.0.0-M1</version>
</dependency> |
Æä´Î£¬ÎÒÃÇÖ»ÒªÔÚMainº¯ÊýÀïÇÃÁ½ÐдúÂ룬·þÎñ¶Ë¾ÍÆô¶¯ÆðÀ´ÁË£º
public
static void main(String[] args) {
// ´´½¨·þÎñ¶Ë
CoapServer server = new CoapServer();
// Æô¶¯·þÎñ¶Ë
server.start();
} |
ÄÇô£¬½ÓÏÂÀ´¾ÍÈÃÎÒÃÇ´ÓCoapServerÕâ¸öÀ࿪ʼ£¬¶ÔÕû¸ö¿ò¼Ü½øÐзÖÎö¡£Ê×ÏÈÈÃÎÒÃÇ¿´¿´¹¹Ôì·½·¨CoapServer()ÀïÃæ×öÁËÄÄЩÊ£º
public
CoapServer(final NetworkConfig
config, final int...
ports) {
// ³õʼ»¯ÅäÖÃ
if (config != null) {
this.config = config;
} else {
this.config = NetworkConfig.getStandard();
}
// ³õʼ»¯Resource
this.root = createRoot();
// ³õʼ»¯MessageDeliverer
this.deliverer = new ServerMessage
Deliverer(root);
CoapResource wellKnown = new CoapResource
(".well-known");
wellKnown.setVisible(false);
wellKnown.add(new DiscoveryResource(root));
root.add(wellKnown);
// ³õʼ»¯EndPoints
this.endpoints = new ArrayList<>();
// ³õʼ»¯Ï̳߳Ø
this.executor = Executors.newScheduled
ThreadPool(this.
config.getInt(NetworkConfig.Keys
.PROTOCOL_STAGE_THREAD_COUNT),
new NamedThreadFactory("CoapServer#"));
// Ìí¼ÓEndpoint
for (int port : ports) {
addEndpoint(new CoapEndpoint(port, this.config));
}
} |
¹¹Ôì·½·¨³õʼ»¯ÁËһЩ³ÉÔ±±äÁ¿¡£ÆäÖУ¬Endpoint¸ºÔðÓëÍøÂç½øÐÐͨÐÅ£¬MessageDeliverer¸ºÔð·Ö·¢ÇëÇó£¬Resource¸ºÔð´¦ÀíÇëÇó¡£½Ó×ÅÈÃÎÒÃÇ¿´¿´Æô¶¯·½·¨start()ÓÖ×öÁËÄÄЩÊ£º
public
void start() {
// Èç¹ûûÓÐÒ»¸öEndpointÓëCoapServer
½øÐа󶨣¬ÄǾʹ´½¨Ò»¸öĬÈϵÄEndpoint
...
// Ò»¸öÒ»¸öµØ½«EndpointÆô¶¯
int started = 0;
for (Endpoint ep:endpoints) {
try {
ep.start();
++started;
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "Cannot
start server endpoint [" + ep.
getAddress() + "]", e);
}
}
if (started==0) {
throw new IllegalStateException
("None of the server endpoints could be
started");
}
} |
Æô¶¯·½·¨ºÜ¼òµ¥£¬Ö÷ÒªÊǽ«ËùÓеÄEndpointÒ»¸ö¸öÆô¶¯¡£ÖÁ´Ë£¬·þÎñ¶ËËãÊÇÆô¶¯³É¹¦ÁË¡£ÈÃÎÒÃÇÉÔ΢×ܽáһϼ¸¸öÀàµÄ¹ØÏµ£º

ÈçÉÏͼ£¬ÏûÏ¢»á´ÓNetworkÄ£¿é´«Ê䏸¶ÔÓ¦µÄEndpoint½Úµã£¬ËùÓеÄEndpoint½Úµã¶¼»á½«ÏûÏ¢ÍÆ¸øMessageDeliverer£¬MessageDeliverer¸ù¾ÝÏûÏ¢µÄÄÚÈÝ´«Ê䏸֏¶¨µÄResource£¬ResourceÔÙ¶ÔÏûÏ¢ÄÚÈݽøÐд¦Àí¡£
½ÓÏÂÀ´£¬½«ÈÃÎÒÃÇÔÙÄ£ÄâÒ»¸ö¿Í»§¶Ë·¢ÆðÒ»¸öGETÇëÇ󣬿´¿´·þÎñ¶ËÊÇÈçºÎ½ÓÊպʹ¦ÀíµÄ°É£¡¿Í»§¶Ë´úÂëÈçÏ£º
public
static void main(String[]
args) throws URISyntaxException
{
// È·¶¨ÇëÇó·¾¶
URI uri = new URI("127.0.0.1");
// ´´½¨¿Í»§¶Ë
CoapClient client = new CoapClient(uri);
// ·¢ÆðÒ»¸öGETÇëÇó
client.get();
} |
ͨ¹ýÇ°Ãæ·ÖÎö£¬ÎÒÃÇÖªµÀEndpointÊÇÖ±½ÓÓëÍøÂç½øÐн»»¥µÄ£¬ÄÇô¿Í»§¶Ë·¢ÆðµÄGETÇëÇó£¬Ó¦¸ÃÔÚ·þÎñ¶ËµÄEndpointÖÐÊÕµ½¡£¿ò¼ÜÖÐEndpoint½Ó¿ÚµÄʵÏÖÀàÖ»ÓÐCoapEndpoint£¬ÈÃÎÒÃÇÉîÈëÁ˽âÒ»ÏÂCoapEndpointµÄÄÚ²¿ÊµÏÖ£¬¿´¿´ËüÊÇÈçºÎ½ÓÊպʹ¦ÀíÇëÇóµÄ¡£
CoapEndpointÀà
CoapEndpointÀàʵÏÖÁËEndpoint½Ó¿Ú£¬Æä¹¹Ôì·½·¨ÈçÏ£º
public
CoapEndpoint(Connector
connector, NetworkConfig
config,
ObservationStore
store) {
this.config = config;
this.connector = connector;
if (store == null) {
this.matcher = new Matcher(config,
new NotificationDispatcher(),
new
InMemoryObservationStore());
} else {
this.matcher = new Matcher(config,
new NotificationDispatcher(),
store);
}
this.coapstack = new CoapStack(config,
new OutboxImpl());
this.connector.setRawDataReceiver(new
InboxImpl());
} |
´Ó¹¹Ôì·½·¨¿ÉÒÔÁ˽⵽£¬ÆäÄÚ²¿½á¹¹ÈçÏÂËùʾ£º

ÄÇô£¬Ò²¾ÍÊÇ˵¿Í»§¶Ë·¢ÆðµÄGETÇëÇ󽫱»InboxImplÀà½ÓÊÕ¡£InboxImplÀàʵÏÖÁËRawDataChannel½Ó¿Ú£¬¸Ã½Ó¿ÚÖ»ÓÐÒ»¸öreceiveData(RawData
raw)·½·¨£¬InboxImplÀàµÄ¸Ã·½·¨ÈçÏ£º
public
void receiveData(final RawData raw) {
// ²ÎÊýУÑé
...
// Æô¶¯Ï̴߳¦ÀíÊÕµ½µÄÏûÏ¢
runInProtocolStage(new Runnable() {
@Override
public void run() {
receiveMessage(raw);
}
});
} |
ÔÙÍùreceiveMessage(RawData raw)·½·¨Àï¿´£º
private
void receiveMessage(final
RawData raw) {
// ½âÎöÊý¾ÝÔ´
DataParser parser = new DataParser(raw.
getBytes());
// Èç¹ûÊÇÇëÇóÊý¾Ý
if (parser.isRequest()) {
// һЩ·Ç¹Ø¼ü²Ù×÷
...
// ÏûÏ¢À¹½ØÆ÷½ÓÊÕÇëÇó
for (MessageInterceptor interceptor:
interceptors) {
interceptor.receiveRequest(request);
}
// Æ¥ÅäÆ÷½ÓÊÕÇëÇ󣬲¢·µ»ØExchange¶ÔÏó
Exchange exchange = matcher.receive
Request(request);
// CoapÐÒéÕ»½ÓÊÕÇëÇó
coapstack.receiveRequest(exchange, request);
}
// Èç¹ûÊÇÏìÓ¦Êý¾Ý£¬ÔòÓëÇëÇóÊý¾ÝÒ»Ñù£¬
·Ö±ðÓÉÏûÏ¢À¹½ØÆ÷¡¢Æ¥ÅäÆ÷¡¢CoapÐÒéÕ»½ÓÊÕÏìÓ¦
...
// Èç¹ûÊÇ¿ÕÊý¾Ý£¬ÔòÓëÇëÇóÊý¾Ý¡¢ÏìÓ¦Êý¾ÝÒ»Ñù£¬
·Ö±ðÓÉÏûÏ¢À¹½ØÆ÷¡¢Æ¥ÅäÆ÷¡¢CoapÐÒéÕ»½ÓÊÕ¿ÕÊý¾Ý
...
// һЩ·Ç¹Ø¼ü²Ù×÷
...
} |
½ÓÏÂÀ´£¬ÎÒÃÇ·Ö±ð¶ÔMessageInterceptor£¨ÏûÏ¢À¹½ØÆ÷£©¡¢Matcher£¨Æ¥ÅäÆ÷£©¡¢CoapStack£¨CoapÐÒéÕ»£©½øÐзÖÎö£¬¿´¿´ËûÃǽÓÊÕµ½ÇëÇóºó×öÁËʲô´¦Àí¡£
MessageInterceptor½Ó¿Ú

¿ò¼Ü±¾Éí²¢Ã»ÓÐÌṩ¸Ã½Ó¿ÚµÄÈκÎʵÏÖÀ࣬ÎÒÃÇ¿ÉÒÔ¸ù¾ÝÒµÎñÐèÇóʵÏָýӿڣ¬²¢Í¨¹ýCoapEndpoint.addInterceptor(MessageInterceptor
interceptor)·½·¨Ìí¼Ó¾ßÌåµÄʵÏÖÀà¡£
MatcherÀà

ÎÒÃÇÖ÷Òª¿´receiveRequest(Request request)·½·¨£¬¿´Ëü¶Ô¿Í»§¶ËµÄGETÇëÇó×öÁËÄÄЩ²Ù×÷£º
public
Exchange receiveRequest(Request request) {
// ¸ù¾ÝRequestÇëÇó£¬Ìî³ä²¢·µ»ØExchange¶ÔÏó
...
} |
CoapStackÀà
CoapStackµÄÀàͼ±È½Ï¸´ÔÓ£¬Æä½á¹¹¿ÉÒÔ¼ò»¯ÎªÏÂͼ£º

ÓÐÈË¿ÉÄÜ»áÒÉ»ó£¬Õâ¸ö½á¹¹Í¼ÊÇÔõôÀ´£¬´ð°¸¾ÍÔÚ¹¹Ôì·½·¨À
public
CoapStack(NetworkConfig
config, Outbox outbox)
{
// ³õʼ»¯Õ»¶¥
this.top = new StackTopAdapter();
// ³õʼ»¯Õ»µ×
this.bottom = new StackBottomAdapter();
// ³õʼ»¯³ö¿Ú
this.outbox = outbox;
// ³õʼ»¯ReliabilityLayer
...
// ³õʼ»¯²ã¼¶
this.layers =
new Layer.TopDownBuilder()
.add(top)
.add(new ObserveLayer(config))
.add(new BlockwiseLayer(config))
.add(reliabilityLayer)
.add(bottom)
.create();
} |
»Ø¹éÕýÌ⣬¼ÌÐø¿´CoapStack.receiveRequest(Exchange exchange,
Request request)·½·¨ÊÇÔõô´¦Àí¿Í»§¶ËµÄGETÇëÇó£º
public
void receiveRequest(Exchange
exchange, Request
request) {
// һЩ·Ç¹Ø¼ü²Ù×÷
...
// ½«ÇëÇ󴫵ݸøÏûÏ¢·Ö·¢Æ÷
deliverer.deliverRequest(exchange);
} |
CoapStackÔÚÊÕµ½ÇëÇóºó£¬½»¸øÁË StackBottomAdapter
È¥´¦Àí£¬ StackBottomAdapter ´¦ÀíÍêºó¾Í»áÒÀ´ÎÏòÉÏ´«µÝ¸ø ReliabilityLayer
¡¢ BlockwiseLayer ¡¢ ObserveLayer £¬×îÖÕ´«µÝ¸ø StackTopAdapter
¡£ÖмäµÄ´¦Àíϸ½Ú¾Í²»ÏêÊöÁË£¬Ö±½Ó¿´ StackTopAdapter . receiveRequest
(Exchange exchange, Request request) ·½·¨£º
public
void deliverRequest(final
Exchange exchange)
{
// ´ÓexchangeÀï»ñÈ¡request
Request request = exchange.getRequest();
// ´ÓrequestÀï»ñÈ¡ÇëÇó·¾¶
List<String> path = request.getOptions
().getUriPath();
// ÕÒ³öÇëÇó·¾¶¶ÔÓ¦µÄResource
final Resource resource = findResource(path);
// һЩ·Ç¹Ø¼ü²Ù×÷
...
// ÓÉResourceÀ´ÕæÕýµØ´¦ÀíÇëÇó
resource.handleRequest(exchange);
// һЩ·Ç¹Ø¼ü²Ù×÷
...
} |
¿ÉÒÔ¿´µ½£¬StackTopAdapter×îºó»á½«ÇëÇ󴫵ݸøMessageDeliverer£¬ÖÁ´ËCoapEndpointµÄÈÎÎñÒ²¾ÍËãÍê³ÉÁË£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÒ»ÕÅÇëÇóÏûÏ¢Á÷³ÌͼÀ´»Ø¹Ëһϣ¬Ò»¸ö¿Í»§¶ËGETÇëÇó×îÖÕÊÇÈçºÎµ½´ïMessageDelivererµÄ£º

MessageDeliverer½Ó¿Ú

¿ò¼ÜÓÐ Server Message Deliverer ºÍ ClientMessageDeliverer
Á½¸öʵÏÖÀà¡£´Ó CoapServer µÄ¹¹Ôì·½·¨ÀïÖªµÀʹÓõÄÊÇ ServerMessageDeliverer
Àà¡£ÄÇô¾ÍÈÃÎÒÃÇ¿´¿´ ServerMessageDeliverer . deliverRequest
(Exchange exchange ) ·½·¨ÊÇÈçºÎ·Ö·¢GETÇëÇóµÄ£º
public
void handleRequest(final
Exchange exchange)
{
Code code = exchange.getRequest().
getCode();
switch (code) {
case GET: handleGET(new CoapExchange
(exchange, this));
break;
case POST: handlePOST(new CoapExchange
(exchange, this));
break;
case PUT: handlePUT(new CoapExchange
(exchange, this));
break;
case DELETE: handleDELETE(new CoapExchange
(exchange, this));
break;
}
} |
µ±MessageDelivererÕÒµ½RequestÇëÇó¶ÔÓ¦µÄResource×ÊÔ´ºó£¬¾Í»á½»ÓÉResource×ÊÔ´À´´¦ÀíÇëÇó¡££¨ÊDz»ÊǺÜÏñSpring
MVCÖеÄDispatcherServlet£¬ËüÒ²¸ºÔð·Ö·¢ÇëÇó¸ø¶ÔÓ¦µÄController£¬ÔÙÓÉController×Ô¼º´¦ÀíÇëÇó£©
Resource½Ó¿Ú

»¹¼ÇµÃCoapServer¹¹Ôì·½·¨Àï´´½¨ÁËÒ»¸öRootResourceÂð£¿ËüµÄ×ÊԴ·¾¶Îª¿Õ£¬¶ø¿Í»§¶Ë·¢ÆðµÄGETÇëÇóĬÈÏÒ²Êǿշ¾¶¡£ÄÇôServerMessageDeliverer¾Í»á°ÑÇëÇó·Ö·¢¸øRootResource´¦Àí¡£RootResourceÀàûÓи²Ð´handleRequest(Exchange
exchange)·½·¨£¬ËùÒÔÎÒÃÇ¿´¿´CoapResource¸¸ÀàµÄʵÏÖ£º
public
void handleGET(CoapExchange
exchange) {
// ÓÉCoapExchange·µ»ØÏìÓ¦
exchange.respond(ResponseCode.
CONTENT, msg);
} |
ÓÉÓÚÎÒÃǿͻ§¶Ë·¢ÆðµÄÊÇGETÇëÇó£¬ÄÇô½«»á½øÈëµ½ RootResource
. handleGET (CoapExchange exchange)·½·¨£º
public
void respond(ResponseCode code,
String payload)
{
// Éú³ÉÏìÓ¦²¢¸³Öµ
Response response = new Response(code);
response.setPayload(payload);
response.getOptions().setContentFormat
(MediaTypeRegistry.TEXT_PLAIN);
// µ÷ÓÃͬÃûº¯Êý
respond(response);
} |
¿´¿´Í¬Ãûº¯ÊýÀïÓÖ×öÁËÄÄЩ²Ù×÷£º
public
void respond(Response response) {
// ²ÎÊýУÑé
...
// ÉèÖÃResponseÊôÐÔ
...
// ¼ì²é¹ØÏµ
resource.checkObserveRelation
(exchange, response);
// ÓɳÉÔ±±äÁ¿Exchange·¢ËÍÏìÓ¦
exchange.sendResponse(response);
} |
ÄÇôExchange.sendResponse(Response response)ÓÖÊÇÈçºÎ·¢ËÍÏìÓ¦µÄÄØ£¿
public
void sendResponse(Response response) {
// ÉèÖÃResponseÊôÐÔ
response.setDestination(request.
getSource());
response.setDestinationPort(request.
getSourcePort());
setResponse(response);
// ÓÉEndpoint·¢ËÍÏìÓ¦
endpoint.sendResponse(this, response);
} |
ÔÀ´×îÖÕ»¹Êǽ»¸øÁËEndpointÈ¥·¢ËÍÏìÓ¦Á˰¡£¡Ö®Ç°µÄGETÇëÇó¾ÍÊÇ´ÓEndpointÖÐÀ´µÄ¡£ÕâÕæÊǺʹ￵Êé¼ÇÒ»Ñù£¬´ÓÈËÃñÖÐÀ´£¬ÔÙµ½ÈËÃñÖÐÈ¥¡£
ÔÚCoapEndpointÀàÒ»Õ½ÚÖÐÎÒÃÇÓнéÉÜËüµÄÄÚ²¿½á¹¹¡£ÄÇôµ±·¢ËÍÏìÓ¦µÄʱºò£¬½«Óë֮ǰ½ÓÊÕÇëÇóÏà·´£¬ÏÈÓÉStackTopAdapter´¦Àí¡¢ÔÙÊÇÒÀ´ÎObserveLayer¡¢BlockwiseLayer¡¢ReliabilityLayer´¦Àí£¬×îºóÓÉStackBottomAdapter´¦Àí£¬ÖмäµÄϸ½Ú»¹ÊÇÀÏÑù×ÓºöÂÔ£¬ÈÃÎÒÃÇÖ±½Ó¿´StackBottomAdapter.sendResponse(Exchange
exchange, Response response)·½·¨£º
public
void sendResponse(Exchange exchange
, Response response)
{
outbox.sendResponse(exchange, response);
} |
ÇëÇóÈë¿ÚÊÇCoapEndpoint.InboxImpl£¬¶øÏìÓ¦³ö¿ÚÊÇCoapEndpint.OutboxImpl£¬¼òµ¥Ã÷ÁË¡£×îºó£¬ÈÃÎÒÃÇ¿´¿´OutboxImpl.sendResponse(Exchange
exchange, Response response)°É£º
public
void sendResponse(Exchange
exchange, Response
response) {
// һЩ·Ç¹Ø¼ü²Ù×÷
...
// Æ¥ÅäÆ÷·¢ËÍÏìÓ¦
matcher.sendResponse(exchange, response);
// ÏûÏ¢À¹½ØÆ÷·¢ËÍÏìÓ¦
for (MessageInterceptor interceptor:
interceptors) {
interceptor.sendResponse(response);
}
// ÕæÕýµØ·¢ËÍÏìÓ¦µ½ÍøÂçÀï
connector.send(Serializer.serialize(response)); |
ͨ¹ýÒ»ÕÅÏìÓ¦ÏûÏ¢Á÷³ÌͼÀ´»Ø¹Ëһϣ¬Ò»¸ö·þÎñ¶ËÏìÓ¦×îÖÕÊÇÈçºÎ´«Êäµ½ÍøÂçÀïÈ¥£º

×ܽá
ͨ¹ý·þÎñ¶ËµÄ´´½¨ºÍÆô¶¯£¬¿Í»§¶Ë·¢ÆðGETÇëÇ󣬷þÎñ¶Ë½ÓÊÕÇëÇó²¢·µ»ØÏìÓ¦Á÷³Ì£¬ÎÒÃǶÔCalifornium¿ò¼ÜÓÐÁËÒ»¸öÕûÌåµÄÁ˽⡣Ë×»°Ëµ£¬Ê¦¸¸Áì½øÃÅ£¬ÐÞÐп´¸öÈË¡£ÔÚ·ÖÎöÕâ¸öÁ÷³ÌµÄ¹ý³ÌÖУ¬ÎÒÊ¡ÂÔÁ˺ܶàµÄϸ½Ú£¬ÒâÔÚÈôó¼Ò¶Ô¿ò¼ÜÓиö¸ÅÄîÉϵÄÀí½â£¬ÔÚÒÔºó¶þ´Î¿ª·¢»ò¶¨Î»ÎÊÌâʱ¸üÄÜץס֨µã£¬×ÅÖØÕë¶Ôij¸öÄ£¿é¡£×îºó£¬Ò²²»µÃ²»ÔÞ̾һÏÂÕâ¿î¿ªÔ´¿ò¼Ü´úÂëÂß¼ÇåÎú£¬Ä£¿éÖ°Ôð»®·ÖÃ÷È·£¬Áé»îµØÊ¹ÓÃÉè¼ÆÄ£Ê½£¬·Ç³£ÖµµÃÎÒÃÇѧϰ£¡ |