单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1670|回复: 6
打印 上一主题 下一主题
收起左侧

原创 网络远程控制单片机四路继电器开关,查询四路温度传感器 含上位机源码

[复制链接]
跳转到指定楼层
楼主
通过互联网络TCP(pc机),远程控制四路继电器开关,和查询四路温度DS18B20传感器的温度

下位机使用的是51单片机
淘宝上淘的TCP转串口模块,和四路继电器模块(底电平触发)
电路上有5个指示灯
分别为:电源指示(通电亮)  运行指示灯(约1秒闪烁一次,表示单片机在工作)  联网指示(收到心跳表示联网,灯亮) 数据收发指示(有数据接收发送,闪烁)
下位机可以有同样的很多个(理论上65535个),为每个下位机编一个ID号来区分。

上位机使用C#语言编写,附件提供源码下载
下位机通电后自动使用TCP Socket连接上位机,指示灯可以观看状态
上位机上可以看到所有连接的下位机
以下位机ID,选择连接的下位机,控制下位机
因为没有那么多的下位机,所以又编了一个下位机的仿真,模仿很多下位机连接上位机

试验己成功!

代码有不合理的地方,谢谢大家纠正

上图










定义数据帧格式

      
        数据帧:一个帧由固定16个字节组成
    字节:一个字节由8位二进制组成,取值范围0-255
    1、规定:帧头1个字节,定值,二进制11111110,十进制 254,十六进制FE
    2、规定:帧尾1个字节,定值,二进制11111111,十进制 255,十六进制FF
    3、规定:设备ID_11个字节,取值范围0-255
    4、规定:设备ID_21个字节,取值范围0-255
    5、规定:控制位固定4个字节
    6、规定:数据位固定8个字节
   
   
   
服务端程序框图 停止服务


一、定义设备ID
  
名称
  
  
ID
  
  
密钥
  
  
备注
  
  服务器端
  
  {  0,0 }
  
  
  
  服务器占用的ID
  
  1号终端
  
  {  0,1 }
  
  {255,255,255,255,255,1}
  
  
  
  2号终端
  
  {  0,2 }
  
  {255,255,255,255,255,2}
  
  
  
  3号终端
  
  {  0,3 }
  
  {255,255,255,255,255,3}
  
  
  
  4号终端
  
  {  0,4 }
  
  {255,255,255,255,255,4}
  
  
  
  5号终端
  
  {  0,5 }
  
  {255,255,255,255,255,5}
  
  
  
  6号终端
  
  {  0,6 }
  
  {255,255,255,255,255,6}
  
  
  

二、定义控制位
  
名称
  
  
控制位
  
  
名称
  
  
控制位
  
  心跳
  
  {0,0,0,1}
  
  
  
  
  
  查询设备ID和密钥
  
  {0,0,0,2}
  
  返回设备ID和密钥
  
  {1,0,0,2}
  
  登录成功
  
  {0,0,0,3}
  
  登录失败
  
  {0,0,0,4}
  
  更新用户信息时间
  
  {0,0,0,9}
  
  返回更新用户信息时间
  
  {1,0,0,9}
  
  查询温度1
  
  {0,0,1,1}
  
  返回温度 1
  
  {1,0,1,1}
  
  查询温度2
  
  {0,0,1,2}
  
  返回温度 2
  
  {1,0,1,2}
  
  查询温度3
  
  {0,0,1,3}
  
  返回温度 3
  
  {1,0,1,3}
  
  查询温度4
  
  {0,0,1,4}
  
  返回温度  4
  
  {1,0,1,4}
  
  查询开关1
  
  {0,0,2,1}
  
  返回开关1状态
  
  {1,0,2,1}
  
  查询开关2
  
  {0,0,2,2}
  
  返回开关2状态
  
  {1,0,2,2}
  
  查询开关3
  
  {0,0,2,3}
  
  返回开关3状态
  
  {1,0,2,3}
  
  查询开关4
  
  {0,0,2,4}
  
  返回开关4状态
  
  {1,0,2,4}
  
  设置开关1
  
  {2,0,2,1}
  
  
  
  
  
  设置开关2
  
  {2,0,2,2}
  
  
  
  
  
  设置开关3
  
  {2,0,2,3}
  
  
  
  
  
  设置开关4
  
  {2,0,2,4}
  
  
  
  
  

三、定义数据位
  
名称
  
  
数据位
  
  
说明
  
  设备ID和密钥
  
  {0-2550-2550-2550-2550-2550-2550-2550-255}
  
  2位是设备ID,后6位是密钥
  
  打开开关
  
  {10000000}
  
  1是打开
  
  关闭开关
  
  {20000000}
  
  2是关闭
  
  返回温度
  
  {0-2550-255000000}
  
  前两位分别是DS18B20温度传感器高位和底位
  


单片机源程序如下:
  1. #include        "config.h"
  2. #include<ds1.h>
  3. #include<ds2.h>
  4. #include<ds3.h>
  5. #include<ds4.h>

  6. void UART_init();
  7. void PutFrame(uchar *TXStr);
  8. void DataFrame_Put_init();
  9. void TEMP_init_var();

  10. uchar dataFrame[16];            //定义数据帧长度为16个字节
  11. uchar dataFrame_RI;             //数据帧是否己读取标记

  12. uchar dataFrame_temp[16];            //数据帧临时缓冲区16个字节
  13. uchar dataFrame_temp_count;     //定义数据帧己接收的字节数

  14. //定义发送数据缓冲区
  15. uchar DataFrame_Put[16]={DATAFRAME_HEAD,DEVICEID_1,DEVICEID_2,0,0,0,0,0,0,0,0,0,0,0,0,DATAFRAME_TAIL};

  16. INT32U led1_count;         //运行指示灯倒计时变量
  17. uchar led1_count2;         //运行指示灯倒计时变量2
  18. INT32U led2_count;         //收到心跳倒计时变量
  19. INT32U led3_count;         //有数据接收倒计时变量
  20. INT32U led4_count;                   //有数据发送倒计时变量
  21. #define LED1_COUNT 15000
  22. #define LED2_COUNT 125000
  23. #define LED3_COUNT 100
  24. #define LED4_COUNT 100


  25. //存储温度的高8位和底8位
  26. uchar ds_M;
  27. uchar ds_L;
  28. //温度变量
  29. uchar symbol;    //符号位
  30. uchar hundreds;  //百位
  31. uchar decade;    //十位
  32. uchar unit;      //个位
  33. uchar decimal;   //小数1位

  34. void main()
  35. {
  36.         //串口初始化
  37.         UART_init();

  38.         while(1)
  39.         {
  40.                 //调试使用
  41.                 //uchar dataFrame[16] = {DATAFRAME_HEAD,DEVICEID_1,DEVICEID_2,0,0,1,1,0,0,0,0,0,0,0,0,DATAFRAME_TAIL};
  42.                 //dataFrame_RI = 1;          //执行时间2.17微妙

  43.                 //如果己接收到一帧数据
  44.                 if(dataFrame_RI == 1)        // 执行时间5.42微秒
  45.                 {        
  46.                         //收到心跳
  47.                     if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 1){
  48.                            //收到心跳
  49.                            DataFrame_Put[3] = 0;
  50.                            DataFrame_Put[4] = 0;
  51.                            DataFrame_Put[5] = 0;
  52.                            DataFrame_Put[6] = 1;
  53.                            PutFrame(&DataFrame_Put);
  54.                            led2_count = LED2_COUNT;
  55.                         }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 2){
  56.                           //收到查询设备id
  57.                            DataFrame_Put[3] = 1;
  58.                            DataFrame_Put[4] = 0;
  59.                            DataFrame_Put[5] = 0;
  60.                            DataFrame_Put[6] = 2;
  61.                            DataFrame_Put[7] = DEVICEID_1;
  62.                            DataFrame_Put[8] = DEVICEID_2;
  63.                            DataFrame_Put[9] = 255;
  64.                            DataFrame_Put[10] = 255;
  65.                            DataFrame_Put[11] = 255;
  66.                            DataFrame_Put[12] = 255;
  67.                            DataFrame_Put[13] = 002;
  68.                            DataFrame_Put[14] = 001;
  69.                            PutFrame(&DataFrame_Put);
  70.                            led3_count = LED3_COUNT;
  71.                            led4_count = LED4_COUNT;
  72.                         }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 0 && dataFrame[6] == 9){
  73.                            //收到更新用户信息时间,返回
  74.                            DataFrame_Put[3] = 1;
  75.                            DataFrame_Put[4] = 0;
  76.                            DataFrame_Put[5] = 0;
  77.                            DataFrame_Put[6] = 9;
  78.                            PutFrame(&DataFrame_Put);
  79.                            led3_count = LED3_COUNT;
  80.                            led4_count = LED4_COUNT;
  81.                     }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 1){         // 执行时间15.19 微秒
  82.                            //查询温度1:0 0 1 1
  83.                            TEMP_init_var();
  84.                            DS1_ReadWeather(&ds_M,&ds_L);
  85.                            Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
  86.                            DataFrame_Put[3] = 1;
  87.                            DataFrame_Put[4] = 0;
  88.                            DataFrame_Put[5] = 1;
  89.                            DataFrame_Put[6] = 1;
  90.                            DataFrame_Put[7] = symbol;
  91.                            DataFrame_Put[8] = hundreds;
  92.                            DataFrame_Put[9] = decade;
  93.                            DataFrame_Put[10] = unit;
  94.                            DataFrame_Put[11] = decimal;
  95.                            PutFrame(&DataFrame_Put);
  96.                            led3_count = LED3_COUNT;
  97.                            led4_count = LED4_COUNT;
  98.                         }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 2){
  99.                            //查询温度2:0 0 1 2
  100.                            TEMP_init_var();
  101.                            DS2_ReadWeather(&ds_M,&ds_L);
  102.                            Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
  103.                            DataFrame_Put[3] = 1;
  104.                            DataFrame_Put[4] = 0;
  105.                            DataFrame_Put[5] = 1;
  106.                            DataFrame_Put[6] = 2;
  107.                            DataFrame_Put[7] = symbol;
  108.                            DataFrame_Put[8] = hundreds;
  109.                            DataFrame_Put[9] = decade;
  110.                            DataFrame_Put[10] = unit;
  111.                            DataFrame_Put[11] = decimal;
  112.                            PutFrame(&DataFrame_Put);
  113.                            led3_count = LED3_COUNT;
  114.                            led4_count = LED4_COUNT;
  115.                     }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 3){         // 执行时间15.19 微秒
  116.                            //查询温度3:0 0 1 3
  117.                            TEMP_init_var();
  118.                            DS3_ReadWeather(&ds_M,&ds_L);
  119.                            Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
  120.                            DataFrame_Put[3] = 1;
  121.                            DataFrame_Put[4] = 0;
  122.                            DataFrame_Put[5] = 1;
  123.                            DataFrame_Put[6] = 3;
  124.                            DataFrame_Put[7] = symbol;
  125.                            DataFrame_Put[8] = hundreds;
  126.                            DataFrame_Put[9] = decade;
  127.                            DataFrame_Put[10] = unit;
  128.                            DataFrame_Put[11] = decimal;
  129.                            PutFrame(&DataFrame_Put);
  130.                            led3_count = LED3_COUNT;
  131.                            led4_count = LED4_COUNT;
  132.                     }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 1 && dataFrame[6] == 4){
  133.                            //查询温度4:0 0 1 4
  134.                            TEMP_init_var();
  135.                            DS4_ReadWeather(&ds_M,&ds_L);
  136.                            Convert_DS_weather(ds_M, ds_L, &symbol, &hundreds, &decade, &unit, &decimal);
  137.                            DataFrame_Put[3] = 1;
  138.                            DataFrame_Put[4] = 0;
  139.                            DataFrame_Put[5] = 1;
  140.                            DataFrame_Put[6] = 4;
  141.                            DataFrame_Put[7] = symbol;
  142.                            DataFrame_Put[8] = hundreds;
  143.                            DataFrame_Put[9] = decade;
  144.                            DataFrame_Put[10] = unit;
  145.                            DataFrame_Put[11] = decimal;
  146.                            PutFrame(&DataFrame_Put);
  147.                            led3_count = LED3_COUNT;
  148.                            led4_count = LED4_COUNT;
  149.                     }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 1){
  150.                            //查询开关1
  151.                            DataFrame_Put[3] = 1;
  152.                            DataFrame_Put[4] = 0;
  153.                            DataFrame_Put[5] = 2;
  154.                            DataFrame_Put[6] = 1;
  155.                           if(SW1 == 0){
  156.                            DataFrame_Put[7] = 1;         
  157.                           }else{
  158.                            DataFrame_Put[7] = 2;
  159.                           }
  160.                           PutFrame(&DataFrame_Put);
  161.                           led3_count = LED3_COUNT;
  162.                           led4_count = LED4_COUNT;
  163.                    }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 2){
  164.                            //查询开关2
  165.                            DataFrame_Put[3] = 1;
  166.                            DataFrame_Put[4] = 0;
  167.                            DataFrame_Put[5] = 2;
  168.                            DataFrame_Put[6] = 2;
  169.                           if(SW2 == 0){
  170.                            DataFrame_Put[7] = 1;         
  171.                           }else{
  172.                            DataFrame_Put[7] = 2;
  173.                           }
  174.                           PutFrame(&DataFrame_Put);
  175.                           led3_count = LED3_COUNT;
  176.                           led4_count = LED4_COUNT;
  177.                     }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 3){
  178.                            //查询开关3
  179.                            DataFrame_Put[3] = 1;
  180.                            DataFrame_Put[4] = 0;
  181.                            DataFrame_Put[5] = 2;
  182.                            DataFrame_Put[6] = 3;
  183.                            if(SW3 == 0){
  184.                              DataFrame_Put[7] = 1;         
  185.                            }else{
  186.                              DataFrame_Put[7] = 2;
  187.                            }
  188.                            PutFrame(&DataFrame_Put);
  189.                            led3_count = LED3_COUNT;
  190.                            led4_count = LED4_COUNT;
  191.                         }else if(dataFrame[3] == 0 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 4){
  192.                            //查询开关3
  193.                            DataFrame_Put[3] = 1;
  194.                            DataFrame_Put[4] = 0;
  195.                            DataFrame_Put[5] = 2;
  196.                            DataFrame_Put[6] = 4;
  197.                            if(SW4 == 0){
  198.                              DataFrame_Put[7] = 1;         
  199.                            }else{
  200.                              DataFrame_Put[7] = 2;
  201.                            }
  202.                            PutFrame(&DataFrame_Put);
  203.                            led3_count = LED3_COUNT;
  204.                            led4_count = LED4_COUNT;
  205.                         }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 1){
  206.                            //设置开关1
  207.                            if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  208.                                  SW1 = 0;
  209.                            }
  210.                            else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  211.                                    SW1 = 1;
  212.                            }
  213.                            led3_count = LED3_COUNT;
  214.                 }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 2){
  215.                            //设置开关2
  216.                            if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  217.                                  SW2 = 0;
  218.                            }
  219.                            else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  220.                                    SW2 = 1;
  221.                            }
  222.                            led3_count = LED3_COUNT;
  223.                     }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 3){
  224.                            //设置开关3
  225.                            if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  226.                                  SW3 = 0;
  227.                            }
  228.                            else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  229.                                    SW3 = 1;
  230.                            }
  231.                            led3_count = LED3_COUNT;
  232.                     }else if(dataFrame[3] == 2 && dataFrame[4] == 0 && dataFrame[5] == 2 && dataFrame[6] == 4){
  233.                            //设置开关4
  234.                            if(dataFrame[7] == 1 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  235.                                  SW4 = 0;
  236.                            }
  237.                            else if(dataFrame[7] == 2 && dataFrame[8] == 0 && dataFrame[9] == 0 && dataFrame[10] == 0 && dataFrame[11] == 0 && dataFrame[12] == 0 && dataFrame[13] == 0 && dataFrame[14] == 0){
  238.                                    SW4 = 1;
  239.                            }
  240.                            led3_count = LED3_COUNT;
  241.                         }
  242.                         dataFrame_RI = 0;     //置数据帧己读取
  243.                         DataFrame_Put_init(); //初始化发送帧,为下一次发送数据做准备
  244.                 }

  245.                  //LED1运行指示灯闪烁,整个循环在没有接收数据时,执行一次约40us
  246.                 if(led1_count > 0){
  247.                   led1_count--;
  248.                 }else{
  249.                   if(led1_count2 == 0){
  250.                     led1_count2 = 1;
  251.                   }else{
  252.                     led1_count2 = 0;
  253.                   }
  254.                   led1_count = LED1_COUNT;
  255.                 }
  256.                 if(led1_count > 0){
  257.                   if(led1_count2 == 0){
  258.                           LED1 = 0;
  259.                   }else{
  260.                     LED1 = 1;
  261.                   }
  262.                   led1_count--;                                    
  263.                 }

  264.                 //收到心跳灯亮20秒
  265.                 if(led2_count > 0){
  266.                   LED2 = 0;
  267.                   led2_count--;
  268.                 }else{
  269.                   LED2 = 1;
  270.                 }

  271.                 //有数据接收闪一下
  272.                 if(led3_count > 0){
  273.                   LED3 = 0;
  274.                   led3_count--;
  275.                 }else{
  276.                   LED3 = 1;
  277.                 }

  278.                 //有数据发送闪一下
  279.                 if(led4_count > 0){
  280.                   LED4 = 0;
  281.                   led4_count--;
  282.                 }else{
  283.                   LED4 = 1;
  284.                 }

  285.         }

  286.         while(1);
  287. }

  288. //初始化输出帧
  289. void DataFrame_Put_init(){
  290.    DataFrame_Put[3] = 0;
  291.    DataFrame_Put[4] = 0;
  292.    DataFrame_Put[5] = 0;
  293.    DataFrame_Put[6] = 0;
  294.    DataFrame_Put[7] = 0;
  295.    DataFrame_Put[8] = 0;
  296.    DataFrame_Put[9] = 0;
  297.    DataFrame_Put[10] = 0;
  298.    DataFrame_Put[11] = 0;
  299.    DataFrame_Put[12] = 0;
  300.    DataFrame_Put[13] = 0;
  301.    DataFrame_Put[14] = 0;
  302. }

  303. //初始化温度值
  304. void TEMP_init_var(){
  305.     ds_M = 0;
  306.     ds_L = 0;
  307.         symbol = 0;     //符号位
  308.         hundreds = 0;   //百位
  309.         decade = 0;     //十位
  310.         unit = 0;       //个位
  311.         decimal = 0;    //小数1位
  312. }

  313. //初始化
  314. void UART_init()
  315. {
  316.         TMOD = 0x20;          //T1工作模式2  8位自动重装
  317.         TH1 = 0xfd;
  318.         TL1 = 0xfd;         //比特率9600
  319.         TR1 = 1;                //启动T1定时器
  320.         SM0 = 0;
  321.         SM1 = 1;                 //串口工作方式1 10位异步
  322.         REN = 1;                //串口允许接收
  323.         EA  = 1;                //开总中断
  324.         ES  = 1;                //串口中断打开
  325. }

  326. //串口发送一帧数据函数,一帧16个字节
  327. void PutFrame(uchar *TXStr)  
  328. {   
  329.          uchar i = 0;
  330.          while(1){
  331.            SBUF=*TXStr;
  332.            while(TI == 0);  //对方接收后TI置1,停止等待
  333.            TI = 0;
  334.            i++;
  335.            if(i > 15){break;}
  336.            TXStr++;
  337.      }
  338. }

  339. void UART() interrupt 4
  340. {
  341.    if(RI)   //检测是否接收完成
  342.    {
  343.      uchar temp = SBUF;
  344.          RI = 0;
  345.          // 如果接收的一帧,第一个字节不是包头标志,则抛弃这个字节
  346.          if(dataFrame_temp_count == 0)
  347.          {
  348.             if(temp != DATAFRAME_HEAD)
  349.                         return;
  350. ……………………

  351. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
C#上位机源码资料包:


所有资料51hei提供下载:
温度检查.rar (851 KB, 下载次数: 60)



评分

参与人数 2黑币 +115 收起 理由
perfect123 + 15 赞一个!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 转播转播 分享分享 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
qzyhlf 发表于 2018-10-26 17:21 | 只看该作者

这个真是极好的,资料很宝贵,谢谢无私的分享!
回复

使用道具 举报

板凳
perfect123 发表于 2018-12-27 00:09 | 只看该作者
网络的最大问题是ip地址的不确定,咱没有固定的网址,你这样搞,能实现千里之外的有网就能控制吗?依旧是要借助网络平台的吧?
回复

使用道具 举报

地板
xxiaoshujjun 发表于 2019-1-28 14:02 来自手机 | 只看该作者
互联网那个模块有购买链接吗?想研究个基于它的继电器控制器
回复

使用道具 举报

5#
WFX777888 发表于 2019-2-12 19:31 | 只看该作者
谢谢分享资料
回复

使用道具 举报

6#
kangzhao 发表于 2019-3-15 23:53 来自手机
ip怎么搞定呀!主要是连外网

7#
 楼主| duwen009 发表于 2019-3-31 14:19 | 只看该作者
perfect123 发表于 2018-12-27 00:09
网络的最大问题是ip地址的不确定,咱没有固定的网址,你这样搞,能实现千里之外的有网就能控制吗?依旧是要 ...

下位机主动连接上位机,用域名来连接,就可以了。
回复

使用道具 举报

8#
 楼主| duwen009 发表于 2019-3-31 14:20 | 只看该作者
xxiaoshujjun 发表于 2019-1-28 14:02
互联网那个模块有购买链接吗?想研究个基于它的继电器控制器

到淘宝上找到了,我用的这个牌子是 友人 的。好象是六七十块钱一个。也有便宜点的,因为是试验,所以买个好点的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表