OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5822|回复: 5

STM32网络ENC28J60实验(扩展智能家居应用)

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-4-3
在线时间
0 小时
发表于 2015-4-3 13:27:30 | 显示全部楼层 |阅读模式
本人单片机新手,之前要做有关智能家居方向的东西,硬着头皮把原理性的东西搞明白了,主要功能就是实现开发板上与远程服务器之间的通讯,同时利用手机APP连接服务器,实现手机发送指令控制开发板的功能,以及手机查询开发板发送的数据,此次学习参考了好多网上关于智能家居的优秀帖子,现在把主要流程给大家分享下,希望对初学者有所帮助,共同进步。
1.客户端实现

在有网络接口情况下,采用原子哥的ENC28J60教程稍加改动即可,在无网口情况下,用SIM900A-GPRS模块也可以实现开发板上网功能。客户端主要发送传感器的数据,并接受服务器发过来的指令,开发板上网的功能好多资料都已经说的很详细了
2.服务器端实现

网络服务器采用APPserv实现服务器与网络的连接,结合MySQL数据库作为数据存储,手机通过上网连接到服务器中,发送控制指令到数据库,同时服务器把数据库中的数据返回给手机,实现手机和服务器的通讯。

服务器与开发板通讯部分采用C#编写,实现数据通讯。开发板的数据实时上传更新到数据库表中,同时服务器从数据库中查询手机的控制指令,再返还给开发板,实现手机远程控制开发板功能。其中包括一些TCP/IP协议,DNS,网关,路由器端口映等网络概念需要提前了解,服务器与开发板连接C#代码附件如下。

最终实现手机控制开发板的功能:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
//添加用于Socket的类
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Threading;
namespace ConsoleApplication2
{
    class Program
    {
        public static int port = 8500;
        public static string host = "192.168.1.150";
        public static IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
        public static IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例
        public static Thread SendMessage, ReceiveMessage;       //,ConnectClient;

        public static Socket s;  /**/
        ///创建socket并开始监听

        static void Main(string[] args)
        {

            Thread ConnectClient = new Thread(connectclient);
            ConnectClient.Start();
        }
        public static void connectclient()
        {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
            s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)

            Console.WriteLine("等待客户端连接");
            while (true)
            {
                try
                {
                    s.Listen(8);
                    //Console.WriteLine("建立连接1");
                    Socket client = s.Accept();
                    SendMessage = new Thread(sendmessage);
                    ReceiveMessage = new Thread(receivemessage);
                    SendMessage.Start(client);
                    ReceiveMessage.Start(client);
                    ///     SendMessage.Abort();
                    ///    ReceiveMessage.Abort();
                }
                catch (Exception e)
                {
                    s.Close();
                    Console.WriteLine(e.ToString());
                    Console.WriteLine("chu cuo le ");
                }
            }
        }

        public static void sendmessage(object obj)
        {
            Socket temp = (Socket)obj;//为新建连接创建新的socket

            // Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
            // s.Bind(ipe);//绑定EndPoint对像(2000端口和ip地址)
            // s.Listen(8);
            /**/
            ///接受到client连接,为此连接建立新的socket,并接受信息
            // Socket temp =s.Accept();//为新建连接创建新的socket
            Console.WriteLine("发送数据到客户端");
            try
            {
                while (true)
                {

                    MySqlConnection mysql = getMySqlCon();////首先连接数据库:getmysqlcon();接下来获得操作数据库的命令:getsqlcommand();最后,执行指令:getinsert(),getupdate(),getresult();
                    //查询sql
                    String sqlSearch = "select content,email,sex from lyb";  //   String sqlSearch = "select content from lyb where id=221";

                    MySqlCommand mySqlCommand = getSqlCommand(sqlSearch, mysql);
                    //MySqlCommand mySqlCommand = getSqlCommand(sqlInsert, mysql);
                    //MySqlCommand mySqlCommand = getSqlCommand(sqlUpdate, mysql);// String sqlUpdate = "update student set name='李四' where id= 3";
                    //MySqlCommand mySqlCommand = getSqlCommand(sqlDel, mysql);

                    mysql.Open();
                    // string sss= getResultset(mySqlCommand);
                    //getInsert(mySqlCommand);
                    //getUpdate(mySqlCommand);
                    // getDel(mySqlCommand);
                    //记得关闭

                    MySqlDataReader reader = mySqlCommand.ExecuteReader();
                    //  string qureyresult = "";
                    if (reader.Read())//首先读取reader.Read(),接着判断是否有数据,并进行取出来,然后发送;
                    {
                        if (reader.HasRows)
                        {
                            //Console.WriteLine("发送成功 ");
                            //  Console.WriteLine(reader.GetInt32(0));
                            Console.WriteLine(reader[1].ToString());
                            string qureyresult = reader[1].ToString();
                            Console.WriteLine("发送成功 ");          // string sendStr = "ok!the sever had send message to client!";
                            byte[] bs = Encoding.ASCII.GetBytes(qureyresult);
                            temp.Send(bs, bs.Length, 0);//返回信息给客户端
                        }
                    }

                    mysql.Close();
                    Thread.Sleep(2000);
                    //String readLine = Console.ReadLine();
                }
            }
            catch (Exception e)
            {
                // temp.Close();

                Console.WriteLine(e.ToString());
                SendMessage.Abort();
            }


        }

        public static void receivemessage(object obj)
        {
            Socket temp = (Socket)obj;//为新建连接创建新的socket
            while (true)
            {
                try
                {
                    string recvStr = "";
                    byte[] recvBytes = new byte[1024];
                    int bytes;
                    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

                    Console.WriteLine("接受到的数据是:{0}", recvStr);
                    /**/
                    ///给client端返回信息

                    //数据库操作:把从客户端接收到的数据recvStr更新到数据库中

                    string num = recvStr;                //int num = bytes; string num = recvStr;  
                    // declare @id char(10)
                    MySqlConnection mysql = getMySqlCon();////首先连接数据库:getmysqlcon();接下来获得操作数据库的命令:getsqlcommand();最后,执行指令:getinsert(),getupdate(),getresult();

                    //修改sql
                    String sqlUpdate = "update lyb set content='" + num + "' where id=221 ";  // String sqlUpdate = "update student set name='李四' where id= 3";变量的加入采用‘“+ 变量名+”’

                    //四种语句对象
                    // MySqlCommand mySqlCommand = getSqlCommand(sqlSearch, mysql);
                    //MySqlCommand mySqlCommand = getSqlCommand(sqlInsert, mysql);
                    MySqlCommand mySqlCommand = getSqlCommand(sqlUpdate, mysql);// String sqlUpdate = "update student set name='李四' where id= 3";
                    //MySqlCommand mySqlCommand = getSqlCommand(sqlDel, mysql);
                    mysql.Open();

                    getUpdate(mySqlCommand);

                    Console.WriteLine("接受并更新到数据库成功! ");
                    Thread.Sleep(2000);
                    mysql.Close();
                }
                catch (Exception e)
                {
                    temp.Close();
                    Console.WriteLine(e.ToString());
                    ReceiveMessage.Abort();
                }
                //String readLine = Console.ReadLine();
            }
        }


        public static MySqlConnection getMySqlCon()
        {
            String mysqlStr = "Database=test;Data Source=127.0.0.1;User Id=rootassword=111111;pooling=false;CharSet=utf8;port=3306";
            // String mySqlCon = ConfigurationManager.ConnectionStrings["MySqlCon"].ConnectionString;
            MySqlConnection mysql = new MySqlConnection(mysqlStr);
            return mysql;
        }
        /// <summary>
        /// 建立执行命令语句对象
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="mysql"></param>
        /// <returns></returns>
        public static MySqlCommand getSqlCommand(String sql, MySqlConnection mysql)
        {
            MySqlCommand mySqlCommand = new MySqlCommand(sql, mysql);
            //  MySqlCommand mySqlCommand = new MySqlCommand(sql);
            // mySqlCommand.Connection = mysql;
            return mySqlCommand;
        }
        /// <summary>
        /// 查询并获得结果集并遍历
        /// </summary>
        /// <param name="mySqlCommand"></param>
        public static string getResultset(MySqlCommand mySqlCommand)
        {
            MySqlDataReader reader = mySqlCommand.ExecuteReader();



            //  list_tblName = new List<string>();
            while (reader.Read())
            {
                if (reader.HasRows)
                {
                    Console.WriteLine(reader[0].ToString());//由于选择了数据库中的content,email和sex这三个数,因此reader数组里面有三个元素,分别输出即可。
                    Console.WriteLine(reader[1].ToString());
                    Console.WriteLine(reader[2].ToString());
                    Console.WriteLine(reader.GetEnumerator());
                    Console.WriteLine(reader.GetString(0));


                }

            }
            // Console.WriteLine("chaxuejieguo");

            reader.Close();

            return reader[1].ToString();
        }
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="mySqlCommand"></param>
        public static void getInsert(MySqlCommand mySqlCommand)
        {
            try
            {
                mySqlCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                String message = ex.Message;
                Console.WriteLine("插入数据失败了!" + message);
            }

        }
        /// <summary>
        /// 修改数据
        /// </summary>
        /// <param name="mySqlCommand"></param>
        public static void getUpdate(MySqlCommand mySqlCommand)
        {
            try
            {
                mySqlCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                String message = ex.Message;
                Console.WriteLine("修改数据失败了!" + message);
            }
            // Console.WriteLine("哎呀我来个去,成功了");
            //Console.ReadLine();
        }
        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param name="mySqlCommand"></param>
        public static void getDel(MySqlCommand mySqlCommand)
        {
            try
            {
                mySqlCommand.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                String message = ex.Message;
                Console.WriteLine("删除数据失败了!" + message);
            }
        }


    }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-4-3 17:59:34 | 显示全部楼层
厉害,顶啊!!!!!
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-3 22:31:30 | 显示全部楼层
不错啊,能多分享点资料就好了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-6-30
在线时间
7 小时
发表于 2015-4-3 22:55:45 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
共享项目,有送板子吗?呵呵,好想要一个F4
我想安安静静做个美男子
回复 支持 反对

使用道具 举报

3

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-8-27
在线时间
3 小时
发表于 2015-4-3 23:08:54 | 显示全部楼层
回复【4楼】Qlin:
---------------------------------
这必须顶啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-4-3 23:14:06 | 显示全部楼层
回复【4楼】Qlin:
---------------------------------
没板子送哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 03:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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