嵌入式linux连接onenet平台edp简单示例
这里分享一个基于onenet edp协议上传系统时间的示例,这里用的野火的imx6ull和原子的兼容
main.c
#include "edp.h"
#include "tcp.h"
#include <unistd.h>
#include <stdio.h>
#include<time.h> //C语言的头文件
int main()
{
unsigned char buff[100] = {0},sendbuff[100] = {0},send_len = 0;
time_t now; //实例化time_t结构
struct tm *timenow; //实例化tm结构指针
Edp_Init(); //edpÐÒé³õÊŒ»¯
tcp_init(); //tcp³õÊŒ»¯
//Ɯ̚ŒøÈšÉÏÏß
send_len = edp_conect(sendbuff);
tcp_send(sendbuff, send_len);
while(1)
{
time(&now);
timenow = localtime(&now);
printf("get time:%s \n",asctime(timenow));
memset(buff,0,100);
//sprintf(buff,"time,%d",timenow->tm_sec);//Ìî³äÐÒé
sprintf(buff,"time,%s",asctime(timenow));//Ìî³äÐÒé
memset(sendbuff,0,100);
send_len = edp_updata(sendbuff, buff, sizeof(buff));
tcp_send(sendbuff, send_len);
sleep(2);
}
}
tcp.c
```c
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Í·ÎÄŒþÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//-------tcpÏà¹ØÍ·ÎÄŒþ------
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> //close()
#include <string.h> //strcmp()µÈ×Ö·ûŽ®²Ù×÷º¯Êý
#include <stdlib.h> //atoi() ×Ö·ûŽ®×ªint
static int socket_fd = -1;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
º¯Êý¶šÒåÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//¹Ø±ÕtcpÅäÖóõÊŒ»¯º¯Êý
//²ÎÊý void
//·µ»Ø void
int tcp_init(void)
{
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if(socket_fd == -1)
{
perror("socket failed!\n");
return -1;
}
struct sockaddr_in server_addr = {0};
//·þÎñÆ÷µÄµØÖ·ÐÅÏ¢
server_addr.sin_family = AF_INET;//IPv4ÐÒé
server_addr.sin_port = htons(876);//·þÎñÆ÷¶Ë¿ÚºÅ
server_addr.sin_addr.s_addr = inet_addr("183.230.40.39");//ÉèÖ÷þÎñÆ÷
int ret = connect(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if(ret == -1)
{
perror("connect failed!\n");
return -1;
}
else
{
printf("connect server successful!\n");
}
return 0;
}
int tcp_send(char *buf,int len)
{
write(socket_fd, buf, len);//·¢ËÍÏûÏ¢
}
int tcp_rcv(char *buf,int len)
{
int ret = 0;
ret = recv(socket_fd, buf, len, 0);
if(ret < 0)
{
perror("recv\n");
close(socket_fd);
return -1;
}
return ret;
}
//¹Ø±ÕtcpÁ¬œÓº¯Êý
//²ÎÊý void
void close_tcp(void)
{
close(socket_fd);
socket_fd = -1;
}
edp.c
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Í·ÎÄŒþÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
œÓ¿Ú¶šÒåÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
volatile unsigned char DEVIES_NUM[15] = "578347916";
volatile unsigned char API_KEY[40] = "imVyC=oCPlM1Tw9od=h4f5PrlMY=";//
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
±äÁ¿¶šÒåÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
static unsigned char EDP_CONENCT_BUF[100];
static unsigned char EDP_SEND_BUF[200];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
º¯Êý¶šÒåÇø
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
static unsigned char str_cnt(char *s)
{
unsigned char len = 0;
while((*s) != 0)
{
s++;
len++;
}
return len;
}
static void str_cpy(unsigned char *s1,unsigned char *s2,unsigned char len)
{
unsigned char i = 0;
while(i < len)
{
s1[i] = s2[i];
i++;
}
}
void Edp_Init(void)
{
unsigned char apikey_len,deviesnum_len,tmp;
//Á¬œÓÏûÏ¢buf³õÊŒ»¯
EDP_CONENCT_BUF[0] = 0X10;//Á¬œÓÔÆÏûÏ¢ÀàÐÍ
apikey_len = str_cnt(API_KEY);
deviesnum_len = str_cnt(DEVIES_NUM);
EDP_CONENCT_BUF[1] = apikey_len + deviesnum_len + 13;
EDP_CONENCT_BUF[2] = 0X00;
EDP_CONENCT_BUF[3] = 0X03;
EDP_CONENCT_BUF[4] = 0X45;
EDP_CONENCT_BUF[5] = 0X44;
EDP_CONENCT_BUF[6] = 0X50;
EDP_CONENCT_BUF[7] = 0X01;
EDP_CONENCT_BUF[8] = 0X40;
EDP_CONENCT_BUF[9] = 0X01;
EDP_CONENCT_BUF[10] = 0X2C;
EDP_CONENCT_BUF[11] = 0X00;
EDP_CONENCT_BUF[12] = deviesnum_len;
str_cpy(&EDP_CONENCT_BUF[13], DEVIES_NUM, deviesnum_len);
EDP_CONENCT_BUF[(13+deviesnum_len)] = 0x00;
EDP_CONENCT_BUF[(13+deviesnum_len+1)] = apikey_len;
str_cpy(&EDP_CONENCT_BUF[(13+deviesnum_len+2)], API_KEY, apikey_len);
//ÉÏŽ«ÊýŸÝÏûÏ¢³õÊŒ»¯
EDP_SEND_BUF[0] = 0x80;
EDP_SEND_BUF[1] = 0x00;//ÏûÏ¢³€¶È ×Ö·ûŽ®ÏûÏ¢³€¶È+5
EDP_SEND_BUF[2] = 0x00;
EDP_SEND_BUF[3] = 0x05;
EDP_SEND_BUF[4] = 0x00; //×ÖœÚ×Ö·ûŽ®ÏûÏ¢³€¶È
EDP_SEND_BUF[5] = 0x00;
EDP_SEND_BUF[6] = 0x2c;//×Ô¶šÒå×ÖœÚ2žö ,;
EDP_SEND_BUF[7] = 0x3B;
//ºóÃæÊÇ×Ö·ûŽ®ÏûÏ¢
//---
}
unsigned int edp_conect(unsigned char *buf)
{
unsigned int len = 0;
Edp_Init();
len = EDP_CONENCT_BUF[1] + 2;
str_cpy(buf, EDP_CONENCT_BUF, len);
return len;
}
unsigned int edp_updata(unsigned char *s,unsigned char *buf,unsigned int len)
{
unsigned char i = 0;
unsigned int len1 = 0;
while(i < len)
{
EDP_SEND_BUF[(i+8)] = buf[i];
i++;
}
EDP_SEND_BUF[5] = len + 2;
EDP_SEND_BUF[1] = len + 6;
len1 = (EDP_SEND_BUF[1] + 2);
str_cpy(s,EDP_SEND_BUF,len1);
return len1;
}
unsigned int edp_ping(unsigned char *s)
{
s[0] = 0xc0;
s[1] = 0x00;
return 2;
}
int edp_Issue_command_parsing(unsigned char *buf,unsigned char *cmdid,unsigned char *cmd_msg)
{
int i;
unsigned char *tmp_p;
unsigned int cmdid_len;
unsigned long cmd_msg_len;
if(buf[0] != 0xa0)
return -1;
tmp_p = &buf[2];
cmdid_len = (tmp_p[0] << 8) + tmp_p[1];
str_cpy(cmdid, &buf[4], cmdid_len);
tmp_p = &buf[(cmdid_len + 4)];
cmd_msg_len = buf[0] << 24;
cmd_msg_len += (buf[1] << 16);
cmd_msg_len += (buf[2] << 8);
cmd_msg_len += (buf[3] << 0);
str_cpy(cmdid, &tmp_p[4], cmd_msg_len);
return 0;
}
int edp_pushdata( unsigned char *buf, unsigned char *targetID, unsigned char *senddata, unsigned long len)
{
unsigned char *tmp_p;
unsigned int targetID_len = 0;
int rtn_len = 0;
targetID_len = str_cnt(targetID);
buf[0] = 0x30;
buf[1] = len + targetID_len + 3;
tmp_p = &buf[2];
tmp_p[0] = targetID_len >> 8;
tmp_p[1] = targetID_len & 0xff;
tmp_p += 2;
str_cpy(tmp_p, targetID, targetID_len);
tmp_p += targetID_len;
str_cpy(tmp_p, senddata, len);
rtn_len = targetID_len + len + 4;
return rtn_len;
}
int edp_pushdata_parsing( unsigned char *buf, unsigned char *targetID, unsigned char *senddata, unsigned long len)
{
unsigned char *tmp_p;
unsigned int targetID_len = 0;
int rtn_len = 0;
if(buf[0] != 0xa0)
return -1;
return rtn_len;
}
tcp.h
#ifndef __TCP_H
#define __TCP_H
int tcp_init(void);
int tcp_send(char *buf,int len);
int tcp_rcv(char *buf,int len);
void close_tcp(void);
#endif
edp.h
#ifndef __EDP_H
#define __EDP_H
void Edp_Init(void);
unsigned int edp_conect(unsigned char *buf);
unsigned int edp_updata(unsigned char *s,unsigned char *buf,unsigned int len);
#endif
makefile
#交叉编译工具链
CC=arm-linux-gnueabihf-gcc
#链接库
CFLAGS=-lm -lpthread
#获取.cpp文件
SrcFiles=$(wildcard *.c)
#使用替换函数获取.o文件
OBJS=$(patsubst %.c,%.o,$(SrcFiles))
all:main
main:$(OBJS)
$(CC) -o $@ $^ $(CFLAGS)
%.o:%.c
$(CC) -c $< $(CFLAGS)
.PHONY:clean all
clean:
rm -rf $(OBJS)
rm -rf main