|
21 | 21 | import android.net.wifi.p2p.WifiP2pDevice; |
22 | 22 | import android.net.wifi.p2p.WifiP2pGroup; |
23 | 23 | import android.net.wifi.p2p.WifiP2pProvDiscEvent; |
| 24 | +import android.net.wifi.p2p.nsd.WifiP2pServiceResponse; |
24 | 25 | import android.net.wifi.StateChangeResult; |
25 | 26 | import android.os.Message; |
26 | 27 | import android.util.Log; |
|
29 | 30 | import com.android.internal.util.Protocol; |
30 | 31 | import com.android.internal.util.StateMachine; |
31 | 32 |
|
| 33 | +import java.util.List; |
32 | 34 | import java.util.regex.Pattern; |
33 | 35 | import java.util.regex.Matcher; |
34 | 36 |
|
@@ -214,6 +216,52 @@ public class WifiMonitor { |
214 | 216 | group_capab=0x0 */ |
215 | 217 | private static final String P2P_PROV_DISC_SHOW_PIN_STR = "P2P-PROV-DISC-SHOW-PIN"; |
216 | 218 |
|
| 219 | + /* |
| 220 | + * Protocol format is as follows.<br> |
| 221 | + * See the Table.62 in the WiFi Direct specification for the detail. |
| 222 | + * ______________________________________________________________ |
| 223 | + * | Length(2byte) | Type(1byte) | TransId(1byte)}| |
| 224 | + * ______________________________________________________________ |
| 225 | + * | status(1byte) | vendor specific(variable) | |
| 226 | + * |
| 227 | + * P2P-SERV-DISC-RESP 42:fc:89:e1:e2:27 1 0300000101 |
| 228 | + * length=3, service type=0(ALL Service), transaction id=1, |
| 229 | + * status=1(service protocol type not available)<br> |
| 230 | + * |
| 231 | + * P2P-SERV-DISC-RESP 42:fc:89:e1:e2:27 1 0300020201 |
| 232 | + * length=3, service type=2(UPnP), transaction id=2, |
| 233 | + * status=1(service protocol type not available) |
| 234 | + * |
| 235 | + * P2P-SERV-DISC-RESP 42:fc:89:e1:e2:27 1 990002030010757569643a3131323 |
| 236 | + * 2646534652d383537342d353961622d393332322d3333333435363738393034343a3 |
| 237 | + * a75726e3a736368656d61732d75706e702d6f72673a736572766963653a436f6e746 |
| 238 | + * 56e744469726563746f72793a322c757569643a36383539646564652d383537342d3 |
| 239 | + * 53961622d393333322d3132333435363738393031323a3a75706e703a726f6f74646 |
| 240 | + * 576696365 |
| 241 | + * length=153,type=2(UPnP),transaction id=3,status=0 |
| 242 | + * |
| 243 | + * UPnP Protocol format is as follows. |
| 244 | + * ______________________________________________________ |
| 245 | + * | Version (1) | USN (Variable) | |
| 246 | + * |
| 247 | + * version=0x10(UPnP1.0) data=usn:uuid:1122de4e-8574-59ab-9322-33345678 |
| 248 | + * 9044::urn:schemas-upnp-org:service:ContentDirectory:2,usn:uuid:6859d |
| 249 | + * ede-8574-59ab-9332-123456789012::upnp:rootdevice |
| 250 | + * |
| 251 | + * P2P-SERV-DISC-RESP 58:17:0c:bc:dd:ca 21 1900010200045f6970 |
| 252 | + * 70c00c000c01094d795072696e746572c027 |
| 253 | + * length=25, type=1(Bonjour),transaction id=2,status=0 |
| 254 | + * |
| 255 | + * Bonjour Protocol format is as follows. |
| 256 | + * __________________________________________________________ |
| 257 | + * |DNS Name(Variable)|DNS Type(1)|Version(1)|RDATA(Variable)| |
| 258 | + * |
| 259 | + * DNS Name=_ipp._tcp.local.,DNS type=12(PTR), Version=1, |
| 260 | + * RDATA=MyPrinter._ipp._tcp.local. |
| 261 | + * |
| 262 | + */ |
| 263 | + private static final String P2P_SERV_DISC_RESP_STR = "P2P-SERV-DISC-RESP"; |
| 264 | + |
217 | 265 | private static final String HOST_AP_EVENT_PREFIX_STR = "AP"; |
218 | 266 | /* AP-STA-CONNECTED 42:fc:89:a8:96:09 dev_addr=02:90:4c:a0:92:54 */ |
219 | 267 | private static final String AP_STA_CONNECTED_STR = "AP-STA-CONNECTED"; |
@@ -268,6 +316,7 @@ public class WifiMonitor { |
268 | 316 | public static final int P2P_PROV_DISC_ENTER_PIN_EVENT = BASE + 35; |
269 | 317 | public static final int P2P_PROV_DISC_SHOW_PIN_EVENT = BASE + 36; |
270 | 318 | public static final int P2P_FIND_STOPPED_EVENT = BASE + 37; |
| 319 | + public static final int P2P_SERV_DISC_RESP_EVENT = BASE + 38; |
271 | 320 |
|
272 | 321 | /* hostap events */ |
273 | 322 | public static final int AP_STA_DISCONNECTED_EVENT = BASE + 41; |
@@ -558,6 +607,13 @@ private void handleP2pEvents(String dataString) { |
558 | 607 | } else if (dataString.startsWith(P2P_PROV_DISC_SHOW_PIN_STR)) { |
559 | 608 | mStateMachine.sendMessage(P2P_PROV_DISC_SHOW_PIN_EVENT, |
560 | 609 | new WifiP2pProvDiscEvent(dataString)); |
| 610 | + } else if (dataString.startsWith(P2P_SERV_DISC_RESP_STR)) { |
| 611 | + List<WifiP2pServiceResponse> list = WifiP2pServiceResponse.newInstance(dataString); |
| 612 | + if (list != null) { |
| 613 | + mStateMachine.sendMessage(P2P_SERV_DISC_RESP_EVENT, list); |
| 614 | + } else { |
| 615 | + Log.e(TAG, "Null service resp " + dataString); |
| 616 | + } |
561 | 617 | } |
562 | 618 | } |
563 | 619 |
|
|
0 commit comments