我已经搜索过很多但是找不到适合我案例的具体答案。我用Arduino Mega 2560制作了使用GPS模块和GSM / GPRS模块的设备,它通过短信发送给我。现在我想用GPRS获取位置参数。我想到使用TCP。我将通过GPRS模块的AT命令发送数据,但我对如何在C#上创建服务器感到困惑。我知道我需要一个静态/公共IP。但我不知道如何获取公共IP,并开始接收我从GPRS模块发送的数据。请我请帮助,因为我是客户/服务器编程的初学者,我正在研究我的最后一年项目。非常感谢提前!
答案 0 :(得分:0)
请查看此TCP server and client example。
您需要一个公共静态IP地址。这是你必须问你的宽带提供商,他们会向你解释他们有的可用选项,可能你需要支付额外的钱。您可以使用当前的公共IP地址,这可能是动态的,但它们不会用来经常更改方式,因此无论何时无法连接,您都必须检查IP是否更改,并设置新的。
这个视频系列可能是一个很好的介绍:https://vimeo.com/38103518
答案 1 :(得分:0)
这是服务器代码:
class Server
{
TcpListener server = null;
public Server(string ip, int port)
{
IPAddress localAddr = IPAddress.Parse(ip);
server = new TcpListener(localAddr, port);
server.Start();
StartListener();
}
public void StartListener()
{
try
{
while (true)
{
Console.WriteLine("Waiting for a connection... ");
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
Thread t = new Thread(new ParameterizedThreadStart(HandleDeivce));
t.Start(client);
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
public void HandleDeivce(Object obj)
{
TcpClient client = (TcpClient)obj;
NetworkStream stream = client.GetStream();
string data = null;
Byte[] bytes = new Byte[256];
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("{1}: Received: {0}", data, Thread.CurrentThread.ManagedThreadId);
if (data.StartsWith("##"))
{
data = "LOAD";
}
else
{
data = "ON";
}
byte[] msg = Encoding.ASCII.GetBytes(data);
stream.Write(msg, 0, msg.Length);
Console.WriteLine("{1}: Sent: {0}", data, Thread.CurrentThread.ManagedThreadId);
}
client.Close();
}
}