问题描述:
硬件:安信可科技WB2系列(基于BL602芯片)的AiPi-PalChatV1模组(烧录支持uart-mcp的固件bin:AiPi-PalChatV1_uart-mcp_WWXH_v3.0_20260106.bin) + 梁山派GD32F450(运行emMCP例程),串口连接。
现象:
- 当我对模组说“开灯”、“打开LED1”、“打开所有灯”等指令时,模组会语音回复类似“灯已打开”、“LED1已点亮”的内容,但开发板上的LED没有任何反应。
- 登录小智平台查看聊天历史,发现这些指令的回复都是普通的文本内容,没有任何工具调用的JSON记录(而之前说“放歌”时,平台有
search_music等工具的调用记录)。 - WiFi连接成功的JSON指令(如
{"role":"AI board","msgType":"status","data":"1.WiFi connect OK"})能被STM32正确接收并通过strstr匹配点亮LED,说明串口通信链路是通的。 - 当我说“开灯”等指令时,模组发送MCU这些json数据:"role":"AI board","msgType":"MCP Text"(后面省略),这说明云端将语音识别为普通文本对话,而不是一个需要调用工具的指令
关键证据:
✅ WiFi连接成功的JSON(如"1.WiFi connect OK")能被STM32收到并点亮LED,证明串口通信和硬件控制正常。
❌ 小智平台聊天历史中,“开灯”指令只有普通文本回复,无任何工具调用记录(而“放歌”指令有search_music等工具记录)。
核心疑问:
为什么云端没有将“开灯”识别为工具调用?
STM32端已用emMCP注册了“开发板LED”工具,如何确认工具列表是否成功上报到云端?
是否需要在小智平台手动为工具添加触发说法?如果需要在哪操作?平台界面看不到工具列表。
或者要AiPi-PalChatV1模组这边的程序也得二次开发?
求指点,感谢!
主函数和工具调用:
static void LED_ToolsRequestHandler(void *arg)
{
cJSON *param = (cJSON *)arg;
cJSON *led1 = cJSON_GetObjectItem(param, "led1");
// cJSON *led2 = cJSON_GetObjectItem(param, "led2");
// cJSON *led3 = cJSON_GetObjectItem(param, "led3");
// cJSON *led4 = cJSON_GetObjectItem(param, "led4");
// cJSON *led_all = cJSON_GetObjectItem(param, "led_all");
if (led1 != NULL)
{
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led1->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
// }
// if (led2 != NULL)
// {
// HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led2->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
// }
// if (led3 != NULL)
// {
// HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led3->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
// }
// if (led4 != NULL)
// {
// HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, led4->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
// }
// if (led_all != NULL)
// {
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, led_all->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, led_all->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, led_all->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, led_all->valueint ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
emMCP_ResponseValue(emMCP_CTRL_OK);
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick.
*/
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
SystemInit();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rxBuffer, RXBUFFER_SIZE_MAX);
__HAL_DMA_DISABLE_IT(huart2.hdmarx, DMA_IT_HT);
emMCP_Init(&emMCP); // Initialize MCP
LED_Tools.name = "开发板LED";
LED_Tools.description = "用于控制开发板的4颗LED灯";
LED_Tools.inputSchema.properties[0].name = "led1";
LED_Tools.inputSchema.properties[0].description = "控制LED1的亮灭,false为灭,true为亮";
LED_Tools.inputSchema.properties[0].type = MCP_SERVER_TOOL_TYPE_BOOLEAN;
// LED_Tools.inputSchema.properties[1].name = "led2";
// LED_Tools.inputSchema.properties[1].description = "控制LED2的亮灭,false为灭,true为亮";
// LED_Tools.inputSchema.properties[1].type = MCP_SERVER_TOOL_TYPE_BOOLEAN;
// LED_Tools.inputSchema.properties[2].name = "led3";
// LED_Tools.inputSchema.properties[2].description = "控制LED3的亮灭,false为灭,true为亮";
// LED_Tools.inputSchema.properties[2].type = MCP_SERVER_TOOL_TYPE_BOOLEAN;
// LED_Tools.inputSchema.properties[3].name = "led4";
// LED_Tools.inputSchema.properties[3].description = "控制LED4的亮灭,false为灭,true为亮";
// LED_Tools.inputSchema.properties[3].type = MCP_SERVER_TOOL_TYPE_BOOLEAN;
// LED_Tools.inputSchema.properties[4].name = "led_all";
// LED_Tools.inputSchema.properties[4].description = "控制所有LED的亮灭,false为灭,true为亮";
// LED_Tools.inputSchema.properties[4].type = MCP_SERVER_TOOL_TYPE_BOOLEAN;
LED_Tools.setRequestHandler = LED_ToolsRequestHandler;
emMCP_AddToolToToolList(&LED_Tools);
emMCP_RegistrationTools();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
emMCP_TickHandle(10);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
回调函数:
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart == &huart2)
{
// 复制数据到临时缓冲区(注意大小,避免溢出)
char temp[256];
uint16_t copy_len = (Size < sizeof(temp)-1) ? Size : sizeof(temp)-1;
memcpy(temp, rxBuffer, copy_len);
temp[copy_len] = '\0'; // 添加字符串结束符
// 检查是否包含联网成功的标志
if (strstr(temp, "role\":\"AI board\",\"msgType\":\"status\",\"data\":\"1.WiFi connect OK\"") != NULL)
{
HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_SET);
}
uartPortRecvData((char *)rxBuffer, Size);
HAL_UARTEx_ReceiveToIdle_DMA(&huart2, rxBuffer, RXBUFFER_SIZE_MAX);
__HAL_DMA_DISABLE_IT(huart2.hdmarx, DMA_IT_HT);
}
}
历史对话:
