-
Notifications
You must be signed in to change notification settings - Fork 0
/
server1.c
259 lines (246 loc) · 8.84 KB
/
server1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
/* @dark_jadeite
* 2018.7.22
* 测试用UDP发包器
* 默认条件:
* 1.起始DTUID为0
* 2.起始ModBus地址为0
* 3.默认发包频率1s
* 输入参数:
* 1.目标IP
* 2.目标端口
* 3.模拟DTU数量
* 4.每个ModBus总线模拟仪表数量
* 5.发包频率毫秒数
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <time.h>
#include <sys/time.h>
#define BUFF_SIZE 40
void error_handling(char *message);
typedef struct{
uint64_t DTU_number;
uint32_t FM_number;
}user_input;
char generate_modbus_data(int dtu_tmp,int fmaddr_tmp);
uint32_t ModBusCRC16(unsigned char *updata,unsigned int len);
char * get_str_time_now()
{
time_t now;
struct tm * timenow;
time(&now);
timenow=localtime(&now);
return asctime(timenow);
}
int main (int argc,char* argv[]){
//local socket descripter
int sock;
//server socket address
struct sockaddr_in server_addr;
struct sockaddr_in from_addr;
socklen_t addr_size;
uint8_t hostcode[8]={0};
//table to save accepted string
//length of accepted string
int str_len=0;
int IPlen;
char* IPaddress;
int i,j;
int sleep_time;
user_input setdata;
setdata.DTU_number=1000;
setdata.FM_number=30;
uint8_t message[BUFF_SIZE]={'3','5','6','5','6','6','0','7','0','9','0','3','4','4','0',0x08,0x03,0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0xbe,0xa6};
uint64_t dtu_tmp;
uint8_t fmaddr_tmp;
uint32_t round_set;
//check argc if the parameter is legal
//create client socket, set protocol and connect type
sock=socket(PF_INET,SOCK_DGRAM,0);
//initialize memory applyed by server_addr
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
if(argc < 3){
printf("未输入IP地址,将采用39.106.62.239:3389\n");
server_addr.sin_addr.s_addr=inet_addr("39.106.62.239");
server_addr.sin_port=htons(3389);
}else{
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
server_addr.sin_port=htons(atoi(argv[2]));
}
if(argc > 3){
setdata.DTU_number=atoi(argv[3]);
}
if(argc > 4){
if((setdata.FM_number=atoi(argv[4]))>256){
setdata.FM_number=255;
printf("单ModBus总线中仪表数量超出255会被修改为255\n");
}
}
if(argc > 5){
sleep_time=atoi(argv[5]);
printf("数据包发送间隔%dus\n",sleep_time);
// sleep_time*=1000;
}else
sleep_time=1000000;
if(argc > 6){
round_set=atoi(argv[6]);
printf("数据包发送%d\n",sleep_time);
// sleep_time*=1000;
}else
round_set=0xffffffff;
printf("DTU数量%ld\n",setdata.DTU_number);
printf("ModBus总线中仪表数量%d\n",setdata.FM_number);
printf("目标地址%s:%d\n",inet_ntoa(server_addr.sin_addr),ntohs(server_addr.sin_port));
//2018.7.17
//@dark_jadeite
//写完用户带参数输入的解析,小媳妇快饿死了,先去看看小媳妇。
//明天继续写根据用户输入来调整DTUID,和仪表地址
//还要把CRC校验的代码弄过来,在仪表伪装的部分有实现
int counter=0;
int round_counter=0;
while(1){
printf("开始一轮模拟当前时间%s",get_str_time_now());
for(dtu_tmp=1;dtu_tmp<=setdata.DTU_number;dtu_tmp++){
for(fmaddr_tmp=0;fmaddr_tmp<setdata.FM_number;fmaddr_tmp++){
memset(message,0x30,BUFF_SIZE);
sprintf(message,"%015d",dtu_tmp);
message[15]=fmaddr_tmp;
message[16]=3;
message[17]=20;
//这是5个数据都是222.1
//0x435e199a
for(i=0,j=0;i<5;i++){
message[18+j]=0x43;
message[19+j]=0x5e;
message[20+j]=0x19;
message[21+j]=0x9a;
j=i*4;
}
i=ModBusCRC16(message+15,23);
message[38] = i % 0x100;
message[39] = i % 0x10000 / 0x100;
// for(i=0;i<BUFF_SIZE;i++)
// printf("0x%x-",message[i]);
sendto(sock,message,BUFF_SIZE,0,(struct sockaddr *)&server_addr,sizeof(server_addr));
counter++;
// if(counter%0xffff==0)
// printf("\nMessage counte %d\n",counter);
usleep(sleep_time);
}
}
printf("\nMessage counte %d\n",counter);
round_counter++;
if(round_counter+1>round_set)
exit(0);
printf("\nround counte %d\n",round_counter);
printf("完成一轮模拟当前时间%s",get_str_time_now());
//sleep(3);
}
/*
// char * IPaddress=NULL;
// char message[]={"what's the fuck,where is my data???"};
for(i=0;i<1000;i++){
while(p != NULL){
hostcode[0] = ;//modbus地址p -> deviceNumber;
hostcode[1] = 0x03;
hostcode[2] = p -> startRegister % 0x10000 / 0x100;
hostcode[3] = p -> startRegister % 0x100;
i=0;
if(p -> modbusRegisterInfoHead)
p1=p -> modbusRegisterInfoHead;
else return 0;
while(p ->modbusRegisterInfoHead!= p1 -> next){
i+=p1->bytenum;
p1 = p1 ->next;
}
i/=2;
hostcode[4] = i % 0x10000 / 0x100;
hostcode[5] = i % 0x100;
j=ModBusCRC16(hostcode,6);
hostcode[6] = j % 0x100;
hostcode[7] = j % 0x10000 / 0x100;
}
*/
//print accepted message
close(sock);
return 0;
}
void error_handling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
/* CRC Check for ModBus
* CRC-16 x^16+x^15+x^2+x^0
* result code sequence big-endian
* initialize code 0xffff
* xor code 0x0000
* simple table and easy function
* * */
const unsigned char auchCRCHi[]=
{
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
};
const unsigned char auchCRCLo[] =
{
0x00,0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
uint32_t ModBusCRC16(unsigned char *updata,unsigned int len)
{
unsigned char uchCRCHi=0xff;
unsigned char uchCRCLo=0xff;
unsigned int uindex; //check if current thread threadPoolInfo's cmd is THREDFREE
while(len--)
{
uindex=uchCRCLo^*updata++;
uchCRCLo=uchCRCHi^auchCRCHi[uindex];
uchCRCHi=auchCRCLo[uindex];
}
return (uchCRCHi<<8|uchCRCLo);
}
/* CRC Check for ModBus
* CRC-16 x^16+x^15+x^2+x^0
* result code sequence big-endian
* initialize code 0xffff
* xor code 0x0000
* simple table and easy function
* * */