前言:该部分是补充部分,主要是对于第二部分(输入部分)代码的相似处理的解释。其中相似的代码主要是灯光控制函数、添加设备节点函数、设备节点的查找函数。
灯光控制函数:
void voicLitCrl(char *strCommand)
{
int str_status;
struct controlDev* str_Dev = NULL;
if(strcmp("get",strCommand) == 0){
printf("Xiao Ai Ready\n");
}
else
{
if(strcmp("KYSD", strCommand) == 0){
if((str_Dev = findDevName("showerRomLitght", pheadDev)) == NULL) return;
str_Dev->open(str_Dev->pinNum);
str_Dev->status = LOW;
printf("ShowerRoom Light is opening\n");
}
if(strcmp("KWSD",strCommand) == 0){
if((str_Dev = findDevName("bedRomLight", pheadDev)) == NULL) return;
str_Dev->open(str_Dev->pinNum);
str_Dev->status = LOW;
printf("BedRoom Light is opening\n");
}
if(strcmp("KCTD",strCommand) == 0){
if((str_Dev = findDevName("kitchenLight", pheadDev)) == NULL) return;
str_Dev->open(str_Dev->pinNum);
str_Dev->status = LOW;
printf("KitchenRoom Light is opening\n");
}
if(strcmp("KELD",strCommand) == 0){
if((str_Dev = findDevName("upstairLight", pheadDev)) == NULL) return;
str_Dev->open(str_Dev->pinNum);
str_Dev->status = LOW;
printf("UpstairRoom Light is opening\n");
}
if(strcmp("GYSD",strCommand) == 0){
if((str_Dev = findDevName("showerRomLitght", pheadDev)) == NULL) return;
str_Dev->close(str_Dev->pinNum);
str_Dev->status = HIGH;
printf("ShowerRoom Light is closeing\n");
}
if(strcmp("GWSD",strCommand) == 0){
if((str_Dev = findDevName("bedRomLight", pheadDev)) == NULL) return;
str_Dev->close(str_Dev->pinNum);
str_Dev->status = HIGH;
printf("BedRoom Light is closeing\n");
}
if(strcmp("GCTD",strCommand) == 0){
if((str_Dev = findDevName("kitchenLight", pheadDev)) == NULL) return;
str_Dev->close(str_Dev->pinNum);
str_Dev->status = HIGH;
printf("KitchenRoom Light is closeing\n");
}
if(strcmp("GELD",strCommand) == 0){
if((str_Dev = findDevName("upstairLight", pheadDev)) == NULL) return;
str_Dev->close(str_Dev->pinNum);
str_Dev->status = HIGH;
printf("UpstairRoom Light is closeing\n");
}
}
}
在语音模块处,我设置识别成功返回的字符串是:KYSD\n,识别成功后,找到相应的控制设备节点进行控制即可。
添加设备节点函数:
struct InputCommander* addVoiceInLink(struct InputCommander* phead)
{
if(phead == NULL){
phead = &voiceCol;
}else{
voiceCol.next = phead;
phead = &voiceCol;
}
return phead;
}
对于输入设备的管理采用链表的形式,链表的操作无非就是增删改查,上述代码是对于链表的创建,若链表是空的,现需要加入的结构体作为链表头;否则,插入至链表头前,作为新的链表头返回。
有添加,当然就需要用到查找,当相应的线程需要用到相对应的输入设备成员的结构体时,通过comName进行查找即可,代码如下:
struct InputCommander* findInputName(char *inputName, struct InputCommander* pheadInput)
{
struct InputCommander* str = pheadInput;
if(pheadInput == NULL){
printf("%s :NULL\n", inputName);
}else{
while(str != NULL){
if(strcmp(str->comName,inputName) == 0){
return str;
}
str = str->next;
}
}
return NULL;
}
对于参数传入需要传入需要查找的设备节点名:例如语音模块的.comName = "voice",我需要传入voice,以及遍历所在链表来找到它。
补充:为了测试socket,补充一个 client.c 客户端程序:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
/*Usage: ./file_name [ipAddr] [port]*/
int main(int argc, char **argv)
{
if (argc != 3)
printf("example: %s [ipAddr] [port]\n", argv[0]);
exit(-1);
int c_fd;
int ret;
int size = sizeof(struct sockaddr_in);
char msg[32] = {'\0'};
struct sockaddr_in c_addr;
memset(&c_addr, 0, size);
if((c_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
perror("socket\n");
exit(-1);
printf("1\n");
c_addr.sin_family = AF_INET;
c_addr.sin_port =htons(atoi(argv[2]));
inet_aton(argv[1], &c_addr.sin_addr);
if(connect(c_fd, (struct sockaddr *)&c_addr, size) == -1){
perror("connect\n");
exit(-1);
}
printf("connect...\n");
while(1)
{
memset(msg, 0, sizeof(msg));
gets(msg);
write(c_fd, msg, sizeof(msg));
fflush(stdout);
sleep(1);
}
return 0;
}
文章介绍了一个智能家居系统中用于控制灯光的函数,包括开启和关闭不同房间的灯光。此外,还讨论了如何通过链表管理输入设备,如添加设备节点和查找设备节点的功能。同时,提供了一个简单的客户端程序示例,用于测试socket连接。
&spm=1001.2101.3001.5002&articleId=129867783&d=1&t=3&u=1610840e52a04667ba10d1d6dd9603bd)
2143

被折叠的 条评论
为什么被折叠?



