当前位置:   article > 正文

基于Linux-ARM的智能家具项目(3)--语音模块与TCP网络_linux 语音控制电器

linux 语音控制电器

前面两篇,我们介绍了工厂模式;以及工厂模式实际运用在灯上的案例,还有火灾线程,如果有遗忘的这里有传送门。

基于Linux-ARM的智能家具项目(2)-- 灯框架与火灾报警_废话少说~的博客-CSDN博客

基于Linux-ARM智能家居项目(1)--工厂模式_废话少说~的博客-CSDN博客

1、前言

这一节我们来介绍一哈怎么来控制这些灯,以及其他外设(火灾是线程实时监控,无需控制),这里我们选择语音与网络两种模式来控制。网络会用到安卓app,不过这里先介绍网络的框架,安卓app后期呈上。

2、语音模块

一、LDChip.c文件修改

(1)、这里我们的语音模块选择的是LD3320,使用串口的方式与树莓派联系,本模块的驱动程序已经是写好的,需要做的就是进行应用程序的修改,修改为可以进行灯控制的方式。

(2)、模块的使用,分为一级指令与二级指令,一级指令为语音模块的名字,二级指令为需要说的语音。模块出厂的名字叫“小杰”,可以自己修改,我修改为“小明同学”。

(3)、一级指令的修改,要依据原厂件的代码进行修改uint8 code sRecog[DATE_A][DATE_B] ,这里的第一条便是一级指令(也就是语音模块的名字,要先有一级指令,才能有二级指令),还要修改对应的地址码,这个也是在这个文件夹内,是uint8 code pCode[DATE_A],对应的CODE——CMD,后面这个地方还要进行修改,注意只能用拼音。

(4)、二级指令的修改,和一级指令一样,uint8 code sRecog[DATE_A][DATE_B],写上对应的修改词条,uint8 code pCode[DATE_A]表示对应的地址码。

  1. //打开LDChip.c文件夹
  2. uint8 LD_AsrAddFixed()
  3. {
  4. uint8 k, flag;
  5. uint8 nAsrAddLength;
  6. #define DATE_A 10 /*数组二维数值*/
  7. #define DATE_B 20 /*数组一维数值*/
  8. uint8 code sRecog[DATE_A][DATE_B] = {
  9. "xiao ming tong xue",\
  10. "kai chu fang deng",\
  11. "guan chu fang deng",\
  12. "kai er lou deng",\
  13. "guan er lou deng",\
  14. "kai ke ting deng",\
  15. "guan ke ting deng",\
  16. "wo hui jia le",\
  17. "da kai jian kong"
  18. }; /*添加关键词,用户修改*/
  19. uint8 code pCode[DATE_A] = {
  20. CODE_CMD,\
  21. CODE_KCFD,\
  22. CODE_GCFD,\
  23. CODE_KELD,\
  24. CODE_GELD,\
  25. CODE_KKTD,\
  26. CODE_GKTD,\
  27. CODE_WHJL,\
  28. CODE_DKJK
  29. }; /*添加识别码,用户修改*/

二、LDCHIP.c文件修改

(1)、这里便是对于地址的修改,注意0x00是一级指令,也就是名字,这里不能修改,其他根据上面的地址符号,对应,可以从0x01开始写

  1. //识别码客户修改处
  2. #define CODE_CMD 0x00 //该命令码0x00用户不可进行修改。
  3. #define CODE_KCFD 0x01 //开厨房灯
  4. #define CODE_GCFD 0x02 //关厨房灯
  5. #define CODE_KELD 0x04 //开二楼灯
  6. #define CODE_GELD 0x05 //关二楼灯
  7. #define CODE_KKTD 0x16 //开卧室灯
  8. #define CODE_GKTD 0x17 //关卧室灯
  9. #define CODE_WHJL 0x2f //开摄像头人脸识别
  10. #define CODE_DKJK 0x03 //打开监控
  11. //数值越大越灵敏识别距离越远,但误识别率就越大, 根据自己的实际情况调节。
  12. #define MIC_VOL 0x55 //咪头增益(灵敏度调节) 范围:00-7f
  13. #endif

三、main.c文件的修改

(1)、因为是使用串口打印,所以当识别成功后,要输出相应的值,这里在对应的switch的case中进行修改,还有在PrintCom写上要串口发生的值,因为这里后面这里发送后,会在树莓派中识别,然后进行相应的运行

  1. /***********************************************************
  2. * 名 称:用户执行函数
  3. * 功 能:识别成功后,执行动作可在此进行修改
  4. * 入口参数: 无
  5. * 出口参数:无
  6. * 说 明:
  7. **********************************************************/
  8. void User_handle(uint8 dat)
  9. {
  10. //UARTSendByte(dat);//串口识别码(十六进制)
  11. if(0==dat)
  12. {
  13. G0_flag=ENABLE;
  14. LED=0;
  15. PrintCom("receive !\r\n"); /*text.....*/
  16. }
  17. else if(ENABLE==G0_flag)
  18. {
  19. G0_flag=DISABLE;
  20. LED=1;
  21. switch(dat) /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/
  22. {
  23. case CODE_KCFD: /*命令“测试”*/
  24. PrintCom("1 KCFD\r\n"); /*text.....*/
  25. break;
  26. case CODE_GCFD: /*命令“全开”*/
  27. PrintCom("2 GCFD\r\n"); /*text.....*/
  28. break;
  29. case CODE_KELD: /*命令“复位”*/
  30. PrintCom("3 KELD\r\n"); /*text.....*/
  31. break;
  32. case CODE_GELD: /*命令“复位”*/
  33. PrintCom("4 GELD\r\n"); /*text.....*/
  34. break;
  35. case CODE_KKTD: /*命令“复位”*/
  36. PrintCom("5 KKTD\r\n"); /*text.....*/
  37. break;
  38. case CODE_GKTD: /*命令“复位”*/
  39. PrintCom("6 GKTD\r\n"); /*text.....*/
  40. break;
  41. case CODE_WHJL: /*命令“复位”*/
  42. PrintCom("7 WHJL\r\n"); /*text.....*/
  43. break;
  44. case CODE_DKJK: /*命令“复位”*/
  45. PrintCom("8 DKJK\r\n"); /*text.....*/
  46. break;
  47. default:PrintCom("请重新识别发口令\r\n"); /*text.....*/break;
  48. }
  49. }
  50. else
  51. {
  52. PrintCom("please say again once cmd\r\n"); /*text.....*/
  53. }
  54. }

四、烧录与语音口令

(1)、使用STC-ISP进行烧录,这里是使用51烧录,相信大家都会,烧录时候,记得拔插一哈GND这根线,方便烧录成功。

(2)、弄好之后,可以打开STC-ISP上面的串口助手,就可以显示,使用方法,以我的来举例。   eg:小明同学 开厨房灯;小明同学 关厨房灯。

(3)、注意:念了一级口令后,上面的知识点会变红,当变红了后,再说出二级口令。

3、树莓派串口编写

(1)、这里的串口模式我们也使用工厂模式来编写,不过在使用串口前,要在树莓派里面进行以下串口配置。

cd /boot

sudo vim cmdline.txt

删除部分内容 console=serial0,115200

然后重启,就可以进行串口模式的编写,还要记住串口要加上#include "wiringSerial.h"

(2)、使用工厂模式进行串口编写

usartinit.c文件,这里进行串口框架编写

  1. #include "InputCommand.h"
  2. /*
  3. #include <wiringSerial.h>
  4. fg=serialOpen("/dev/ttyAMA0",9600);
  5. struct Inputcommand{
  6. char commandName[128];
  7. char command[32];
  8. int (*Init)(char *name, char *ipAdress, char *port);
  9. int (*Getcommand)(char *cmd);
  10. char log[1024];
  11. struct Inputcommand *next;
  12. };
  13. */
  14. int voiceInit(struct Inputcommand *voicer,char *ipAdress, char *port){
  15. int fg;
  16. fg=serialOpen(voicer->toolname,9600);
  17. if(fg==-1){
  18. printf("ttyAMA0 init error\n");
  19. return -1;
  20. }
  21. voicer->fg=fg; //赋值
  22. return fg; //可能有问题,为什么不是返回的 voicer->fg
  23. }
  24. int voiceGetcommand(struct Inputcommand *voicecmd){
  25. int buf=0;
  26. memset(voicecmd->command , 0 , sizeof(voicecmd->command));
  27. buf=read(voicecmd->fg,voicecmd->command,sizeof(voicecmd->command));
  28. if(buf<=0){
  29. printf("time over\n"); //这样可以再来,不用退出
  30. //return -1;
  31. }
  32. return buf;
  33. }
  34. struct Inputcommand voice={
  35. .commandName="voicer",
  36. .command={"0"},
  37. .toolname="/dev/ttyAMA0",
  38. .fg=0,
  39. .Init=voiceInit,
  40. .Getcommand=voiceGetcommand
  41. };
  42. //链表
  43. struct Inputcommand *insertVoiceList(struct Inputcommand *phead){
  44. if(phead==NULL){
  45. phead=&voice;
  46. return phead;
  47. }else{
  48. voice.next=phead;
  49. phead=&voice;
  50. return phead;
  51. }
  52. }

 InputCommand.h文件,这里面存放结构体

  1. //这里面包含了网络和串口的,我就一起写了
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <wiringPi.h>
  5. #include <wiringSerial.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <string.h>
  10. #include <strings.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <pthread.h>
  14. struct Inputcommand{
  15. char commandName[128];
  16. char command[64];
  17. char toolname[128];
  18. int fg; //usart
  19. char port[12];
  20. char ip[32];
  21. int s_fd; //socket
  22. int accpetfg; //如果这里不行,就用全局变量
  23. int (*Init)(struct Inputcommand *voicer,char *ipAdress, char *port);
  24. int (*Getcommand)(struct Inputcommand *voicecmd);
  25. char log[1024];
  26. struct Inputcommand *next;
  27. };
  28. struct Inputcommand *insertVoiceList(struct Inputcommand *phead);
  29. struct Inputcommand *insertSocketList(struct Inputcommand *phead);

main.c文件

  1. #include "contrlDevices.h"
  2. #include "InputCommand.h"
  3. struct Inputcommand *socketHandler;
  4. struct Devices *head=NULL;
  5. struct Inputcommand *cmdhead=NULL; //因为子函数,要调用这个,所以全局变量
  6. typedef unsigned int bool;
  7. //设备查找
  8. struct Devices *foundDeviceslist(char *name,struct Devices *head ){
  9. struct Devices *tmp=head;
  10. if(head==NULL){
  11. printf("none is list\n");
  12. return NULL;
  13. }else{
  14. while(tmp !=NULL){
  15. if(strcmp(tmp->devicename,name) == 0){
  16. printf("find %s sussendfully\n",tmp->devicename);
  17. return tmp;
  18. }
  19. tmp=tmp->next;
  20. }
  21. printf("found %s error\n",name);
  22. return NULL;
  23. }
  24. }
  25. //命令查找
  26. struct Inputcommand *foundInputcommandlist(char *name,struct Inputcommand *head ){
  27. struct Inputcommand *tmp=head;
  28. if(head==NULL){
  29. printf("none is list\n");
  30. return NULL;
  31. }else{
  32. while(tmp !=NULL){
  33. if(strcmp(tmp->commandName,name) == 0){
  34. printf("find %s sussendfully\n",tmp->commandName);
  35. return tmp;
  36. }
  37. tmp=tmp->next;
  38. }
  39. printf("found %s error\n",name);
  40. return NULL;
  41. }
  42. }
  43. //语音
  44. void *voice_Thread(){
  45. struct Inputcommand *voiceHandler;
  46. struct Devices *tmp; //设备赋值
  47. pthread_t monitorThread;
  48. int nread;
  49. voiceHandler=foundInputcommandlist("voicer",cmdhead);
  50. if(voiceHandler==NULL){
  51. printf("voice can not found\n");
  52. pthread_exit(NULL);
  53. }else{
  54. if(voiceHandler->Init(voiceHandler,NULL,NULL)<0){
  55. printf("voice init error\n");
  56. pthread_exit(NULL);
  57. }else{
  58. printf("voice main work sussendfully\n");
  59. while(1){
  60. memset(voiceHandler->command,0,sizeof(voiceHandler->command));
  61. nread=voiceHandler->Getcommand(voiceHandler);
  62. if(nread<=0){
  63. printf("no voice date\n");
  64. }
  65. else if(strstr(voiceHandler->command,"receive") != NULL){
  66. printf("please say second cmd\n");
  67. }
  68. //printf("voice is %s\n",voiceHandler->command); //后续开发,就可以加在这个地方,因为 voiceHandler->command就是存放数据的地方,是一个数组,可以就是name
  69. else if(strstr(voiceHandler->command,"1") != NULL){
  70. tmp=foundDeviceslist("restaurantlight",head); //重头进去查询
  71. if(tmp !=NULL){
  72. //初始化引脚
  73. tmp->devicesinit(tmp->pin);
  74. tmp->open(tmp->pin);
  75. delayMicroseconds(1500000);
  76. printf("open the restaurantlight light\n");
  77. }
  78. }
  79. else if(strstr(voiceHandler->command,"2") != NULL){
  80. tmp=foundDeviceslist("restaurantlight",head); //重头进去查询
  81. if(tmp !=NULL){
  82. //初始化引脚
  83. tmp->devicesinit(tmp->pin);
  84. tmp->close(tmp->pin);
  85. printf("close the restaurantlight light\n");
  86. }
  87. }
  88. else if(strstr(voiceHandler->command,"3") != NULL){
  89. tmp=foundDeviceslist("upstairlight",head); //重头进去查询
  90. if(tmp !=NULL){
  91. //初始化引脚
  92. tmp->devicesinit(tmp->pin);
  93. tmp->open(tmp->pin);
  94. delayMicroseconds(1500000);
  95. printf("open the upstairlight light\n");
  96. }
  97. }
  98. else if(strstr(voiceHandler->command,"4") != NULL){
  99. tmp=foundDeviceslist("upstairlight",head); //重头进去查询
  100. if(tmp !=NULL){
  101. //初始化引脚
  102. tmp->devicesinit(tmp->pin);
  103. tmp->close(tmp->pin);
  104. printf("close the upstairlight light\n");
  105. }
  106. }
  107. else if(strstr(voiceHandler->command,"5") != NULL){
  108. tmp=foundDeviceslist("livingroomlight",head); //重头进去查询
  109. if(tmp !=NULL){
  110. //初始化引脚
  111. tmp->devicesinit(tmp->pin);
  112. tmp->open(tmp->pin);
  113. delayMicroseconds(1500000);
  114. printf("open the livingroomlight light\n");
  115. }
  116. }
  117. else if(strstr(voiceHandler->command,"6") != NULL){
  118. tmp=foundDeviceslist("livingroomlight",head); //重头进去查询
  119. if(tmp !=NULL){
  120. //初始化引脚
  121. tmp->devicesinit(tmp->pin);
  122. tmp->close(tmp->pin);
  123. printf("close the livingroomlight light\n");
  124. }
  125. }
  126. else if(strstr(voiceHandler->command,"9") != NULL){
  127. tmp=foundDeviceslist("bathroomlight",head);
  128. if(tmp !=NULL){
  129. //初始化引脚
  130. tmp->devicesinit(tmp->pin);
  131. tmp->open(tmp->pin);
  132. delayMicroseconds(1500000);
  133. printf("open the bathroomlight light\n");
  134. }
  135. }
  136. else if(strstr(voiceHandler->command,"10") != NULL){
  137. tmp=foundDeviceslist("bathroomlight",head);
  138. if(tmp !=NULL){
  139. //初始化引脚
  140. tmp->devicesinit(tmp->pin);
  141. tmp->close(tmp->pin);
  142. printf("close the bathroomlight light\n");
  143. }
  144. }
  145. //后续灯,直接加上,写入链表就完事了,很简单的
  146. }
  147. }
  148. }
  149. }
  150. void *fire_Thread(){
  151. int status;
  152. struct Devices *firetmp = NULL;
  153. struct Devices *buztmp = NULL;
  154. firetmp = foundDeviceslist("fire",head);
  155. if(firetmp != NULL){
  156. firetmp->devicesinit();
  157. }
  158. buztmp = foundDeviceslist("fengming",head);
  159. if(buztmp != NULL){
  160. buztmp->devicesinit();
  161. }
  162. while(1){
  163. status = firetmp->readstatus(firetmp->pinNum);
  164. if(status == 0){
  165. buztmp->open(buztmp->pinNum);
  166. delay(1000);
  167. }
  168. if(status == 1){
  169. buztmp->close(buztmp->pinNum);
  170. }
  171. }
  172. }
  173. int main(){
  174. pthread_t voiceThread; //线程最好少用参数
  175. pthread_t socketThread;
  176. pthread_t fireThread;
  177. if(wiringPiSetup()==-1){
  178. printf("wiringPi init error\n");
  179. return -1;
  180. }
  181. //设备控制初始化
  182. //struct Devices *head=NULL; 全局变量
  183. head=insertbathroomlightlist(head);
  184. head=insertupstairlightlist(head);
  185. head=insertlivingroomlightlist(head);
  186. head=insertrestaurantlightlist(head);
  187. head=insertfirelist(head);
  188. head=insertcamerafacelist(head);
  189. head=insertlockdoorlist(head);
  190. head=insertmonitortoollist(head);
  191. head=insertvocielist(head);
  192. //指令工程初始化
  193. //struct Inputcommand *cmdhead=NULL; 全局变量
  194. cmdhead=insertVoiceList(cmdhead);
  195. //语音线程
  196. pthread_create(&voiceThread, NULL, voice_Thread, NULL);
  197. //火灾
  198. pthread_create(&fireThread, NULL, fire_Thread, NULL);
  199. pthread_join(voiceThread,NULL);
  200. pthread_join(fireThread,NULL);
  201. }

这里我在main.c文件中写完了所有的控制,并且把之前输入模块控制,改成了语音控制,现在使用:小明同学 开二楼灯,就打开相应的灯。

4、socket网络编程

这里我们使用TCP网络编程来实现,也使用工厂模式来编写框架,后面会加上安卓app来控制,这里只介绍服务器框架。

socket.c文件 这里是网络框架

  1. #include "InputCommand.h"
  2. /*
  3. #include <wiringSerial.h>
  4. fg=serialOpen("/dev/ttyAMA0",9600);
  5. struct Inputcommand{
  6. char commandName[128];
  7. char command[32];
  8. int (*Init)(char *name, char *ipAdress, char *port);
  9. int (*Getcommand)(char *cmd);
  10. char log[1024];
  11. struct Inputcommand *next;
  12. };
  13. */
  14. int socketInit(struct Inputcommand *socketer,char *ipAdress, char *port){
  15. int sockfg;
  16. int bindfg;
  17. struct sockaddr_in sin; //这个不是文件描述符,是结构体而已 ,用于构建使用
  18. //socket
  19. sockfg=socket(AF_INET,SOCK_STREAM,0);//IPV4 ,TCP
  20. if(sockfg<0)
  21. {
  22. perror("socket error");
  23. return -1;
  24. }
  25. //struct jie_gou_ti == 0
  26. bzero(&sin,sizeof(sin));
  27. //bind
  28. sin.sin_family=AF_INET; //IPV4
  29. sin.sin_port=htons(atoi(socketer->port)); //socketer->port,这个是字符串,还需要把字符串转为整数int,才能把本地字节序弄成网络字节序
  30. sin.sin_addr.s_addr=inet_addr(socketer->ip); //IPV4 di_zhi
  31. //sin.sin_addr.s_addr=INADDR_ANY; //INADDR_ANY will find all IPV4
  32. bindfg=bind(sockfg,(struct sockaddr *)&sin ,sizeof(sin));
  33. if(bindfg<0) //right return 0 ,error return -1
  34. {
  35. perror("bind error");
  36. return -1;
  37. }
  38. //listen
  39. int listfg;
  40. listfg=listen(sockfg,5);//creat 11 list (5*2+1)
  41. if(listfg<0)
  42. {
  43. printf("listen error");
  44. return -1;
  45. }
  46. socketer->s_fd=sockfg;
  47. printf("socket listen sussendfully\n");
  48. return sockfg;
  49. }
  50. int socketGetcommand(struct Inputcommand *socketercmd){
  51. int accefg=-1;
  52. int nread=0;
  53. struct sockaddr_in cin;
  54. memset(&cin,0,sizeof(struct sockaddr_in));
  55. socklen_t socklend=sizeof(cin);
  56. accefg=accept(socketercmd->s_fd,(struct sockaddr *)&cin,&socklend); //socketercmd->s_fd 要用上面初始化的函数才可以进行,也就是上面一个的初始化过程 cin不是文件描述符
  57. if(accefg<0){
  58. perror("accept arror");
  59. return -1;
  60. }
  61. nread=read(accefg,socketercmd->command,sizeof(socketercmd->command)); //接收就是用新的了,如同 accept就是新的了 ,cin又不是文件描述符
  62. if(nread<0){
  63. printf("read error is <0 \n");
  64. return -1;
  65. }else if(nread==0){
  66. printf("socket time out\n");
  67. }else{
  68. printf("read is : %d \n",nread);
  69. }
  70. return nread;
  71. }
  72. struct Inputcommand socketer={
  73. .commandName="socket",
  74. .command={"0"},
  75. .port="5006",
  76. .ip="192.168.43.???",//这里写自己电脑的ip地址
  77. .s_fd=0,
  78. .accpetfg=0,
  79. .Init=socketInit,
  80. .Getcommand=socketGetcommand
  81. };
  82. //链表
  83. struct Inputcommand *insertSocketList(struct Inputcommand *phead){
  84. if(phead==NULL){
  85. phead=&socketer;
  86. return phead;
  87. }else{
  88. socketer.next=phead;
  89. phead=&socketer;
  90. return phead;
  91. }
  92. }

InputCommand.h文件,这里面存放结构体

  1. //这里面包含了网络和串口的,我就一起写了
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <wiringPi.h>
  5. #include <wiringSerial.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <string.h>
  10. #include <strings.h>
  11. #include <netinet/in.h>
  12. #include <arpa/inet.h>
  13. #include <pthread.h>
  14. struct Inputcommand{
  15. char commandName[128];
  16. char command[64];
  17. char toolname[128];
  18. int fg; //usart
  19. char port[12];
  20. char ip[32];
  21. int s_fd; //socket
  22. int accpetfg; //如果这里不行,就用全局变量
  23. int (*Init)(struct Inputcommand *voicer,char *ipAdress, char *port);
  24. int (*Getcommand)(struct Inputcommand *voicecmd);
  25. char log[1024];
  26. struct Inputcommand *next;
  27. };
  28. struct Inputcommand *insertVoiceList(struct Inputcommand *phead);
  29. struct Inputcommand *insertSocketList(struct Inputcommand *phead);

main.c文件

  1. void *read_Thread(){
  2. int nread;
  3. memset(socketHandler->command , 0 , sizeof(socketHandler->command));
  4. nread=read(socketHandler->accpetfg,socketHandler->command,sizeof(socketHandler->command)); //接收就是用新的了,如同 accept就是新的了 ,cin又不是文件描述符
  5. if(nread<0){
  6. perror("socket read");
  7. }else if(nread==0){
  8. printf("socket time out\n");
  9. }else{
  10. printf("read is : %d and %s \n",nread,socketHandler->command);
  11. }
  12. }
  13. void *socket_Thread(){
  14. pthread_t read;
  15. int accpetfg=0;
  16. struct sockaddr_in cin;// 配置
  17. memset(&cin,0,sizeof(struct sockaddr_in));
  18. socklen_t clen=sizeof(cin);
  19. socketHandler=foundInputcommandlist("socket",cmdhead);
  20. if(socketHandler==NULL){
  21. printf("socket not found \n");
  22. pthread_exit(NULL);
  23. }else{
  24. socketHandler->Init(socketHandler,NULL,NULL);
  25. printf("socket TCP main work sussendfully\n");
  26. while(1){
  27. socketHandler->accpetfg=accept(socketHandler->s_fd,(struct sockaddr *)&cin, &clen);
  28. pthread_create(&read,NULL,read_Thread,NULL);
  29. }
  30. }
  31. }
  32. int main(){
  33. pthread_t voiceThread; //线程最好少用参数
  34. pthread_t socketThread;
  35. pthread_t fireThread;
  36. if(wiringPiSetup()==-1){
  37. printf("wiringPi init error\n");
  38. return -1;
  39. }
  40. //指令工程初始化
  41. //struct Inputcommand *cmdhead=NULL; 全局变量
  42. cmdhead=insertSocketList(cmdhead);
  43. //socket
  44. pthread_create(&socketThread, NULL, socket_Thread, NULL);
  45. pthread_join(socketThread,NULL);
  46. }

这里我只写了网络需要写的,其实加上之前的main.c里面就可以,这里的main.c写的是伪代码。写好的可以通过网络调试助手进行检验。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/893445
推荐阅读
相关标签
  

闽ICP备14008679号