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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Californium ¿ªÔ´¿ò¼Ü·ÖÎö
 
À´Ô´£ºÂëÅ©Íø ·¢²¼ÓÚ£º 2017-6-8
  2832  次浏览      27
 

ÒýÑÔ

ÎïÁªÍøÊ±´ú£¬ËùÓÐÉ豸¶¼¿ÉÒÔ½ÓÈëÎÒÃǵĻ¥ÁªÍø¡£ÏëÏë¿´Ö»ÒªÓÐһ̨ÖÇÄÜÊÖ»ú£¬¾Í¿ÉÒÔ²Ù¿ØËùÓеÄÉ豸£¬Ò²¿ÉÒÔ»ñÈ¡µ½ËùÓÐÉ豸²É¼¯µÄÐÅÏ¢¡£²»¹ý£¬²¢²»ÊÇËùÓÐÉ豸¶¼Ö§³Ö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¸öÄ£¿é¡£×îºó£¬Ò²²»µÃ²»ÔÞ̾һÏÂÕâ¿î¿ªÔ´¿ò¼Ü´úÂëÂß¼­ÇåÎú£¬Ä£¿éÖ°Ôð»®·ÖÃ÷È·£¬Áé»îµØÊ¹ÓÃÉè¼ÆÄ£Ê½£¬·Ç³£ÖµµÃÎÒÃÇѧϰ£¡

   
2832 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö