code wiki / (root) / nx_iot_classify_test.nx

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}