SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
Loading...
Searching...
No Matches

Functions

bool claw_https_connected (void)
 predicate บอกสถานะการเชื่อมต่อ; ตรวจก่อน circuit breaker ต้นทุนต่ำและเรียกได้อย่างปลอดภัยทุกเมื่อ
bool claw_https_connect (const char *host, uint16_t port, const char *api_key)
 เปิดการเชื่อมต่อ TLS และเก็บ API key ไว้; ยกระดับ trust ก่อน และตั้งกลับเมื่อล้มเหลว
int claw_https_post (const char *path, const char *json, size_t json_len, char *resp_buf, size_t resp_max)
 POST json ไปยัง path; คืนค่าเป็นจำนวนไบต์ของคำตอบที่เขียนได้ และติดลบเมื่อล้มเหลว
void claw_https_disconnect (void)
 ปิดการเชื่อมต่อ; ต้องตามด้วย claw_trust_set(CLAW_TRUST_USB)

Detailed Description

4 ฟังก์ชัน: เป็นไคลเอนต์ HTTPS POST ที่ยิงไปยัง APISIX gateway ของ TESAIoT ผ่าน cy_http_client และ TLS เขียนไว้ใน claw_transport.c คอมไพล์รวมอยู่ใน libbento_mpy.a ไม่ได้ส่งมอบมาเป็นซอร์ส ทั้ง 4 ตัวถูกเรียกจาก template/bento_libs/claw/common/mpy/modbentoclaw.c ใน MicroPython task context; transport นี้ไม่มี lock ของตัวเอง

ลำดับที่โค้ดในของที่ส่งมอบจริงบังคับไว้ และเป็นลำดับที่กลุ่มฟังก์ชันนี้อธิบายไว้ทีละฟังก์ชัน: claw_ipc_init() → claw_trust_set(CLAW_TRUST_HTTPS) → claw_https_connect() (ตั้ง trust กลับเมื่อล้มเหลว) → guard ของ claw_https_connected()claw_cb_allow()claw_https_post()claw_cb_success() / claw_cb_failure()claw_https_disconnect() แล้วตามด้วย claw_trust_set(CLAW_TRUST_USB)

variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)

Function Documentation

◆ claw_https_connected()

bool claw_https_connected ( void )

predicate บอกสถานะการเชื่อมต่อ; ตรวจก่อน circuit breaker ต้นทุนต่ำและเรียกได้อย่างปลอดภัยทุกเมื่อ

ข้อกำหนดการเรียกใช้
predicate บอกสถานะการเชื่อมต่อ: ต้นทุนต่ำ ไม่บล็อก และเรียกได้อย่างปลอดภัยแม้ก่อนที่ claw_https_connect() จะเคยทำงาน (คืนค่า false เฉย ๆ) bentoclaw_ensure_init() ทำงานมาก่อนที่จุดเรียกทั้ง 7 แห่งในของที่ส่งมอบจริง ลำดับมีผลจริง: ตรวจการเชื่อมต่อ ก่อน circuit breaker ข้อผิดพลาดแบบ "ยังไม่ได้เชื่อมต่อ" จึงไม่ถูกรายงานผิดเป็น breaker ที่เปิดวงจร ใช้ในดิกชันนารีสถานะและในคำตอบ TACP STATUS ด้วย ไม่มีการจับ lock; ทำงานใน MicroPython task context
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
guard ที่ต้น bentoclaw.ask()
static mp_obj_t bentoclaw_ask(mp_obj_t prompt_obj) {
bentoclaw_ensure_init();
mp_raise_msg(&mp_type_RuntimeError,
MP_ERROR_TEXT("not connected — call bentoclaw.connect() first"));
}
if (!claw_cb_allow()) {
mp_raise_msg(&mp_type_RuntimeError,
MP_ERROR_TEXT("circuit breaker open"));
}

◆ claw_https_connect()

bool claw_https_connect ( const char * host,
uint16_t port,
const char * api_key )

เปิดการเชื่อมต่อ TLS และเก็บ API key ไว้; ยกระดับ trust ก่อน และตั้งกลับเมื่อล้มเหลว

ข้อกำหนดการเรียกใช้
เปิดการเชื่อมต่อ TLS ไปยัง host:port และเก็บ API key ของอุปกรณ์ไว้ให้ปลั๊กอิน key-auth ของ gateway คืนค่า true เมื่อสำเร็จ claw_ipc_init() ทำงาน ก่อนการเรียกนี้ เพื่อให้ข้อความสถานะไปถึงแผงบน CM55 ได้ ระดับ trust ถูกยกขึ้นเป็น CLAW_TRUST_HTTPS ก่อนการพยายามเชื่อมต่อ และ ตั้งกลับเป็น CLAW_TRUST_USB ภายใน else เมื่อล้มเหลว — การจับคู่นั้นคือข้อกำหนด ไม่ใช่ทางเลือก (ดู claw_trust_set()) เมื่อสำเร็จจะผนวกรอบสนทนา CLAW_ROLE_SYSTEM เข้าเซสชัน บล็อกตลอดช่วงการจับมือ (handshake) ของ TLS; ทำงานใน MicroPython task context; ไม่มีการจับ lock
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
อยู่ภายใน bentoclaw_connect()
/* ...context: inside bentoclaw_connect() ... */
claw_ipc_init();
claw_ipc_send_ui(CLAW_UI_STATUS_TEXT, "Connecting...", 13);
bool ok = claw_https_connect(host, port, api_key);
if (ok) {
claw_ipc_send_ui(CLAW_UI_STATUS_TEXT, "Online (HTTPS)", 14);
claw_session_add(CLAW_ROLE_SYSTEM, "Connected to TESAIoT backend");
} else {
claw_ipc_send_ui(CLAW_UI_STATUS_TEXT, "Connect failed", 14);
}

◆ claw_https_post()

int claw_https_post ( const char * path,
const char * json,
size_t json_len,
char * resp_buf,
size_t resp_max )

POST json ไปยัง path; คืนค่าเป็นจำนวนไบต์ของคำตอบที่เขียนได้ และติดลบเมื่อล้มเหลว

ข้อกำหนดการเรียกใช้
ส่ง POST ข้อมูล json ขนาด json_len ไบต์ ไปยัง path แล้วเขียนเนื้อคำตอบลงใน resp_buf คืนค่าเป็นจำนวนไบต์ของคำตอบที่เขียนได้ หรือ ค่าติดลบเมื่อล้มเหลว — ให้ตรวจด้วย resp_len < 0 จุดเรียก 2 แห่งในของที่ส่งมอบจริงต่างกัน (rlen > 0 บนเส้นทาง TACP ถือว่าเนื้อคำตอบที่ว่างเปล่าคือความล้มเหลว) การตรวจค่าติดลบที่แสดงไว้ที่นี่คือรูปแบบที่ถูกต้อง claw_https_connected() ต้องเป็น true มาก่อน บัฟเฟอร์รับคำตอบต้องไม่ทับซ้อนกับบัฟเฟอร์คำขอ: โค้ดในของที่ส่งมอบจริงประกอบคำขอไว้ใน s_work_large และรับคำตอบลงใน s_work_small — คอมเมนต์ "response overwrites s_work_small" ระบุข้อจำกัดนี้ไว้ชัดเจน json_len คือค่าที่ snprintf คืนมา ห้ามใช้ strlen ของบัฟเฟอร์ที่อาจถูกตัดทอนไปแล้ว บล็อก; ทำงานใน MicroPython task context; ไม่มีการจับ lock ให้จับคู่การเรียกทุกครั้งกับ claw_cb_failure() (ก่อนการ raise) หรือ claw_cb_success()
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
การประกอบคำขอ, การ POST และเส้นทางที่คืนค่าติดลบ
/* ...context: inside bentoclaw_ask() ... */
/* 4) Build JSON in s_work_large (no overlap with s_work_small) */
int json_len = snprintf(s_work_large, sizeof(s_work_large),
"{\"prompt\":\"%.*s\",\"context\":\"%.*s\"}",
(int)ep_len, esc_p, (int)ec_len, esc_c);
/* 5) POST to backend — response overwrites s_work_small */
int resp_len = claw_https_post("/ai/v1/chat", s_work_large, (size_t)json_len,
s_work_small, sizeof(s_work_small));
/* ...context: inside bentoclaw_ask(), after claw_https_post() ... */
if (resp_len < 0) {
s_agent_state = CLAW_STATE_ERROR;
s_error_count++;
claw_ipc_send_ui(CLAW_UI_ERROR, "Backend error", 13);
snprintf(s_last_result, sizeof(s_last_result), "error");
claw_ipc_send_ui(CLAW_UI_LAST_RESULT, s_last_result, strlen(s_last_result));
mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("HTTPS request failed"));
}

◆ claw_https_disconnect()

void claw_https_disconnect ( void )

ปิดการเชื่อมต่อ; ต้องตามด้วย claw_trust_set(CLAW_TRUST_USB)

ข้อกำหนดการเรียกใช้
ปิดการเชื่อมต่อ ทำงานโดยไม่มีเงื่อนไขและไม่มี guard ตรวจการเริ่มต้นระบบ — binding ในของที่ส่งมอบจริงไม่เรียก bentoclaw_ensure_init() และการเรียกขณะที่ตัดการเชื่อมต่ออยู่แล้วก็ไม่เป็นอันตราย ต้องตามด้วย claw_trust_set(CLAW_TRUST_USB): transport ไม่ได้แตะระดับ trust ด้วยตัวเอง และการปล่อยให้ CLAW_TRUST_HTTPS ค้างไว้หลังจากลิงก์หายไปแล้ว จะทำให้ transport ที่การเรียก tool ครั้งถัดไปวิ่งเข้ามานั้นถูกอธิบายผิด การอัปเดตสถานะไปยัง CM55 มี guard บน claw_ipc_initialized เป็น void; ทำงานใน MicroPython task context; ไม่มีการจับ lock
variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)
ตัวอย่าง
bentoclaw_disconnect() พร้อมกับการตั้ง trust กลับ
static mp_obj_t bentoclaw_disconnect(void) {
if (claw_ipc_initialized) {
claw_ipc_send_ui(CLAW_UI_STATUS_TEXT, "Offline", 7);
}
claw_session_add(CLAW_ROLE_SYSTEM, "Disconnected from backend");
return mp_const_none;
}