nx_iot_classify_test.nx source
↩ module page · 72 lines · 4238 B
1// nx_iot_classify_test.nx -- gate for the universal device-type probe.
2//
3// Proves each signal classifier + the fusion priority, grounded in the
4// operator's REAL live device (Kasa HS210: SSID TP-LINK_HS210_C209,
5// OUI d8:0d:17, port 9999), plus a Tuya + WiZ example and the UNKNOWN
6// fallback that triggers active probing / autonomous driver work.
7//
8// Uses natural escaped JSON literals for reply samples (now that the
9// lexer's escape support is verified -- the whole point).
10//
11// expect_exit: 0
12//
13// license_tier: ORIGINAL
14
15import "nx_syscalls_x86_64.nx"
16import "nx_iot_classify.nx"
17
18func main() -> i64 {
19 // ---- SSID classifier -------------------------------------------
20 let ka_ssid: *u8 = "TP-LINK_HS210_C209"
21 if nx_iot_classify_by_ssid(ka_ssid, nx_iot_cls_strlen(ka_ssid)) != NX_IOT_VENDOR_KASA { return 1 }
22 let tu_ssid: *u8 = "SmartLife-A1B2"
23 if nx_iot_classify_by_ssid(tu_ssid, nx_iot_cls_strlen(tu_ssid)) != NX_IOT_VENDOR_TUYA { return 2 }
24 let wz_ssid: *u8 = "wiz_a1b2c3"
25 if nx_iot_classify_by_ssid(wz_ssid, nx_iot_cls_strlen(wz_ssid)) != NX_IOT_VENDOR_WIZ { return 3 }
26 let hm_ssid: *u8 = "MyHouseWiFi"
27 if nx_iot_classify_by_ssid(hm_ssid, nx_iot_cls_strlen(hm_ssid)) != NX_IOT_VENDOR_UNKNOWN { return 4 }
28
29 // ---- OUI classifier --------------------------------------------
30 let mac: *u8 = sys_mmap(8)
31 mac[0] = 0xD8; mac[1] = 0x0D; mac[2] = 0x17 // the real HS210 OUI
32 mac[3] = 0xA1; mac[4] = 0xC2; mac[5] = 0x09
33 if nx_iot_classify_by_oui(mac) != NX_IOT_VENDOR_KASA { return 10 }
34 let mac2: *u8 = sys_mmap(8)
35 mac2[0] = 0x00; mac2[1] = 0x11; mac2[2] = 0x32 // Synology -- not an IoT vendor
36 if nx_iot_classify_by_oui(mac2) != NX_IOT_VENDOR_UNKNOWN { return 11 }
37
38 // ---- port classifier -------------------------------------------
39 if nx_iot_classify_by_port(9999) != NX_IOT_VENDOR_KASA { return 20 }
40 if nx_iot_classify_by_port(38899) != NX_IOT_VENDOR_WIZ { return 21 }
41 if nx_iot_classify_by_port(6668) != NX_IOT_VENDOR_TUYA { return 22 }
42 if nx_iot_classify_by_port(1234) != NX_IOT_VENDOR_UNKNOWN { return 23 }
43
44 // ---- reply-content classifier (escaped JSON literals) ----------
45 let ka_reply: *u8 = "{\"system\":{\"get_sysinfo\":{\"relay_state\":1,\"mic_type\":\"IOT.SMARTPLUGSWITCH\"}}}"
46 if nx_iot_classify_by_reply(ka_reply, nx_iot_cls_strlen(ka_reply)) != NX_IOT_VENDOR_KASA { return 30 }
47 let wz_reply: *u8 = "{\"method\":\"getPilot\",\"result\":{\"state\":true}}"
48 if nx_iot_classify_by_reply(wz_reply, nx_iot_cls_strlen(wz_reply)) != NX_IOT_VENDOR_WIZ { return 31 }
49 let tu_reply: *u8 = "{\"devId\":\"abc123\",\"dps\":{}}"
50 if nx_iot_classify_by_reply(tu_reply, nx_iot_cls_strlen(tu_reply)) != NX_IOT_VENDOR_TUYA { return 32 }
51 let un_reply: *u8 = "no known markers in here"
52 if nx_iot_classify_by_reply(un_reply, nx_iot_cls_strlen(un_reply)) != NX_IOT_VENDOR_UNKNOWN { return 33 }
53
54 // ---- fusion priority -------------------------------------------
55 // reply wins over a disagreeing oui
56 if nx_iot_classify_fuse(NX_IOT_VENDOR_WIZ, NX_IOT_VENDOR_KASA, NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN) != NX_IOT_VENDOR_WIZ { return 40 }
57 // no reply -> oui wins over port
58 if nx_iot_classify_fuse(NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_KASA, NX_IOT_VENDOR_TUYA, NX_IOT_VENDOR_UNKNOWN) != NX_IOT_VENDOR_KASA { return 41 }
59 // only ssid -> ssid
60 if nx_iot_classify_fuse(NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_TUYA) != NX_IOT_VENDOR_TUYA { return 42 }
61 // nothing -> UNKNOWN (triggers active probe / autonomous driver)
62 if nx_iot_classify_fuse(NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN, NX_IOT_VENDOR_UNKNOWN) != NX_IOT_VENDOR_UNKNOWN { return 43 }
63
64 // ---- end-to-end: the real HS210, all four signals agree --------
65 let v_ssid: i64 = nx_iot_classify_by_ssid(ka_ssid, nx_iot_cls_strlen(ka_ssid))
66 let v_oui: i64 = nx_iot_classify_by_oui(mac)
67 let v_port: i64 = nx_iot_classify_by_port(9999)
68 let v_reply: i64 = nx_iot_classify_by_reply(ka_reply, nx_iot_cls_strlen(ka_reply))
69 if nx_iot_classify_fuse(v_reply, v_oui, v_port, v_ssid) != NX_IOT_VENDOR_KASA { return 50 }
70
71 return 0
72}