本人单片机新手,之前要做有关智能家居方向的东西,硬着头皮把原理性的东西搞明白了,主要功能就是实现开发板上与远程服务器之间的通讯,同时利用手机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=root assword=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);
}
}
}
}
|